Andy Developer Docs
MCP

Tool catalog

All 44 Andy MCP tools, generated from the v2 tool registry.

Outcome

List every tool advertised by https://app.andypartner.com/api/mcp, in the order the server returns them, with the granular Tenant Operation each one composes.

Source

  • MCP surface: the v2 tool registry — 44 tools, and no others
  • Granular Tenant Operations behind them: see the CLI Reference, which lists every operation including the ones that are CLI/HTTP-only

Authorization, roles, scopes, Entitlements, idempotency and stable problems stay server-side per granular operation. A merged tool takes a closed action discriminator validated before dispatch.

tools/list shows each credential only the tools and actions it may call: a Workspace API Key does not see select_workspace, and an OAuth sign-in does not see the tools that need a Workspace API Key, such as send_message or ask_agent.

Tools

#MCP toolTitleComposesScope
1get_contextGet Andy contextget_context—
2select_workspaceSelect Andy Workspaceselect_workspace—
3get_workspaceGet Andy Workspaceworkspace.inspect—
4get_workspace_entitlementsGet Andy Workspace Entitlementsworkspace.entitlements.inspectworkspace:read
5get_support_ticketGet Support Ticketsupport.ticket.list, support.ticket.inspectsupport:read
6get_support_metricsGet Support Metricssupport.metrics.inspectsupport:read
7manage_support_settingsManage Support Settingsinspect → support.settings.inspect; configure → support.settings.configure; inspect_alerts → support.alerts.inspect; configure_alerts → support.alerts.configuresupport:read
8reply_support_ticketReply to Support Ticketsupport.ticket.replysupport:write
9manage_support_ticketManage Support Ticketnote → support.ticket.note; assign → support.ticket.assign; priority → support.ticket.priority; wait → support.ticket.wait; resolve → support.ticket.resolvesupport:write
10manage_support_providerManage Support providerinspect → support.provider.inspect; provision → support.provider.provision—
11manage_support_installationManage Support installationlist → support.installation.list; inspect → support.installation.inspect; create → support.installation.create; configure → support.installation.configure; issue_key → support.installation.issue_key; rotate_key → support.installation.rotate_key; retire_key → support.installation.retire_key; retire → support.installation.retire—
12get_agentGet Andy Agentagent.list, agent.inspect—
13get_agent_metricsGet Agent Metricsinspect → agent.metrics.inspect; live_now → agent.metrics.live_nowagent:read
14configure_agentConfigure Andy Agentagent.configure—
15manage_agentManage Andy Agent lifecyclecreate → agent.create; set_purpose → agent.purpose.set; delete → agent.delete; rename_slug → agent.rename_slug—
16manage_widgetManage Andy Widgetinspect → widget.inspect; configure → widget.configure—
17list_conversationsList Andy Conversationsconversation.listagent:read
18list_conversation_messagesList Andy Conversation Messagesconversation.message.listagent:read
19inspect_reply_eligibilityInspect Conversation Reply Eligibilityconversation.reply_eligibility.inspectagent:read
20manage_handoffManage Conversation handofftakeover → conversation.handoff.takeover; hand_back → conversation.handoff.hand_backagent:write
21send_messageSend Conversation Messageconversation.message.sendagent:write
22inspect_message_submissionInspect operator reply acceptance and deliveryconversation.message.submission.inspectagent:write
23ask_agentAsk Andy Agentthe Agent runtime (no Tenant Operation)—
24list_postsList Andy Postscontent.post.list, content.post.inspectcontent:read
25manage_postManage Andy Postapprove → content.post.approve; reject → content.post.reject; reschedule → content.post.reschedule; pause → content.post.pause; resume → content.post.resume; create → content.post.create; edit → content.post.edit; cancel → content.post.cancel; retry_first_comment → content.post.retry_first_comment; dismiss → content.post.dismisscontent:write
26manage_mediaManage Andy Mediaupload_bytes → content.media.upload_bytes; prepare → content.media.upload_prepare; complete → content.media.upload_complete; list → content.media.list; inspect → content.media.inspectcontent:write, content:read
27list_connectionsList Andy Platform Connectionscontent.connection.listcontent:connections
28manage_connectionManage Andy Platform Connectionconnect → content.connection.connect; inspect → content.connection.inspect; preflight → content.connection.preflight; disconnect → content.connection.disconnect; set_posting_slots → content.connection.set_posting_slots; add_x_community → content.connection.add_x_community; remove_x_community → content.connection.remove_x_communitycontent:connections
29list_knowledgeList Agent Knowledgeknowledge_source.list, knowledge_source.inspect—
30add_knowledgeAdd Agent Knowledgeknowledge_source.add—
31replace_knowledgeReplace Agent Knowledgeknowledge_source.replace—
32delete_knowledgeDelete Agent Knowledgeknowledge_source.delete—
33manage_outreach_batchManage outreach batchprepare → outreach.batch.prepare; inspect → outreach.batch.inspect; revise → outreach.batch.revise; approve → outreach.batch.approve; defer → outreach.batch.deferagent:write, agent:read
34manage_outreach_preparationManage outreach preparationstart → outreach.preparation.start; resume → outreach.preparation.resume; inspect → outreach.preparation.inspectagent:write, agent:read
35manage_outreach_outcomesManage outreach outcomesinspect → outreach.outcomes.inspect; record → outreach.outcomes.recordagent:read, agent:write
36list_contactsList Andy Contactscontact.listagent:read
37manage_contactManage Andy Contactinspect → contact.inspect; discard → contact.discard; restore → contact.restoreagent:read, agent:write
38manage_telegram_connectionManage your Andy Telegram connectioninspect → assistant.telegram.inspect; prepare → assistant.telegram.prepare; confirm → assistant.telegram.confirm; disconnect → assistant.telegram.disconnect—
39manage_affiliateManage your Andy affiliate programget → affiliate.get; join → affiliate.join; update → affiliate.update—
40manage_workspace_time_zoneManage Andy Workspace time zoneinspect → workspace.time_zone.inspect; set → workspace.time_zone.setworkspace:read
41get_workspace_billingGet Andy Workspace billingworkspace.billing.inspect—
42manage_workspace_billingManage Andy Workspace billingportal_session → workspace.billing.portal_session.create; set_tax_registration → workspace.billing.tax_registration.set—
43list_invoicesList Andy Workspace invoiceslist → workspace.invoices.list; link → workspace.invoices.link—
44manage_workspace_membersManage Andy Workspace memberslist_members → workspace.member.list; list_invites → workspace.invite.list; invite → workspace.invite.create; revoke_invite → workspace.invite.revoke; change_role → workspace.member.change_role; remove → workspace.member.remove—

Annotations

Every tool declares all four booleans explicitly; none relies on a protocol default. An annotation describes the tool's maximum effect, not its safest call.

MCP toolreadOnlyHintdestructiveHintidempotentHintopenWorldHint
get_contextyesnoyesno
select_workspacenonoyesno
get_workspaceyesnoyesno
get_workspace_entitlementsyesnoyesno
get_support_ticketyesnoyesno
get_support_metricsyesnoyesno
manage_support_settingsnonoyesno
reply_support_ticketnonoyesno
manage_support_ticketnonoyesno
manage_support_providernonoyesno
manage_support_installationnoyesyesno
get_agentyesnoyesno
get_agent_metricsyesnoyesno
configure_agentnoyesyesno
manage_agentnoyesnono
manage_widgetnoyesyesno
list_conversationsyesnoyesno
list_conversation_messagesyesnoyesno
inspect_reply_eligibilityyesnoyesno
manage_handoffnoyesyesno
send_messagenoyesnoyes
inspect_message_submissionyesnoyesno
ask_agentnoyesnoyes
list_postsyesnoyesno
manage_postnoyesnoyes
manage_medianoyesnono
list_connectionsyesnoyesno
manage_connectionnoyesnoyes
list_knowledgeyesnoyesno
add_knowledgenononono
replace_knowledgenoyesnono
delete_knowledgenoyesnono
manage_outreach_batchnoyesyesno
manage_outreach_preparationnonoyesno
manage_outreach_outcomesnonoyesno
list_contactsyesnoyesno
manage_contactnonoyesno
manage_telegram_connectionnononono
manage_affiliatenonoyesno
manage_workspace_time_zonenonoyesno
get_workspace_billingyesnoyesyes
manage_workspace_billingnononoyes
list_invoicesyesnoyesyes
manage_workspace_membersnoyesnoyes

Descriptions

get_context

Return everything needed to route any Andy operation in one call: the connected identity and its capabilities, accessible Workspaces, the selected Workspace with its provenance, that Workspace's active Agents and live Entitlements, its labeled Platform Connections (the destinations a Post can publish to), availability, and ready-to-run repairs when no Workspace is selected. When agentsCompleteness.status is truncated, call this again with its nextCursor as agentsCursor to read the remaining Agents.

  • Composes: get_context
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentsCursor": {
      "type": "string",
      "minLength": 1
    }
  },
  "additionalProperties": false
}

select_workspace

Bind one accessible Workspace to this MCP session and answer with the same complete context bundle as get_context, so no further orientation call is needed.

  • Composes: select_workspace
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "workspaceId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "workspaceId"
  ],
  "additionalProperties": false
}

get_workspace

Inspect the selected Workspace without exposing billing credentials.

  • Composes: workspace.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

get_workspace_entitlements

Inspect current Entitlements, Limits, Usage, Plan, and trial state for the selected Workspace. A Workspace API Key needs workspace:read.

  • Composes: workspace.entitlements.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

get_support_ticket

Read the selected Workspace’s live Soporte queue and view counts, or inspect a numbered ticket and its thread. Get ticketId from the list. Views: mine, unassigned, risk (tickets still awaiting a first reply past or near the reply promise, oldest first; counts.risk stops at 500), open, resolved. priority (low, normal, high, urgent; normal includes tickets never prioritised) narrows any view, or alone lists every ticket of that priority. To search, pass one of number, status, assigneeId (null = unassigned), installationId, requesterId (requester.id on a row) or query (subject text) instead of a view; updatedAfter/updatedBefore (ms) narrow any view or selector. A cursor pages only the list that issued it.

  • Composes: support.ticket.list, support.ticket.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "view": {
      "type": "string",
      "enum": [
        "mine",
        "unassigned",
        "risk",
        "open",
        "resolved"
      ]
    },
    "number": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "status": {
      "type": "string",
      "enum": [
        "open",
        "in_progress",
        "waiting_customer",
        "resolved"
      ]
    },
    "assigneeId": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "installationId": {
      "type": "string",
      "minLength": 1
    },
    "requesterId": {
      "type": "string",
      "minLength": 1
    },
    "query": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "priority": {
      "type": "string",
      "enum": [
        "low",
        "normal",
        "high",
        "urgent"
      ]
    },
    "updatedAfter": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4102444800000
    },
    "updatedBefore": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4102444800000
    },
    "clock": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4102444800000
    },
    "cursor": {
      "type": "string",
      "minLength": 1
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "ticketId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "list",
      "required": [],
      "not": {
        "anyOf": [
          {
            "required": [
              "ticketId"
            ]
          }
        ]
      }
    },
    {
      "title": "inspect",
      "required": [
        "ticketId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "view"
            ]
          },
          {
            "required": [
              "number"
            ]
          },
          {
            "required": [
              "status"
            ]
          },
          {
            "required": [
              "assigneeId"
            ]
          },
          {
            "required": [
              "installationId"
            ]
          },
          {
            "required": [
              "requesterId"
            ]
          },
          {
            "required": [
              "query"
            ]
          },
          {
            "required": [
              "priority"
            ]
          },
          {
            "required": [
              "updatedAfter"
            ]
          },
          {
            "required": [
              "updatedBefore"
            ]
          }
        ]
      }
    }
  ]
}

