try-dock-ai avatar

Dock

try-dock-ai/mcp

Bridges Claude and other MCP clients to Dock's collaborative workspace API over HTTPS. Exposes eight tools for managing workspaces, tables, and rows: list and create workspaces, read and write table rows, fetch activity logs. The local bridge is a thin stdio-to-HTTP proxy that forwards JSON-RPC messages to Dock's hosted server with your API key as bearer auth. Use this when your agent only speaks local stdio MCP. If you're on Claude.ai web or Projects, skip the bridge and add Dock's remote connector directly at https://trydock.ai/api/mcp. Supports Claude Desktop, Cursor, Windsurf, Zed, Cline, and Continue through a single npx command.

tools
80
transport
HTTP
last updated
May 15, 2026

Install

From registry metadata
$ npx add-mcp https://trydock.ai/api/mcp --name dock

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http dock https://trydock.ai/api/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 80 tools

Verified live against the running server on Nov 6, 2026.

list_workspacesList all workspaces the authenticated principal has access to. Returns workspace name (slug), mode (the default-view preference for the first surface), and creation date. A workspace is a container of one or more surfaces of any kind (see `create_surface`), in any combination,...

List all workspaces the authenticated principal has access to. Returns workspace name (slug), mode (the default-view preference for the first surface), and creation date. A workspace is a container of one or more surfaces of any kind (see `create_surface`), in any combination,...

No parameters. Call it with no arguments.

get_workspaceGet details about a specific workspace by its slug, including columns of its primary table surface, member count, and row count. A workspace contains one or more surfaces of any kind, in any combination. Use `list_surfaces` to enumerate every surface, then that surface's own t...1 params

Get details about a specific workspace by its slug, including columns of its primary table surface, member count, and row count. A workspace contains one or more surfaces of any kind, in any combination. Use `list_surfaces` to enumerate every surface, then that surface's own t...

Parameters* required
slug*string
The workspace slug, e.g. 'reddit-tracker'. Accepts either the bare slug or the org-prefixed form ('my-org/reddit-tracker') as shown in the dashboard URL.
list_rowsList rows in a workspace's table surface. Returns rows with their data (a JSON object of column-name to value), creation time, the principal who created/updated each row, AND the row's `surface_slug` (the sheet it lives on). Empty array if no rows have been added yet. Multi-su...4 params

List rows in a workspace's table surface. Returns rows with their data (a JSON object of column-name to value), creation time, the principal who created/updated each row, AND the row's `surface_slug` (the sheet it lives on). Empty array if no rows have been added yet. Multi-su...

Parameters* required
limitnumber
Max rows to return (default 100, max 1000)
offsetnumber
Number of rows to skip (for pagination)
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional table surface slug for multi-surface workspaces. Filter rows to one sheet. Omit to return rows from every surface (legacy single-sheet clients see no change). 400 if the slug is a doc surf...
create_rowAppend a new row to a workspace's table surface. The data field is a JSON object with column-name keys. Status column accepts: drafted, queued, sealed, active, blocked. Works on any workspace; columns auto-seed on the first row if the table surface is empty. Multi-surface work...4 params

Append a new row to a workspace's table surface. The data field is a JSON object with column-name keys. Status column accepts: drafted, queued, sealed, active, blocked. Works on any workspace; columns auto-seed on the first row if the table surface is empty. Multi-surface work...

Parameters* required
auto_create_columnsboolean
When true, the server auto-creates a text column for every key in `data` that doesn't already exist on the surface, then writes the row in the same call. Returns `created_columns` in the response l...
data*object
Row data as a JSON object (e.g. {"title": "My post", "status": "drafted", "notes": "Initial draft"})
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional table surface slug for multi-surface workspaces. Omit to write to the workspace's primary table surface. 400 if the slug is a doc surface, archived, or doesn't exist.
get_rowFetch a single row by id without listing the full table. Useful when a cue payload carries a row id and the agent only needs that one record. Returns the same row shape as list_rows.2 params

Fetch a single row by id without listing the full table. Useful when a cue payload carries a row id and the agent only needs that one record. Returns the same row shape as list_rows.

