Sortd Docs

MCP tool catalog

Everything a connected assistant can do, and the scope that gates each capability. Setup lives in Connect your AI.

How to read this

Identity & teams

ToolWhat it doesScope(s)
whoamiReturn the authenticated user and the key/scopes this connection has. The quickest way to confirm the connection works and see what it can do.none (public)read
list_teamsList the teams (organisations) this connection can act within. A team id is needed to list boards and search CRM contacts.boards.readread
get_teamGet a single team by id.boards.readread

Boards, lists & custom fields

ToolWhat it doesScope(s)
list_boardsList the boards a team owns. Pass team_id from whoami/list_teams.boards.readread
get_boardGet a single board by its opaque id (brd_…).boards.readread
list_board_listsList a board's task lists (columns). A list id (lst_…) is where you create or move tasks.lists.readread
list_board_membersList a board's active members. Use a member's email as the `assignee` when assigning a task.boards.readread
list_board_custom_fieldsList a board's custom fields with their types and (for tag/status/select) option ids — use a field id when setting values with update_task.customfields.readread
list_tasksList/search tasks. Provide ONE scope: list_id, board_id, thread_id (raw Gmail hex) or contact_id (con_…). Optional filters (board/list scope): q, completed, shade, due_before, due_after, assigned_to (email/name), custom_field_id (+ custom_field_value). Cursor-paginated.tasks.readread
create_boardCreate a shared team board.boards.writewrite
update_boardRename a board.boards.writewrite
delete_boardSoft-delete a board (recoverable).boards.writedestructive
create_listAdd a task list (column) to a board.lists.writewrite
update_listRename a list.lists.writewrite
delete_listSoft-delete a list (recoverable).lists.writedestructive
create_custom_fieldCreate a custom field on a board. Option types (select/status/tag/multiselect) take an `options` list.customfields.writewrite
update_custom_fieldUpdate a custom field (name, options, display_on_card).customfields.writewrite
delete_custom_fieldSoft-delete a custom field on a board.customfields.writedestructive
list_companiesList/search a team's CRM companies. Pass team_id; optional q.contacts.readread
list_email_labelsList the mailbox's Gmail labels (system + user) for building search queries.email.metadata.readread
list_email_draftsList the Gmail drafts on a thread.email.metadata.readread
list_webhooksList webhook subscriptions (never the signing secret).webhooks.manageread
list_webhook_deliveriesList a webhook subscription's recent delivery log.webhooks.manageread

Tasks

ToolWhat it doesScope(s)
get_taskGet a single task by its opaque id (tsk_…), incl. colour and custom-field values.tasks.readread
create_taskCreate a task on a list. New tasks go to the TOP by default — when adding several in sequence, pass position "bottom" (or anchor each with after_task_id) or the batch ends up in reverse order.tasks.writewrite
create_task_from_emailTurn an email thread into a task on a list — the API equivalent of dragging the email onto a board. The task title defaults to the email subject; pass `title` only to override it. `notes` and `due_at` work here just as they do on create_task. The thread stays linked to the task, so replies keep landing on it. Use add_thread_to_task to link further emails.tasks.write + email.metadata.readwrite
add_thread_to_taskLink another email thread to an existing task — a task can carry several. Linking a thread that is already on the task does nothing, so this is safe to repeat.tasks.write + email.metadata.readwrite
update_taskUpdate a task. Set `shade` (colour name, "none" clears) and/or `custom_fields` (array of {field_id, value}; option id(s) for tag/status/select).tasks.writewrite
assign_taskAssign a task to a board member by email, or pass an empty/omitted assignee to clear it. The email must belong to an active member of the task's board (see list_board_members). Only one assignee is supported.tasks.writewrite
complete_taskMark a task complete.tasks.writewrite
reopen_taskReopen a completed task.tasks.writewrite
move_taskMove a task to a DIFFERENT list. To change a task's position within the list it is already on, use reorder_task instead.tasks.writewrite
reorder_taskChange where a task sits WITHIN its current list — this is how you act on a prioritisation. Pass after_task_id to place it directly below a specific task, or position "top"/"bottom". To impose a whole new order, walk the list front to back and anchor each task to the one that should precede it. The response reports the position the server actually recorded.tasks.writewrite
delete_taskSoft-delete a task (recoverable; hidden from reads).tasks.deletedestructive

CRM — contacts & companies