get_support_metrics

Read Support Ticket facts in UTC-hour buckets for today, 7d or 30d. First-reply and backlog times use current support opening hours. complete=false means filling or a bounded sample exceeded; null statistics are unavailable, not zero. Optional clock ages the read without changing saved facts. Sales metrics are separate.

  • Composes: support.metrics.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "period": {
      "default": "30d",
      "type": "string",
      "enum": [
        "today",
        "7d",
        "30d"
      ]
    },
    "clock": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4102444800000
    }
  },
  "additionalProperties": false
}

manage_support_settings

Read the provider’s first Public Reply promise, weekly opening hours and timezone with action="inspect". A live Workspace Owner or Admin can change them with action="configure". Business minutes use these hours; current metrics and receipts recompute. API keys and Requesters cannot configure. action="inspect_alerts" lists every operator with how they get ticket alerts; action="configure_alerts" switches only the caller's own alert emails (emailAlerts).

  • Composes: inspect → support.settings.inspect; configure → support.settings.configure; inspect_alerts → support.alerts.inspect; configure_alerts → support.alerts.configure
  • Actions: inspect, configure, inspect_alerts, configure_alerts
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "configure",
        "inspect_alerts",
        "configure_alerts"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "replyPromiseMinutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 43200
    },
    "timeZone": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "businessHours": {
      "type": "object",
      "properties": {
        "days": {
          "minItems": 1,
          "maxItems": 7,
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 0,
            "maximum": 6
          }
        },
        "startMinutes": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1439
        },
        "endMinutes": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1440
        }
      },
      "required": [
        "days",
        "startMinutes",
        "endMinutes"
      ],
      "additionalProperties": false
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "emailAlerts": {
      "type": "boolean"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "replyPromiseMinutes"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "businessHours"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "emailAlerts"
            ]
          }
        ]
      }
    },
    {
      "title": "action: configure",
      "properties": {
        "action": {
          "const": "configure"
        }
      },
      "required": [
        "action",
        "replyPromiseMinutes",
        "timeZone",
        "businessHours"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "emailAlerts"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect_alerts",
      "properties": {
        "action": {
          "const": "inspect_alerts"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "replyPromiseMinutes"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "businessHours"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "emailAlerts"
            ]
          }
        ]
      }
    },
    {
      "title": "action: configure_alerts",
      "properties": {
        "action": {
          "const": "configure_alerts"
        }
      },
      "required": [
        "action",
        "emailAlerts"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "replyPromiseMinutes"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "businessHours"
            ]
          }
        ]
      }
    }
  ]
}

reply_support_ticket

Send a human Public Reply in Soporte. The first reply claims an unassigned ticket and starts work. Optional then waits or resolves in the same command. Resolved tickets refuse replies. No sales conversation is changed.

  • Composes: support.ticket.reply
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ticketId": {
      "type": "string",
      "minLength": 1
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "then": {
      "type": "string",
      "enum": [
        "waiting_customer",
        "resolved"
      ]
    }
  },
  "required": [
    "ticketId",
    "body"
  ],
  "additionalProperties": false
}

manage_support_ticket

Operator actions on a Support Ticket: "note" saves an Internal Note that only the support team can read, "assign" selects an authorized operator id from get_support_ticket operators or null to unassign, "priority" sets low, normal, high or urgent (operators only; Requesters never see it), "wait" asks for a Requester answer, and "resolve" ends human work without returning the ticket to the AI. ticketId comes from get_support_ticket. Requesters explicitly reopen through their private host app, never this operator tool.

  • Composes: note → support.ticket.note; assign → support.ticket.assign; priority → support.ticket.priority; wait → support.ticket.wait; resolve → support.ticket.resolve
  • Actions: note, assign, priority, wait, resolve
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "note",
        "assign",
        "priority",
        "wait",
        "resolve"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "ticketId": {
      "type": "string",
      "minLength": 1
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "assigneeId": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "priority": {
      "type": "string",
      "enum": [
        "low",
        "normal",
        "high",
        "urgent"
      ]
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: note",
      "properties": {
        "action": {
          "const": "note"
        }
      },
      "required": [
        "action",
        "ticketId",
        "body"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "assigneeId"
            ]
          },
          {
            "required": [
              "priority"
            ]
          }
        ]
      }
    },
    {
      "title": "action: assign",
      "properties": {
        "action": {
          "const": "assign"
        }
      },
      "required": [
        "action",
        "ticketId",
        "assigneeId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "priority"
            ]
          }
        ]
      }
    },
    {
      "title": "action: priority",
      "properties": {
        "action": {
          "const": "priority"
        }
      },
      "required": [
        "action",
        "ticketId",
        "priority"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "assigneeId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: wait",
      "properties": {
        "action": {
          "const": "wait"
        }
      },
      "required": [
        "action",
        "ticketId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "assigneeId"
            ]
          },
          {
            "required": [
              "priority"
            ]
          }
        ]
      }
    },
    {
      "title": "action: resolve",
      "properties": {
        "action": {
          "const": "resolve"
        }
      },
      "required": [
        "action",
        "ticketId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "assigneeId"
            ]
          },
          {
            "required": [
              "priority"
            ]
          }
        ]
      }
    }
  ]
}

manage_support_provider

Set up or inspect Soporte for the selected Workspace, as its Owner or Admin. The Workspace needs Soporte (Pro Max or a grant). supportAgentId is explicit and must name a live Support Agent in this Workspace (create one with manage_agent create, purpose support). Omit sender to use the default Andy sender; a custom sender's domain must already be verified on the server. Only a Platform Admin sees or changes Relay routing, and only a Platform Admin changes operator seats. It sends nothing.

  • Composes: inspect → support.provider.inspect; provision → support.provider.provision
  • Actions: inspect, provision
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "provision"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "supportAgentId": {
      "type": "string",
      "minLength": 1
    },
    "operatorSeats": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "sender": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "email": {
          "type": "string",
          "format": "email",
          "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
        }
      },
      "required": [
        "name",
        "email"
      ],
      "additionalProperties": false
    },
    "relay": {
      "type": "object",
      "properties": {
        "workspace": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]{0,79}$"
        },
        "product": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9-]{0,79}$"
        }
      },
      "required": [
        "workspace",
        "product"
      ],
      "additionalProperties": false
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "supportAgentId"
            ]
          },
          {
            "required": [
              "operatorSeats"
            ]
          },
          {
            "required": [
              "sender"
            ]
          },
          {
            "required": [
              "relay"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: provision",
      "properties": {
        "action": {
          "const": "provision"
        }
      },
      "required": [
        "action",
        "supportAgentId"
      ]
    }
  ]
}

manage_support_installation

Provider Owner or Admin host installation metadata and key controls. issue_key and rotate_key return a safe Configurar handoff without issuing a key; private signing bytes are delivered once only in verified App Configurar. Never request or place a signing secret in this tool. ticketTag (e.g. Preprod) prefixes every new ticket subject from the installation as [Preprod] ; find those tickets with get_support_ticket query or installationId.

  • Composes: list → support.installation.list; inspect → support.installation.inspect; create → support.installation.create; configure → support.installation.configure; issue_key → support.installation.issue_key; rotate_key → support.installation.rotate_key; retire_key → support.installation.retire_key; retire → support.installation.retire
  • Actions: list, inspect, create, configure, issue_key, rotate_key, retire_key, retire
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "list",
        "inspect",
        "create",
        "configure",
        "issue_key",
        "rotate_key",
        "retire_key",
        "retire"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "cursor": {
      "type": "string",
      "minLength": 1
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "installationId": {
      "type": "string",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "surfaces": {
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "surface": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_-]{1,80}$"
          },
          "ticketUrlTemplate": {
            "type": "string",
            "maxLength": 2000
          }
        },
        "required": [
          "surface",
          "ticketUrlTemplate"
        ],
        "additionalProperties": false
      }
    },
    "branding": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "color": {
          "type": "string",
          "pattern": "^#[0-9A-Fa-f]{6}$"
        },
        "footer": {
          "maxItems": 3,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "label": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "url": {
                "type": "string",
                "maxLength": 2000
              }
            },
            "required": [
              "label",
              "url"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "name",
        "color",
        "footer"
      ],
      "additionalProperties": false
    },
    "ticketTag": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 20,
          "description": "Short tag prefixed to the subject of every ticket opened through this installation, as [<tag>] <subject>, e.g. Preprod. null removes it; omitted on configure keeps the current tag."
        },
        {
          "type": "null"
        }
      ]
    },
    "environment": {
      "type": "string",
      "enum": [
        "local",
        "preview",
        "production"
      ]
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "kid": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: list",
      "properties": {
        "action": {
          "const": "list"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "installationId"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "surfaces"
            ]
          },
          {
            "required": [
              "branding"
            ]
          },
          {
            "required": [
              "ticketTag"
            ]
          },
          {
            "required": [
              "environment"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "installationId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "surfaces"
            ]
          },
          {
            "required": [
              "branding"
            ]
          },
          {
            "required": [
              "ticketTag"
            ]
          },
          {
            "required": [
              "environment"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    },
    {
      "title": "action: create",
      "properties": {
        "action": {
          "const": "create"
        }
      },
      "required": [
        "action",
        "name",
        "surfaces",
        "branding",
        "environment"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "installationId"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    },
    {
      "title": "action: configure",
      "properties": {
        "action": {
          "const": "configure"
        }
      },
      "required": [
        "action",
        "installationId",
        "name",
        "surfaces",
        "branding"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "environment"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    },
    {
      "title": "action: issue_key",
      "properties": {
        "action": {
          "const": "issue_key"
        }
      },
      "required": [
        "action",
        "installationId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "surfaces"
            ]
          },
          {
            "required": [
              "branding"
            ]
          },
          {
            "required": [
              "ticketTag"
            ]
          },
          {
            "required": [
              "environment"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    },
    {
      "title": "action: rotate_key",
      "properties": {
        "action": {
          "const": "rotate_key"
        }
      },
      "required": [
        "action",
        "installationId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "surfaces"
            ]
          },
          {
            "required": [
              "branding"
            ]
          },
          {
            "required": [
              "ticketTag"
            ]
          },
          {
            "required": [
              "environment"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    },
    {
      "title": "action: retire_key",
      "properties": {
        "action": {
          "const": "retire_key"
        }
      },
      "required": [
        "action",
        "installationId",
        "kid"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "surfaces"
            ]
          },
          {
            "required": [
              "branding"
            ]
          },
          {
            "required": [
              "ticketTag"
            ]
          },
          {
            "required": [
              "environment"
            ]
          }
        ]
      }
    },
    {
      "title": "action: retire",
      "properties": {
        "action": {
          "const": "retire"
        }
      },
      "required": [
        "action",
        "installationId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "surfaces"
            ]
          },
          {
            "required": [
              "branding"
            ]
          },
          {
            "required": [
              "ticketTag"
            ]
          },
          {
            "required": [
              "environment"
            ]
          },
          {
            "required": [
              "kid"
            ]
          }
        ]
      }
    }
  ]
}

