> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sagescreen.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Generate a multi-step outbound sequence across email, LinkedIn, SMS, etc.

> Generate a multi-step outbound sequence across email, LinkedIn, SMS, etc.

    `message` must be a JSON string with this shape:
    {
      "sequence": {
        "sequence_id": "healthcare-cold",
        "summary": "cold outreach to CFOs at healthcare staffing firms",
        "threaded": true,
        "voice": "theo",
        "links": {
          "demo_calendar": "https://cal.com/sagescreen/demo",
          "intro_calendar": "https://cal.com/sagescreen/intro",
          "demo_link": "https://sagescreen.io/demo",
          "landing_1": "https://sagescreen.io/for-staffing",
          "landing_2": "https://sagescreen.io/case-study",
          "landing_3": "https://sagescreen.io/pricing",
          "file_1": "https://...",
          "file_2": "https://...",
          "file_3": "https://...",
          "file_4": "https://..."
        },
        "images": {
          "1": "https://cdn.sagescreen.io/img1.png",
          "2": "https://cdn.sagescreen.io/img2.png",
          "3": "https://cdn.sagescreen.io/img3.png"
        },
        "steps": [
          { "step": 1, "channel": "email" },
          { "step": 2, "channel": "linkedin-dm", "intent": "connect — no hard pitch" },
          { "step": 3, "channel": "email", "intent": "follow up after no LinkedIn connection for 5 days", "template": "outreach-header" }
        ]
      },
      "prospect": {
        "person": { "id": 1, "name": "Jane Smith", "first_name": "Jane", "title": "CFO", "email": "jane@acme.com" },
        "organization": { "id": 2, "name": "Acme Corp", "website": "acme.com", "address": "Austin, TX" },
        "recent_notes": ["Met at SHRMTech, interested in audit trail features"]
      }
    }

    step channel values: "email" | "linkedin-inmail" | "linkedin-connection-note" | "linkedin-dm" | "sms" | "whatsapp" | "facebook-dm" | "instagram-dm"
    step intent: optional free-text instruction for that specific step (e.g. "follow up after no LinkedIn connection for 5 days", "soft close — ask for intro call").
    links are all optional — include only what you have.
    recent_notes are operator CRM notes about the prospect, newest first. Optional.

    Returns a JSON object:
    {
      "steps": [
        { "step": 1, "channel": "email", "subject": "Subject line", "body": { "headline": "Short title", "body": "Paragraph text", "link": "https://..." } },
        { "step": 2, "channel": "linkedin-dm", "subject": "", "body": "Plain text message" }
      ]
    }
    Email and linkedin-inmail body is an object with headline, body, link. All other channels body is a plain string. subject is "" for non-email channels. For email steps, subject is optional — omit it (or use "") to thread under the previous email, include it only when intentionally starting a new thread.



## OpenAPI