ToolWhat it doesScope(s)
search_contactsSearch a team's CRM contacts (company-grouped). Pass team_id; optional q, type, stage. Requires the team's Contacts feature.contacts.readread
get_contactGet a CRM contact by opaque id (con_…).contacts.readread
create_contactCreate a CRM contact. team_id + name required; link a company via company_id or company_name.contacts.writewrite
update_contactUpdate a CRM contact (partial).contacts.writewrite
delete_contactSoft-delete a CRM contact.contacts.writedestructive
get_companyGet a CRM company by opaque id (cmp_…).contacts.readread
create_companyCreate a CRM company. team_id required.contacts.writewrite
update_companyUpdate a CRM company (partial).contacts.writewrite
delete_companySoft-delete a CRM company.contacts.writedestructive

Email — read & thread state

ToolWhat it doesScope(s)
get_mailboxReport the owner's mailbox connection state (connected / not_connected / reauth_required). Reads no mail.email.metadata.readread
search_email_threadsSearch the mailbox with a Gmail query. Provide at least one of q / label / category. Returns thread metadata (no bodies). Cursor-paginated. Gmail only.email.metadata.readread
get_email_threadGet an email thread by raw Gmail thread id (hex). Set include_messages=true to include message bodies (needs the email.body.read scope).email.metadata.readread
set_email_thread_read_stateMark a thread read or unread.email.metadata.writewrite
archive_email_threadArchive a thread (remove from Inbox).email.metadata.writewrite
unarchive_email_threadUnarchive a thread (return to Inbox).email.metadata.writewrite
apply_email_thread_labelsAdd and/or remove Gmail labels on a thread (raw label ids). At least one of add/remove.email.metadata.writewrite
snooze_email_threadSnooze a thread until a future time (ISO-8601).email.metadata.writewrite

Email — drafts & sending

ToolWhat it doesScope(s)
create_email_draftCreate a Gmail draft reply on a thread for a human to review and send (this server never sends mail). Body required; recipients/subject optional (default Re: thread).drafts.writewrite
create_draftCreate a brand-new Gmail draft (no thread) for a human to review and send. to + subject + body required.drafts.writewrite
send_email_draftSend a Gmail draft that already exists (from create_email_draft / create_draft / list_email_drafts). The "approve by sending" pattern: one key prepares the draft, a human or a key holding drafts.send releases it. IRREVERSIBLE — confirm with the user first.drafts.senddestructive
reply_to_email_threadReply on an existing thread. You control ONLY the body — recipients are derived server-side from the conversation and cannot be supplied, so a reply can never reach anyone not already on the thread. This is the safest send for an agent. mode "reply" = sender only (honouring Reply-To), "reply_all" = keep the To/Cc audience. IRREVERSIBLE — confirm with the user first.email.replydestructive
send_emailCompose and send a NEW email to recipients you specify, from the connected mailbox. Optionally onto an existing thread via thread_id. This is the widest email capability — it can reach anyone — so prefer reply_to_email_thread when replying, or create_draft when a human should review first. IRREVERSIBLE — always confirm the recipients and body with the user before calling.email.senddestructive

AI

ToolWhat it doesScope(s)
classify_emailGet Sortd's AI read on an email thread (status / urgency / sentiment / risk). Returns a cached analysis instantly or a job to poll with get_ai_job. Untrusted email content is returned only as structured labels.ai.classifyread
get_thread_analysesRead cached AI analyses for an email thread.ai.classifyread
get_ai_jobPoll an async AI classification job by id (job_…) for its status/result.ai.classifyread

Webhooks

ToolWhat it doesScope(s)
create_webhookSubscribe an HTTPS target_url to one or more event types. The response includes the signing secret once.webhooks.managewrite
update_webhookUpdate a webhook subscription (events, target_url, status active/disabled, filters).webhooks.managewrite
delete_webhookDelete a webhook subscription.webhooks.managedestructive
rotate_webhook_secretRotate a webhook signing secret (returns the new secret once). Invalidates the old secret immediately — deliveries will fail signature checks until the new one is deployed.webhooks.managedestructive
test_webhookSend a test ping to a webhook subscription.webhooks.managewrite
replay_webhook_deliveryReplay a previous webhook delivery by id.webhooks.managewrite

Not exposed, on purpose

Next: connect a client, or read the send-scope ladder before granting send capability.