get_agent

Without agentId, list the active Agents of the selected Workspace so a model can pick one by name. With agentId, inspect exactly that Agent including its behavior configuration. This is a read: it never asks for an Agent to be selected.

  • Composes: agent.list, agent.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "cursor": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "list",
      "required": [],
      "not": {
        "anyOf": [
          {
            "required": [
              "agentId"
            ]
          }
        ]
      }
    },
    {
      "title": "inspect",
      "required": [
        "agentId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          }
        ]
      }
    }
  ]
}

get_agent_metrics

Read the same numbers as the Agent Overview. action "inspect" reads a period and its comparison; action "live_now" counts Conversations active in the last five minutes. Get agentId from get_context or get_agent. Filling means history is being prepared, never zero activity.

  • Composes: inspect → agent.metrics.inspect; live_now → agent.metrics.live_now
  • Actions: inspect, live_now
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "live_now"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "clock": {
      "type": "number"
    },
    "period": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "today",
            "7d",
            "30d"
          ]
        },
        {
          "type": "object",
          "properties": {
            "month": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
            }
          },
          "required": [
            "month"
          ],
          "additionalProperties": false
        }
      ]
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "agentId",
        "period"
      ]
    },
    {
      "title": "action: live_now",
      "properties": {
        "action": {
          "const": "live_now"
        }
      },
      "required": [
        "action",
        "agentId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "period"
            ]
          }
        ]
      }
    }
  ]
}

configure_agent

Apply a partial, validated behavior configuration to one Agent and return the resulting Agent. Omitted, agentId resolves to the Workspace's sole active Agent; with several Agents the answer carries one ready-to-run call per Agent.

  • Composes: agent.configure
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "defaultLanguage": {
      "description": "The language the Widget and the Handoff reply use when a Visitor's own is unknown. A host page's <html lang> or a lang prop overrides it per Visitor. Copy already written in each language stays in that language.",
      "type": "string",
      "enum": [
        "en",
        "es"
      ]
    },
    "instructions": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 20000
        },
        {
          "type": "null"
        }
      ]
    },
    "temperature": {
      "type": "number",
      "minimum": 0,
      "maximum": 2
    },
    "tone": {
      "description": "How the Agent sounds: formal, balanced (default) or casual.",
      "type": "string",
      "enum": [
        "formal",
        "balanced",
        "casual"
      ]
    },
    "creativity": {
      "description": "How much answers vary: predictable, balanced (default) or creative.",
      "type": "string",
      "enum": [
        "predictable",
        "balanced",
        "creative"
      ]
    },
    "handoffReply": {
      "type": "object",
      "properties": {
        "es": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500
            },
            {
              "type": "null"
            }
          ]
        },
        "en": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false,
      "description": "The reply a Visitor gets when the Agent hands the Conversation to a person, per language. Empty or null sends the default in that language."
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "additionalProperties": false
}

manage_agent

action "create" creates an Agent in the selected Workspace under current Entitlements and Limits — it needs no existing Agent. purpose defaults to sales; a Workspace Owner or Admin User can create support when the Workspace has Soporte (Pro Max or a grant), only a Platform Admin User can create assistant, and a Workspace API Key can only create sales. action "set_purpose" switches between sales and support for a Workspace Owner or Admin User (support needs Soporte); assistant stays with Platform Admins. Purpose is read-only in normal configuration. A support Agent uses help knowledge only and cannot enable Lead Capture, Human Handoff or booking. action "delete" soft-deletes exactly one Agent: agentId is never auto-resolved, not even in a one-Agent Workspace, and confirm is still required. action "rename_slug" changes one Agent's URL slug (the in //); the old URL stops working, nothing redirects it; Owner/Admin only and agentId is never auto-resolved.

  • Composes: create → agent.create; set_purpose → agent.purpose.set; delete → agent.delete; rename_slug → agent.rename_slug
  • Actions: create, set_purpose, delete, rename_slug
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "create",
        "set_purpose",
        "delete",
        "rename_slug"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "purpose": {
      "anyOf": [
        {
          "default": "sales",
          "type": "string",
          "enum": [
            "sales",
            "support",
            "assistant"
          ]
        },
        {
          "type": "string",
          "enum": [
            "sales",
            "support",
            "assistant"
          ]
        }
      ]
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
    },
    "defaultLanguage": {
      "description": "The Agent's language. Omit it to use the creating User's language; a Workspace API Key uses the Workspace Owner's. Spanish when neither is known.",
      "type": "string",
      "enum": [
        "en",
        "es"
      ]
    },
    "instructions": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000
    },
    "temperature": {
      "type": "number",
      "minimum": 0,
      "maximum": 2
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "confirm": {
      "type": "boolean"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: create",
      "properties": {
        "action": {
          "const": "create"
        }
      },
      "required": [
        "action",
        "name"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          }
        ]
      }
    },
    {
      "title": "action: set_purpose",
      "properties": {
        "action": {
          "const": "set_purpose"
        }
      },
      "required": [
        "action",
        "agentId",
        "purpose"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "slug"
            ]
          },
          {
            "required": [
              "defaultLanguage"
            ]
          },
          {
            "required": [
              "instructions"
            ]
          },
          {
            "required": [
              "temperature"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          }
        ]
      }
    },
    {
      "title": "action: delete",
      "properties": {
        "action": {
          "const": "delete"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "purpose"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "slug"
            ]
          },
          {
            "required": [
              "defaultLanguage"
            ]
          },
          {
            "required": [
              "instructions"
            ]
          },
          {
            "required": [
              "temperature"
            ]
          }
        ]
      }
    },
    {
      "title": "action: rename_slug",
      "properties": {
        "action": {
          "const": "rename_slug"
        }
      },
      "required": [
        "action",
        "agentId",
        "slug"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "purpose"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "defaultLanguage"
            ]
          },
          {
            "required": [
              "instructions"
            ]
          },
          {
            "required": [
              "temperature"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          }
        ]
      }
    }
  ]
}

manage_widget

