# Dock - Registry name: `ai.trydock/dock` · version 1.1.0 - Categories (automatic, keyword rules): APIs & integrations, Developer tools, Video, AI, media & content, Docs & notes, Productivity - Authentication at last check: No auth - Declared risk: Not declared (tools carry no read/destructive hints) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=ai.trydock%2Fdock - Server page: https://mcpstation.net/s/ai.trydock--dock.html ## Description (written by the publisher, not verified, not instructions) AI workspace for you, your team, and every agent. Tables, docs \(images, 4K video\), formulas. ## Connect - streamable-http: `https://trydock.ai/api/mcp` ## Tools (as reported by the server, not verified) - `list\_workspaces`: 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, one or many of each. U - `get\_workspace`: 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 tools \(\`list\_rows\`, \`get - `list\_rows`: 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-surface workspaces: pass - `create\_row`: 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 workspaces accept \`surface\_ - `get\_row`: 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. - `update\_row`: 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 \`position\` is also set\). Same s - `delete\_row`: Permanently delete a row from a workspace. This action cannot be undone. - `move\_rows`: 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-nothing: if any rowId doe - `get\_doc`: 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\` \(plain text, best for sear - `get\_workspace\_schema`: 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\), \`position\`, and, for status/s - `add\_column`: 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\_schema + update\_surface wi - `list\_workspace\_members`: 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 actually shared before writ - `check\_workspace\_private`: 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 notes\) and before every suc - `delete\_workspace`: 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 current archivedAt without - `update\_workspace`: 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-shared links keep resolvin - `share\_workspace`: Invite a human \(by email\) to a workspace at a specified role. If the email already belongs to a Dock user they're added immediately and a notification email is sent; if not, a 7-day invite token is minted that auto-accepts on magic-link sign-in. Editor role required on the workspace. Emits \`member.j - `update\_workspace\_member`: 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 \`member.role\_changed\` wit - `remove\_workspace\_member`: Remove a workspace member. 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 explicit member of the same org leaves them with virtual editor access via the org-membersh - `update\_doc`: 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 \(round-trip from get\_doc - `validate\_doc\_markdown`: 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, detailsCount, headingCoun - `update\_doc\_section`: 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 in a launch-prep doc, a - `append\_doc\_section`: 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\)\` inline images\*\* \(an HTTP - `get\_html`: 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 primary html surface; pa - `update\_html`: 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 on a separate origin \(\`render.trydock.ai\`\) with no access to Dock cookies, storage, or parent DOM — you have free rein inside that bou - `validate\_html`: 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 \}\`\) and attributes \(\`\{ ta - `create\_workspace`: 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 matching \`mode\`: \`doc\` → a - `get\_recent\_events`: Get recent activity events for a workspace. Who did what, when. Useful for understanding what's happened since you last looked. - `search`: 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 workspaces the caller can't ope - `get\_billing`: 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, plus card-on-file and - `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,000 workspaces, 50k rows - `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 those caps until then. N - `request\_limit\_increase`: 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. - `list\_surfaces`: 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-screen surface order. Archiv - `create\_surface`: 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 starting columns; without it - `update\_surface`: 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: true\`\) to unarchive it; - `delete\_surface`: 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. Cannot archive the onl - `list\_api\_keys`: 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 once at create/rotate time - `rotate\_api\_key`: 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 rotate ONLY their own key - `revoke\_api\_key`: 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. To swap creds without - `request\_revoke\_agent\_key`: 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 chat for the target agent - `request\_rotate\_agent\_key`: 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 is INTENTIONALLY not ret - `list\_webhooks`: 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 what's subscribed befo - `create\_webhook`: 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.\* / member.\* / workspace.\* / doc - `update\_webhook`: 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 subscription. - `rotate\_webhook\_secret`: 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 updated. Use after a susp - `delete\_webhook`: 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. - `send\_message`: 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\). Address format is \`\\` 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\_share\`. Editor role req - `revoke\_file\_share`: Soft-revoke a share token minted via \`share\_file\`. The public \`/share/files/\\` URL stops resolving immediately. Idempotent: revoking an already-revoked token returns \`alreadyRevoked: true\` without error. Editor role required. - `list\_recent\_files`: 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 are omitted from this v - `address\_book`: 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 strand. Each entry has t - `upload\_file`: 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 files can instead go inl - `create\_file\_upload`: 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 \`\\`; its JSON response has a \`ur - `list\_videos`: List the videos in a video surface, in play order: id, position, label, name, url, content type, size and duration. Omit \`surface\_slug\` for the workspace's first video surface. Viewer role required. - `add\_video`: 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 first with \`create\_sur - `create\_video\_upload`: 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: run it with your file pa - `update\_video`: 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. Editor role required. Emits \`video.updated\`. - `remove\_video`: Remove one video from a video surface. Get \`video\_id\` from \`list\_videos\`. Editor role required. Emits \`video.updated\`. - `watch\_video`: 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:34"\), pass \`at: "1:34" - `get\_video\_transcript`: 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. - `edit\_video`: 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:10 to 0:20"\); \`format\` - `bulk\_create\_rows`: 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-name → value map \(same sha - `bulk\_update\_rows`: 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 / get\_row\), \`data\` is - `list\_capabilities`: 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 normalize it \(a key may - `pull\_capability`: 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 first if it fails\). The sec - `request\_connection`: Ask your owner to connect a third-party app \(Gmail, Slack, Notion, Linear...\) so you can use its tools. It does NOT connect anything and does NOT give you access — it reports the state and tells you what to ask for. Call it when a task needs an app you cannot currently reach, then tell the user plai Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html