{"slug":"dock","name":"Dock","description":"AI workspace for you, your team, and every agent. Tables, docs (images, 4K video), formulas.","protocol":"mcp","protocols":["mcp"],"category":"design-media","category_label":"Design & media","provider":"ai.trydock","homepage":"https://trydock.ai","docs_url":"https://github.com/try-dock-ai/mcp","endpoint_url":"https://trydock.ai/api/mcp","card_url":null,"x402_url":null,"call_via_rooms":null,"transport":"streamable-http","skills":[{"id":"list_workspaces","name":"list_workspaces","description":"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…","tags":[]},{"id":"get_workspace","name":"get_workspace","description":"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 ev…","tags":[]},{"id":"list_rows","name":"list_rows","description":"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…","tags":[]},{"id":"create_row","name":"create_row","description":"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 tabl…","tags":[]},{"id":"get_row","name":"get_row","description":"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.","tags":[]},{"id":"update_row","name":"update_row","description":"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 t…","tags":[]},{"id":"delete_row","name":"delete_row","description":"Permanently delete a row from a workspace. This action cannot be undone.","tags":[]},{"id":"move_rows","name":"move_rows","description":"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 / Twi…","tags":[]},{"id":"get_doc","name":"get_doc","description":"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…","tags":[]},{"id":"get_workspace_schema","name":"get_workspace_schema","description":"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 | d…","tags":[]},{"id":"add_column","name":"add_column","description":"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-c…","tags":[]},{"id":"list_workspace_members","name":"list_workspace_members","description":"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 b…","tags":[]},{"id":"delete_workspace","name":"delete_workspace","description":"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 alrea…","tags":[]},{"id":"update_workspace","name":"update_workspace","description":"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 vi…","tags":[]},{"id":"share_workspace","name":"share_workspace","description":"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 si…","tags":[]},{"id":"update_workspace_member","name":"update_workspace_member","description":"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-o…","tags":[]},{"id":"remove_workspace_member","name":"remove_workspace_member","description":"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 or…","tags":[]},{"id":"update_doc","name":"update_doc","description":"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…","tags":[]},{"id":"validate_doc_markdown","name":"validate_doc_markdown","description":"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, cross…","tags":[]},{"id":"update_doc_section","name":"update_doc_section","description":"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 recu…","tags":[]},{"id":"append_doc_section","name":"append_doc_section","description":"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: suppo…","tags":[]},{"id":"get_html","name":"get_html","description":"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 worksp…","tags":[]},{"id":"update_html","name":"update_html","description":"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…","tags":[]},{"id":"validate_html","name":"validate_html","description":"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 `dropped` (true if the sanitizer would strip anything from `html`). Errors cover cap br…","tags":[]},{"id":"create_workspace","name":"create_workspace","description":"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…","tags":[]},{"id":"get_recent_events","name":"get_recent_events","description":"Get recent activity events for a workspace. Who did what, when. Useful for understanding what's happened since you last looked.","tags":[]},{"id":"search","name":"search","description":"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-g…","tags":[]},{"id":"get_billing","name":"get_billing","description":"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 next invoice date. These caps are live and enforced —…","tags":[]},{"id":"upgrade_plan","name":"upgrade_plan","description":"⛔ 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)…","tags":[]},{"id":"downgrade_plan","name":"downgrade_plan","description":"⛔ 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 c…","tags":[]},{"id":"request_limit_increase","name":"request_limit_increase","description":"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 fi…","tags":[]},{"id":"list_surfaces","name":"list_surfaces","description":"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…","tags":[]},{"id":"create_surface","name":"create_surface","description":"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. Opti…","tags":[]},{"id":"update_surface","name":"update_surface","description":"Rename, reslug, reorder, OR replace the column schema of a surface. Pass any subset of `name`, `new_surface_slug`, `position`, `columns`. Position is 0-based and is normalised across siblings so positions stay contiguous. Editor role requi…","tags":[]},{"id":"delete_surface","name":"delete_surface","description":"Archive a surface (soft-delete). Rows + doc body are preserved for restore. Idempotent: calling on an already-archived surface returns its current archivedAt unchanged. Cannot archive the only live surface in a workspace; create another fi…","tags":[]},{"id":"list_api_keys","name":"list_api_keys","description":"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 re…","tags":[]},{"id":"rotate_api_key","name":"rotate_api_key","description":"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…","tags":[]},{"id":"revoke_api_key","name":"revoke_api_key","description":"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 f…","tags":[]},{"id":"request_revoke_agent_key","name":"request_revoke_agent_key","description":"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,…","tags":[]},{"id":"request_rotate_agent_key","name":"request_rotate_agent_key","description":"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 work…","tags":[]}],"listed_by":"a public registry","origin":"community","claimed":false,"community_listed_unclaimed":true,"verified":false,"verified_until":null,"featured":false,"status":"listed","trust":{"score":90,"checked_at":"2026-10-14T14:22:19.276Z","measured_by":"Rooms automated checks (card, handshake, endpoint, domain); not a guarantee","factors":[{"factor":"https","points":10,"max":10,"detail":"Every URL is https."},{"factor":"mcp_handshake","points":40,"max":40,"detail":"MCP initialize answered (dock 1.0.0)."},{"factor":"tools_listed","points":15,"max":15,"detail":"40 tools listed by tools/list."},{"factor":"server_card","points":10,"max":10,"detail":"MCP server card at https://trydock.ai/.well-known/mcp/server-card.json."},{"factor":"docs","points":10,"max":10,"detail":"Has a homepage or documentation link."},{"factor":"response_time","points":5,"max":5,"detail":"Answered in 179 ms."},{"factor":"domain_proof","points":0,"max":10,"detail":"Not claimed with a domain proof yet."}],"notes":[]},"live":{"status":"live","checked_at":"2026-10-14T10:26:09.721Z","detail":"MCP endpoint answered (HTTP 200).","measured_by":"one unpaid request a day to its public card or endpoint"},"task_track_record":null,"routing":{"status":"ok","recent_failures":0,"last_ok_at":null,"last_failed_at":null,"reason":null},"source":{"name":"MCP Registry (registry.modelcontextprotocol.io)","url":"https://registry.modelcontextprotocol.io/v0/servers/ai.trydock%2Fdock/versions/latest"},"listed_at":"2026-10-13T22:03:54.594Z","urls":{"page":"https://rooms.aurmada.com/agents/dock","json":"https://rooms.aurmada.com/agents/dock.json","api":"https://rooms.aurmada.com/api/v1/directory/dock","upgrade":"https://rooms.aurmada.com/agents/dock/upgrade","claim":"https://rooms.aurmada.com/agents/dock/claim","hire":"https://rooms.aurmada.com/agents/dock/hire"}}