The Widget editor for one Agent (#3062). action "inspect" reads its effective Widget configuration. action "configure" writes only the fields given: per-language copy (greeting, starters, Proactive Message), look and Launcher under configuration.widget, allowed origins, and the logo as configuration.logoMediaAssetId — a PNG or JPEG Media Asset id from manage_media, up to 2 MB, or null to remove it. Signed-in Users need Owner or Admin to configure; a Workspace API Key needs widget:write, and for a Sales Agent its Public Chat on and Knowledge ready. A Support Agent works unpublished; its Requester Widget keeps the Host Installation's name and colour and never shows a logo.

  • Composes: inspect → widget.inspect; configure → widget.configure
  • Actions: inspect, configure
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "configure"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "configuration": {
      "type": "object",
      "properties": {
        "allowedOrigins": {
          "maxItems": 50,
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "confirmRemovedOrigins": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        "showBranding": {
          "type": "boolean"
        },
        "defaultLanguage": {
          "description": "The Agent's default language, as in agent.configure. Copy already written in each language stays in that language.",
          "type": "string",
          "enum": [
            "en",
            "es"
          ]
        },
        "website": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "appearance": {
          "type": "object",
          "properties": {
            "welcomeMessage": {
              "type": "string",
              "maxLength": 500
            },
            "brandColor": {
              "type": "string",
              "pattern": "^#[0-9A-Fa-f]{6}$"
            },
            "theme": {
              "type": "string",
              "enum": [
                "light",
                "dark",
                "auto"
              ]
            },
            "orientation": {
              "type": "string",
              "enum": [
                "left",
                "right"
              ]
            },
            "logoUrl": {
              "type": "string"
            },
            "bubbleStyle": {
              "type": "string",
              "enum": [
                "icon",
                "pill"
              ]
            },
            "bubbleLabel": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "useBrandColor": {
              "type": "boolean"
            }
          }
        },
        "behavior": {
          "type": "object",
          "properties": {
            "welcomePopup": {
              "type": "object",
              "properties": {
                "enabled": {
                  "type": "boolean"
                },
                "seconds": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 30
                },
                "message": {
                  "type": "string"
                }
              }
            },
            "leadCapture": {
              "type": "object",
              "properties": {
                "enabled": {
                  "type": "boolean"
                },
                "contactEmail": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "email",
                      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                    },
                    {
                      "type": "string",
                      "const": ""
                    }
                  ]
                },
                "calendarLink": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uri"
                    },
                    {
                      "type": "string",
                      "const": ""
                    }
                  ]
                },
                "phoneNumber": {
                  "type": "string"
                },
                "customMessage": {
                  "type": "string"
                },
                "emailNotificationEnabled": {
                  "type": "boolean"
                }
              }
            },
            "predefinedQuestions": {
              "maxItems": 4,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "question": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "order": {
                    "type": "number"
                  }
                },
                "required": [
                  "question"
                ]
              }
            }
          },
          "additionalProperties": false
        },
        "widget": {
          "type": "object",
          "properties": {
            "identity": {
              "type": "object",
              "properties": {
                "name": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 40
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Display name, the panel's title. Empty shows the Agent's name."
                }
              },
              "additionalProperties": false
            },
            "conversation": {
              "type": "object",
              "properties": {
                "greeting": {
                  "type": "object",
                  "properties": {
                    "es": {
                      "type": "string",
                      "maxLength": 500
                    },
                    "en": {
                      "type": "string",
                      "maxLength": 500
                    }
                  },
                  "additionalProperties": false
                },
                "starters": {
                  "type": "object",
                  "properties": {
                    "es": {
                      "maxItems": 4,
                      "type": "array",
                      "items": {
                        "type": "string",
                        "maxLength": 80
                      }
                    },
                    "en": {
                      "maxItems": 4,
                      "type": "array",
                      "items": {
                        "type": "string",
                        "maxLength": 80
                      }
                    }
                  },
                  "additionalProperties": false
                },
                "footerNote": {
                  "type": "object",
                  "properties": {
                    "es": {
                      "type": "string",
                      "maxLength": 120
                    },
                    "en": {
                      "type": "string",
                      "maxLength": 120
                    }
                  },
                  "additionalProperties": false
                },
                "proactive": {
                  "type": "object",
                  "properties": {
                    "enabled": {
                      "type": "boolean"
                    },
                    "message": {
                      "type": "object",
                      "properties": {
                        "es": {
                          "type": "string"
                        },
                        "en": {
                          "type": "string"
                        }
                      },
                      "additionalProperties": false
                    },
                    "delaySeconds": {
                      "anyOf": [
                        {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 30
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "mobile": {
                      "type": "boolean"
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            },
            "look": {
              "type": "object",
              "properties": {
                "accent": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^#[0-9A-Fa-f]{6}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "theme": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "light",
                        "dark",
                        "auto"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "header": {
                  "anyOf": [
                    {
                      "type": "string",
                      "enum": [
                        "neutral",
                        "brand"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "launcher": {
                  "type": "object",
                  "properties": {
                    "style": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "icon",
                            "pill"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "icon": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "andy",
                            "logo"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "label": {
                      "type": "object",
                      "properties": {
                        "es": {
                          "type": "string",
                          "maxLength": 30
                        },
                        "en": {
                          "type": "string",
                          "maxLength": 30
                        }
                      },
                      "additionalProperties": false
                    },
                    "position": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "left",
                            "right"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "offsetY": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 160
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": false
                },
                "branding": {
                  "type": "boolean",
                  "description": "\"Powered by Andy\"; hiding it needs a plan with custom branding."
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false
        },
        "logoMediaAssetId": {
          "description": "A PNG or JPEG Media Asset id from manage_media, up to 2097152 bytes, becomes the Agent's logo; null removes it. A Support Agent's Widget never shows a logo.",
          "anyOf": [
            {
              "type": "string",
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "agentId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "configuration"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: configure",
      "properties": {
        "action": {
          "const": "configure"
        }
      },
      "required": [
        "action",
        "agentId",
        "configuration"
      ]
    }
  ]
}

list_conversations

List Workspace Conversations as flat rows sorted by recency, aggregated across every active Agent unless agentId narrows it. Each row carries Workspace and Agent identity, customer label, channel, needs-human status, handoff state, sender-block fact, a preview of at most 160 characters, and the Message count. Production traffic only; raw provider metadata never crosses this boundary.

  • Composes: conversation.list
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "channel": {
      "type": "string",
      "enum": [
        "whatsapp",
        "instagram",
        "slack",
        "voice",
        "widget",
        "public_url"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "needs_human",
        "waiting",
        "resolved"
      ]
    },
    "since": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "until": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "cursor": {
      "type": "string",
      "minLength": 1
    },
    "pageSize": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "additionalProperties": false
}

list_conversation_messages

List Conversation Messages newest first, aggregated across every active Agent unless agentId narrows it. Call it with {"role":"visitor","pageSize":1} and no other context to read the newest customer Message with Workspace and Agent names on the row; add sessionId (with agentId) to read one Conversation. Content is verbatim, clamped to maxContentChars with an honest contentTruncated flag; raw provider metadata never crosses this boundary. An Instagram Agent reply carries delivery: sent, or failed with failureCode instagram_thread_owner (Instagram had given the conversation to another app or the Meta inbox, so the Visitor got none of it), instagram_send_failed (any other failure, none of it sent) or instagram_partly_delivered (the Visitor got only the first parts). Reads are bounded: a rare role or channel can return a short or empty page with truncated true, so keep calling with meta.nextCursor until truncated is false.

  • Composes: conversation.message.list
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sessionId": {
      "type": "string",
      "minLength": 1
    },
    "role": {
      "type": "string",
      "enum": [
        "visitor",
        "agent"
      ]
    },
    "channel": {
      "type": "string",
      "enum": [
        "whatsapp",
        "instagram",
        "slack",
        "voice",
        "widget",
        "public_url"
      ]
    },
    "since": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "until": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "maxContentChars": {
      "default": 300,
      "type": "integer",
      "minimum": 50,
      "maximum": 4000
    },
    "cursor": {
      "type": "string",
      "minLength": 1
    },
    "pageSize": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "additionalProperties": false
}

inspect_reply_eligibility

Read the canonical, source-agnostic facts that decide whether an operator reply may be submitted. This does not enable a channel or send anything.

  • Composes: conversation.reply_eligibility.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sessionId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "sessionId"
  ],
  "additionalProperties": false
}

manage_handoff

action "takeover" pauses the Agent for one Conversation so a human can reply; action "hand_back" resumes it. Both take the sessionId straight from a list_conversations row and derive the owning Agent from it. The resulting handoff state is returned.

  • Composes: takeover → conversation.handoff.takeover; hand_back → conversation.handoff.hand_back
  • Actions: takeover, hand_back
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "takeover",
        "hand_back"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sessionId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: takeover",
      "properties": {
        "action": {
          "const": "takeover"
        }
      },
      "required": [
        "action",
        "sessionId"
      ]
    },
    {
      "title": "action: hand_back",
      "properties": {
        "action": {
          "const": "hand_back"
        }
      },
      "required": [
        "action",
        "sessionId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "reason"
            ]
          }
        ]
      }
    }
  ]
}

send_message

Persist a human operator reply into the Conversation projection and schedule channel delivery when needed. No client-facing provider send.

  • Composes: conversation.message.send
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sessionId": {
      "type": "string",
      "minLength": 1
    },
    "content": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4000
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "sessionId",
    "content"
  ],
  "additionalProperties": false
}

inspect_message_submission

Inspect one original send intent under the current actor and Workspace. Returns durable Message acceptance and route-evidenced Delivery state; absence never starts another send. Reauthorises current access without matching Message text.

  • Composes: conversation.message.submission.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sessionId": {
      "type": "string",
      "minLength": 1
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "sessionId",
    "idempotencyKey"
  ],
  "additionalProperties": false
}

ask_agent

Ask one Andy Agent a question, answered with its reviewed Knowledge, configured behavior and enabled tools. Omitted, agentId resolves to the Workspace's sole active Agent. By default (actionMode "answer_only") the Agent's mutating tools are disabled server-side. With actionMode "allow_actions" an action that needs consent returns the stable confirmation_required problem with a single-use, short-lived confirmationToken and an exact action summary; replay the call with that token to authorize only that action.

  • Composes: the Agent runtime (no Tenant Operation)
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true

Input schema:

{
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "description": "Optional. Omitted, Andy resolves the Workspace's sole active Agent; with several Agents the answer is a stable agent_selection_required problem carrying one ready-to-run call per Agent, labeled by name."
    },
    "message": {
      "type": "string",
      "description": "The question or instruction for the Agent. Required unless you are replaying a confirmationToken."
    },
    "sessionId": {
      "type": "string",
      "description": "Optional id that continues an earlier ask conversation."
    },
    "actionMode": {
      "type": "string",
      "enum": [
        "answer_only",
        "allow_actions"
      ],
      "default": "answer_only",
      "description": "\"answer_only\" (the default) answers without performing any action: the Agent's mutating tools are disabled server-side. \"allow_actions\" lets the Agent propose one action, which still requires explicit confirmation."
    },
    "confirmationToken": {
      "type": "string",
      "description": "Opaque token returned by a confirmation_required problem. Authorizes exactly that action, once, and expires in minutes."
    }
  },
  "required": [],
  "additionalProperties": false,
  "anyOf": [
    {
      "title": "ask a question",
      "required": [
        "message"
      ]
    },
    {
      "title": "replay a confirmation",
      "required": [
        "confirmationToken"
      ]
    }
  ]
}

list_posts

Without postId, list Workspace Posts newest first — filter status="pending_approval" for the approval queue. With postId, inspect exactly that Post including lifecycle and publish state. Every row carries the postId manage_post takes, so approving needs no ID copying.

  • Composes: content.post.list, content.post.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "cursor": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "status": {
      "type": "string",
      "enum": [
        "pending_approval",
        "approved",
        "published",
        "failed",
        "rejected"
      ]
    },
    "postId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "list",
      "required": [],
      "not": {
        "anyOf": [
          {
            "required": [
              "postId"
            ]
          }
        ]
      }
    },
    {
      "title": "inspect",
      "required": [
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "status"
            ]
          }
        ]
      }
    }
  ]
}

manage_post

