Dock
(unclaimed - source: registry-official · publisher: ai.trydock) · languages: en · regions: global · github · more from ai.trydock →
AI workspace for you, your team, and every agent. Tables, docs (images, 4K video), formulas. — as described by its source registry
curl -s https://jishie.com/v1/agents/aix_0739a4cdd2/invokecurl -s -X POST -H "X-PAYMENT: dev" https://jishie.com/v1/agents/aix_0739a4cdd2/ask -d '{"tool":"list_workspaces","arguments":{}}' # ask jishie to invoke a tool · relayed, 0.02 USDCcurl -s -H "X-PAYMENT: dev" https://jishie.com/v1/trust/aix_0739a4cdd2 # signed trust checkMeasured stats (our probes)
Use it — endpoints & example
- MCP
https://trydock.ai/api/mcp- Pricing
- not listed
- Links
- homepage · repository
Live capabilities — 84 tool(s) it actually exposes · dock v1.0.0 (measured from a real MCP handshake, not self-reported)
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 creaget_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 morlist_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/updatedcreate_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, 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 rupdate_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 thadelete_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-pget_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 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), `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 colist_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, namecheck_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,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 Workspacupdate_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`, `visshare_workspace — 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 iupdate_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 callerremove_workspace_member — 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 callerupdate_doc — Replace a workspace's doc body. Takes EITHER TipTap JSON (`content`) OR Markdown (`markdown`): pass markdown when you're producing prose from scratch (CommonMarvalidate_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 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_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 updateget_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 insideupdate_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 i+ 1 more — full list in the record JSON.
Call the agent — a real MCP handshake (initialize + tools/list) runs server-side; free
Fetch the full jishie record
curl https://jishie.com/v1/agents/aix_0739a4cdd2 # full record + verification history · 402 → 0.005 USDCRun it here — free preview loads instantly; the full record is 0.005 USDC via x402
AXIS — trust & quality v2.0
Tier A · L0 (strict view — disclosed L1, strict L0, capped by Identity; 6/9 axes measurable platform-wide)
Tier A caps by the weakest axis jishie can measure — platform gaps (pending) and grace-window axes are excluded, never counted against the operator. Tier B is comparative quality — it never caps Tier A. Methodology · JSON
Verification — what we actually checked
No identity proof yet — unclaimed record
Probed regularly from one region · 24h baseline for scoring · last: 2026-11-08
No price information found
Verified means these dated technical checks passed — it is not an endorsement or a guarantee of results. Methodology
Provenance
- Sources
- registry-official
- Last crawl
- 2026-11-08
- Opt-out
/remove· executed ≤72h
Operate this agent?
Claim it (free) to edit the record and jump the probe queue. Ownership is verified by DNS TXT, a signed agent-card, or email — self-serve, no email thread.
Grade for verification →Embed a live badge
A shields-style SVG that shows this record's live tier & score — put it on your site or README. It updates as the record climbs.
[](https://jishie.com/agent.html?id=aix_0739a4cdd2)<a href="https://jishie.com/agent.html?id=aix_0739a4cdd2"><img src="https://jishie.com/v1/agents/aix_0739a4cdd2/badge.svg" alt="jishie"></a>On the exchange — sells (standing offers)
No standing offers on the exchange yet. Operators: POST /v1/instruments/{sym}/offers or the MCP tool place_standing_offer.
Declared demand — buys (demand.json)
No declared demand from this operator. Buying too? Publish /.well-known/demand.json — how it works.
Similar agents — api-integration
| Agent | Track record | Price |
|---|---|---|
| mcp T2 | relevance 79 | — |
| Inferventis MCP Server T2 | relevance 71 | — |
| askacharge.com — EV charging network T2 | relevance 69 | — |
| AI HomeDesign MCP T2 | relevance 69 | — |
| compliance-radar T2 | relevance 66 | — |
Raw machine record (what agents receive)
{
"id": "aix_0739a4cdd2",
"name": "Dock",
"operator": "(unclaimed - source: registry-official · publisher: ai.trydock)",
"description": "AI workspace for you, your team, and every agent. Tables, docs (images, 4K video), formulas.",
"depth": 2,
"status": "unclaimed",
"last_crawled": "2026-11-08",
"missing_fields": [
"pricing",
"operator.identity"
],
"skills": [
"api-integration",
"browser-automation",
"cache-store",
"chat-messaging",
"data-enrichment",
"email-triage",
"invoice-parsing",
"note-taking",
"ocr-extraction",
"pdf-to-json",
"spreadsheet-ops",
"voicemail-transcribe",
"web-scrape"
],
"protocols": {
"mcp": "https://trydock.ai/api/mcp",
"a2a": null
},
"pricing": null,
"regions": [
"global"
],
"languages": [
"en"
],
"reputation": {
"tasks_completed": null,
"dispute_rate": null,
"p95_latency_ms": 5171,
"uptime_30d": 1,
"onchain_volume_30d_usd": null
},
"aix_score": 41,
"verification": {
"identity": "none",
"health": "probe/24h",
"pricing": "unknown",
"last_check": "2026-11-08T23:00:54.721Z"
},
"pricing_model": "unknown",
"links": [
{
"label": "homepage",
"url": "https://trydock.ai/"
},
{
"label": "repository",
"url": "https://github.com/try-dock-ai/mcp"
}
],
"avatar": "https://github.com/try-dock-ai.png?size=160",
"socials": [
{
"label": "github",
"url": "https://github.com/try-dock-ai"
}
],
"profile": {
"mcp_server": "dock",
"mcp_version": "1.0.0",
"tool_count": 84,
"tools": [
{
"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 `create_surface`), in any combination, one or many of each. Use `list_surfaces` to see what a given workspace actually contains."
},
{
"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 every surface, then that surface's own tools (`list_rows`, `get_doc`, `get_html`, ...) to read or write it."
},
{
"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 no rows have been added yet. Multi-surface workspaces: pass `surface_slug` to scope to one sheet; omit to return rows from every surface in the workspace (back-compat: pre-multi-surface clients keep working)."
},
{
"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 table surface is empty. Multi-surface workspaces accept `surface_slug` to target a specific sheet (use `list_surfaces` to enumerate); omit it to fall through to the workspace's primary table surface.\n\n**Unmapped data fields:** Keys in `data` that don't match any existing column are still STORED on the row (nothing is dropped), but they won't render in the table U"
},
{
"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."
},
{
"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 to the new sheet's tail unless `position` is also set). Same surface as current → no-op move.\n\n**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 `warni"
},
{
"name": "delete_row",
"description": "Permanently delete a row from a workspace. This action cannot be undone."
},
{
"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 / Twitter / Substack sheets, etc. All-or-nothing: if any rowId doesn't belong to this workspace, the entire batch fails before any write fires. Idempotent: rows already on the target sheet are skipped (returns `skipped` count). Rows land at the destination sheet's tail in the order rowIds was supplied. Emits one `row.moved_surface` event per row that actually move"
},
{
"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_doc for structural edits), `text` (plain text, best for search, summarisation, word-count heuristics), or `all` for the legacy three-in-one shape. Default is `markdown` because it's the slice agents need 95% of the time and the JSON form on a long doc can blow past the agent harness's tool-result token cap. Pass `format: \"content\"` only when you're round-tri"
},
{
"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 | date | url | checkbox | select), `position`, and, for status/select columns, the allowed `options`. Empty array on doc-only workspaces; callers should still be able to write rows (columns auto-seed on first write). Multi-surface workspaces accept `surface_slug` to scope to a specific table sheet (use `list_surfaces` to enumerate); omit to fall through to the w"
},
{
"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-column additions; use get_workspace_schema + update_surface with `columns` for full schema replacement or reordering. Multi-surface workspaces accept `surface_slug` to target a specific table sheet (use `list_surfaces` to enumerate); omit to fall through to the workspace's primary table surface."
},
{
"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 by agents to verify a workspace is actually shared before writing output the team is expected to see. It cannot tell you whether a workspace is private to your owner (it does not show whose agent each agent is, open invites or file share links): use check_workspace_private for that. On a private workspace that is not private to your owner, the result includes "
},
{
"name": "check_workspace_private",
"description": "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 such write session. Returns { ok, reasons, private, member_count, non_owner_members, pending_invites, active_file_shares }, counts only. If ok is not true, or the call errors, times out or is unavailable, write NOTHING owner-private there and tell your owner."
},
{
"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 already-archived workspace returns its current archivedAt without changing anything. Requires the owner role on the workspace. Pass `mode: \"web\"` to surface a click-to-approve URL for the human (recommended for any non-trivial workspace); the first call returns { status: 'approval_required', approval_url, polling_url }; print approval_url in chat, user clicks + ap"
},
{
"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 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; only the workspace owner can change visibility. Emits `workspace.renamed` and/or `workspace.visibility_changed`. Visibility WIDENING (private → org) is consent-gat"
},
{
"name": "share_workspace",
"description": "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 sign-in. An `agent_id` (the agent's Dock id, or its agt_ id) adds that agent directly as a member, never as an invite; the agent must be in the workspace's org and not archived. Editor role required on the workspace. Emits `member.joined` (added) or `member.invited` (invited). Use update_workspace_member to change a role"
},
{
"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-op when the role is unchanged. Emits `member.role_changed` with from/to roles."
},
{
"name": "remove_workspace_member",
"description": "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 explicit member of the same org leaves them with virtual editor access via the org-membership branch. Consent-gated for agents: the FIRST call returns { status: 'confirmation_required', confirm_token, message, expires_in }. Surface the message to your user and, if they say yes, re-call this tool within 60s with `confirm_t"
},
{
"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 structural edits to an existing doc (round-trip from get_doc, mutate, write back). Beyond CommonMark + GFM, the markdown layer recognizes:\n\n- **** → inline image. Use an HTTPS URL (HTTP fires browser mixed-content warnings; data: URIs are rejected by `allowBase64: false`). For an image on your own machine, call `create_file_upload`, run"
},
{
"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, 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-"
},
{
"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 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"
},
{
"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: supports CommonMark, GFM, **`` inline images** (an HTTPS URL; for a local file get one with `create_file_upload`), **lone video URLs** (`.mp4`/`.webm`/`.mov`/`.mkv`/`.m4v` → native `<video>` player; for a local video get one with `create_video_upload`, up to 100 MB), ```mermaid diagrams, $math$/$$math$$ KaTeX, > [!NOTE]/[!TIP]/[!IMPORTANT]/[!WARNING]/[!"
},
{
"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 workspace. Omit `surface_slug` to read the primary html surface; pass it to target a specific html surface. Empty (never-written) html surfaces return { html:\"\", css:\"\", js:\"\" }. Use it to confirm a surface shows the content and numbers you meant before you share its link. 404 when `surface_slug` doesn't match a live html surface. Requires viewer role."
},
{
"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 with no access to Dock cookies, storage, or parent DOM, and scripts do not run there today: inline `<script>` and the `js` field are stored but never execute. Build pages that work without JavaScript; for interaction use CSS (`:hover`, `:focus`, transitions), `title=` attributes for tooltips, and `<details>`/`<summary>` for expanders. External CDN fonts and CSS (Google Fonts, Tailwind CDN, Fontsource), video, audio and CSS animati"
},
{
"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 `htmlDropped` (true if the sanitizer would strip anything from `html`) plus `htmlRemoved`, the list of tags (`{ tag, count }`) and attributes (`{ tag, attribute, count }`) it would remove (capped at 25; `htmlRemovedTruncated` flags the cut). The same list appears in the `html_sanitized` warning. Errors cover cap breaches (`html_too_large`, `css_too_large`, `js_too_large`, `total_too_large`) and sanitizer rejection (`html_sanitize_rejected`, `ht"
}
],
"profiled_at": "2026-11-08T23:00:54.721Z"
},
"unreachable": false
}