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 tool | Title | Composes | Scope |
|---|---|---|---|---|
| 1 | get_context | Get Andy context | get_context | — |
| 2 | select_workspace | Select Andy Workspace | select_workspace | — |
| 3 | get_workspace | Get Andy Workspace | workspace.inspect | — |
| 4 | get_workspace_entitlements | Get Andy Workspace Entitlements | workspace.entitlements.inspect | workspace:read |
| 5 | get_support_ticket | Get Support Ticket | support.ticket.list, support.ticket.inspect | support:read |
| 6 | get_support_metrics | Get Support Metrics | support.metrics.inspect | support:read |
| 7 | manage_support_settings | Manage Support Settings | inspect → support.settings.inspect; configure → support.settings.configure; inspect_alerts → support.alerts.inspect; configure_alerts → support.alerts.configure | support:read |
| 8 | reply_support_ticket | Reply to Support Ticket | support.ticket.reply | support:write |
| 9 | manage_support_ticket | Manage Support Ticket | note → support.ticket.note; assign → support.ticket.assign; priority → support.ticket.priority; wait → support.ticket.wait; resolve → support.ticket.resolve | support:write |
| 10 | manage_support_provider | Manage Support provider | inspect → support.provider.inspect; provision → support.provider.provision | — |
| 11 | manage_support_installation | Manage Support installation | 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 | — |
| 12 | get_agent | Get Andy Agent | agent.list, agent.inspect | — |
| 13 | get_agent_metrics | Get Agent Metrics | inspect → agent.metrics.inspect; live_now → agent.metrics.live_now | agent:read |
| 14 | configure_agent | Configure Andy Agent | agent.configure | — |
| 15 | manage_agent | Manage Andy Agent lifecycle | create → agent.create; set_purpose → agent.purpose.set; delete → agent.delete; rename_slug → agent.rename_slug | — |
| 16 | manage_widget | Manage Andy Widget | inspect → widget.inspect; configure → widget.configure | — |
| 17 | list_conversations | List Andy Conversations | conversation.list | agent:read |
| 18 | list_conversation_messages | List Andy Conversation Messages | conversation.message.list | agent:read |
| 19 | inspect_reply_eligibility | Inspect Conversation Reply Eligibility | conversation.reply_eligibility.inspect | agent:read |
| 20 | manage_handoff | Manage Conversation handoff | takeover → conversation.handoff.takeover; hand_back → conversation.handoff.hand_back | agent:write |
| 21 | send_message | Send Conversation Message | conversation.message.send | agent:write |
| 22 | inspect_message_submission | Inspect operator reply acceptance and delivery | conversation.message.submission.inspect | agent:write |
| 23 | ask_agent | Ask Andy Agent | the Agent runtime (no Tenant Operation) | — |
| 24 | list_posts | List Andy Posts | content.post.list, content.post.inspect | content:read |
| 25 | manage_post | Manage Andy Post | 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 | content:write |
| 26 | manage_media | Manage Andy Media | upload_bytes → content.media.upload_bytes; prepare → content.media.upload_prepare; complete → content.media.upload_complete; list → content.media.list; inspect → content.media.inspect | content:write, content:read |
| 27 | list_connections | List Andy Platform Connections | content.connection.list | content:connections |
| 28 | manage_connection | Manage Andy Platform Connection | 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 | content:connections |
| 29 | list_knowledge | List Agent Knowledge | knowledge_source.list, knowledge_source.inspect | — |
| 30 | add_knowledge | Add Agent Knowledge | knowledge_source.add | — |
| 31 | replace_knowledge | Replace Agent Knowledge | knowledge_source.replace | — |
| 32 | delete_knowledge | Delete Agent Knowledge | knowledge_source.delete | — |
| 33 | manage_outreach_batch | Manage outreach batch | prepare → outreach.batch.prepare; inspect → outreach.batch.inspect; revise → outreach.batch.revise; approve → outreach.batch.approve; defer → outreach.batch.defer | agent:write, agent:read |
| 34 | manage_outreach_preparation | Manage outreach preparation | start → outreach.preparation.start; resume → outreach.preparation.resume; inspect → outreach.preparation.inspect | agent:write, agent:read |
| 35 | manage_outreach_outcomes | Manage outreach outcomes | inspect → outreach.outcomes.inspect; record → outreach.outcomes.record | agent:read, agent:write |
| 36 | list_contacts | List Andy Contacts | contact.list | agent:read |
| 37 | manage_contact | Manage Andy Contact | inspect → contact.inspect; discard → contact.discard; restore → contact.restore | agent:read, agent:write |
| 38 | manage_telegram_connection | Manage your Andy Telegram connection | inspect → assistant.telegram.inspect; prepare → assistant.telegram.prepare; confirm → assistant.telegram.confirm; disconnect → assistant.telegram.disconnect | — |
| 39 | manage_affiliate | Manage your Andy affiliate program | get → affiliate.get; join → affiliate.join; update → affiliate.update | — |
| 40 | manage_workspace_time_zone | Manage Andy Workspace time zone | inspect → workspace.time_zone.inspect; set → workspace.time_zone.set | workspace:read |
| 41 | get_workspace_billing | Get Andy Workspace billing | workspace.billing.inspect | — |
| 42 | manage_workspace_billing | Manage Andy Workspace billing | portal_session → workspace.billing.portal_session.create; set_tax_registration → workspace.billing.tax_registration.set | — |
| 43 | list_invoices | List Andy Workspace invoices | list → workspace.invoices.list; link → workspace.invoices.link | — |
| 44 | manage_workspace_members | Manage Andy Workspace members | 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 | — |
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 tool | readOnlyHint | destructiveHint | idempotentHint | openWorldHint |
|---|---|---|---|---|
get_context | yes | no | yes | no |
select_workspace | no | no | yes | no |
get_workspace | yes | no | yes | no |
get_workspace_entitlements | yes | no | yes | no |
get_support_ticket | yes | no | yes | no |
get_support_metrics | yes | no | yes | no |
manage_support_settings | no | no | yes | no |
reply_support_ticket | no | no | yes | no |
manage_support_ticket | no | no | yes | no |
manage_support_provider | no | no | yes | no |
manage_support_installation | no | yes | yes | no |
get_agent | yes | no | yes | no |
get_agent_metrics | yes | no | yes | no |
configure_agent | no | yes | yes | no |
manage_agent | no | yes | no | no |
manage_widget | no | yes | yes | no |
list_conversations | yes | no | yes | no |
list_conversation_messages | yes | no | yes | no |
inspect_reply_eligibility | yes | no | yes | no |
manage_handoff | no | yes | yes | no |
send_message | no | yes | no | yes |
inspect_message_submission | yes | no | yes | no |
ask_agent | no | yes | no | yes |
list_posts | yes | no | yes | no |
manage_post | no | yes | no | yes |
manage_media | no | yes | no | no |
list_connections | yes | no | yes | no |
manage_connection | no | yes | no | yes |
list_knowledge | yes | no | yes | no |
add_knowledge | no | no | no | no |
replace_knowledge | no | yes | no | no |
delete_knowledge | no | yes | no | no |
manage_outreach_batch | no | yes | yes | no |
manage_outreach_preparation | no | no | yes | no |
manage_outreach_outcomes | no | no | yes | no |
list_contacts | yes | no | yes | no |
manage_contact | no | no | yes | no |
manage_telegram_connection | no | no | no | no |
manage_affiliate | no | no | yes | no |
manage_workspace_time_zone | no | no | yes | no |
get_workspace_billing | yes | no | yes | yes |
manage_workspace_billing | no | no | no | yes |
list_invoices | yes | no | yes | yes |
manage_workspace_members | no | yes | no | yes |
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  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.