One closed set of Post transitions chosen by action: "create" (channel, text, intent request_approval|schedule|publish_now defaulting to request_approval, optional connectionId, optional targetType personal_profile|company_page for LinkedIn only, optional scheduledAt in epoch milliseconds — omitted on request_approval, Andy proposes the connection's next free posting slot at least 30 minutes out, or the next full hour when it has none — optional mediaAssetId — required on Instagram, where a JPEG/PNG posts as a feed image and an MP4 as a Reel (H.264 or HEVC, 3 s to 15 min, at most 1920 px wide) — optional firstComment — a reply on X up to 280 characters or a comment on LinkedIn up to 1250 that Andy posts right after the Post publishes, refused on Instagram and TikTok — optional xCommunity { id, shareWithFollowers }, X only: id is a community saved on the Post's X connection (list_connections xCommunities) and publishes the Post to that X Community instead of the author's timeline, shareWithFollowers:true also shows it to the author's followers — idempotencyKey; for an X Article send article { title, body, coverMediaAssetId? } instead of text, only on a connection whose capabilities.formats include article: the body is the User's exact Markdown, stored as sent, with inline images as ![caption](media:<mediaAssetId>) from manage_media; the cover and images are JPEG/PNG up to 5 MB; an Article takes no mediaAssetId, firstComment or xCommunity), "approve" (postId plus either a required future scheduledAt in epoch milliseconds or an explicit publishNow:true that publishes immediately and rejects scheduledAt; Owner/Admin only, never the default), "reject", "reschedule", "edit" (an Article takes article, replaced whole, and refuses text; firstComment null removes it; xCommunity { id, shareWithFollowers } retargets an X Post, null sends it back to the author's timeline), "cancel", "dismiss" (postId plus an optional note; Owner/Admin only, for failed posts and approved posts with an unknown publishState — lands rejected with terminalReason dismissed, never publishes), "pause", "resume" and "retry_first_comment" (posts a failed first comment again, never republishes the Post; list_posts shows firstComment.state; after a reconnect it follows the replacement connection, and an optional connectionId from list_connections picks one explicitly). Pause stops queued delivery while keeping approval. Resume requires a new explicit future scheduledAt and the same grants as scheduling. Rescheduling a paused Post keeps it paused. Saving never implies publication (#2140): request_approval always files the Post as pending_approval with no dispatch; schedule requires an explicit future scheduledAt; publish_now and approve with publishNow:true are explicitly immediate and reject scheduledAt. Members may only request approval; schedule and publish_now need Owner/Admin. A Workspace API Key needs content:write, plus content:schedule for schedule, content:publish for publish_now, and content:approve plus content:schedule to approve (content:publish instead of content:schedule for an approve with publishNow:true). Each action accepts only its own fields; postId comes straight from a list_posts row and create's optional connectionId from a list_connections row or the same list_posts row. Entitlement, role, lifecycle, scheduling and idempotency gates are unchanged.

  • Composes: approve → content.post.approve; reject → content.post.reject; reschedule → content.post.reschedule; pause → content.post.pause; resume → content.post.resume; create → content.post.create; edit → content.post.edit; cancel → content.post.cancel; retry_first_comment → content.post.retry_first_comment; dismiss → content.post.dismiss
  • Actions: approve, reject, reschedule, pause, resume, create, edit, cancel, retry_first_comment, dismiss
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "approve",
        "reject",
        "reschedule",
        "pause",
        "resume",
        "create",
        "edit",
        "cancel",
        "retry_first_comment",
        "dismiss"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "postId": {
      "type": "string",
      "minLength": 1
    },
    "scheduledAt": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "consentAccepted": {
      "type": "boolean"
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "publishNow": {
      "type": "boolean",
      "const": true
    },
    "note": {
      "type": "string",
      "maxLength": 2000
    },
    "channel": {
      "type": "string",
      "enum": [
        "x",
        "linkedin",
        "instagram",
        "tiktok"
      ]
    },
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 25000
    },
    "targetType": {
      "type": "string",
      "enum": [
        "personal_profile",
        "company_page"
      ]
    },
    "mediaAssetId": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "tiktokSettings": {
      "type": "object",
      "properties": {
        "privacyLevel": {
          "type": "string",
          "enum": [
            "PUBLIC_TO_EVERYONE",
            "MUTUAL_FOLLOW_FRIENDS",
            "FOLLOWER_OF_CREATOR",
            "SELF_ONLY"
          ]
        },
        "commentEnabled": {
          "type": "boolean"
        },
        "duetEnabled": {
          "type": "boolean"
        },
        "stitchEnabled": {
          "type": "boolean"
        },
        "commercialContent": {
          "type": "string",
          "enum": [
            "off",
            "own_brand",
            "branded",
            "both"
          ]
        },
        "consentAccepted": {
          "type": "boolean"
        }
      },
      "required": [
        "privacyLevel"
      ],
      "additionalProperties": false
    },
    "firstComment": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 1250
        },
        {
          "type": "null"
        }
      ]
    },
    "xCommunity": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[0-9]{1,19}$"
            },
            "shareWithFollowers": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "shareWithFollowers"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "connectionId": {
      "type": "string",
      "minLength": 1
    },
    "intent": {
      "type": "string",
      "enum": [
        "request_approval",
        "schedule",
        "publish_now"
      ]
    },
    "article": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1000
        },
        "body": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100000
        },
        "coverMediaAssetId": {
          "type": "string",
          "minLength": 1
        }
      },
      "required": [
        "title",
        "body"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: approve (variant 1)",
      "properties": {
        "action": {
          "const": "approve"
        }
      },
      "required": [
        "action",
        "postId",
        "scheduledAt"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: approve (variant 2)",
      "properties": {
        "action": {
          "const": "approve"
        }
      },
      "required": [
        "action",
        "postId",
        "publishNow"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "scheduledAt"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: reject",
      "properties": {
        "action": {
          "const": "reject"
        }
      },
      "required": [
        "action",
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "scheduledAt"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: reschedule",
      "properties": {
        "action": {
          "const": "reschedule"
        }
      },
      "required": [
        "action",
        "postId",
        "scheduledAt"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: pause",
      "properties": {
        "action": {
          "const": "pause"
        }
      },
      "required": [
        "action",
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "scheduledAt"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: resume",
      "properties": {
        "action": {
          "const": "resume"
        }
      },
      "required": [
        "action",
        "postId",
        "scheduledAt"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: create (variant 1)",
      "properties": {
        "action": {
          "const": "create"
        }
      },
      "required": [
        "action",
        "channel",
        "text"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "postId"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: create (variant 2)",
      "properties": {
        "action": {
          "const": "create"
        }
      },
      "required": [
        "action",
        "channel",
        "article"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "postId"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          }
        ]
      }
    },
    {
      "title": "action: edit",
      "properties": {
        "action": {
          "const": "edit"
        }
      },
      "required": [
        "action",
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          }
        ]
      }
    },
    {
      "title": "action: cancel",
      "properties": {
        "action": {
          "const": "cancel"
        }
      },
      "required": [
        "action",
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "scheduledAt"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: retry_first_comment",
      "properties": {
        "action": {
          "const": "retry_first_comment"
        }
      },
      "required": [
        "action",
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "scheduledAt"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "note"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    },
    {
      "title": "action: dismiss",
      "properties": {
        "action": {
          "const": "dismiss"
        }
      },
      "required": [
        "action",
        "postId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "scheduledAt"
            ]
          },
          {
            "required": [
              "consentAccepted"
            ]
          },
          {
            "required": [
              "publishNow"
            ]
          },
          {
            "required": [
              "channel"
            ]
          },
          {
            "required": [
              "text"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "mediaAssetId"
            ]
          },
          {
            "required": [
              "tiktokSettings"
            ]
          },
          {
            "required": [
              "firstComment"
            ]
          },
          {
            "required": [
              "xCommunity"
            ]
          },
          {
            "required": [
              "connectionId"
            ]
          },
          {
            "required": [
              "intent"
            ]
          },
          {
            "required": [
              "article"
            ]
          }
        ]
      }
    }
  ]
}

manage_media

Workspace media actions: upload_bytes stores a PNG/JPEG up to 3 MB through JSON with bytesBase64, contentType, fileName and idempotencyKey. It returns a reusable photo asset; same-key same-bytes replays return that asset. Larger files use these transfer actions: "prepare" (fileName, contentType image/jpeg|image/png|video/mp4, byteSize within the 10,000,000-byte image / 100,000,000-byte video caps, sha256 hex digest of the exact file bytes, idempotencyKey) returns a preparationId, uploadUrl, partSizeBytes, partCount, and uploadToken; send the file to the session endpoint one part at a time with standard library HTTP calls — POST ?preparation=&index=<0-based part> with header X-Andy-Upload-Token and the raw byte slice as the body — then "complete" (preparationId, uploadToken, sourceType, idempotencyKey) to assemble, validate, and create the reusable asset whose kind the server derives from measured bytes. Completion takes no storage id: the server owns every stored object, so bytes sent under another session can never be claimed. Replaying prepare with the same key recovers the same live session; "list" and "inspect" read assets back so their id can be reused as mediaAssetId on manage_post create or edit; an MP4 publishes on X, LinkedIn, TikTok, and Instagram (as a Reel). Anyone permitted to create Posts may upload, including Members attaching an image or video to a draft for approval. Video bytes never travel in model messages and no web handoff or user-copied IDs are involved. Entitlement, workspace ownership, idempotency, and Post approval gates are unchanged.

  • Composes: upload_bytes → content.media.upload_bytes; prepare → content.media.upload_prepare; complete → content.media.upload_complete; list → content.media.list; inspect → content.media.inspect
  • Actions: upload_bytes, prepare, complete, list, inspect
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "upload_bytes",
        "prepare",
        "complete",
        "list",
        "inspect"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "bytesBase64": {
      "type": "string",
      "minLength": 4,
      "maxLength": 4000000
    },
    "contentType": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "image/png",
            "image/jpeg"
          ]
        },
        {
          "type": "string",
          "enum": [
            "image/jpeg",
            "image/png",
            "video/mp4"
          ]
        }
      ]
    },
    "fileName": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        {
          "type": "string",
          "minLength": 1
        }
      ]
    },
    "sourceRef": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 500
        },
        {
          "type": "string",
          "minLength": 1
        }
      ]
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "byteSize": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "sha256": {
      "type": "string",
      "minLength": 64,
      "maxLength": 64
    },
    "preparationId": {
      "type": "string",
      "minLength": 1
    },
    "uploadToken": {
      "type": "string",
      "minLength": 1
    },
    "sourceType": {
      "type": "string",
      "enum": [
        "bsale_product",
        "catalog_product",
        "upload"
      ]
    },
    "pieceId": {
      "type": "string",
      "minLength": 1
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "assetId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: upload_bytes",
      "properties": {
        "action": {
          "const": "upload_bytes"
        }
      },
      "required": [
        "action",
        "bytesBase64",
        "contentType",
        "fileName"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "byteSize"
            ]
          },
          {
            "required": [
              "sha256"
            ]
          },
          {
            "required": [
              "preparationId"
            ]
          },
          {
            "required": [
              "uploadToken"
            ]
          },
          {
            "required": [
              "sourceType"
            ]
          },
          {
            "required": [
              "pieceId"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "assetId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: prepare",
      "properties": {
        "action": {
          "const": "prepare"
        }
      },
      "required": [
        "action",
        "fileName",
        "contentType",
        "byteSize",
        "sha256"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "bytesBase64"
            ]
          },
          {
            "required": [
              "sourceRef"
            ]
          },
          {
            "required": [
              "preparationId"
            ]
          },
          {
            "required": [
              "uploadToken"
            ]
          },
          {
            "required": [
              "sourceType"
            ]
          },
          {
            "required": [
              "pieceId"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "assetId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: complete",
      "properties": {
        "action": {
          "const": "complete"
        }
      },
      "required": [
        "action",
        "preparationId",
        "uploadToken",
        "sourceType"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "bytesBase64"
            ]
          },
          {
            "required": [
              "contentType"
            ]
          },
          {
            "required": [
              "fileName"
            ]
          },
          {
            "required": [
              "byteSize"
            ]
          },
          {
            "required": [
              "sha256"
            ]
          },
          {
            "required": [
              "pieceId"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "assetId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: list",
      "properties": {
        "action": {
          "const": "list"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "bytesBase64"
            ]
          },
          {
            "required": [
              "contentType"
            ]
          },
          {
            "required": [
              "fileName"
            ]
          },
          {
            "required": [
              "sourceRef"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "byteSize"
            ]
          },
          {
            "required": [
              "sha256"
            ]
          },
          {
            "required": [
              "preparationId"
            ]
          },
          {
            "required": [
              "uploadToken"
            ]
          },
          {
            "required": [
              "sourceType"
            ]
          },
          {
            "required": [
              "assetId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "assetId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "bytesBase64"
            ]
          },
          {
            "required": [
              "contentType"
            ]
          },
          {
            "required": [
              "fileName"
            ]
          },
          {
            "required": [
              "sourceRef"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "byteSize"
            ]
          },
          {
            "required": [
              "sha256"
            ]
          },
          {
            "required": [
              "preparationId"
            ]
          },
          {
            "required": [
              "uploadToken"
            ]
          },
          {
            "required": [
              "sourceType"
            ]
          },
          {
            "required": [
              "pieceId"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          }
        ]
      }
    }
  ]
}