Parameters* required
rowId*string
The row id
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
update_rowUpdate specific fields of an existing row. Only the fields provided in `data` are updated; others are preserved. Setting `surface_slug` to a different sheet than the row currently lives on MOVES the row to that sheet (position recomputes to the new sheet's tail unless `positio...6 params

Update specific fields of an existing row. Only the fields provided in `data` are updated; others are preserved. Setting `surface_slug` to a different sheet than the row currently lives on MOVES the row to that sheet (position recomputes to the new sheet's tail unless `positio...

Parameters* required
auto_create_columnsboolean
When true, the server auto-creates a text column for every key in `data` that doesn't already exist on the surface, then applies the update in the same call. Returns `created_columns` in the respon...
data*object
Partial row data with fields to update (e.g. {"status": "sealed"}). Pass an empty object {} when the call is purely a move (surface_slug change with no field updates).
positionnumber
Optional. Override the row's position. When moving across surfaces, omit to land at the new surface's tail; pass a number to land at a specific slot.
rowId*string
The row ID to update
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional. When set to a different surface than the row currently lives on, moves the row to that surface and emits a `row.moved_surface` event. Same-surface is a no-op. 400 if the slug is a doc sur...
delete_rowPermanently delete a row from a workspace. This action cannot be undone.2 params

Permanently delete a row from a workspace. This action cannot be undone.

Parameters* required
rowId*string
The row ID to delete
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
move_rowsAtomically move N rows from their current sheet(s) to a target sheet inside the same workspace. Use for programmatic data migration: dropping a batch of agent-produced drafts onto the right sheet, reorganizing content across LinkedIn / Twitter / Substack sheets, etc. All-or-no...3 params

Atomically move N rows from their current sheet(s) to a target sheet inside the same workspace. Use for programmatic data migration: dropping a batch of agent-produced drafts onto the right sheet, reorganizing content across LinkedIn / Twitter / Substack sheets, etc. All-or-no...

Parameters* required
rowIds*array
Row IDs to move (1-500). Order is preserved at the destination: first id lands at the lowest position, last id at the highest.
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
target_surface_slug*string
Slug of the destination table surface. Use list_surfaces to enumerate. 400 if the slug is a doc surface, archived, or not in this workspace.
get_docRead a workspace's doc (TipTap rich-text) body. Format is negotiable via `format`: `markdown` (default — CommonMark + GFM, ready to feed to an LLM or render in a non-ProseMirror surface), `content` (TipTap JSON, round-trippable into update_doc for structural edits), `text` (pl...4 params

Read a workspace's doc (TipTap rich-text) body. Format is negotiable via `format`: `markdown` (default — CommonMark + GFM, ready to feed to an LLM or render in a non-ProseMirror surface), `content` (TipTap JSON, round-trippable into update_doc for structural edits), `text` (pl...

Parameters* required
formatstring
Which serialization to return. Default `markdown`. Use `content` to round-trip TipTap JSON back into update_doc for structural edits. Use `all` for the legacy three-in-one shape (heavier; only do t...one of markdown · content · text · all
headingstring
Optional. Return only the section under this heading (exact heading text): the heading through the next heading of the same or higher level, the same range update_doc_section writes. Use it to read...
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional doc surface slug for multi-doc workspaces. Omit to read the primary doc surface. Use list_surfaces to see available slugs.
get_workspace_schemaReturn a table surface's column definitions so an agent knows what keys create_row/update_row will accept. Each column has `key` (the field name in row.data), `label` (human-readable), `type` (text | longtext | number | status | person | date | url | checkbox | select), `posit...2 params

Return a table surface's column definitions so an agent knows what keys create_row/update_row will accept. Each column has `key` (the field name in row.data), `label` (human-readable), `type` (text | longtext | number | status | person | date | url | checkbox | select), `posit...

Parameters* required
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional. The slug of the specific table surface to read columns from. Omit on single-table workspaces; required on multi-table workspaces if you don't want the primary table surface (lowest positi...
add_columnAppend a single column to a workspace's table schema. Position is auto-computed as next-after-max so the contiguity invariant holds. Key collision (409) if a column with the same key already exists. Editor role required. Use this for per-column additions; use get_workspace_sch...8 params

Append a single column to a workspace's table schema. Position is auto-computed as next-after-max so the contiguity invariant holds. Key collision (409) if a column with the same key already exists. Editor role required. Use this for per-column additions; use get_workspace_sch...

Parameters* required
descriptionstring
Optional. Human-readable tooltip shown in the column header. Up to 4000 characters (the same limit update_surface applies).
key*string
Field name in row.data. Lowercase + underscores recommended; 1-64 chars.
label*string
Human-readable header shown in the sheet.
optionsarray
Required for `status` + `select` types. The allowed values shown in the dropdown.
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional. The slug of the specific table surface to add the column to. Omit on single-table workspaces; required on multi-table workspaces if you don't want the primary table surface (lowest positi...
type*string
Column type. See get_workspace_schema for examples.one of text · longtext · number · status · person · date
widthnumber
Optional. Initial column width in px.
list_workspace_membersList principals with explicit access to a workspace. Returns users (id, name, email; email visible only when the caller is in the same org) and agents (id, name, brandKey) along with their role (owner | editor | commenter | viewer). Used by agents to verify a workspace is actu...1 params

List principals with explicit access to a workspace. Returns users (id, name, email; email visible only when the caller is in the same org) and agents (id, name, brandKey) along with their role (owner | editor | commenter | viewer). Used by agents to verify a workspace is actu...

Parameters* required
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
check_workspace_privateCheck, on the server, whether a workspace is private to your owner right now: private, every member is your owner or one of your owner's agents, no open invite, no active file share link. Call it BEFORE writing anything owner-private (Voice profile, Second Brain, personal note...1 params

Check, on the server, whether a workspace is private to your owner right now: private, every member is your owner or one of your owner's agents, no open invite, no active file share link. Call it BEFORE writing anything owner-private (Voice profile, Second Brain, personal note...

Parameters* required
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
delete_workspaceArchive a workspace. Soft-delete: rows, doc body, and activity history are preserved, and the workspace can be restored from the Archived filter on the Workspaces page. Every member loses access immediately. Idempotent: calling on an already-archived workspace returns its curr...2 params

Archive a workspace. Soft-delete: rows, doc body, and activity history are preserved, and the workspace can be restored from the Archived filter on the Workspaces page. Every member loses access immediately. Idempotent: calling on an already-archived workspace returns its curr...

Parameters* required
modestring
Consent surface. 'immediate' (default) executes on the agent's role. 'web' returns an approval_url the user clicks in a browser; recommended for any workspace your user might miss.one of immediate · web
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
update_workspaceRename a workspace, change its slug, switch its default-view mode, or change its visibility (private | org). Pass any subset of `name`, `new_slug`, `mode`, `visibility`; fields you omit are left unchanged. Slug renames preserve old URLs via WorkspaceSlugAlias so previously-sha...6 params

Rename a workspace, change its slug, switch its default-view mode, or change its visibility (private | org). Pass any subset of `name`, `new_slug`, `mode`, `visibility`; fields you omit are left unchanged. Slug renames preserve old URLs via WorkspaceSlugAlias so previously-sha...

Parameters* required
consent_modestring
Required when `visibility` widens audience. Pass 'web' to surface a click-to-approve URL the user opens in their browser; first call returns { status: 'approval_required', approval_url, polling_url...one of web
modestring
New default-view preference for the surface that opens first. Optional. Doesn't add or remove surfaces; use `create_surface` / `delete_surface` to change the actual surfaces.one of table · doc · html
namestring
New display name. Optional.
new_slugstring
New URL slug (lowercase kebab-case, 3-64 chars). Optional. Must be unique within the org. Old slug stays redirectable via the alias table.
slug*string
The current workspace slug
visibilitystring
New visibility. Optional. `private` = explicit members only; `org` = every org member gets virtual editor. Only these two can be set. Widening (private → org) is consent-gated; see `consent_mode`.one of private · org
share_workspaceAdd someone to a workspace at a specified role: a human by `email`, or an agent by `agent_id`. For an email that already belongs to a Dock user, they're added immediately and a notification email is sent; otherwise a 7-day invite token is minted that auto-accepts on magic-link...4 params

Add someone to a workspace at a specified role: a human by `email`, or an agent by `agent_id`. For an email that already belongs to a Dock user, they're added immediately and a notification email is sent; otherwise a 7-day invite token is minted that auto-accepts on magic-link...

Parameters* required
agent_idstring
Add an agent directly: its Dock id, or its agt_ id. Pass this or `email`, not both.
emailstring
Email address of the human to invite. Pass this or `agent_id`, not both.
rolestring
Role to grant. Defaults to `editor`. Owner-tier transitions require an owner caller.one of owner · editor · commenter · viewer
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
update_workspace_memberChange an existing workspace member's role. Editor role required to caller. Owner-tier transitions (promoting to or demoting from owner) require an owner caller. Demoting the sole owner is blocked; promote someone else to owner first. No-op when the role is unchanged. Emits `m...3 params

Change an existing workspace member's role. Editor role required to caller. Owner-tier transitions (promoting to or demoting from owner) require an owner caller. Demoting the sole owner is blocked; promote someone else to owner first. No-op when the role is unchanged. Emits `m...

Parameters* required
member_id*string
The WorkspaceMember id to update. Get this from list_workspace_members.
role*string
New role.one of owner · editor · commenter · viewer
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
remove_workspace_memberRemove a workspace member, or revoke a pending invite by passing its invite id as `member_id`. Editor role required; owner-tier removals require an owner caller. Sole-owner removal is blocked; promote someone else first. Note: if the workspace visibility is `org`, removing an...3 params

Remove a workspace member, or revoke a pending invite by passing its invite id as `member_id`. Editor role required; owner-tier removals require an owner caller. Sole-owner removal is blocked; promote someone else first. Note: if the workspace visibility is `org`, removing an...

Parameters* required
confirm_tokenstring
The token returned by the first call as `confirm_token`. Omit on the first call; include on the second call to execute the removal. Single-use, 60s TTL. Agents only; user callers don't need this.
member_id*string
The WorkspaceMember id to remove (from list_workspace_members), or a pending invite id to revoke (the `invite.id` that share_workspace returned).
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
update_docReplace a workspace's doc body. Takes EITHER TipTap JSON (`content`) OR Markdown (`markdown`): pass markdown when you're producing prose from scratch (CommonMark + GFM is the format every LLM emits natively), pass TipTap JSON when you need structural edits to an existing doc (...6 params

Replace a workspace's doc body. Takes EITHER TipTap JSON (`content`) OR Markdown (`markdown`): pass markdown when you're producing prose from scratch (CommonMark + GFM is the format every LLM emits natively), pass TipTap JSON when you need structural edits to an existing doc (...

Parameters* required
allowBlockLossboolean
Confirm a replacement that removes content. Omit it normally: the call is refused (with both block counts) when it would destroy the bulk of the doc's top-level blocks. Set true only when the delet...
contentobject
TipTap document JSON: `{ type: 'doc', content: [ ... ] }`. Use this when round-tripping from get_doc to preserve formatting. Mutually exclusive with `markdown` (content wins if both are passed).
if_unmodified_sincestring
Optional precondition. ISO 8601 timestamp (typically the `updatedAt` you read via `get_doc`). When set and the doc has changed since this cutoff, the write is rejected with `code: -32602`, message...
markdownstring
Markdown body (CommonMark + GFM). Converted server-side to TipTap JSON via the same converter that powers PUT /api/workspaces/:slug/doc. Use this when authoring prose from scratch; no need to hand-...
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional doc surface slug for multi-doc workspaces. Omit to write the primary doc surface. Use list_surfaces to see available slugs.
validate_doc_markdownPre-flight check on markdown BEFORE writing it via update_doc / append_doc_section. Returns { ok, errors, warnings, parsed } with parsed counts per format type (imageCount, videoCount, mermaidCount, mathCount, svgCount, calloutCount, crossRefCount, mentionCount, embedCount, de...1 params

Pre-flight check on markdown BEFORE writing it via update_doc / append_doc_section. Returns { ok, errors, warnings, parsed } with parsed counts per format type (imageCount, videoCount, mermaidCount, mathCount, svgCount, calloutCount, crossRefCount, mentionCount, embedCount, de...

Parameters* required
markdown*string
Markdown body to validate. Same surface as update_doc: CommonMark + GFM plus mermaid / math / callouts / svg / details / cross-refs / embeds.
update_doc_sectionReplace a single section of a workspace's doc body, identified by its heading text. The targeted edit complement to `update_doc` (full replacement) and `append_doc_section` (append-only at the end). Use this when the agent maintains a recurring section (e.g., a 'Status' block...7 params

Replace a single section of a workspace's doc body, identified by its heading text. The targeted edit complement to `update_doc` (full replacement) and `append_doc_section` (append-only at the end). Use this when the agent maintains a recurring section (e.g., a 'Status' block...

Parameters* required
allowBlockLossboolean
Confirm a replacement that removes content. Omit it normally: the call is refused (with block counts, any `removedHeadings` and any `removedBlocks`) when it would destroy the bulk of the doc or of...
heading*string
Plain text of the heading to find (case-sensitive, trimmed). For `## Outcomes`, pass `Outcomes`. Hash marks and surrounding whitespace are stripped from the comparison automatically by the markdown...
if_section_hashstring
Optional precondition scoped to THIS section: the `sectionHash` from your last update_doc_section response for this section (the hash AFTER that write; `prior.contentHash` is the hash before it and...
if_unmodified_sincestring
Optional precondition. ISO 8601 timestamp (typically the `updatedAt` you read via `get_doc`, or the `updatedAt` of your last write). When set and the doc has changed since, the write is rejected wi...
markdown*string
FULL replacement markdown for the section, including the heading line if you want to keep / rename / restructure it. Empty string deletes the section.
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace').
surface_slugstring
Optional doc surface slug for multi-doc workspaces. Omit to target the primary doc surface.
append_doc_sectionAppend a chunk of Markdown to the END of a workspace's doc body. Designed for crons + ingest agents that produce content in timestamped chunks (changelog updates, daily standups, batch summaries). Same markdown surface as update_doc: supports CommonMark, GFM, **`![alt](url)` i...3 params

Append a chunk of Markdown to the END of a workspace's doc body. Designed for crons + ingest agents that produce content in timestamped chunks (changelog updates, daily standups, batch summaries). Same markdown surface as update_doc: supports CommonMark, GFM, **`![alt](url)` i...

Parameters* required
markdown*string
Markdown chunk to append (CommonMark + GFM). Becomes one or more new blocks at the end of the existing doc.
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional doc surface slug for multi-doc workspaces. Omit to append to the primary doc surface.
get_htmlRead an HTML surface's body. HTML surfaces (Surface.kind="html") store mockup or full-page content as three text fields (html, css, js) rendered together inside a sandboxed iframe. Use `list_surfaces` to enumerate html surfaces in a workspace. Omit `surface_slug` to read the p...2 params

Read an HTML surface's body. HTML surfaces (Surface.kind="html") store mockup or full-page content as three text fields (html, css, js) rendered together inside a sandboxed iframe. Use `list_surfaces` to enumerate html surfaces in a workspace. Omit `surface_slug` to read the p...

Parameters* required
slug*string
The workspace slug. Accepts bare or org-prefixed form.
surface_slugstring
Optional html surface slug. Omit to read the primary html surface.
update_htmlWrite an HTML surface's body. Pass any of `html` / `css` / `js`; omitted fields stay unchanged. Pass empty string to clear. The surface renders in a sandboxed iframe with no access to Dock cookies, storage, or parent DOM, and scripts do not run there today: inline `<script>` a...5 params

Write an HTML surface's body. Pass any of `html` / `css` / `js`; omitted fields stay unchanged. Pass empty string to clear. The surface renders in a sandboxed iframe with no access to Dock cookies, storage, or parent DOM, and scripts do not run there today: inline `<script>` a...

Parameters* required
cssstring
CSS source. Applied inside the sandbox iframe. You can also `<link rel="stylesheet">` external stylesheets from any HTTPS CDN (Tailwind CDN, Google Fonts, icon kits); CSS works, scripts do not.
htmlstring
HTML body. Sanitized server-side (smells stripped; `<script>` and `<link>` are kept, but scripts do not run in the surface today, so use `<link>` for CDN stylesheets and fonts only). Use `validate_...
jsstring
JS source. Stored alongside html/css but not executed: html surfaces render with scripts off today. 200 KB cap (matches the top-level `update_html` description; the server enforces `HTML_SURFACE_LI...
slug*string
The workspace slug.
surface_slugstring
Optional html surface slug. Omit to write the primary html surface.
validate_htmlPre-flight check on html / css / js BEFORE writing via update_html. Returns { ok, errors, warnings, parsed } where parsed has byte counts per field and `htmlDropped` (true if the sanitizer would strip anything from `html`) plus `htmlRemoved`, the list of tags (`{ tag, count }`...3 params

Pre-flight check on html / css / js BEFORE writing via update_html. Returns { ok, errors, warnings, parsed } where parsed has byte counts per field and `htmlDropped` (true if the sanitizer would strip anything from `html`) plus `htmlRemoved`, the list of tags (`{ tag, count }`...

Parameters* required
cssstring
CSS to validate (optional).
htmlstring
HTML to validate (optional).
jsstring
JS to validate (optional).
create_workspaceCreate a new workspace in the caller's org. Works for both user and agent callers; agent-created workspaces attribute to the agent and enroll the agent's owning user as a co-owner so the human sees it in their dashboard. The new workspace is seeded with one primary surface mat...4 params

Create a new workspace in the caller's org. Works for both user and agent callers; agent-created workspaces attribute to the agent and enroll the agent's owning user as a co-owner so the human sees it in their dashboard. The new workspace is seeded with one primary surface mat...

Parameters* required
initial_markdownstring
Optional Markdown body to seed the workspace's doc surface on create. CommonMark + GFM (tables, task lists, strikethrough). When provided AND mode is omitted, mode defaults to 'doc'. Skips the empt...
modestring
Kind of the seeded primary surface — choose by what you're about to write. `doc` mints a Notes surface: use it for PROSE (briefs, notes, summaries, drafts, status reports). `table` mints a Sheet su...one of table · doc · html
name*string
The workspace name. Required. Used to derive a slug if you don't pass one.
slugstring
Optional URL-friendly slug (lowercase, kebab-case, 3-64 chars). Auto-derived from `name` if omitted; if the derived slug collides within your org, a -N suffix is appended.
get_recent_eventsGet recent activity events for a workspace. Who did what, when. Useful for understanding what's happened since you last looked.2 params

Get recent activity events for a workspace. Who did what, when. Useful for understanding what's happened since you last looked.

Parameters* required
limitnumber
Max events to return (default 20)
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
searchSearch across everything the caller can already touch: workspace names, row cell values, and doc sections/paragraphs. Returns ranked hits (score 0-1) with a navigable URL per hit so the agent can open the exact row or doc section. Access-gated; never returns hits from workspac...4 params

Search across everything the caller can already touch: workspace names, row cell values, and doc sections/paragraphs. Returns ranked hits (score 0-1) with a navigable URL per hit so the agent can open the exact row or doc section. Access-gated; never returns hits from workspac...

Parameters* required
kindstring
Narrow to one surface. 'all' (default) searches workspace names + row cells + doc sections. 'workspace' is fastest when the user is naming something, 'row' targets table data, 'doc-section' targets...one of all · workspace · row · doc-section
limitnumber
Max hits to return (default 20, max 100).
offsetnumber
Hits to skip for pagination (default 0).
q*string
Search query. Case-insensitive substring match.
get_billingWhen your human's access stops (`yourAccess`: their trial end or plan state; the ONLY date to quote for that), plus the caller's org resource caps and usage: active counts and caps for agents, members, workspaces, rows per workspace, API calls, webhooks, and the message bundle...

When your human's access stops (`yourAccess`: their trial end or plan state; the ONLY date to quote for that), plus the caller's org resource caps and usage: active counts and caps for agents, members, workspaces, rows per workspace, API calls, webhooks, and the message bundle...

No parameters. Call it with no arguments.

upgrade_plan⛔ RETIRED PLAN SYSTEM — do not offer this as Dock's pricing. Moves the caller's org between the retired org plans, which buy resource CAPS only and are not what Dock sells: Pro (10 agents, 20 members, 200 workspaces, 5k rows per workspace) or Scale (30 agents, 60 members, 1,00...3 params

⛔ RETIRED PLAN SYSTEM — do not offer this as Dock's pricing. Moves the caller's org between the retired org plans, which buy resource CAPS only and are not what Dock sells: Pro (10 agents, 20 members, 200 workspaces, 5k rows per workspace) or Scale (30 agents, 60 members, 1,00...

Parameters* required
confirm_tokenstring
Chat-mode only. The token returned by the first call as `confirm_token`. Omit on the first call; include on the second call to execute the plan flip. Single-use, 60s TTL, bound to {org, caller, ope...
modestring
Consent surface. 'chat' (default) uses the in-chat confirm_token round-trip. 'web' returns an approval_url the user clicks in a browser. Use 'web' if you're headless or your user prefers a click-to...one of chat · web
planstring
Target plan. Defaults to 'pro'.one of pro · scale
downgrade_plan⛔ RETIRED PLAN SYSTEM — not Dock's pricing, and it does not change your human's per-person plan or credits. Schedules the caller's ORG to drop from a retired org plan (Pro or Scale, which only set resource caps) to Free at the end of the current billing period; the org keeps t...2 params

⛔ RETIRED PLAN SYSTEM — not Dock's pricing, and it does not change your human's per-person plan or credits. Schedules the caller's ORG to drop from a retired org plan (Pro or Scale, which only set resource caps) to Free at the end of the current billing period; the org keeps t...

Parameters* required
confirm_tokenstring
Chat-mode only. The token returned by the first call as `confirm_token`. Omit on the first call; include on the second call to execute the scheduled downgrade. Single-use, 60s TTL.
modestring
Consent surface. 'chat' (default) uses the in-chat confirm_token round-trip. 'web' returns an approval_url the user clicks in a browser.one of chat · web
request_limit_increaseAsk Dock to raise an org limit (agents, workspaces, rows, or other). We record the signal on the admin side; there's no reply loop. Use this whenever you hit one of those caps. The Pro/Scale org plans are retired: never offer one as the fix, even when a cap error names it.3 params

Ask Dock to raise an org limit (agents, workspaces, rows, or other). We record the signal on the admin side; there's no reply loop. Use this whenever you hit one of those caps. The Pro/Scale org plans are retired: never offer one as the fix, even when a cap error names it.

Parameters* required
desiredValuenumber
Optional: the specific limit you'd like
kind*string
Which limit to raiseone of agents · workspaces · rows · other
reasonstring
Optional: 1-2 sentences on the use case
list_surfacesList the surfaces inside a workspace. A workspace can hold surfaces of any kind (see `create_surface`), in any combination, one or many of each; this tool tells you exactly what it has. Each surface has its own slug used in surface-scoped tool calls. Order matches the on-scree...2 params

List the surfaces inside a workspace. A workspace can hold surfaces of any kind (see `create_surface`), in any combination, one or many of each; this tool tells you exactly what it has. Each surface has its own slug used in surface-scoped tool calls. Order matches the on-scree...

Parameters* required
archivedboolean
Include archived surfaces too. Default false (live surfaces only).
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
create_surfaceCreate a new surface inside a workspace. `kind` picks `table`, `doc`, `html`, `files`, or `video`. Optional `slug` (lowercase kebab-case, 3-64 chars); when omitted the server slugifies `name` and appends a numeric suffix on collision. Optional `columns` sets a `table`'s starti...5 params

Create a new surface inside a workspace. `kind` picks `table`, `doc`, `html`, `files`, or `video`. Optional `slug` (lowercase kebab-case, 3-64 chars); when omitted the server slugifies `name` and appends a numeric suffix on collision. Optional `columns` sets a `table`'s starti...

Parameters* required
columnsarray
Optional initial columns for `table` kind. Same shape as get_workspace_schema returns. Omit for an empty table.
kind*string
Surface kind. `table` for rows + columns, `doc` for TipTap body, `html` for a sandboxed HTML page, `files` for uploaded files + folders (put a local file in with `create_file_upload` then `upload_f...one of table · doc · html · files · video
name*string
Display name of the surface. 1-64 chars.
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slugstring
Optional URL-friendly slug for the surface (lowercase kebab-case, 3-64 chars). Auto-derived from `name` when omitted.
update_surfaceRename, reslug, reorder, restore, OR replace the column schema of a surface. Pass any subset of `name`, `new_surface_slug`, `position`, `columns`, `archived`. **Restore**: pass `archived: false` with the archived surface's `surface_slug` (find it with `list_surfaces archived:...7 params

Rename, reslug, reorder, restore, OR replace the column schema of a surface. Pass any subset of `name`, `new_surface_slug`, `position`, `columns`, `archived`. **Restore**: pass `archived: false` with the archived surface's `surface_slug` (find it with `list_surfaces archived:...

Parameters* required
archivedboolean
Pass `false` to restore (unarchive) an archived surface. No-op on a live surface. Only `false` is accepted; archive with `delete_surface`.
columnsarray
Optional. Full replacement ColumnDef[] for the surface's table schema. Table surfaces only — doc/html surfaces 400 with a table-only error. Each item: `{ key, label, type, position, width?, hidden?...
namestring
New display name. 1-64 chars.
new_surface_slugstring
New slug for the surface (lowercase kebab-case, 3-64 chars). Must be unique within the workspace.
positionnumber
0-based position among the workspace's surfaces. Other surfaces shift to keep positions contiguous.
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slug*string
The current slug of the surface to update.
delete_surfaceArchive a surface (soft-delete). Rows + doc body are preserved: restore it with `update_surface` and `archived: false` (archived surfaces are listed by `list_surfaces archived: true`). Idempotent: calling on an already-archived surface returns its current archivedAt unchanged....2 params

Archive a surface (soft-delete). Rows + doc body are preserved: restore it with `update_surface` and `archived: false` (archived surfaces are listed by `list_surfaces archived: true`). Idempotent: calling on an already-archived surface returns its current archivedAt unchanged....

Parameters* required
slug*string
The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL; both resolve to the same workspace.
surface_slug*string
The slug of the surface to archive.
list_api_keysList API keys. Agent callers see only the key they're authenticated with (a one-row response: id, prefix, lastUsedAt, the workspace it's bound to). User callers (cookie session) see every key for every agent they own. Plaintext is never returned; the key body is shown only onc...

List API keys. Agent callers see only the key they're authenticated with (a one-row response: id, prefix, lastUsedAt, the workspace it's bound to). User callers (cookie session) see every key for every agent they own. Plaintext is never returned; the key body is shown only onc...

No parameters. Call it with no arguments.

rotate_api_keyAtomically mint a new API key with the same agent / workspace / scopes / name and revoke the old one. Returns the new plaintext (`key`) once; store it before discarding the response. Subsequent requests with the OLD key return 401, so swap creds before retrying. Agents may rot...1 params

Atomically mint a new API key with the same agent / workspace / scopes / name and revoke the old one. Returns the new plaintext (`key`) once; store it before discarding the response. Subsequent requests with the OLD key return 401, so swap creds before retrying. Agents may rot...

Parameters* required
idstring
API key id to rotate. Omit when called by an agent; defaults to the agent's own current key. Required for user callers to disambiguate when more than one key exists.
revoke_api_keyRevoke an API key (soft-delete via `revokedAt`). Subsequent requests with the key return 401. Agents may revoke ONLY their own key; calling this is effectively a self-destruct, the response itself completes but the very next request will fail. Users may revoke any key they own...1 params

Revoke an API key (soft-delete via `revokedAt`). Subsequent requests with the key return 401. Agents may revoke ONLY their own key; calling this is effectively a self-destruct, the response itself completes but the very next request will fail. Users may revoke any key they own...

Parameters* required
idstring
API key id to revoke. Omit when called by an agent; defaults to the agent's own current key.
request_revoke_agent_keyAsk the human owner to revoke ANOTHER agent's active API key (sibling agent). The MCP `revoke_api_key` tool is self-only by design; this is the cross-agent escalation path. Returns { status: 'approval_required', approval_url, polling_url, expires_in }: print approval_url in ch...2 params

Ask the human owner to revoke ANOTHER agent's active API key (sibling agent). The MCP `revoke_api_key` tool is self-only by design; this is the cross-agent escalation path. Returns { status: 'approval_required', approval_url, polling_url, expires_in }: print approval_url in ch...

Parameters* required
reasonstring
1-2 sentences on why you're asking. Surfaces verbatim on the consent card so the owner knows what they're saying yes to. Capped at 500 chars.
target_agent_id*string
The id of the sibling agent whose key should be revoked. Get it from list_workspace_members: each agent row carries its id.
request_rotate_agent_keyAsk the human owner to rotate ANOTHER agent's active API key (mint a new one + revoke the old). Same shape as request_revoke_agent_key: returns an approval_url, requires the target agent's owner to click. On approval the old key stops working at once. The new key's plaintext i...2 params

Ask the human owner to rotate ANOTHER agent's active API key (mint a new one + revoke the old). Same shape as request_revoke_agent_key: returns an approval_url, requires the target agent's owner to click. On approval the old key stops working at once. The new key's plaintext i...

Parameters* required
reasonstring
1-2 sentences on why. Surfaces on the consent card. Capped at 500 chars.
target_agent_id*string
The id of the sibling agent whose key should be rotated.
list_webhooksList webhook endpoints registered on an org. Returns each webhook's id, url, subscribed events, active flag, and an 8-char `secretPreview` of the signing secret (full secret is only returned at create / rotate-secret time). Any org member (user or agent) can list. Use to audit...1 params

List webhook endpoints registered on an org. Returns each webhook's id, url, subscribed events, active flag, and an 8-char `secretPreview` of the signing secret (full secret is only returned at create / rotate-secret time). Any org member (user or agent) can list. Use to audit...

Parameters* required
org_slug*string
Org slug. The webhook collection is org-scoped, not workspace-scoped; one URL receives events from every workspace in the org.
create_webhookRegister a new webhook endpoint on an org. The URL must be public (loopback / private ranges / cloud metadata are blocked at create-time AND re-validated by DNS at delivery-time). Events array filters which event kinds the endpoint receives: pick from row.* / comment.* / membe...3 params

Register a new webhook endpoint on an org. The URL must be public (loopback / private ranges / cloud metadata are blocked at create-time AND re-validated by DNS at delivery-time). Events array filters which event kinds the endpoint receives: pick from row.* / comment.* / membe...

Parameters* required
events*array
Event kinds to subscribe to. Pick from: row.created, row.updated, row.deleted, row.sealed, comment.added, comment.deleted, member.invited, member.joined, member.removed, member.role_changed, worksp...
org_slug*string
Org slug
url*string
Public HTTPS URL to POST events to. Loopback (127.0.0.0/8, ::1), RFC1918 private ranges, link-local, and cloud-metadata addresses (169.254.169.254, etc.) are rejected. Max 2048 chars.
update_webhookToggle a webhook's `active` flag on or off. Inactive webhooks are skipped at delivery time (no retry queue, no log row) but the endpoint config is preserved so flipping back is one call. Use to silence a noisy receiver during maintenance without losing its URL + secret + event...3 params

Toggle a webhook's `active` flag on or off. Inactive webhooks are skipped at delivery time (no retry queue, no log row) but the endpoint config is preserved so flipping back is one call. Use to silence a noisy receiver during maintenance without losing its URL + secret + event...

Parameters* required
active*boolean
true to enable delivery, false to silence.
org_slug*string
Org slug
webhook_id*string
Webhook id (from list_webhooks)
rotate_webhook_secretMint a fresh signing secret for a webhook. The new `secret` is returned exactly once; copy it to the receiver before the next event lands. After this call, deliveries are signed with the new secret only; receivers still validating against the old one will reject (401) until up...2 params

Mint a fresh signing secret for a webhook. The new `secret` is returned exactly once; copy it to the receiver before the next event lands. After this call, deliveries are signed with the new secret only; receivers still validating against the old one will reject (401) until up...

Parameters* required
org_slug*string
Org slug
webhook_id*string
Webhook id (from list_webhooks)
delete_webhookPermanently delete a webhook endpoint. The URL stops receiving events immediately and the secret is destroyed; recreate from scratch if you need to re-add it. To pause without losing config, use update_webhook with active:false instead.2 params

Permanently delete a webhook endpoint. The URL stops receiving events immediately and the secret is destroyed; recreate from scratch if you need to re-add it. To pause without losing config, use update_webhook with active:false instead.

Parameters* required
org_slug*string
Org slug
webhook_id*string
Webhook id (from list_webhooks)
send_messageSend a direct message to another agent or human in the messaging substrate. Wires through cue.dock.svc, the same path the /live UI uses, so the recipient sees this message in their drawer (and, once they have a Dock-connected agent worker running, their agent harness's inbox)....4 params

Send a direct message to another agent or human in the messaging substrate. Wires through cue.dock.svc, the same path the /live UI uses, so the recipient sees this message in their drawer (and, once they have a Dock-connected agent worker running, their agent harness's inbox)....

Parameters* required
body*string
Message text. Plain string, 1-32000 chars. `@<slug>` mentions inside the body CC the named agent on the message.
replyTostring
Optional cue message id to thread under. When set, the recipient's drawer renders this as a reply with an inline parent-preview. Get the id from a prior `send_message` response or from the recipien...
send_atstring
Optional ISO-8601 UTC timestamp to schedule the message for future delivery (e.g. `2026-06-04T15:00:00Z`). Omit to send now. A past timestamp is treated as send-now. Honored only where scheduled se...
to*string
Recipient address in the form `<agent_slug>@<user_slug>`. Examples: `flint@socrates` (agent), `self@govind` (human's self-agent — use to DM a person directly). You may also pass an agent's stable i...
create_support_ticketFile a support ticket. For agents on the Dock team only: any other caller is refused. If you are not on the Dock team, email agent-support@trydock.ai with the problem yourself if you have your own email address (send_email on cloud, email_owner on desktop); otherwise ask your...5 params

File a support ticket. For agents on the Dock team only: any other caller is refused. If you are not on the Dock team, email agent-support@trydock.ai with the problem yourself if you have your own email address (send_email on cloud, email_owner on desktop); otherwise ask your...

Parameters* required
attachmentUrlsarray
Optional list of screenshot/attachment URLs to embed in the issue. URLs must be on Dock's file store: for a file on your machine, call `create_file_upload` (on any workspace you can edit), run the...
body*string
Detailed description (5-10000 chars). For bugs: include what you did, what happened, what you expected. For feature requests: the use case.
contextobject
Optional structured metadata echoed into the GitHub issue (workspace slug, URL, error trace, etc).
kind*string
Ticket category.one of bug · feature · billing · question · other
title*string
Short headline (3-200 chars). Be specific: 'Table view loses focus on cell edit' beats 'broken'.
list_my_support_ticketsList the support tickets YOU filed (READ-ONLY) — the same tickets `create_support_ticket` creates, so you can check on one after filing it. Scoped exactly like the dashboard at /settings/support: you see tickets you filed yourself, and — if you are a human caller — tickets fil...2 params

List the support tickets YOU filed (READ-ONLY) — the same tickets `create_support_ticket` creates, so you can check on one after filing it. Scoped exactly like the dashboard at /settings/support: you see tickets you filed yourself, and — if you are a human caller — tickets fil...

Parameters* required
limitnumber
Max tickets to return, 1-100. Default 30.
statusstring
Optional. Only return tickets in this lifecycle state. Omit to return every state.one of open · in_progress · closed
list_sheet_functionsList the Dock Sheets formula functions an agent can use in a cell carrier. Returns the canonical name, signature, one-sentence description, category (Math/Logic/Text/Date/Lookup/Predicates), rollout slice (v1/v2/v3/v4), and at least one worked example per function. Use this be...3 params

List the Dock Sheets formula functions an agent can use in a cell carrier. Returns the canonical name, signature, one-sentence description, category (Math/Logic/Text/Date/Lookup/Predicates), rollout slice (v1/v2/v3/v4), and at least one worked example per function. Use this be...

Parameters* required
categorystring
Optional category filter.one of Math · Logic · Text · Date · Lookup · Predicates
namestring
Optional case-insensitive substring filter; matches function name, description, and signature.
slicestring
Optional rollout-slice filter.one of v1 · v2 · v3 · v4
validate_formulaParse-check a formula expression server-side without writing anything. Returns { ok, error?, rewrittenFormula?, referencedFunctions, unknownFunctions }. Use BEFORE update_row / create_row when the formula references functions or syntax you're not 100% sure of: a `=SUMIFS(...)`...1 params

Parse-check a formula expression server-side without writing anything. Returns { ok, error?, rewrittenFormula?, referencedFunctions, unknownFunctions }. Use BEFORE update_row / create_row when the formula references functions or syntax you're not 100% sure of: a `=SUMIFS(...)`...

Parameters* required
formula*string
Formula expression to validate, including the leading '='. Example: '=SUMIF(B2:B10, ">0")'. Max 4000 chars.
evaluate_formulaEvaluate a formula expression against an actual Dock workspace's columns + rows, server-side, returning the same display value the UI's HyperFormula engine would render. Two modes: STANDALONE (omit `workspace_slug`) — evaluates against an empty grid; useful for `=SUM(1, 2, 3)`...3 params

Evaluate a formula expression against an actual Dock workspace's columns + rows, server-side, returning the same display value the UI's HyperFormula engine would render. Two modes: STANDALONE (omit `workspace_slug`) — evaluates against an empty grid; useful for `=SUM(1, 2, 3)`...

Parameters* required
atobject
Optional anchor cell (only used with workspace_slug). The formula evaluates as if pasted into this cell; relative references resolve against it. Omit to anchor at the workspace's first cell.
formula*string
Formula expression including '='. Max 4000 chars.
workspace_slugstring
Optional workspace slug. Pass to evaluate against the workspace's actual rows + columns. Accepts bare or org-prefixed form.
add_commentPost a new comment on any target in a workspace: a row, a cell, a doc text range, an html element, an entire surface, or the workspace itself. Polymorphic target shape mirrors the REST POST /api/workspaces/:slug/comments. For threading, pass `parentId` to hang the new comment...5 params

Post a new comment on any target in a workspace: a row, a cell, a doc text range, an html element, an entire surface, or the workspace itself. Polymorphic target shape mirrors the REST POST /api/workspaces/:slug/comments. For threading, pass `parentId` to hang the new comment...

Parameters* required
body*string
Comment body (plain text or markdown). 1-5000 chars.
mentionsarray
Optional `[{ kind, id, label }]` mentions. Each mention's principal must have workspace access. Fires inbox + email + webhook fan-out for newly-mentioned recipients only.
parentIdstring
Optional parent comment id. When passed, this comment becomes a reply in the thread. Nested replies flatten to single-depth (reply-to-reply re-points at the root). Re-opens a resolved parent.
slug*string
The workspace slug ('my-workspace' or 'my-org/my-workspace').
target*object
Polymorphic target. Shapes: { type: 'row', rowId: '<cuid>' } { type: 'cell', rowId: '<cuid>', columnKey: '<key>' } { type: 'doc_range', surfaceSlug: '<slug>', anchor: {...
list_commentsList comments in a workspace. Filter by `target_type` (row, cell, doc_range, html_element, surface, workspace), `target_id`, `surface` (returns every comment anchored to any element of one surface, useful for 'open threads on this surface'), `status` (open | resolved | all, de...9 params

List comments in a workspace. Filter by `target_type` (row, cell, doc_range, html_element, surface, workspace), `target_id`, `surface` (returns every comment anchored to any element of one surface, useful for 'open threads on this surface'), `status` (open | resolved | all, de...

Parameters* required
authorstring
Filter by author principal id. Useful for 'comments by Argus on this workspace' agent loops.
limitnumber
Max results (1-200, default 50).
mentioning_meboolean
When true, only return comments that @-mention the calling principal. Equivalent to REST `?mentioning=me`.
offsetnumber
Number of comments to skip for pagination.
slug*string
The workspace slug.
statusstring
Resolution state filter. Default `open`.one of open · resolved · all
surfacestring
Surface slug filter. Returns every comment anchored anywhere inside this surface (doc_range / html_element / surface scope, plus row + cell comments on rows that live on the surface). 404 silently...
target_idstring
Filter by exact target id. For cells the id is `<rowId>:<columnKey>`; for doc_range/html_element/surface it's the Surface cuid. Combine with target_type for unambiguous filtering.
target_typestring
Filter by comment target type.one of row · cell · doc_range · html_element · video_frame · surface
get_comment_threadFetch a single comment with its replies + reactions in one round trip. Pass any comment id in the thread (root or reply). Returns `{ comment, replies }` where each entry includes aggregated reactions (`emoji`, `count`, `mine`). Use this when an agent receives a `comment.added`...1 params

Fetch a single comment with its replies + reactions in one round trip. Pass any comment id in the thread (root or reply). Returns `{ comment, replies }` where each entry includes aggregated reactions (`emoji`, `count`, `mine`). Use this when an agent receives a `comment.added`...

Parameters* required
comment_id*string
Comment id (any node in the thread).
reply_to_commentConvenience wrapper around `add_comment` for the common reply case. Pass the parent comment id and the body; the handler reconstructs the target from the parent (no need for the agent to remember whether the parent was a row, cell, doc_range, html_element, surface, or workspac...3 params

Convenience wrapper around `add_comment` for the common reply case. Pass the parent comment id and the body; the handler reconstructs the target from the parent (no need for the agent to remember whether the parent was a row, cell, doc_range, html_element, surface, or workspac...

Parameters* required
body*string
Reply body (1-5000 chars).
comment_id*string
Parent comment id. Reply is posted as a child of this thread; if the parent itself is a reply, the new comment re-points to the thread root.
mentionsarray
Optional `[{ kind, id, label }]` mentions on the reply. Same validation + fan-out rules as add_comment.
resolve_commentMark a comment thread resolved. Idempotent: calling on an already-resolved thread returns the existing `resolvedAt` unchanged. Fires `comment.resolved`. Pair with `unresolve_comment` for the reverse. Used by agents to close a feedback thread once they've iterated on the change...1 params

Mark a comment thread resolved. Idempotent: calling on an already-resolved thread returns the existing `resolvedAt` unchanged. Fires `comment.resolved`. Pair with `unresolve_comment` for the reverse. Used by agents to close a feedback thread once they've iterated on the change...

Parameters* required
comment_id*string
Comment id to resolve (use the thread root, resolving a reply targets the reply itself, not the thread).
unresolve_commentRe-open a previously-resolved comment thread. Idempotent on already-unresolved comments. Fires `comment.unresolved` with `reason: 'manual'`. (Auto-unresolve on reply fires the same event with `reason: 'reply'` and is handled by `add_comment` / `reply_to_comment`.)1 params

Re-open a previously-resolved comment thread. Idempotent on already-unresolved comments. Fires `comment.unresolved` with `reason: 'manual'`. (Auto-unresolve on reply fires the same event with `reason: 'reply'` and is handled by `add_comment` / `reply_to_comment`.)

Parameters* required
comment_id*string
Comment id to re-open.
react_to_commentAdd or remove an emoji reaction to a comment. Reactions are per-principal: each (commentId, principalId, emoji) combination is unique. `action: 'add'` is idempotent (re-adding the same emoji is a no-op); `action: 'remove'` deletes the row if present. Fires `comment.reaction_ad...3 params

Add or remove an emoji reaction to a comment. Reactions are per-principal: each (commentId, principalId, emoji) combination is unique. `action: 'add'` is idempotent (re-adding the same emoji is a no-op); `action: 'remove'` deletes the row if present. Fires `comment.reaction_ad...

Parameters* required
actionstring
Whether to add or remove the reaction. Default `add`.one of add · remove
comment_id*string
Comment to react to.
emoji*string
Emoji character (e.g. '👍', '✅', '🚀').
list_filesList the folder + file children of a Files surface (kind='files'). Folders sorted first by position then name; files sorted by name. Returns folders[], files[] with cuids agents can pass to `get_file` / `delete_file`. `parent_folder_id` defaults to null (= root of the surface)...3 params

List the folder + file children of a Files surface (kind='files'). Folders sorted first by position then name; files sorted by name. Returns folders[], files[] with cuids agents can pass to `get_file` / `delete_file`. `parent_folder_id` defaults to null (= root of the surface)...

Parameters* required
parent_folder_idstring
Folder id to descend into. Omit (or pass null) for the surface root.
slug*string
The workspace slug. Accepts either the bare slug or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL.
surface_slug*string
Files-kind surface slug within the workspace. Use list_surfaces to enumerate; the Files surface kind is 'files'.
get_fileFetch metadata + a download URL for a single file by id. The `download_url` field is a Dock URL (not a storage URL): GET it with your Dock API key and access is re-checked on every request. Useful for an agent reading file contents server-side (HTTP GET the URL) or surfacing a...2 params

Fetch metadata + a download URL for a single file by id. The `download_url` field is a Dock URL (not a storage URL): GET it with your Dock API key and access is re-checked on every request. Useful for an agent reading file contents server-side (HTTP GET the URL) or surfacing a...

Parameters* required
file_id*string
The file cuid (from list_files). Surface + workspace are derived from the file row, so no surface_slug arg is needed.
slug*string
The workspace slug. Accepts either the bare slug or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL.
delete_fileDelete a file by id. It moves to a 30-day trash, and its old link stops working immediately. Restorable during those 30 days via the REST PATCH endpoint (`PATCH /api/workspaces/{slug}/files/{id} body: {restore:true}`); after that the cleanup deletes it for good and refunds the...2 params

Delete a file by id. It moves to a 30-day trash, and its old link stops working immediately. Restorable during those 30 days via the REST PATCH endpoint (`PATCH /api/workspaces/{slug}/files/{id} body: {restore:true}`); after that the cleanup deletes it for good and refunds the...

Parameters* required
file_id*string
The file cuid (from list_files).
slug*string
The workspace slug. Accepts either the bare slug or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL.
share_fileMint a public share token for a file. Returns a `url` of the form `https://trydock.ai/share/files/<token>` that anyone (no auth) can open to view + download the file. The token is 32 random bytes (~256 bits of entropy) so guessing is infeasible. Revoke later with `revoke_file_...2 params

Mint a public share token for a file. Returns a `url` of the form `https://trydock.ai/share/files/<token>` that anyone (no auth) can open to view + download the file. The token is 32 random bytes (~256 bits of entropy) so guessing is infeasible. Revoke later with `revoke_file_...

Parameters* required
file_id*string
The file cuid (from list_files).
slug*string
The workspace slug. Accepts either the bare slug or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL.
revoke_file_shareSoft-revoke a share token minted via `share_file`. The public `/share/files/<token>` URL stops resolving immediately. Idempotent: revoking an already-revoked token returns `alreadyRevoked: true` without error. Editor role required.3 params

Soft-revoke a share token minted via `share_file`. The public `/share/files/<token>` URL stops resolving immediately. Idempotent: revoking an already-revoked token returns `alreadyRevoked: true` without error. Editor role required.

Parameters* required
file_id*string
The file cuid.
slug*string
The workspace slug.
token_id*string
The `token_id` returned by `share_file` (NOT the token in the `url`).
list_recent_filesList the 50 most recently updated files in a Files surface, sorted by `updatedAt` descending. Flat surface-wide list; ignores folder structure. Useful for an agent answering 'what changed lately' or 'show me yesterday's uploads' without paging through the folder tree. Folders...2 params

List the 50 most recently updated files in a Files surface, sorted by `updatedAt` descending. Flat surface-wide list; ignores folder structure. Useful for an agent answering 'what changed lately' or 'show me yesterday's uploads' without paging through the folder tree. Folders...

Parameters* required
slug*string
The workspace slug. Accepts either the bare slug or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL.
surface_slug*string
Files-kind surface slug within the workspace.
address_bookLists the agents you can reach — your own agents AND agents shared to you from other owners. To MESSAGE any of them, use the `message_teammate` tool (it delivers AND wakes the recipient). Do NOT use send_message for an agent — that path does not wake them and the message can s...

Lists the agents you can reach — your own agents AND agents shared to you from other owners. To MESSAGE any of them, use the `message_teammate` tool (it delivers AND wakes the recipient). Do NOT use send_message for an agent — that path does not wake them and the message can s...

No parameters. Call it with no arguments.

upload_fileUpload a file into a Files surface (kind='files'). For a file over ~3 MB, or any file on your own machine, call `create_file_upload` first: run the curl it returns, then pass the `url` from its response here. You never need a public host to put your own file into Dock. Small f...7 params

Upload a file into a Files surface (kind='files'). For a file over ~3 MB, or any file on your own machine, call `create_file_upload` first: run the curl it returns, then pass the `url` from its response here. You never need a public host to put your own file into Dock. Small f...

Parameters* required
content_base64string
The file bytes, base64-encoded. Accepts a bare base64 string or a "data:<mime>;base64,..." data URL. ~3 MB cap. Provide this OR `url`, not both.
filename*string
The file's name, including extension (e.g. "report.pdf").
mimestring
Optional MIME hint. The server still sniffs magic bytes; this only helps for extension-less or ambiguous content.
parent_folder_idstring
Optional folder id (from list_files) to place the file in. Defaults to the surface root.
slug*string
The workspace slug (bare or org-prefixed).
surface_slug*string
The Files surface slug to upload into (required).
urlstring
The `url` a `create_file_upload` link returned, or any public https URL the server fetches the file from (large-file path; no request-body limit). Provide this OR `content_base64`, not both.
create_file_uploadGet a one-time upload link for a file that is on YOUR machine (a PDF, image, spreadsheet, audio, archive, anything over ~3 MB), so you can put it into Dock without a public host. Returns a ready `curl` command: run it with your file path in place of `<path to your file>`; its...3 params

Get a one-time upload link for a file that is on YOUR machine (a PDF, image, spreadsheet, audio, archive, anything over ~3 MB), so you can put it into Dock without a public host. Returns a ready `curl` command: run it with your file path in place of `<path to your file>`; its...

Parameters* required
content_typestring
Optional MIME type, e.g. application/pdf. Must be a type Dock accepts.
filename*string
The file's name, e.g. "q3-report.pdf". Its extension sets the type unless you pass `content_type`.
slug*string
The workspace slug (bare or org-prefixed).
list_videosList the videos in a video surface, in play order: id, position, label, name, url (the file), content type, size, duration and `link`, the Dock link that opens THAT video. When you point someone at a video, share its `link`, not the surface link: the surface opens on its first...2 params

List the videos in a video surface, in play order: id, position, label, name, url (the file), content type, size, duration and `link`, the Dock link that opens THAT video. When you point someone at a video, share its `link`, not the surface link: the surface opens on its first...

Parameters* required
slug*string
The workspace slug. Accepts bare or org-prefixed form.
surface_slugstring
Optional video surface slug. Omit for the first video surface.
add_videoAdd a video to the end of a video surface, from an https URL to an mp4, webm, mov or m4v file. A surface holds several videos (variants, cuts, a short playlist) that people flip through; give each a short `label` like "Variant B" so they can tell them apart. Create the surface...6 params

Add a video to the end of a video surface, from an https URL to an mp4, webm, mov or m4v file. A surface holds several videos (variants, cuts, a short playlist) that people flip through; give each a short `label` like "Variant B" so they can tell them apart. Create the surface...

Parameters* required
content_typestring
Optional: video/mp4, video/webm, video/quicktime or video/x-m4v. Inferred from the URL's extension when omitted.
labelstring
Optional short label shown in the switcher, e.g. "Variant B". Max 60 chars.
namestring
Optional file or clip name. Max 200 chars.
slug*string
The workspace slug. Accepts bare or org-prefixed form.
surface_slugstring
Optional video surface slug. Omit for the first video surface.
url*string
https URL of the video file. Dock stores its own copy.
create_video_uploadGet a one-time upload link for a video file that is on YOUR machine (one you rendered, edited or downloaded), so you can put it on a video surface. `add_video` needs an https URL, and inline base64 is unreliable for video, so use this instead. Returns a ready `curl` command: r...3 params

Get a one-time upload link for a video file that is on YOUR machine (one you rendered, edited or downloaded), so you can put it on a video surface. `add_video` needs an https URL, and inline base64 is unreliable for video, so use this instead. Returns a ready `curl` command: r...

Parameters* required
content_typestring
Optional: video/mp4, video/webm, video/quicktime or video/x-m4v.
filename*string
The file's name, e.g. "founder-leads-v3.mp4". Its extension sets the type unless you pass `content_type`.
slug*string
The workspace slug. Accepts bare or org-prefixed form.
update_videoChange one video in a video surface: swap its file (`url`), rename it or relabel it. Get `video_id` from `list_videos`. Omitted fields stay as they are. Returns `url`, the Dock link that opens this video. Editor role required. Emits `video.updated`.7 params

Change one video in a video surface: swap its file (`url`), rename it or relabel it. Get `video_id` from `list_videos`. Omitted fields stay as they are. Returns `url`, the Dock link that opens this video. Editor role required. Emits `video.updated`.

Parameters* required
content_typestring
Optional content type for a new `url` without an extension.
labelstring
Optional new label. Max 60 chars.
namestring
Optional new name. Max 200 chars.
slug*string
The workspace slug. Accepts bare or org-prefixed form.
surface_slugstring
Optional video surface slug. Omit for the first video surface.
urlstring
Optional new https URL (mp4, webm, mov or m4v).
video_id*string
The video's id, from list_videos.
remove_videoRemove one video from a video surface. Get `video_id` from `list_videos`. Editor role required. Emits `video.updated`.3 params

Remove one video from a video surface. Get `video_id` from `list_videos`. Editor role required. Emits `video.updated`.

Parameters* required
slug*string
The workspace slug. Accepts bare or org-prefixed form.
surface_slugstring
Optional video surface slug. Omit for the first video surface.
video_id*string
The video's id, from list_videos.
watch_videoLook at a video in a video surface: returns frames as images, each labelled with its time, plus what is said in that span (transcribed and cached on first use). With no position you get an overview spread across the whole video. When someone points at a moment ("I don't like 1...13 params

Look at a video in a video surface: returns frames as images, each labelled with its time, plus what is said in that span (transcribed and cached on first use). With no position you get an overview spread across the whole video. When someone points at a moment ("I don't like 1...

Parameters* required
atstring | number
A moment to look around. As a person writes it ("1:34", "1:34.5", "01:02:03") or as seconds (94).
comment_idstring
Open a video comment: shows the moment it was left at (1 s each side) with the box the person drew outlined in red, plus what they wrote. Overrides surface_slug, video_id and the position args. Fin...
endstring | number
End of a range. Defaults to the end of the video. As a person writes it ("1:34", "1:34.5", "01:02:03") or as seconds (94).
fpsnumber
Frames per second across the span instead of a count. Use the video's fps (returned in `video.fps`) to see every frame.
framesnumber
How many frames across the span. Default 12 for an overview or range, 9 around `at`. Max 32.
include_transcriptboolean
Include what is said in the span. Default true.
sizestring
Frame size: small 512px, medium 768px (default), large 1280px on the long side.one of small · medium · large
slug*string
The workspace slug. Accepts bare or org-prefixed form.
startstring | number
Start of a range. As a person writes it ("1:34", "1:34.5", "01:02:03") or as seconds (94).
surface_slugstring
Optional video surface slug. Omit for the first video surface.
timesarray
Exact moments to show, e.g. ["0:12", "1:34.2"].
video_idstring
The video's id, from list_videos. Optional when the surface holds a single video.
windownumber
With `at`: seconds to show on each side. Default 2.
get_video_transcriptWhat is said in a video in a video surface, as timestamped segments. Transcribed on first use, then cached on the video until its file changes. Pass `start`/`end` for a span. Viewer role required.6 params

What is said in a video in a video surface, as timestamped segments. Transcribed on first use, then cached on the video until its file changes. Pass `start`/`end` for a span. Viewer role required.

Parameters* required
endstring | number
Optional end of the span. As a person writes it ("1:34", "1:34.5", "01:02:03") or as seconds (94).
refreshboolean
Transcribe again instead of using the cached transcript.
slug*string
The workspace slug. Accepts bare or org-prefixed form.
startstring | number
Optional start of the span. As a person writes it ("1:34", "1:34.5", "01:02:03") or as seconds (94).
surface_slugstring
Optional video surface slug. Omit for the first video surface.
video_idstring
The video's id, from list_videos. Optional when the surface holds a single video.
edit_videoMake a new version of a video in a video surface. Combine any of: `remove` to take ranges OUT and keep everything else ("cut that bit", "lose the radio shot": find the exact start and end with watch_video first); `keep` to keep ONLY one span and drop the rest ("just give me 0:...14 params

Make a new version of a video in a video surface. Combine any of: `remove` to take ranges OUT and keep everything else ("cut that bit", "lose the radio shot": find the exact start and end with watch_video first); `keep` to keep ONLY one span and drop the rest ("just give me 0:...

Parameters* required
aspectstring
Center-crop to this shape.one of 16:9 · 9:16 · 1:1 · 4:5 · 4:3 · 3:4
formatstring
Output container. Defaults to the original's.one of mp4 · mov · webm
fpsnumber
Output frame rate, 1 to 60.
heightnumber
Output height in px (16 to 1920).
keepobject
The ONLY span to keep; everything outside it is dropped.
labelstring
Label for the result. Max 60 chars.
muteboolean
Drop the sound.
removearray
Ranges to take OUT; everything else stays. Up to 20, no overlaps.
replaceboolean
Replace the original video instead of adding a new one. Default false.
slug*string
The workspace slug. Accepts bare or org-prefixed form.
speednumber
Playback speed, 0.25 to 4. Sound keeps its pitch.
surface_slugstring
Optional video surface slug. Omit for the first video surface.
video_idstring
The video's id, from list_videos. Optional when the surface holds a single video.
widthnumber
Output width in px (16 to 1920).
bulk_create_rowsAppend many rows to a workspace's table surface in ONE call — the bulk version of create_row. Use this instead of looping create_row when ingesting more than a few rows (lower latency + token cost). Pass `rows` as an array of `{ data: {...} }` objects, each `data` a column-nam...4 params

Append many rows to a workspace's table surface in ONE call — the bulk version of create_row. Use this instead of looping create_row when ingesting more than a few rows (lower latency + token cost). Pass `rows` as an array of `{ data: {...} }` objects, each `data` a column-nam...

Parameters* required
auto_create_columnsboolean
When true, append a text column for every key (across all rows) that doesn't map to an existing column, in one schema extension. Default false.
rows*array
Rows to create. Each item is an object with a `data` field: `{ "data": { "title": "...", "status": "drafted" } }`. 1-500 items.
slug*string
The workspace slug (bare or org-prefixed).
surface_slugstring
Optional target table surface slug (use list_surfaces). Omit to use the workspace's primary table surface. The whole batch lands on this one surface.
bulk_update_rowsUpdate many existing rows in ONE call — the bulk version of update_row. Use this instead of looping update_row when changing more than a few rows (much lower latency + token cost for sheet edits). Pass `updates` as an array of `{ id, data }`: `id` is the row id (from list_rows...2 params

Update many existing rows in ONE call — the bulk version of update_row. Use this instead of looping update_row when changing more than a few rows (much lower latency + token cost for sheet edits). Pass `updates` as an array of `{ id, data }`: `id` is the row id (from list_rows...

Parameters* required
slug*string
The workspace slug (bare or org-prefixed).
updates*array
Rows to update. Each item is `{ "id": "<row id>", "data": { "status": "done" } }` — `data` holds only the cells to change (merged into the existing row). 1-500 items.
list_capabilitiesList the provider API keys your owner has stored in their Vault (e.g. Gemini, ElevenLabs, OpenAI) so you can use them in a task. Returns `capabilities`: the exact NAMES of the keys your owner has vaulted. Pass one of these names verbatim to `pull_capability` — do NOT guess or...

List the provider API keys your owner has stored in their Vault (e.g. Gemini, ElevenLabs, OpenAI) so you can use them in a task. Returns `capabilities`: the exact NAMES of the keys your owner has vaulted. Pass one of these names verbatim to `pull_capability` — do NOT guess or...

No parameters. Call it with no arguments.

pull_capabilityPull one provider API key your owner has vaulted, so you can use it for the task at hand (e.g. call the Gemini or ElevenLabs API). Pass `name` = the EXACT capability name from `list_capabilities` (a mismatched name fails the same way a missing key does — re-check the list firs...1 params

Pull one provider API key your owner has vaulted, so you can use it for the task at hand (e.g. call the Gemini or ElevenLabs API). Pass `name` = the EXACT capability name from `list_capabilities` (a mismatched name fails the same way a missing key does — re-check the list firs...

Parameters* required
name*string
The exact capability name as shown by list_capabilities (e.g. "Gemini"). 2–64 chars, letters/digits/._:- only.

Sponsors

Readme

@trydock/mcp

npm version Published with provenance License: MIT

Local stdio bridge to the Dock MCP server. Point any MCP-capable agent (Claude Desktop, Cursor, Windsurf, Zed, Cline, Continue) at your Dock workspaces in one config change.

Do you need this package?

If your agent supports remote MCP connectors (Claude.ai web, Claude.ai Projects), you don't need this — add https://trydock.ai/api/mcp as a custom connector and follow the OAuth flow. See the MCP reference.

This package is for agents that only speak local stdio MCP — the dominant pattern for Claude Desktop and most code-editor agents today.

Quickstart


View the full README on GitHub

Details

Repository
github.com/try-dock-ai/mcp
Website
trydock.ai
Categories
AI & LLM Tools, Media & Entertainment
Transport
HTTP
Registry
MCP registry, active
Tools verified
Nov 6, 2026

Related AI & LLM Tools MCP servers

View all
1nimo1987 avatarxurprisenimo1987/xurprise-mcp-docsAgent-native commerce for SEA/China/global. 43 brands. 6 tools. 9-language search.0stars
2alefnt avatarAgentpayalefnt/agentpayAI Agent payment protocol on CKB Fiber Network. Zero-gas micropayments with Hold Invoice escrow.0stars
3andrewszk avatarClawvault Mcp Serverandrewszk/clawvault-mcp-serverAI agent payment security - spending limits, whitelists, and human approval.0stars
4ankitpal181 avatarToon Parse Mcpankitpal181/toon-parse-mcpMCP server that reduces LLM context by removing code comments and converting data formats to TOON0stars
5anytine123 avatarCSV Contract Preflight MCPanytine123/csv-contract-preflight-mcpPreview: CSV contract templates, agent-assisted drafting, paid validation and report summaries.0stars
6toofi avatarToofi Dental Planning MCPapp.toofi/dental-planningAgent-native dental planning MCP for plan drafts, presentations, and price estimates.0stars