list_companies read
Lists every company the token can see.
Required scope: read
Returns
Array of {id, name, role}.
Errors
unauthorized
The Toado MCP server exposes 22 tools. They fall into two categories: read (no side effects) and write (mutate state). Each tool declares a required scope; calls with an under-scoped token return insufficient_scope without round-tripping to the API.
This page is generated from src/data/mcp-tools.json, which is hand-synced with the MCP server source on every release. The current snapshot matches Toado v0.1.4.
Use these to discover ids, fetch ticket context, and search.
list_companies read Lists every company the token can see.
Required scope: read
Array of {id, name, role}.
unauthorizedlist_projects read Lists projects, optionally filtered to one company.
Required scope: read
| Name | Type | Description |
|---|---|---|
company_id | string? | Filter to a single company. Omit to list across every company the token can see. |
Array of {id, company_id, name, url_patterns}.
unauthorizedcompany_not_foundlist_columns read Lists the workflow columns of a project (To Do, In Progress, Done, etc.). Required before moving a ticket.
Required scope: read
| Name | Type | Description |
|---|---|---|
project_id | string | Project whose columns to list. |
Array of {id, name, order}.
project_not_foundforbiddenlist_tickets read Lists tickets in a project with optional filters. Defaults to active (non-archived) tickets.
Required scope: read
| Name | Type | Description |
|---|---|---|
project_id | string | Project to query. |
column_id | string? | Filter to one column. |
status | 'active' | 'archived' | 'all' | Default 'active'. |
query | string? | Text search within the project. |
limit | number? | Page size, max 100. |
cursor | string? | Pagination cursor from a previous response. |
Paginated list: { items: TicketSummary[], cursor?: string }.
project_not_foundforbiddeninvalid_cursorget_ticket read Returns a full ticket with capture data, comments, and DevTools arrays. Use this before working a bug so you have console / network / error context.
Required scope: read
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
include | Array<'capture' | 'comments' | 'attachments' | 'annotations' | 'devtools'>? | Currently advisory; the server returns the full payload regardless. |
Ticket with title, description, source_url, capture (console/network/errors/performance), comments, attachments, annotations.
ticket_not_foundforbiddenget_capture_asset read Returns a URL to download a capture asset (screenshot, annotated screenshot, or attachment). Fetch the URL directly with no extra headers.
Required scope: read
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
asset | 'screenshot' | 'screenshot_with_annotations' | 'attachment' | |
attachment_id | string? | Required when asset='attachment'. |
{ url: string }
ticket_not_foundasset_not_foundforbiddenlist_comments read Lists comments on a ticket in chronological order. Use before posting a new comment so you know what has already been said.
Required scope: read
| Name | Type | Description |
|---|---|---|
ticket_id | string |
Array of comments with author, body, timestamps.
ticket_not_foundforbiddenget_annotations read Returns the structured vector shapes the user drew on the screenshot, with coordinates in image-natural pixel space. For the rasterized image, use get_capture_asset(asset='screenshot_with_annotations').
Required scope: read
| Name | Type | Description |
|---|---|---|
ticket_id | string |
Array of annotation shapes (circles, arrows, strokes, redactions, text boxes).
ticket_not_foundforbiddenlist_members read Lists members of a company with their user ids, names, emails, and roles. Required before assign / unassign tools, which take ids not names.
Required scope: read
| Name | Type | Description |
|---|---|---|
company_id | string |
Array of members.
company_not_foundforbiddenlist_capture_assets read Lists every capture asset on a ticket (screenshot, annotated overlay, attachments) without downloading bytes. Use get_capture_asset to fetch a specific asset's bytes.
Required scope: read
| Name | Type | Description |
|---|---|---|
ticket_id | string |
{ ticket_id: string, assets: Array<{kind, id?, url?}> }
ticket_not_foundforbiddensearch_tickets read Full-text search across tickets the token can see. Query must be at least 2 characters.
Required scope: read
| Name | Type | Description |
|---|---|---|
query | string | Min 2 chars. |
company_id | string? | |
project_id | string? | |
assignee_id | string? | |
limit | number? | Max 100. |
cursor | string? |
Paginated search results.
unauthorizedinvalid_queryUse these to post comments, edit tickets, move them between columns or projects, and manage assignment.
add_comment write Posts a comment to a ticket. UI shows the MCP token label alongside the user who owns the token.
Required scope: comments
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
body | string | Markdown supported. |
Created comment with author attribution.
ticket_not_foundforbiddenrate_limitedcreate_ticket write Creates a new ticket in a project. Useful for filing bugs an AI agent discovers while working through other tickets. Text-only, no screenshot. To attach a screenshot, capture from the Chrome extension.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
project_id | string | |
title | string | |
description | string? | Markdown supported. |
column_id | string? | Defaults to the lowest-order column (To Do). |
Full ticket (DevTools fields trimmed for write responses).
project_not_foundforbiddenvalidation_errorupdate_ticket write Edits a ticket's title, description, resolved state, and / or branch name. Only fields you provide are changed.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
title | string? | |
description | string? | |
resolved | boolean? | Resolved is independent of archived. |
branch_name | string? | Pass empty string to clear. For most cases prefer start_work_on_ticket. |
Updated ticket.
ticket_not_foundforbiddenvalidation_errorstart_work_on_ticket write Records the git branch a ticket (or a small bundle of related tickets) is being worked on. Generates a slug from the title for a single ticket; requires an explicit branch_name when bundling 2 or more.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
ticket_ids | string[] | 1 to 10 ticket ids. |
branch_name | string? | Required when ticket_ids has more than one id. |
{ branch_name, tickets: Array<{ticket_id, ok, ticket?, error?}> }
validation_errorticket_not_foundforbiddenarchive_ticket write Archives a ticket. Removes it from the board into the archive view. Reversible via restore_ticket. Different from delete: data, comments, and capture context are retained.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
ticket_id | string |
Updated ticket.
ticket_not_foundforbiddenrestore_ticket write Restores an archived ticket back to the board, into the column it was archived from.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
ticket_id | string |
Updated ticket.
ticket_not_foundforbiddenmove_ticket write Moves a ticket to a different column (same project) or project (same company). Cross-company moves are forbidden.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
target_column_id | string? | |
target_project_id | string? |
Updated ticket.
ticket_not_foundcolumn_not_foundcross_company_move_forbiddenvalidation_errorforbiddenbulk_move_tickets write Moves up to 50 tickets to the same destination in one call. Best-effort, partial failures reported per ticket.
Required scope: tickets:write
| Name | Type | Description |
|---|---|---|
ticket_ids | string[] | 1 to 50 ticket ids. |
target_column_id | string? | |
target_project_id | string? |
{ results: Array<{ticket_id, ok, ticket?, error?}> }
validation_errorforbiddenassign_ticket write Assigns users to a ticket. mode='add' appends; mode='replace' overwrites.
Required scope: tickets:assign
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
user_ids | string[] | |
mode | 'add' | 'replace' |
Updated ticket with assignees.
ticket_not_founduser_not_in_companyforbiddenunassign_ticket write Removes users from a ticket.
Required scope: tickets:assign
| Name | Type | Description |
|---|---|---|
ticket_id | string | |
user_ids | string[] |
Updated ticket.
ticket_not_foundforbiddenbulk_assign_tickets write Assigns the same set of users to up to 50 tickets in one call. Best-effort, partial failures reported per ticket.
Required scope: tickets:assign
| Name | Type | Description |
|---|---|---|
ticket_ids | string[] | 1 to 50 ticket ids. |
user_ids | string[] | |
mode | 'add' | 'replace' |
{ results: Array<{ticket_id, ok, ticket?, error?}> }
validation_errorforbiddenlist_companies → pick a company idlist_projects(company_id) → pick a project idlist_columns(project_id) → pick a column idlist_tickets(project_id, column_id) → ticket idsYou usually only need to do this once per session. Most skills cache the company / project / column ids from the first round and reuse them.
get_ticket(ticket_id, include=['capture','comments','annotations'])get_capture_asset(ticket_id, asset='screenshot_with_annotations')get_annotations(ticket_id)start_work_on_ticket([ticket_id])[edit code locally]add_comment(ticket_id, body='Fixed in branch t-…')move_ticket(ticket_id, target_column_id=in_review_id)bulk_move_tickets and bulk_assign_tickets cap at 50 ticket ids per call. They call sequentially to stay inside the per-token write rate limit (60 / min). Failures on one ticket do not roll back others; results come back as a per-ticket array.
search_tickets requires a query of at least 2 characters. Scope with company_id, project_id, or assignee_id to narrow results.
| Scope | Tools |
|---|---|
read | list_companies, list_projects, list_columns, list_tickets, get_ticket, get_capture_asset, list_comments, get_annotations, list_members, list_capture_assets, search_tickets |
comments | add_comment (plus all read) |
tickets:write | create_ticket, update_ticket, archive_ticket, restore_ticket, move_ticket, bulk_move_tickets, start_work_on_ticket (plus read and comments) |
tickets:assign | assign_ticket, unassign_ticket, bulk_assign_tickets (plus read) |
See Tokens & scopes for details on choosing the right scope set.