list_connections

List every publish destination of the selected Workspace: one row per target, each with its human label (handle or destination name), provider, state, capabilities, weekly postingSchedule (timeZone plus { day 0 = Sunday … 6 = Saturday, time HH:mm } slots) and, on X, the saved xCommunities ({ id, name }) a Post may target. The connectionId a list_posts row carries and the label here are the same destination, so a model picks by name and feeds manage_post create without a human-typed id.

  • Composes: content.connection.list
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "cursor": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "additionalProperties": false
}

manage_connection

Manage one social publishing connection. "connect" prepares a browser handoff for the user to grant provider consent; it does not connect silently. Supply provider and agentId from list_connections; include connectionId to reconnect the exact account. "inspect" reads an exact connection. "preflight" checks readiness and may refresh credentials; follow state and nextAction, because connected does not always mean ready to publish. For TikTok publishing review use refreshCreator:true, inspect until checkPending clears and fetchedAt advances, and stop on a failed creator check. "disconnect" requires connectionId and confirm containing that same exact ID; it removes the account from the Workspace (it leaves list_connections, including an already-disconnected row) and cancels Posts still waiting on it, while published Posts keep their history. Disconnect and preflight accept idempotencyKey for safe retries; connect prepares a read-only handoff and does not accept that field. "set_posting_slots" replaces the connection's weekly posting slots (connectionId, slots as { day 0 = Sunday … 6 = Saturday, time "HH:mm" } rows for the whole week, optional IANA timeZone); new and pending Posts are proposed at the next free slot, explicit and approved times never move, and an empty list falls back to the next full hour. "add_x_community" saves an X Community on an X connection (connectionId, community as the numeric id or https://x.com/i/communities/, name) so Posts can target it with xCommunity; "remove_x_community" removes one (connectionId, communityId). X connections only. Connect and disconnect require a Workspace API Key with content:connections. OAuth may inspect, preflight, set posting slots and manage X Communities under the existing administrator gates.

  • Composes: connect → content.connection.connect; inspect → content.connection.inspect; preflight → content.connection.preflight; disconnect → content.connection.disconnect; set_posting_slots → content.connection.set_posting_slots; add_x_community → content.connection.add_x_community; remove_x_community → content.connection.remove_x_community
  • Actions: connect, inspect, preflight, disconnect, set_posting_slots, add_x_community, remove_x_community
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "connect",
        "inspect",
        "preflight",
        "disconnect",
        "set_posting_slots",
        "add_x_community",
        "remove_x_community"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "provider": {
      "type": "string",
      "enum": [
        "x",
        "linkedin",
        "instagram",
        "tiktok"
      ]
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "connectionId": {
      "type": "string",
      "minLength": 1
    },
    "targetType": {
      "type": "string",
      "enum": [
        "personal_profile",
        "company_page"
      ]
    },
    "organizationId": {
      "type": "string",
      "minLength": 1
    },
    "displayName": {
      "type": "string",
      "minLength": 1
    },
    "refreshCreator": {
      "type": "boolean"
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "confirm": {
      "type": "string",
      "minLength": 1
    },
    "slots": {
      "maxItems": 70,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "day": {
            "type": "integer",
            "minimum": 0,
            "maximum": 6
          },
          "time": {
            "type": "string",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
          }
        },
        "required": [
          "day",
          "time"
        ],
        "additionalProperties": false
      }
    },
    "timeZone": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "community": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "communityId": {
      "type": "string",
      "pattern": "^[0-9]{1,19}$"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: connect",
      "properties": {
        "action": {
          "const": "connect"
        }
      },
      "required": [
        "action",
        "provider",
        "agentId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "refreshCreator"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "slots"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "community"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "communityId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "connectionId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "provider"
            ]
          },
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "organizationId"
            ]
          },
          {
            "required": [
              "displayName"
            ]
          },
          {
            "required": [
              "refreshCreator"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "slots"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "community"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "communityId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: preflight",
      "properties": {
        "action": {
          "const": "preflight"
        }
      },
      "required": [
        "action",
        "connectionId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "provider"
            ]
          },
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "organizationId"
            ]
          },
          {
            "required": [
              "displayName"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "slots"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "community"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "communityId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: disconnect",
      "properties": {
        "action": {
          "const": "disconnect"
        }
      },
      "required": [
        "action",
        "connectionId",
        "confirm"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "provider"
            ]
          },
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "organizationId"
            ]
          },
          {
            "required": [
              "displayName"
            ]
          },
          {
            "required": [
              "refreshCreator"
            ]
          },
          {
            "required": [
              "slots"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "community"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "communityId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: set_posting_slots",
      "properties": {
        "action": {
          "const": "set_posting_slots"
        }
      },
      "required": [
        "action",
        "connectionId",
        "slots"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "provider"
            ]
          },
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "organizationId"
            ]
          },
          {
            "required": [
              "displayName"
            ]
          },
          {
            "required": [
              "refreshCreator"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "community"
            ]
          },
          {
            "required": [
              "name"
            ]
          },
          {
            "required": [
              "communityId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: add_x_community",
      "properties": {
        "action": {
          "const": "add_x_community"
        }
      },
      "required": [
        "action",
        "connectionId",
        "community",
        "name"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "provider"
            ]
          },
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "organizationId"
            ]
          },
          {
            "required": [
              "displayName"
            ]
          },
          {
            "required": [
              "refreshCreator"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "slots"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "communityId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: remove_x_community",
      "properties": {
        "action": {
          "const": "remove_x_community"
        }
      },
      "required": [
        "action",
        "connectionId",
        "communityId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "provider"
            ]
          },
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "targetType"
            ]
          },
          {
            "required": [
              "organizationId"
            ]
          },
          {
            "required": [
              "displayName"
            ]
          },
          {
            "required": [
              "refreshCreator"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "slots"
            ]
          },
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "community"
            ]
          },
          {
            "required": [
              "name"
            ]
          }
        ]
      }
    }
  ]
}

list_knowledge

Without sourceId, list an Agent's current Knowledge Sources with their processing state. With sourceId, inspect exactly that Source, its active and pending revisions and its current processing state — call it again to observe processing finish. Omitted, agentId is resolved server-side: from the Source's own owning Agent when sourceId is given, otherwise from the Workspace's sole active Agent.

  • Composes: knowledge_source.list, knowledge_source.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "sourceId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "list",
      "required": [],
      "not": {
        "anyOf": [
          {
            "required": [
              "sourceId"
            ]
          }
        ]
      }
    },
    {
      "title": "inspect",
      "required": [
        "sourceId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          }
        ]
      }
    }
  ]
}

add_knowledge

Add one reviewed, content-addressed Knowledge Source to an Agent and return its current processing state. Omitted, agentId resolves to the Workspace's sole active Agent. Adding never overwrites live Knowledge: a key already in use is refused. digest is optional: omitted, Andy computes it from the exact content; a supplied digest must match. A Workspace API Key needs knowledge_source:write; a signed-in User must be the Workspace Owner or an Admin.

  • Composes: knowledge_source.add
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "key": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 240
    },
    "provenance": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "repository",
            "url",
            "manual"
          ]
        },
        "uri": {
          "type": "string",
          "minLength": 1,
          "maxLength": 2000
        }
      },
      "required": [
        "kind",
        "uri"
      ]
    },
    "revision": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "digest": {
      "type": "string",
      "pattern": "^sha256:[a-f0-9]{64}$"
    },
    "required": {
      "default": true,
      "type": "boolean"
    },
    "content": {
      "type": "string",
      "minLength": 1
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "key",
    "title",
    "provenance",
    "revision",
    "content"
  ],
  "additionalProperties": false
}

replace_knowledge

Privately process a replacement revision while retaining last-good Knowledge. digest is optional: omitted, Andy computes it from the exact content; a supplied digest must match.

  • Composes: knowledge_source.replace
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 240
    },
    "provenance": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "repository",
            "url",
            "manual"
          ]
        },
        "uri": {
          "type": "string",
          "minLength": 1,
          "maxLength": 2000
        }
      },
      "required": [
        "kind",
        "uri"
      ]
    },
    "revision": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "digest": {
      "type": "string",
      "pattern": "^sha256:[a-f0-9]{64}$"
    },
    "required": {
      "default": true,
      "type": "boolean"
    },
    "content": {
      "type": "string",
      "minLength": 1
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sourceId": {
      "type": "string",
      "minLength": 1
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "title",
    "provenance",
    "revision",
    "content",
    "sourceId"
  ],
  "additionalProperties": false
}

delete_knowledge

Delete one Knowledge Source so the Agent stops answering from it. Requires tombstone true, prune true and confirm containing the exact sourceId from list_knowledge. The owning Agent is derived from sourceId. A Workspace API Key needs knowledge_source:write; a signed-in User must be the Workspace Owner or an Admin.

  • Composes: knowledge_source.delete
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "sourceId": {
      "type": "string",
      "minLength": 1
    },
    "tombstone": {
      "type": "boolean",
      "const": true
    },
    "prune": {
      "type": "boolean",
      "const": true
    },
    "confirm": {
      "type": "string",
      "minLength": 1
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "sourceId",
    "tombstone",
    "prune",
    "confirm"
  ],
  "additionalProperties": false
}

manage_outreach_batch

