Dock
REMOTE · TRYDOCK.AI · SCANNED AUG 3
AI workspace for you, your team, and every agent. Tables, docs (images, 4K video), formulas.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability53
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 19361 tokens (~284/item across 68 items; 68 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · trydock.ai
claude mcp add --transport http ai-trydock-dock https://trydock.ai/api/mcp
[mcp_servers.ai-trydock-dock] url = "https://trydock.ai/api/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ai-trydock-dock": {
"type": "remote",
"url": "https://trydock.ai/api/mcp",
"enabled": true
}
}
} openclaw mcp add ai-trydock-dock --url https://trydock.ai/api/mcp --transport streamable-http
mcp_servers:
ai-trydock-dock:
url: "https://trydock.ai/api/mcp" {
"mcpServers": {
"ai-trydock-dock": {
"type": "http",
"url": "https://trydock.ai/api/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Aug 26 +2
- New tool “pull_capability” functional
- New tool “list_capabilities” functional
- 31 Jul 26 +14
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 −10
- Schema quality: good → unverified ▼ functional
- 28 Jul 26 −1
- Schema quality: excellent → good functional
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 69
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://trydock.ai/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=*.trydock.ai | CN=YR1,O=Let's Encrypt,C=US | 19 Jun 2026 | 17 Sept 2026 | RSA 2048 | SHA256-RSA | 5b4c080143d02c3ef904637cfceb53e14e7 |
| SANs: *.trydock.ai, trydock.ai | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
DNSSEC insecure
Validation of trydock.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| trydock.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer realm="dock", resource_metadata="https://trydock.ai/.well-known/oauth-protected-resource"
Bearer realm="dock", resource_metadata="https://trydock.ai/.well-known/oauth-protected-resource" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
Protected resource metadata
| Document | https://trydock.ai/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://trydock.ai/api/mcp |
| Authorisation server | https://trydock.ai |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://trydock.ai/api/mcp | Verified | 200 | |
| http (plaintext) | http://trydock.ai/api/mcp | HTTPS enforced | 308 | https://trydock.ai/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
rotate_webhook_secret ~107
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 suspected leak or as part of routine rotation hygiene.
| Name | Type | Req | Description |
|---|---|---|---|
| org_slug | string | yes | Org slug |
| webhook_id | string | yes | Webhook id (from list_webhooks) |
No output schema declared.
No examples provided.
search ~213
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 open. Use when the user references something by keyword ("find my launch-plan workspace", "which row mentions Redis?"). Faster than listing workspaces and iterating.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | — | 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 h… |
| limit | number | — | Max hits to return (default 20, max 100). |
| offset | number | — | Hits to skip for pagination (default 0). |
| q | string | yes | Search query. Case-insensitive substring match. |
No output schema declared.
No examples provided.
send_message ~679
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 `<agent_slug>@<user_slug>`: `flint@socrates` targets the `flint` agent owned by user `socrates`; `self@<user_slug>` targets a human's synthetic self-agent (use this to message a human directly when you don't know which of their agents to ping). Use this when an agent legitimately needs to ask a teammate (human or agent) for help, hand off work, or follow up async; don't use it as a chat-ops side-channel for things that belong in workspace events. Sender identity follows the caller: agent callers send AS themselves, user callers send AS their self-agent (`self@<their_slug>`). Body cap is 32,000 chars. Returns `{ messageId, threadId, to }` on success. IMPORTANT: this tool QUEUES a message to the recipient's inbox — it does NOT wake or run a recipient agent. To actually reach an AGENT (deliver AND wake it), use `message_teammate`; send_message to an agent only files to their inbox and, for an agent recipient, returns `{ status: 'queued_not_delivered', messageId, ... }` to make that explicit. Use send_message for humans (`self@<user_slug>`) or when you deliberately want an inbox drop without a wake. The recipient is resolved against the substrate's identity space, NOT against your accessible workspace set, this is messaging, not workspace write access. Pre-cue.dock.svc-deploy environments return `cue_not_configured` (caller treats as 'messaging not deployed yet').
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | Message text. Plain string, 1-32000 chars. `@<slug>` mentions inside the body CC the named agent on the message. |
| replyTo | string | — | 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 recipient'… |
| send_at | string | — | 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 send… |
| to | string | yes | 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 id… |
No output schema declared.
No examples provided.
share_file ~167
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_share`. Editor role required. Gated behind FILES_SURFACE_ENABLED + per-user allowlist. Use when a workflow needs to hand the file off to an external system that can't authenticate.
| Name | Type | Req | Description |
|---|---|---|---|
| file_id | string | yes | The file cuid (from list_files). |
| slug | string | yes | The workspace slug. Accepts either the bare slug or the org-prefixed form ('my-org/my-workspace') as shown in the dashboard URL. |
No output schema declared.
No examples provided.
share_workspace ~192
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.joined` (existing user) or `member.invited` (new user). Use update_workspace_member to change a role afterwards, remove_workspace_member to revoke.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | Email address of the human to invite. | |
| role | string | — | Role to grant. Defaults to `editor`. Owner-tier transitions require an owner caller. |
| slug | string | yes | 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. |
No output schema declared.
No examples provided.
unresolve_comment ~87
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`.)
| Name | Type | Req | Description |
|---|---|---|---|
| comment_id | string | yes | Comment id to re-open. |
No output schema declared.
No examples provided.
update_doc ~1,403
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, mutate, write back). Beyond CommonMark + GFM, the markdown layer recognizes: - **** → inline image. Use ANY publicly-reachable URL (HTTPS preferred — HTTP fires browser mixed-content warnings; data: URIs are rejected by `allowBase64: false`). Renders block-feeling via CSS (max-width 100%, rounded corners, drop shadow) even though the underlying node is inline. The `alt` text is the accessible label and shows in place of the image if the URL fails to load — always include it. To attach a user-uploaded file, hit `POST /api/workspaces/:slug/upload-image` from the human-side UI first to get a Vercel Blob URL, then reference that URL in the doc markdown. - A **lone video-file URL on its own line** (extension `.mp4` / `.m4v` / `.webm` / `.mov` / `.mkv`, signed-params + timestamp fragments tolerated) → native HTML5 `<video controls preload="metadata">` player. Source URL is referenced directly: no iframe, no transcoding, no quality loss. Vercel Blob is the canonical hosting (5 GB per file, served with HTTP range requests so 4K masters stream cleanly), but ANY publicly-reachable HTTPS URL works. Sample shape: a paragraph containing only `https://cdn.dock.ai/2025-launch-walkthrough.mp4`. Mid-paragraph URLs stay as plain links — surrounding prose disqualifies the auto-promotion (matches the oEmbed convention). - **```mermaid** fenced code → diagram (15 sub-types: flowchart, sequence, gantt, ER, state, class, mindmap, timeline, pie, quadrant, sankey, XY-chart, packet, block, journey) - **$x$** inline math, **$$x$$** block math (LaTeX, KaTeX-rendered, scripts/href disabled) - **> [!NOTE]** / **[!TIP]** / **[!IMPORTANT]** / **[!WARNING]** / **[!CAUTION]** GFM…
| Name | Type | Req | Description |
|---|---|---|---|
| content | object | — | 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_since | string | — | 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 de… |
| markdown | string | — | 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-bu… |
| slug | string | yes | 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 | — | Optional doc surface slug for multi-doc workspaces. Omit to write the primary doc surface. Use list_surfaces to see available slugs. |
No output schema declared.
No examples provided.
update_doc_section ~590
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, an 'Outcomes' block in a meeting note) and only needs to refresh that one piece. Without it, agents are forced into 'GET → splice → PUT' which costs tokens, costs latency, and races against any concurrent human edit elsewhere in the doc (last-write-wins clobbers). Section semantics: the FIRST heading whose plain text matches `heading` exactly (case-sensitive on trimmed text) is found, and everything from that heading up to the next heading at the same OR shallower level is replaced. So a `## Outcomes` section ends at the next `## …` or `# …`; nested `### …` subsections stay part of the replaced range. Returns 404 when no matching heading exists; strict by design so a misremembered heading fails loudly. `markdown` is the FULL replacement, INCLUDING the heading line: pass it back as-is to keep the heading, change it to rename or rewrite the heading, change the heading level, or omit the heading entirely (collapses the section into the prior one). Empty `markdown` deletes the section. Same markdown surface as update_doc / append_doc_section (CommonMark + GFM + `` images + lone-URL videos (mp4/webm/mov/mkv/m4v) + Mermaid + KaTeX + callouts + SVG + details + cross-refs + @-mentions + URL embeds). Identity / attribution / events / doc-guard all flow through the same writeDocBody path as the other doc endpoints, so @-mentions in the new section fire `doc.mention_added` for newly-added mentions just like update_doc does. Requires editor role. Multi-surface workspaces optionally accept `surface_slug` to target a specific doc tab.
| Name | Type | Req | Description |
|---|---|---|---|
| heading | string | yes | 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 c… |
| markdown | string | yes | 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 | yes | The workspace slug. Accepts either the bare slug ('my-workspace') or the org-prefixed form ('my-org/my-workspace'). |
| surface_slug | string | — | Optional doc surface slug for multi-doc workspaces. Omit to target the primary doc surface. |
No output schema declared.
No examples provided.
update_html ~805
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 boundary. Use any web technology the browser supports: external CDN fonts and CSS (Google Fonts, Tailwind CDN, Fontsource), JS libraries (three.js, GSAP, Chart.js, anime.js), inline `<script>`, Web Workers, WebGL, video, audio, canvas, dynamic DOM, complex CSS animations. Per-field caps: html 256 KB, css 200 KB, js 200 KB, total 600 KB. The sanitizer strips a small set of style smells: inline `on*=` event-handler attributes, `javascript:` and `data:text/html` URIs, `<meta http-equiv>` tags; use `addEventListener` and `<script>` instead. Layout: Dock renders the surface EDGE-TO-EDGE (full-bleed) inside the workspace — the surface itself is the frame. Do NOT put `border-radius`, an outer border, or a drop-shadow on the root/outermost element unless the owner explicitly asked for that framing, or the specific design genuinely needs it; keep the page root flush and apply rounding to inner cards only. DESIGN LANGUAGE: Dock injects a base stylesheet into every surface — semantic tokens + a small component kit — that automatically follows each VIEWER's light/dark theme. PREFER these over hardcoded colors so the surface matches Dock and themes correctly for everyone (a surface with hardcoded dark colors looks broken for a light-mode teammate on a shared surface, and vice-versa). Tokens: var(--dock-canvas|surface|surface-muted|border|border-strong|text|text-2|text-muted|accent|accent-ink|data|data-strong|good|warn|crit), var(--dock-radius|shadow|gap); font is Inter via var(--dock-font). Component classes: .dock-card, .dock-stat/.dock-stat-value/.dock-stat-label, .dock-delta.up|.down, .dock-badge.good|warn|crit|neutral|accent (add a <span class="dot"></span>), .dock-btn(.primary), .d…
| Name | Type | Req | Description |
|---|---|---|---|
| css | string | — | CSS source. Applied inside the sandbox iframe. At v2 you can also `<link rel="stylesheet">` external stylesheets from any HTTPS CDN — useful for Tailwind CDN, Google Fonts, icon kits. |
| html | string | — | HTML body. Sanitized server-side (smells stripped, but `<script>` and `<link>` allowed at v2 — load any CDN, write inline scripts, dynamic DOM). Use `validate_html` first for a pre-flight check. |
| js | string | — | JS source. Stored alongside html/css; at v2 you'll typically inline `<script>` in the html field instead (same execution context, fewer round-trips). 200 KB cap (matches the top-level `update_html` d… |
| slug | string | yes | The workspace slug. |
| surface_slug | string | — | Optional html surface slug. Omit to write the primary html surface. |
No output schema declared.
No examples provided.
update_row ~488
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 surface as current → no-op move. **Unmapped data fields:** Keys in `data` that don't match any existing column on the row's surface are still STORED on the row, but they won't render in the table UI until the column exists. The response carries an `unmapped_fields` array plus a human-readable `warning`. Pass `auto_create_columns: true` to have the server append a fresh text column for every unmapped key in one atomic step; the response then also includes `created_columns: ColumnDef[]`. Default false: store-but-don't-render is the safe choice for explicit schema management.
| Name | Type | Req | Description |
|---|---|---|---|
| auto_create_columns | boolean | — | 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 response… |
| data | object | yes | 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). |
| position | number | — | 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 | yes | The row ID to update |
| slug | string | yes | 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 | — | 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 surfa… |
No output schema declared.
No examples provided.
update_surface ~491
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 required. Emits `surface.updated`. **Column schema (`columns`)**: table surfaces only. Pass a full ColumnDef[] to REPLACE the existing schema atomically (no per-column add/remove churn, no row data loss — existing row.data keys that are no longer mapped are preserved on disk and surface in future writes' `unmapped_fields`). Each ColumnDef = `{ key, label, type, position, width?, hidden?, description?, options? }`. Type ∈ text | longtext | url | status | owner | date | number; `options` is required on status/owner. Reject 400 with a `table-only` error if the surface is a doc or html kind. Use `get_workspace_schema` first to fetch the current shape, mutate it, send it back.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | — | 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?,… |
| name | string | — | New display name. 1-64 chars. |
| new_surface_slug | string | — | New slug for the surface (lowercase kebab-case, 3-64 chars). Must be unique within the workspace. |
| position | number | — | 0-based index in the tab strip. Other surfaces shift to keep positions contiguous. |
| slug | string | yes | 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 | yes | The current slug of the surface to update. |
No output schema declared.
No examples provided.
update_webhook ~111
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.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | true to enable delivery, false to silence. |
| org_slug | string | yes | Org slug |
| webhook_id | string | yes | Webhook id (from list_webhooks) |
No output schema declared.
No examples provided.
update_workspace ~437
Rename a workspace, change its slug, switch its default-view mode, or flip its visibility (private | org | unlisted | public). 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 resolving. Visibility flips disconnect every live SSE subscriber so reconnects re-authenticate against the new visibility. Editor role required. Emits `workspace.renamed` and/or `workspace.visibility_changed`. Visibility WIDENING (private → org/unlisted/public, org → unlisted/public, unlisted → public) is consent-gated: pass `consent_mode: "web"` to return an approval_url the user clicks; otherwise the call returns `consent_required` and you must re-issue with consent_mode set. Visibility narrowing + non-visibility updates execute immediately on the agent's role.
| Name | Type | Req | Description |
|---|---|---|---|
| consent_mode | string | — | 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 }… |
| mode | string | — | New default-view preference for the workspace's first tab. Optional. Doesn't add or remove surfaces; use `create_surface` / `delete_surface` to change the actual tab set. |
| name | string | — | New display name. Optional. |
| new_slug | string | — | 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 | yes | The current workspace slug |
| visibility | string | — | New visibility. Optional. `private` = explicit members only; `org` = every org member gets virtual editor; `unlisted` = anyone with the URL can view; `public` = listed and viewable to all. Widening t… |
No output schema declared.
No examples provided.
update_workspace_member ~153
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` with from/to roles.
| Name | Type | Req | Description |
|---|---|---|---|
| member_id | string | yes | The WorkspaceMember id to update. Get this from list_workspace_members. |
| role | string | yes | New role. |
| slug | string | yes | 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. |
No output schema declared.
No examples provided.
upgrade_plan ~374
Move the caller's org to Pro ($19/mo flat, 10 agents, 20 members, 200 workspaces, 5k rows per workspace) or Scale ($49/mo flat, 30 agents, 60 members, 1,000 workspaces, 50k rows per workspace). The bill doesn't change as you add agents. If the org has no card on file, returns a Stripe Checkout URL for the human. If a card exists, a live plan switch (Pro ↔ Scale) is consent-gated. Two consent surfaces, you pick via `mode`: (1) `chat` (default): FIRST call returns { status: 'confirmation_required', confirm_token, message, expires_in }; surface the message to your user and re-call within 60s with `confirm_token` set. (2) `web`: FIRST call returns { status: 'approval_required', approval_url, polling_url, expires_at }; print the approval_url in chat for your user to click and approve in their browser, then poll `polling_url` for the result. No-card and same-plan paths execute on the first call (no money changes hands).
| Name | Type | Req | Description |
|---|---|---|---|
| confirm_token | string | — | 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, opera… |
| mode | string | — | 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-a… |
| plan | string | — | Target plan. Defaults to 'pro'. |
No output schema declared.
No examples provided.
validate_doc_markdown ~215
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, headingCount, byteSize, nodeCount, depth) plus structured DocGuardError-equivalent errors (cap breaches) and non-blocking warnings (cross-refs that don't resolve, mention ids that don't resolve, oversize sources, cap-approaching counts). NEVER writes anything; pure parse + analysis. Use when iterating on rich-format markdown to catch problems before burning a write. Cross-ref + mention resolution is gated on caller's accessible workspace set, so unresolved tokens surface in warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| markdown | string | yes | Markdown body to validate. Same surface as update_doc: CommonMark + GFM plus mermaid / math / callouts / svg / details / cross-refs / embeds. |
No output schema declared.
No examples provided.
validate_formula ~198
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(...)` with the wrong arg order or a misspelled `=AVERAG(...)` will round-trip into the cell as a stored carrier with no value, and the user will see #NAME? or #VALUE? on next view. Catch it here. `unknownFunctions` flags any identifier that isn't in the Dock Sheets catalog (including likely typos); `referencedFunctions` lists the canonical post-alias names the engine will see. Cheap, public, no auth, no workspace context needed.
| Name | Type | Req | Description |
|---|---|---|---|
| formula | string | yes | Formula expression to validate, including the leading '='. Example: '=SUMIF(B2:B10, ">0")'. Max 4000 chars. |
No output schema declared.
No examples provided.
validate_html ~231
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 breaches (`html_too_large`, `css_too_large`, `js_too_large`, `total_too_large`) and sanitizer rejection (`html_sanitize_rejected`, `html_sanitize_empty`). At v2 the sanitizer accepts `<script>` and `<link>` — those used to be smells but are now first-class agent markup; isolation lives in the opaque render iframe, not the sanitizer. The smells still stripped: inline `on*=` attributes, `javascript:`/`data:text/html` URIs, `<meta http-equiv>` tags. NEVER writes anything. Use when iterating on a payload so you don't burn a write on something the surface would reject.
| Name | Type | Req | Description |
|---|---|---|---|
| css | string | — | CSS to validate (optional). |
| html | string | — | HTML to validate (optional). |
| js | string | — | JS to validate (optional). |
No output schema declared.
No examples provided.