````yaml /openapi/private/specs/mcp/sagescreen.yml post /tools/outreach_agent
openapi: 3.1.0
info:
  title: SageScreen — MCP Tool Catalog
  description: >-
    Agent-callable tools exposed by the SageScreen MCP server at
    `https://mcp.sagescreen.net`.


    These are the same tools served over the Model Context Protocol; this
    reference documents their **REST** surface (`POST /tools/{name}`, body = the
    tool's arguments), which is what the playground below invokes. The live,
    machine-readable catalog is `GET /tools/list`.


    **This page is generated deterministically** from the server's tool registry
    (`apps/docs/scripts/generate_mcp_spec.py`), not hand-written and not
    AI-generated — it cannot drift from the shipped tools.


    All calls authenticate with the `X-Service-Token` header (or `?token=`).
  version: 1.0.0
servers:
  - url: https://mcp.sagescreen.net
    description: Production MCP server
security:
  - serviceToken: []
  - tokenQuery: []
tags:
  - name: Agents
  - name: Contact Push
  - name: Image Generation
  - name: Other
  - name: Productlane
  - name: Reply.io
  - name: Sequences
  - name: Spaces
  - name: WordPress
paths:
  /tools/outreach_agent:
    post:
      tags:
        - Agents
      summary: >-
        Generate a multi-step outbound sequence across email, LinkedIn, SMS,
        etc.
      description: >-
        Generate a multi-step outbound sequence across email, LinkedIn, SMS,
        etc.

            `message` must be a JSON string with this shape:
            {
              "sequence": {
                "sequence_id": "healthcare-cold",
                "summary": "cold outreach to CFOs at healthcare staffing firms",
                "threaded": true,
                "voice": "theo",
                "links": {
                  "demo_calendar": "https://cal.com/sagescreen/demo",
                  "intro_calendar": "https://cal.com/sagescreen/intro",
                  "demo_link": "https://sagescreen.io/demo",
                  "landing_1": "https://sagescreen.io/for-staffing",
                  "landing_2": "https://sagescreen.io/case-study",
                  "landing_3": "https://sagescreen.io/pricing",
                  "file_1": "https://...",
                  "file_2": "https://...",
                  "file_3": "https://...",
                  "file_4": "https://..."
                },
                "images": {
                  "1": "https://cdn.sagescreen.io/img1.png",
                  "2": "https://cdn.sagescreen.io/img2.png",
                  "3": "https://cdn.sagescreen.io/img3.png"
                },
                "steps": [
                  { "step": 1, "channel": "email" },
                  { "step": 2, "channel": "linkedin-dm", "intent": "connect — no hard pitch" },
                  { "step": 3, "channel": "email", "intent": "follow up after no LinkedIn connection for 5 days", "template": "outreach-header" }
                ]
              },
              "prospect": {
                "person": { "id": 1, "name": "Jane Smith", "first_name": "Jane", "title": "CFO", "email": "jane@acme.com" },
                "organization": { "id": 2, "name": "Acme Corp", "website": "acme.com", "address": "Austin, TX" },
                "recent_notes": ["Met at SHRMTech, interested in audit trail features"]
              }
            }

            step channel values: "email" | "linkedin-inmail" | "linkedin-connection-note" | "linkedin-dm" | "sms" | "whatsapp" | "facebook-dm" | "instagram-dm"
            step intent: optional free-text instruction for that specific step (e.g. "follow up after no LinkedIn connection for 5 days", "soft close — ask for intro call").
            links are all optional — include only what you have.
            recent_notes are operator CRM notes about the prospect, newest first. Optional.

            Returns a JSON object:
            {
              "steps": [
                { "step": 1, "channel": "email", "subject": "Subject line", "body": { "headline": "Short title", "body": "Paragraph text", "link": "https://..." } },
                { "step": 2, "channel": "linkedin-dm", "subject": "", "body": "Plain text message" }
              ]
            }
            Email and linkedin-inmail body is an object with headline, body, link. All other channels body is a plain string. subject is "" for non-email channels. For email steps, subject is optional — omit it (or use "") to thread under the previous email, include it only when intentionally starting a new thread.
      operationId: outreach_agent
      requestBody:
        required: true
        content:
          application/json:
            schema:
              properties:
                message:
                  title: Message
                  type: string
              required:
                - message
              type: object
      responses:
        '200':
          description: >-
            Tool result. The shape is tool-specific; most tools return a JSON
            object, some a `{"result": ...}` envelope.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '400':
          description: Bad arguments (unknown kwargs, malformed JSON body).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Unknown tool name.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Tool raised an error during execution.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message.
        detail:
          type: string
          description: Optional additional context.
      required:
        - error
  responses:
    Unauthorized:
      description: Missing or invalid service token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Unauthorized
  securitySchemes:
    serviceToken:
      type: apiKey
      in: header
      name: X-Service-Token
    tokenQuery:
      type: apiKey
      in: query
      name: token

````