One closed set of simplified outreach batch actions (Andesphere only) chosen by action: "prepare" (campaignId + target sending day YYYY-MM-DD — snapshots eligible review rows without accepting anything), "inspect" (campaignId + batchId — every row carries the rowId and rowRevision revise and approve take), "revise" (rowId + expected row revision + optional subject/body/selected — edits bump the row revision with explicit edit provenance), "approve" (batchId + batch revision + row revisions + a stable requestKey — the single Owner/Admin decision; replaying the same key returns the original receipts, a changed payload under it is refused) and "defer" (parks an open batch with nothing approved). A Workspace API Key needs agent:write for writes and agent:read for inspect; User callers need Owner/Admin for writes.

  • Composes: prepare → outreach.batch.prepare; inspect → outreach.batch.inspect; revise → outreach.batch.revise; approve → outreach.batch.approve; defer → outreach.batch.defer
  • Actions: prepare, inspect, revise, approve, defer
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "prepare",
        "inspect",
        "revise",
        "approve",
        "defer"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "campaignId": {
      "type": "string",
      "minLength": 1
    },
    "targetSendingDay": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "batchId": {
      "type": "string",
      "minLength": 1
    },
    "rowId": {
      "type": "string",
      "minLength": 1
    },
    "expectedRowRevision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "subject": {
      "type": "string",
      "minLength": 2,
      "maxLength": 80
    },
    "body": {
      "type": "string",
      "minLength": 10,
      "maxLength": 5000
    },
    "followupSubject": {
      "type": "string",
      "maxLength": 80
    },
    "followupBody": {
      "type": "string",
      "maxLength": 5000
    },
    "selected": {
      "type": "boolean"
    },
    "batchRevision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "rows": {
      "minItems": 1,
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "rowId": {
            "type": "string",
            "minLength": 1
          },
          "rowRevision": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "rowId",
          "rowRevision"
        ],
        "additionalProperties": false
      }
    },
    "requestKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: prepare",
      "properties": {
        "action": {
          "const": "prepare"
        }
      },
      "required": [
        "action",
        "campaignId",
        "targetSendingDay"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "batchId"
            ]
          },
          {
            "required": [
              "rowId"
            ]
          },
          {
            "required": [
              "expectedRowRevision"
            ]
          },
          {
            "required": [
              "subject"
            ]
          },
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "followupSubject"
            ]
          },
          {
            "required": [
              "followupBody"
            ]
          },
          {
            "required": [
              "selected"
            ]
          },
          {
            "required": [
              "batchRevision"
            ]
          },
          {
            "required": [
              "rows"
            ]
          },
          {
            "required": [
              "requestKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "campaignId",
        "batchId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "targetSendingDay"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "rowId"
            ]
          },
          {
            "required": [
              "expectedRowRevision"
            ]
          },
          {
            "required": [
              "subject"
            ]
          },
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "followupSubject"
            ]
          },
          {
            "required": [
              "followupBody"
            ]
          },
          {
            "required": [
              "selected"
            ]
          },
          {
            "required": [
              "batchRevision"
            ]
          },
          {
            "required": [
              "rows"
            ]
          },
          {
            "required": [
              "requestKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: revise",
      "properties": {
        "action": {
          "const": "revise"
        }
      },
      "required": [
        "action",
        "campaignId",
        "batchId",
        "rowId",
        "expectedRowRevision"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "targetSendingDay"
            ]
          },
          {
            "required": [
              "batchRevision"
            ]
          },
          {
            "required": [
              "rows"
            ]
          },
          {
            "required": [
              "requestKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: approve",
      "properties": {
        "action": {
          "const": "approve"
        }
      },
      "required": [
        "action",
        "campaignId",
        "batchId",
        "batchRevision",
        "rows",
        "requestKey"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "targetSendingDay"
            ]
          },
          {
            "required": [
              "rowId"
            ]
          },
          {
            "required": [
              "expectedRowRevision"
            ]
          },
          {
            "required": [
              "subject"
            ]
          },
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "followupSubject"
            ]
          },
          {
            "required": [
              "followupBody"
            ]
          },
          {
            "required": [
              "selected"
            ]
          }
        ]
      }
    },
    {
      "title": "action: defer",
      "properties": {
        "action": {
          "const": "defer"
        }
      },
      "required": [
        "action",
        "campaignId",
        "batchId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "rowId"
            ]
          },
          {
            "required": [
              "expectedRowRevision"
            ]
          },
          {
            "required": [
              "subject"
            ]
          },
          {
            "required": [
              "body"
            ]
          },
          {
            "required": [
              "followupSubject"
            ]
          },
          {
            "required": [
              "followupBody"
            ]
          },
          {
            "required": [
              "selected"
            ]
          },
          {
            "required": [
              "batchRevision"
            ]
          },
          {
            "required": [
              "rows"
            ]
          },
          {
            "required": [
              "requestKey"
            ]
          }
        ]
      }
    }
  ]
}

manage_outreach_preparation

One closed set of suitable preparation actions (Andesphere only) chosen by action: "start" (campaignId + optional target sending day YYYY-MM-DD — creates or recovers the day's run within 16 inspection and 16 verifier calls bounded by confirmed free allowance; capacity is checked before any external call), "resume" (campaignId + optional preparation day — continues persisted work without new spend) and "inspect" (campaignId + optional preparation day — status, ready inventory pointer and concise shortage reasons). Preparation can never approve or send. A Workspace API Key needs agent:write for start/resume and agent:read for inspect; User callers need Owner/Admin for writes.

  • Composes: start → outreach.preparation.start; resume → outreach.preparation.resume; inspect → outreach.preparation.inspect
  • Actions: start, resume, inspect
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "start",
        "resume",
        "inspect"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "campaignId": {
      "type": "string",
      "minLength": 1
    },
    "targetSendingDay": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "preparationDay": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: start",
      "properties": {
        "action": {
          "const": "start"
        }
      },
      "required": [
        "action",
        "campaignId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "preparationDay"
            ]
          }
        ]
      }
    },
    {
      "title": "action: resume",
      "properties": {
        "action": {
          "const": "resume"
        }
      },
      "required": [
        "action",
        "campaignId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "targetSendingDay"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "campaignId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "targetSendingDay"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    }
  ]
}

manage_outreach_outcomes

One closed set of genuine-reply and outcome actions (Andesphere only) chosen by action: "inspect" (campaignId — business-level contacted/replied/demo/customer/unknown counts with evidence semantics; only authenticated genuine human replies count, synthetic fixture rows are excluded from real counts) and "record" (campaignId + contacted businessIdentity + kind demo|customer|unknown — a demo needs its booked/delivered kind plus who/when/evidence, a customer needs payment evidence or an explicitly labeled operator assertion; corrections reuse it and keep the audit trail). The record never approves or sends. A Workspace API Key needs agent:write for record and agent:read for inspect; User callers need Owner/Admin for the record.

  • Composes: inspect → outreach.outcomes.inspect; record → outreach.outcomes.record
  • Actions: inspect, record
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "record"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "campaignId": {
      "type": "string",
      "minLength": 1
    },
    "businessIdentity": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "outcomeId": {
      "type": "string",
      "minLength": 1
    },
    "expectedRevision": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "kind": {
      "type": "string",
      "enum": [
        "demo",
        "customer",
        "unknown"
      ]
    },
    "demoKind": {
      "type": "string",
      "enum": [
        "booked",
        "delivered"
      ]
    },
    "contactName": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "occurredAt": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "evidence": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "paymentEvidence": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "operatorAsserted": {
      "type": "boolean"
    },
    "assertionNote": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "campaignId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "businessIdentity"
            ]
          },
          {
            "required": [
              "outcomeId"
            ]
          },
          {
            "required": [
              "expectedRevision"
            ]
          },
          {
            "required": [
              "kind"
            ]
          },
          {
            "required": [
              "demoKind"
            ]
          },
          {
            "required": [
              "contactName"
            ]
          },
          {
            "required": [
              "occurredAt"
            ]
          },
          {
            "required": [
              "evidence"
            ]
          },
          {
            "required": [
              "paymentEvidence"
            ]
          },
          {
            "required": [
              "operatorAsserted"
            ]
          },
          {
            "required": [
              "assertionNote"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: record",
      "properties": {
        "action": {
          "const": "record"
        }
      },
      "required": [
        "action",
        "campaignId",
        "businessIdentity",
        "kind"
      ]
    }
  ]
}

list_contacts

List one Agent's unique people, newest interaction first. population "leads" excludes booked Contacts; "booked" selects them; "all" is the default. status selects active or discarded people. query matches name/email/phone across the full population through bounded continuation, never just loaded rows. A page can be empty while meta.nextCursor remains. countsOnly returns no person rows and retains the same bounded authorised traversal, for reactive totals. counts.population and counts.matched accumulate through the traversal and are exact only when counts.complete is true. Restart traversal after a write; concurrent population changes are not a frozen snapshot. Use each row's contactId for inspect/discard/restore. Continue with the same scope and filter until meta.nextCursor is absent. A Workspace API Key needs agent:read.

  • Composes: contact.list
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "status": {
      "default": "active",
      "type": "string",
      "enum": [
        "active",
        "discarded"
      ]
    },
    "population": {
      "default": "all",
      "type": "string",
      "enum": [
        "all",
        "leads",
        "booked"
      ]
    },
    "query": {
      "type": "string",
      "maxLength": 200
    },
    "countsOnly": {
      "default": false,
      "type": "boolean"
    },
    "cursor": {
      "type": "string",
      "minLength": 1
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  },
  "additionalProperties": false
}

manage_contact

action "inspect" reads the person and bounded capture history with authorised Conversation destinations using agentId and exactly one contactId from list_contacts or sessionId from list_conversations. action "discard" removes one Contact from Leads and broadcast audiences with reason "test" or "not_qualified"; nothing is deleted and the person stays discarded if they write again. action "restore" puts a discarded Contact back. Both take the contactId straight from a list_contacts row. A Workspace API Key needs agent:write.

  • Composes: inspect → contact.inspect; discard → contact.discard; restore → contact.restore
  • Actions: inspect, discard, restore
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "discard",
        "restore"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "agentId": {
      "type": "string",
      "minLength": 1
    },
    "cursor": {
      "type": "string",
      "minLength": 1
    },
    "pageSize": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    },
    "contactId": {
      "type": "string",
      "minLength": 1
    },
    "sessionId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "enum": [
        "test",
        "not_qualified"
      ]
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect (variant 1)",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "agentId",
        "contactId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "sessionId"
            ]
          },
          {
            "required": [
              "reason"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: inspect (variant 2)",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action",
        "agentId",
        "sessionId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "contactId"
            ]
          },
          {
            "required": [
              "reason"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: discard",
      "properties": {
        "action": {
          "const": "discard"
        }
      },
      "required": [
        "action",
        "contactId",
        "reason"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "sessionId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: restore",
      "properties": {
        "action": {
          "const": "restore"
        }
      },
      "required": [
        "action",
        "contactId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "agentId"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          },
          {
            "required": [
              "pageSize"
            ]
          },
          {
            "required": [
              "sessionId"
            ]
          },
          {
            "required": [
              "reason"
            ]
          }
        ]
      }
    }
  ]
}

manage_telegram_connection

