acknowledge_agent_inbox_batch | Archive many handled inbox items in one call when clearing a backlog. Each item gets its own result, and newer activity is preserved. | agent.inbox.acknowledge_batch | Required items: 1 to 25 entries, each with event_id and exact opaque expected_revision from an inbox activity item. Marks them handled in one call and returns one result per item in the same order; use it to clear a backlog instead of one call per item. Refresh context for any stale_revision item. | AcknowledgeAgentInboxBatchCapabilityOutput | update | idempotent | None | None |
acknowledge_agent_inbox_item | Archive the exact inbox activity you handled, preserving newer activity. This does not complete an assignment or mark messages read. | agent.inbox.acknowledge | Required event_id and exact opaque expected_revision from an inbox activity item. Archives only that snapshot in your own inbox; refresh context after stale_revision. Does not mark messages read or complete an assignment. | AcknowledgeAgentInboxCapabilityOutput | update | idempotent | None | None |
add_to_conversation | Use this to add to conversation. | conversation.membership.add | conversation_id. Optional: membership_ids. | AddToConversationResponse | create | write | None | None |
answer_from_context | Ask the channel journals and Wiki a question and get a short answer that cites them. | context.answer | question (1–300 characters). Waits up to about 20 seconds for the answer; in_progress means ask the same question again, which returns the same answer without starting another. Reads only journals and Wiki pages you can read; a managed turn stays in its workspace Wiki and current channel. Requires documents:read and messages:read, and a workspace with search answers enabled. | AnswerFromContextOutput | search | read-only | None | None |
authorize_beacon | Issue a subscription-only Beacon credential using your agent API key or OAuth pairing. | beacon.authorize_beacon | Optional: ttl_seconds (integer, 60–86400; defaults to 86400). Requires an active connected agent authenticated by API key or OAuth with realtime:read. Returns a secret credential limited to inbox notifications; pass it privately to Beacon. | AuthorizeBeaconOutput | manage | write | None | None |
check_agent_inbox | Use this from a non-model preflight worker to check for pending work before waking the agent and reading its inbox. | agent.inbox.list | No inputs. Returns only has_pending_items; call get_agent_inbox when it is true. Requires a connected-agent credential. | CheckAgentInboxOutput | lookup | read-only, idempotent | None | None |
configure_agent_receiving | Configure your own HTTPS webhook receiver, or read receiving status. Requires your real provider listener URL and sender key; cannot create a provider listener. | principal.receiving.configure | Optional: webhook_url and sender_key, supplied together to register your receiver. Omit both to read status. Requires your active paired-agent OAuth connection. Obtain credentials from your runtime; Ando does not create the listener. The key is not returned, but your tool host may retain arguments. Configuration does not prove a reply. | ConfigureAgentReceivingOutput | update | destructive, idempotent | None | None |
create_channel | Use this when the user has authorized you to create a channel. | conversation.create | name. Optional: access_control_type, member_ids. | CreateConversationResponse | create | write | None | POST /conversations (createConversation) |
delete_message | Use this to delete message only after explicit user authorization. | message.delete | message_id. | DeleteMessageResponse | delete | destructive | None | DELETE /conversation-messages/{messageId} (deleteConversationMessage) |
edit_message | Replace the text of a message the caller posted, shown as edited, instead of reposting a correction or an updated list. Attachments and cards stay as they are; a miniapp URL on its own line renders the miniapp in place. | message.edit | message_id (one of your own messages), markdown_content. | EditMessageResponse | update | idempotent | None | PATCH /conversation-messages/{messageId} (updateConversationMessage) |
execute_tools | Use this to execute tools. | mcp_gateway.tool.execute | calls, each with connection_id, tool_name, and optional arguments, approval_token, approval_gateway_event_id. Use get_tool_schemas to construct the arguments. Optional: parallel (defaults to false). | GatewayInvokeToolsResponse | execute | destructive, open-world | None | None |
explain_notification_behavior | Explain whether a hypothetical event qualifies on desktop and mobile, and why delivery may be suppressed. Does not send notifications. | notification.behavior.explain | conversation_id, event, and relationships. Optional: actor_id, at, desktop_focused. Explains a hypothetical event; does not send a notification. | NotificationBehaviorExplanation | lookup | read-only, idempotent | None | None |
get_agent_inbox | Use this after the agent starts or wakes to page through durable activity that may need attention. | agent.inbox.list | Optional: cursor, limit, scope (all, activity, direct, or updates; defaults to all). Start with direct (mentions, then DMs), then check updates (subscribed threads and reactions). Use activity for all message items. Keep the same scope when continuing a page. | Page<AgentInboxItem> | list | read-only, idempotent | None | None |
get_attachment | Optional: use this to check an upload_attachment file_id if you could not read the upload response. | file.attachment.get | file_id from upload_attachment. Optional; returns its status and size_bytes if you could not read the PUT response body. | GetAttachmentOutput | lookup | read-only, idempotent | None | None |
get_call | Use this to read call. | call.get | call_id. Optional: forwarded_message_id (the readable destination message containing a newly shared Jam forward). | GetCallResponse | lookup | read-only, idempotent | None | GET /calls/{callId} (getCall) |
get_call_transcript | Use this to read call transcript. | call.transcript.get | call_id. Optional: forwarded_message_id, limit, cursor. Include the destination forward message ID on every page when using shared-call access. | GetCallTranscriptResponse | lookup | read-only, idempotent | None | GET /calls/{callId}/transcript (getCallTranscript) |
get_channel_context | Use this to read channel context. | document.channel_context.get | conversation_id. Optional: connections_cursor, connections_target. Read before updating to obtain current versions. | GetChannelContextResponse | lookup | idempotent | None | None |
get_context | Read an exact shared context page or browse a workspace, channel, or member directory. | context.get | scope (workspace, channel with conversation ID, or member with workspace membership ID). Optional: pageId, cursor, limit. Follow hasMore / nextCursor with the same request filters; restart without a cursor on CONTEXT_CURSOR_RESTART_REQUIRED. Exact page reads return revision-bound UTF-8 chunks of at most 32 KiB and reject limit (lists only). Read the current revision before editing. Member directories expose their server-designated Introduction; context:self-introduction only permits reading your own member section. | GetContextOutput | lookup | read-only, idempotent | None | None |
get_conversation_context | Use this to understand what a conversation is about and what is currently important. | conversation.channel_journal.get | conversation_id. Optional: cursor, limit. | ConversationContext | lookup | read-only, idempotent | None | None |
get_current_identity | Use this before writing when you need to confirm the workspace identity Ando will use to author the write. | principal.get | None. | CurrentIdentityOutput | lookup | read-only, idempotent | None | None |
get_file | Use this to read an accessible message attachment by file ID and receive a short-lived download URL. | file.get | file_id. Optional: fileId compatibility alias. | GetFileResponse | lookup | read-only, idempotent | None | GET /files/{fileId} (getFile) |
get_member_group | Use this to see who is in an @group, by its id or handle, such as when someone asks who is in @design. | member_group.get | Exactly one of member_group_id or handle (with or without the @, e.g. design). Returns the active group and its current members. Guests are refused. | GetMemberGroupOutput | lookup | read-only, idempotent | None | None |
get_message | Use this when you know a message ID and need that single message. | message.get | message_id. Active public-channel messages are readable before joining; non-public conversations require membership. | GetMessageResponse | lookup | read-only, idempotent | None | GET /conversation-messages/{messageId} (getConversationMessage) |
get_messages_by_time_range | Use this to page through all accessible messages in one conversation between start_at (inclusive) and end_at (exclusive), in oldest-first chronological order. Filter with roots_only and author_workspace_membership_ids when counting top-level posts by an author. | message.list_conversation_window | conversation_id, start_at (inclusive), end_at (exclusive). Optional: cursor, limit, char_budget, roots_only, author_workspace_membership_ids (up to four distinct authors). Active public channels are readable before joining; non-public conversations require membership. | TimeRangeMessagesResponse | list | read-only, idempotent | None | None |
get_miniapp_command | Use this to discover the built-in question command or a configured miniapp’s creation fields. | miniapp.command.get | command (built-in $ando.question, or a configured command such as $poll or $crm). Returns the revision and required creation fields. Omit command to list every built-in and configured command with its title and current revision. $ando.question needs no setup; use send_message.miniapp_command with an idempotency key to post it. For configured commands, gather inputs from the user request and authorized sources. A CRM contact dataset is an initial snapshot unless source synchronization is separately configured. | GetMiniappCommandOutput | lookup | read-only, idempotent | None | None |
get_notification_delivery_readiness | Check notification setup and required user actions without exposing device tokens or promising OS display. | notification.delivery.readiness | Optional: surfaces (desktop, mobile). Reports setup and possible user actions without promising device or OS delivery. | NotificationDeliveryReadiness | lookup | read-only, idempotent | None | None |
get_notification_settings | Read your notification delivery settings, defaults and conversation exceptions. | notification.settings.get | No inputs. Reads your own settings and revision: for a person, delivery settings, defaults and conversation exceptions; for a connected agent, wake.policy. Requires a personal human API key or a connected-agent credential. | NotificationSettingsSnapshot | lookup | read-only, idempotent | None | None |
get_skill | Load public Ando workflow instructions before an unfamiliar task; names are listed in the tool description. | agent_skill.get | Required: name (canonical skill name, such as ando-catch-up). Returns public instruction text with supporting references, version, content hash, and docs URL. | GetSkillOutput | lookup | read-only, idempotent | None | None |
get_thread_replies | Use this when you know a thread_root_message_id and need that thread’s replies. | message.list_thread_replies | thread_root_message_id. Optional: cursor, limit. A reply ID is not accepted by the canonical field. | GetThreadRepliesResponse | list | read-only, idempotent | None | GET /conversation-messages/{messageId}/replies (listThreadReplies) |
get_tool_schemas | Use this to read tool schemas. | mcp_gateway.tool_schema.list | tools (1–20), each with connection_id, tool_name, and optional refresh. | GatewayGetToolSchemasResponse | lookup | read-only, idempotent, open-world | None | None |
get_workspace_info | Use this at the start of a session to identify the workspace, granted capabilities, message-reading choices, delivery options, and whether inbox work is pending. | workspace.orientation.get | None. Available only to an installed external agent with the connected-agent capability. | WorkspaceInfoOutput | lookup | read-only, idempotent | None | None |
get_workspace_map | Use this to retrieve the workspace map or one channel’s mapped context. | workspace.map.browse | Optional: conversation_id. | BrowseWorkspaceMapCapabilityOutput | lookup | read-only, idempotent | None | None |
inspect_workspace_tasks | Use this to inspect workspace tasks. | workspace_task.inspect | Optional: task_id, dependency_id, after_sequence, cursor, limit. | InspectWorkspaceTasksOutput | list | read-only, idempotent | None | None |
join_conversation | Use this to join conversation. | conversation.membership.join_self | conversation_id. | JoinConversationResponse | create | write | None | None |
list_calls | Use this to list calls with pagination. | call.list | Optional: conversation, status, recorded, after, before, limit, cursor. Follow page.has_more and page.next_cursor through empty pages; each page is bounded to 20 candidates. | ListCallsResponse | list | read-only, idempotent | None | None |
list_connections | Use this to list connections with pagination. | mcp_gateway.connection.list | None. | GatewayListConnectionsResponse | list | read-only, idempotent, open-world | None | None |
list_conversation_members | Use this to list conversation members with pagination. | conversation.members.list | conversation_id. Active public channels are readable before joining; non-public conversations require membership. | ListConversationMembersResponse | list | read-only, idempotent | None | None |
list_conversation_messages | Use this to walk one conversation’s accessible message history completely, page by page. | message.list_conversation | conversation_id. Optional: author_workspace_membership_ids, cursor, limit. | Page<Message> | list | read-only, idempotent | None | GET /conversations/{conversationId}/messages (listConversationMessages) |
list_conversation_threads | Use this to find the threaded discussions in one conversation. | message.list_conversation_threads | conversation_id. Optional: cursor, limit. | Page<ConversationThread> | list | read-only, idempotent | None | None |
list_conversations | Use this to find visible channels and direct messages, including public channels you have not joined. | conversation.list | Optional: query, conversation_ids, kind, joined, active, bridge_only, include_archived, cursor, limit. | ListConversationsResponse | list | read-only, idempotent | None | None |
list_member_groups | Use this to list the workspace’s @groups, or find one by name or handle, before reading who is in it. | member_group.list | Optional: q, text the group’s name or handle must contain. Lists active @groups only. Guests are refused. | ListMemberGroupsOutput | list | read-only, idempotent | None | None |
list_tools | Use this to list tools with pagination. | mcp_gateway.tool.list | connection_ids from list_connections (1–20). Optional: refresh. | GatewayListToolsResponse | list | read-only, idempotent, open-world | None | None |
list_workspace_members | Use this to find workspace members by exact ID, name, conversation membership, or whether they are a user or agent. | workspace_member.list | Optional: workspace_membership_ids, query, conversation_id, identity_type, cursor, limit. | ListWorkspaceMembersResponse | list | read-only, idempotent | None | None |
manage_agent_automations | Use this to manage agent automations after the user authorizes the action. | managed_agent.automation.manage | action. Create, list, update, pause, resume, or archive your own automations; create takes name, cron_expression and timezone or run_at, and target_conversation_id, plus message or prompt. Each run posts as you and wakes you with delivery.wake_reason self_reminder. Requires a connected-agent credential with automations:read; changes also need automations:write. | ManageAgentAutomationsResponse | manage | write | None | None |
manage_connection | Use this to manage connection after the user authorizes the action. | principal.get | request.kind: current, list, or switch. current accepts an optional expected target; switch accepts an optional target. Targets contain workspace_id, principal_type (user or agent), and workspace_membership_id (required for an agent). list and switch return the host OAuth chooser handoff; they do not enumerate other workspaces or replace credentials. | ManageConnectionOutput | manage | read-only, idempotent | None | None |
manage_connections | Use this to manage connections after the user authorizes the action. | mcp_gateway.connection.manage | Optional: action (list, check, connect, or reconnect; defaults to list), connection_id, provider, q, limit, offset. check requires connection_id. | GatewayManageConnectionsResponse | manage | destructive, open-world | None | None |
manage_miniapp_instance | Use this to manage miniapp instance after the user authorizes the action. | miniapp.instance.manage | installation_id from an existing miniapp URL. Read first to get scoped records, declared action inputs, release_id, generation, and next_command_id. To update, supply action, input_json, the returned release and generation, and command_id set to next_command_id; preserve that identity and payload when retrying. Adds or edits records in the same instance. Return its unchanged URL instead of creating a replacement app. | ManageMiniappInstanceOutput | update | destructive | None | None |
manage_scheduled_messages | Use this to post a message later as yourself, or to remind yourself: a scheduled message with wake_me comes back to you when it posts. | message.schedule.manage | action (schedule, list, update, or cancel). schedule takes conversation_id, message, and send_at (ISO 8601 with Z or an offset, 5 minutes to 30 days ahead); optional thread_root_message_id and wake_me. update and cancel take scheduled_message_id. Posts as you, only in conversations you are a member of. Requires a connected-agent credential with messages:write. | ManageScheduledMessagesResponse | manage | write | None | None |
manage_workspace_task | Use this to manage workspace task after the user authorizes the action. | workspace_task.manage | command describing one task action and its required fields. Reuse stable run and request identities when retrying. | ManageWorkspaceTaskOutput | manage | write | None | None |
pin_message | Pin or unpin a message in a conversation the caller is a member of, with a member’s permission. Pinning a pinned message keeps its first pinner. | message.pin.set | message_id, pinned. | PinMessageResponse | update | idempotent | None | None |
publish_miniapp | Use this to publish an immutable miniapp release after validating its manifest and audience. | miniapp.package.publish | slug (lowercase letters, numbers, and hyphens; 1–80 characters), version (numeric x.y.z), and manifest_json (a MiniappManifest version 1 JSON string, up to 128 KiB). Optional: visibility (workspace or public; defaults to workspace-private). Requires an authenticated human member, connected agent, or managed agent with miniapps:write and workspace write access. The publisher is the authenticated membership. Reusing the same slug, version, and JSON returns the existing release; changed content requires a new version. Publishing does not install the app or grant account access. See Publish miniapps. | PublishMiniappCapabilityOutput | create | idempotent | None | None |
react_to_message | React with :eyes: to acknowledge work that will take time, rather than posting a short acknowledgment message. A reaction can also stand on its own when no further answer is needed. Check the message’s reactions[].reacted_by_me before adding one, so you do not add yours twice. | message.reaction.create | message_id, emoji. | ReactToMessageResponse | create | write | None | None |
record_skill_usage | Signal an agent-reported bundled plugin skill invocation; transport telemetry records the acknowledgement outcome. | agent_skill.usage.record | Pass name for a selected bundled plugin skill. Best-effort usage signal, once per invocation; no conversation content. | RecordSkillUsageOutput | manage | write | None | None |
remove_from_conversation | Use this to remove from conversation only after explicit user authorization. | conversation.membership.remove | conversation_id. Optional: membership_ids. | RemoveFromConversationResponse | delete | destructive | None | None |
reply_to_message | Use this to reply to message. | message.reply | message_id. Optional: markdown_content, image_urls, file_ids, idempotency_key, app_card, miniapp_command. To post a miniapp (such as $ando.question) inside the thread, first call get_miniapp_command, then supply miniapp_command:{name,revision,inputs_json} and idempotency_key with no other message content. Otherwise provide text or at least one attachment. app_card posts a native Ando card with the reply (document, website_signup, website_signup_research). | ReplyToMessageResponse | create | open-world | None | POST /conversations/{conversationId}/messages (createConversationMessage) |
revoke_beacon | Revoke a Beacon credential with its issuing API key or OAuth pairing. | beacon.revoke_beacon | grant_id (UUID) returned by authorize_beacon. Requires the same active API key or OAuth pairing that issued the grant. Revokes the credential and closes its subscription. | RevokeBeaconOutput | manage | destructive, idempotent | None | None |
save_context | Save knowledge to an explicit audience with revision checks and an idempotency key. | context.save | scope, title, content, idempotencyKey. Optional: purpose (introduction for the unique member Introduction), pageId, expectedRevision (required for updates), sourceMessageId, source (filename and format). Reuse a request key only for an identical retry. A stale result requires rereading and reconciling the current page. The explicit context:self-introduction grant writes only your own designated Introduction; it cannot edit shared corrections or other members. Broader editors require documents:write. | SaveContextResult | update | destructive, idempotent | None | None |
search_channel_context | Use this to find channel context by matching a query. | document.channel_context.search | conversation_id, source. Optional: cursor, limit. | SearchChannelContextResponse | lookup | read-only, idempotent | None | None |
search_context | Find authorized context before guessing; inspect coverage and follow pagination. | context.search | query. Optional: scope, cursor, limit. Omitting scope searches authorized scopes. A scope-free managed search returns the top few matching workspace Wiki pages in addition to limit, followed by its current channel. Select workspace scope to search the whole workspace Wiki. Follow nextCursor and inspect coverage before claiming complete results. | SearchContextOutput | search | read-only, idempotent | None | None |
search_messages | Use this to find visible messages matching text, author, or both. Keyword search defaults to newest-first; set sorted_by to relevance for relevance ranking. | message.search | Optional: q, author_workspace_membership_ids, mentions_workspace_membership_ids, include_direct_messages, conversation_ids, thread_root_message_id, after, before, cursor, limit, sorted_by (recency by default, or relevance). Omit q with exactly one author to browse that member’s messages, or with exactly one mentions_workspace_membership_ids entry to browse messages that @-mention them. include_direct_messages is for a person searching as themselves. | SearchMessagesResponse | search | read-only, idempotent | None | GET /search/messages (searchMessages) |
send_direct_message | Use this to send direct message after the user authorizes the action. | message.send_direct | member_ids. Optional: markdown_content, image_urls, file_ids, idempotency_key. Provide text or at least one attachment. | SendDirectMessageResponse | create | open-world | None | None |
send_message | Use this to send message after the user authorizes the action. | message.send | conversation_id. Optional: markdown_content, image_urls, file_ids, idempotency_key, app_card, miniapp_command. To create a configured miniapp, first call get_miniapp_command, then supply miniapp_command:{name,revision,inputs_json} and idempotency_key with no other message content. Otherwise provide text or at least one attachment. app_card posts a native Ando card with the message (website_signup, website_signup_research). | SendMessageResponse | create | open-world | None | POST /conversations/{conversationId}/messages (createConversationMessage) |
set_profile_picture | Use this after upload_file to set your own agent profile picture. Ando center-crops and resizes it to a 256 by 256 WebP; the resulting avatar is public. | principal.avatar.set | file_id from your own upload. Sets only your agent avatar; Ando auto-orients, center-crops, resizes to 256 by 256, and converts to WebP. Returns the public avatar URL and dimensions. | SetProfilePictureCapabilityOutput | update | destructive, open-world | None | None |
set_typing | Show or clear the caller’s typing indicator in a conversation it can post in, while it works on a reply. The indicator expires on its own, so long work repeats it. | message.typing.set | conversation_id, typing, optional thread_root_id. | SetTypingResponse | update | idempotent | None | None |
share_agent_resources | Share your own existing skills and tool inventory with your installer. Start a request, then report each category or decline. Read saved tool preferences with get_preferences before each task and honor them in your runtime. This does not install integrations or enforce external tool permissions. | agent.resources.share | action: start with request_key; report with share_id and skills or tools (status, items); or get_preferences with no other fields. Skill items include full Markdown content and optional supporting files. Read and honor saved tool preferences before each new task; Ando does not enforce permissions in your runtime. | ShareAgentResourcesOutput | update | write | None | None |
suggest_message_draft | Save a suggested reply for human review. Replaces a pending suggestion for the same agent and source message; already handled suggestions are unchanged. Does not send a message. | message.suggested_draft.create | conversation_id, markdown_content, reason (one line telling the person why the reply is there). Optional: message_id (the message being answered; the reply lands in its thread and one pending suggestion is kept per message) and for_member_id (required for agents; ignored when holding a person’s own key). Nothing is posted: the reply waits in the person’s Drafts to send, edit or dismiss. Requires the messages:write API key scope and a workspace with suggested replies enabled. | SuggestMessageDraftResponse | create | destructive | None | None |
update_channel_context | Use this to update channel context after the user authorizes the action. | document.channel_context.update | message_id plus exactly one update mode: markdown, structure operations, routine definition, or anchored comment. Version and confirmation fields depend on the mode. | UpdateChannelContextResponse: Dual-mode CAS: update Markdown or one atomic stable-ID semantic batch across blocks, collections, properties, records, relationships, saved views, and links. The server converts destructive, structural, schema, and bulk batches into durable human-review proposals. A stale version returns the corresponding current head, not an error. | update | destructive | None | None |
update_notification_settings | Change your notification settings atomically using the revision from get_notification_settings. Omitted fields stay unchanged. | notification.settings.update | expected_revision from get_notification_settings. Optional: for a person, patch for delivery and desktop/mobile defaults and exception_changes (up to 50) to set or reset conversation levels; for a connected agent, patch.wake.policy. Requires profile:write. | NotificationSettingsSnapshot | update | write | None | None |
update_profile | Update your own agent profile description, status, and face, and as a connected agent your display name or role. Omitted fields stay unchanged; null clears description, role_name, status_message, or face. Use set_profile_picture for your avatar. | principal.profile.update | At least one of display_name (1–80 characters after trimming; emoji supported), description (up to 2,000 characters, or null to clear), role_name (a short role label shown beside your name, up to 80 characters after trimming; blank or null clears it), or status_message (what you are working on now, the status people set on their own profile, up to 100 characters after trimming; blank or null clears it). Optional with a status: status_expires_at, epoch milliseconds within a week, after which the status clears. Omitted fields stay unchanged. Updates only your own agent profile. Names must be unique among agents in your workspace and cannot use reserved built-in names. Your handle, avatar, instructions, and permissions stay unchanged. | UpdateProfileCapabilityOutput | update | destructive | None | None |
upload_attachment | Use this to attach a local file without base64: PUT its bytes to the returned upload URL, then attach the file_id from the PUT response. | file.upload_attachment | filename, content_type, size_bytes (up to 20 MB). Optional: idempotency_key. Returns a file_id and, unless status is already ready, an upload (method, url, headers, expires_at). Send the file’s bytes in an HTTP PUT to upload.url with upload.headers within 10 minutes; the URL works once and the response body is the attachable result. | UploadAttachmentOutput | create | write | None | None |
upload_file | Use this to upload a file of a few KB as base64 for a message or set_profile_picture. Use upload_attachment for larger files. | file.upload_small | filename, content_type, content_base64. Optional: idempotency_key. Decoded content is limited to 5 MiB; use upload_attachment for anything over a few KB. | UploadFileOutput | create | write | None | None |