Inspect or disconnect your own Telegram connection. Prepare and confirm return an App handoff: open appPath and use the connection page; assistants never receive proof tokens. Each member connects their own account.

  • Composes: inspect → assistant.telegram.inspect; prepare → assistant.telegram.prepare; confirm → assistant.telegram.confirm; disconnect → assistant.telegram.disconnect
  • Actions: inspect, prepare, confirm, disconnect
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "prepare",
        "confirm",
        "disconnect"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "challengeId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "challengeId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: prepare",
      "properties": {
        "action": {
          "const": "prepare"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "challengeId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: confirm",
      "properties": {
        "action": {
          "const": "confirm"
        }
      },
      "required": [
        "action",
        "challengeId"
      ]
    },
    {
      "title": "action: disconnect",
      "properties": {
        "action": {
          "const": "disconnect"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "challengeId"
            ]
          }
        ]
      }
    }
  ]
}

manage_affiliate

The signed-in User's place in the Andy affiliate program (50% of what referred Workspaces pay for 12 months). action "get" answers "how much have I earned?": the Referral Link, clicks, referred signups, paying Referrals and earnings in USD cents (Andy Credit applied and pending, Cash Owed, cash paid, cash payable against the US$20 minimum); affiliate is null until the User joins. action "join" needs acceptTermsVersion after the User read and accepted the terms at andypartner.com/legal/afiliados; never accept them on the User's behalf. action "update" sets payoutMethod (wise or paypal) and payoutEmail for cash payouts, together, and creditWorkspaceId: which of stats.creditWorkspaces (the User's own paying Workspaces) receives Andy Credit. It belongs to the User, not the Workspace.

  • Composes: get → affiliate.get; join → affiliate.join; update → affiliate.update
  • Actions: get, join, update
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "get",
        "join",
        "update"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "acceptTermsVersion": {
      "type": "string",
      "const": "2026-09-27"
    },
    "payoutMethod": {
      "type": "string",
      "enum": [
        "wise",
        "paypal"
      ]
    },
    "payoutEmail": {
      "type": "string",
      "maxLength": 254,
      "format": "email",
      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "creditWorkspaceId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: get",
      "properties": {
        "action": {
          "const": "get"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "acceptTermsVersion"
            ]
          },
          {
            "required": [
              "payoutMethod"
            ]
          },
          {
            "required": [
              "payoutEmail"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "creditWorkspaceId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: join",
      "properties": {
        "action": {
          "const": "join"
        }
      },
      "required": [
        "action",
        "acceptTermsVersion"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "creditWorkspaceId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: update",
      "properties": {
        "action": {
          "const": "update"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "acceptTermsVersion"
            ]
          }
        ]
      }
    }
  ]
}

manage_workspace_time_zone

action "inspect" reads the selected Workspace's IANA time zone (source "default" means none is set and America/Santiago applies). action "set" stores one, e.g. "Europe/London"; Owner/Admin only. Dates in the App and Owner emails use it.

  • Composes: inspect → workspace.time_zone.inspect; set → workspace.time_zone.set
  • Actions: inspect, set
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "inspect",
        "set"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "timeZone": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: inspect",
      "properties": {
        "action": {
          "const": "inspect"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "timeZone"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          }
        ]
      }
    },
    {
      "title": "action: set",
      "properties": {
        "action": {
          "const": "set"
        }
      },
      "required": [
        "action",
        "timeZone"
      ]
    }
  ]
}

get_workspace_billing

Facturación for the selected Workspace, read live from Stripe: the plan (name, list price, status, next charge date and amount after discounts and account credit, card), the Billing Details on every invoice (legal name, billing email, address) and each tax ID with its Tax Registration Status and the statement that confirms it. needsPaymentMethod means the Owner must add a card before the next renewal. Owner only.

  • Composes: workspace.billing.inspect
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

manage_workspace_billing

action "portal_session" returns a fresh Stripe billing portal URL for the Owner to open: flow "manage" (card, plan, cancel), "payment_method" (add a card) or "details" (legal name, address, tax IDs; changes apply to future invoices). Give the URL to the Owner; it expires. action "set_tax_registration" confirms (confirmed true) or removes (confirmed false) the Tax Registration Status of one tax ID from get_workspace_billing: before confirming, show the Owner that tax ID's exact statement in their language and confirm only when they agree, with that language's wordingVersion. Never confirm on the Owner's behalf. Owner only.

  • Composes: portal_session → workspace.billing.portal_session.create; set_tax_registration → workspace.billing.tax_registration.set
  • Actions: portal_session, set_tax_registration
  • Annotations: readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "portal_session",
        "set_tax_registration"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "flow": {
      "type": "string",
      "enum": [
        "manage",
        "payment_method",
        "details"
      ]
    },
    "stripeTaxIdId": {
      "type": "string",
      "pattern": "^txi_"
    },
    "confirmed": {
      "type": "boolean"
    },
    "wordingVersion": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: portal_session",
      "properties": {
        "action": {
          "const": "portal_session"
        }
      },
      "required": [
        "action",
        "flow"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "stripeTaxIdId"
            ]
          },
          {
            "required": [
              "confirmed"
            ]
          },
          {
            "required": [
              "wordingVersion"
            ]
          }
        ]
      }
    },
    {
      "title": "action: set_tax_registration",
      "properties": {
        "action": {
          "const": "set_tax_registration"
        }
      },
      "required": [
        "action",
        "stripeTaxIdId",
        "confirmed"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "flow"
            ]
          }
        ]
      }
    }
  ]
}

list_invoices

Facturas for the selected Workspace, live from Stripe. action "list" returns the Invoices newest first (number, date, description, period, total in its currency, paid or unpaid), history included after a cancellation; $0 trial Invoices only with includeZero, and meta.nextCursor pages further. action "link" returns a fresh link for one Invoice: kind "pdf" downloads it, kind "pay" opens Stripe's payment page for an unpaid one. For "¿cuál es mi última factura?", list, then link the first. Give the link to the Owner to open now; never store it. Owner only.

  • Composes: list → workspace.invoices.list; link → workspace.invoices.link
  • Actions: list, link
  • Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "list",
        "link"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "includeZero": {
      "type": "boolean"
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "invoiceId": {
      "type": "string",
      "pattern": "^in_"
    },
    "kind": {
      "default": "pdf",
      "type": "string",
      "enum": [
        "pdf",
        "pay"
      ]
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: list",
      "properties": {
        "action": {
          "const": "list"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "invoiceId"
            ]
          },
          {
            "required": [
              "kind"
            ]
          }
        ]
      }
    },
    {
      "title": "action: link",
      "properties": {
        "action": {
          "const": "link"
        }
      },
      "required": [
        "action",
        "invoiceId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "includeZero"
            ]
          },
          {
            "required": [
              "cursor"
            ]
          }
        ]
      }
    }
  ]
}

manage_workspace_members

The selected Workspace's team, as on the App's members page. action "list_members" returns each member's membershipId, role, name and email; any member may read it. action "list_invites" returns invitations with their status and expiry. action "invite" emails an invitation (role admin or member); it sends an email, so set confirm true only after the User agreed. It is refused with limit_exceeded when members plus pending invitations fill the plan's seats. action "revoke_invite" cancels a pending invitation by inviteId. action "change_role" makes a member an admin or a member, and action "remove" removes one, both by membershipId. The Owner cannot be changed or removed here, and nobody removes themselves: ownership transfer and leaving happen in the App. Everything but list_members is Owner/Admin only.

  • Composes: list_members → workspace.member.list; list_invites → workspace.invite.list; invite → workspace.invite.create; revoke_invite → workspace.invite.revoke; change_role → workspace.member.change_role; remove → workspace.member.remove
  • Actions: list_members, list_invites, invite, revoke_invite, change_role, remove
  • Annotations: readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true

Input schema:

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "list_members",
        "list_invites",
        "invite",
        "revoke_invite",
        "change_role",
        "remove"
      ],
      "description": "Which operation to perform. Required. Each action accepts only its own fields, listed under oneOf."
    },
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "role": {
      "type": "string",
      "enum": [
        "admin",
        "member"
      ]
    },
    "confirm": {
      "type": "boolean"
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "inviteId": {
      "type": "string",
      "minLength": 1
    },
    "membershipId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "action"
  ],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "action: list_members",
      "properties": {
        "action": {
          "const": "list_members"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "email"
            ]
          },
          {
            "required": [
              "role"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "inviteId"
            ]
          },
          {
            "required": [
              "membershipId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: list_invites",
      "properties": {
        "action": {
          "const": "list_invites"
        }
      },
      "required": [
        "action"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "email"
            ]
          },
          {
            "required": [
              "role"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "idempotencyKey"
            ]
          },
          {
            "required": [
              "inviteId"
            ]
          },
          {
            "required": [
              "membershipId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: invite",
      "properties": {
        "action": {
          "const": "invite"
        }
      },
      "required": [
        "action",
        "email",
        "role"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "inviteId"
            ]
          },
          {
            "required": [
              "membershipId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: revoke_invite",
      "properties": {
        "action": {
          "const": "revoke_invite"
        }
      },
      "required": [
        "action",
        "inviteId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "email"
            ]
          },
          {
            "required": [
              "role"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "membershipId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: change_role",
      "properties": {
        "action": {
          "const": "change_role"
        }
      },
      "required": [
        "action",
        "membershipId",
        "role"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "email"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "inviteId"
            ]
          }
        ]
      }
    },
    {
      "title": "action: remove",
      "properties": {
        "action": {
          "const": "remove"
        }
      },
      "required": [
        "action",
        "membershipId"
      ],
      "not": {
        "anyOf": [
          {
            "required": [
              "email"
            ]
          },
          {
            "required": [
              "role"
            ]
          },
          {
            "required": [
              "confirm"
            ]
          },
          {
            "required": [
              "inviteId"
            ]
          }
        ]
      }
    }
  ]
}

Machine-readable verification

Call tools/list and require exactly these 44 names, in this order:

[
  "get_context",
  "select_workspace",
  "get_workspace",
  "get_workspace_entitlements",
  "get_support_ticket",
  "get_support_metrics",
  "manage_support_settings",
  "reply_support_ticket",
  "manage_support_ticket",
  "manage_support_provider",
  "manage_support_installation",
  "get_agent",
  "get_agent_metrics",
  "configure_agent",
  "manage_agent",
  "manage_widget",
  "list_conversations",
  "list_conversation_messages",
  "inspect_reply_eligibility",
  "manage_handoff",
  "send_message",
  "inspect_message_submission",
  "ask_agent",
  "list_posts",
  "manage_post",
  "manage_media",
  "list_connections",
  "manage_connection",
  "list_knowledge",
  "add_knowledge",
  "replace_knowledge",
  "delete_knowledge",
  "manage_outreach_batch",
  "manage_outreach_preparation",
  "manage_outreach_outcomes",
  "list_contacts",
  "manage_contact",
  "manage_telegram_connection",
  "manage_affiliate",
  "manage_workspace_time_zone",
  "get_workspace_billing",
  "manage_workspace_billing",
  "list_invoices",
  "manage_workspace_members"
]

Then invoke get_context and require a data.selection block and a meta.requestId.

On this page