A visual communication channel between AI agents and a human operator. Provides SQLite storage, MCP endpoint, WebSocket realtime channel, and HTTP API for the viewer.
Desk provides 14 well-named tools with clear verb-noun patterns (create_artifact, update_artifact, delete_artifact, etc.). Tool descriptions are present and moderately detailed (avg ~120 chars), explaining what each tool does and when to use it. However, parameter descriptions are sparse or missing entirely, most parameters lack explanations of expected format, constraints, or valid values. Input schemas are present but incomplete: many lack type definitions for nested objects (e.g., 'author' and 'patch' are typed as 'object' with no properties defined). Output schemas are not documented. Error handling is minimal, no guidance on recovery, retryability, or actionable error messages. The 'reply' tool (tool 14) lacks visible schema definition in the provided source, capping its score at 50. Overall, the server demonstrates solid naming and basic descriptions but falls short on parameter rigor, schema completeness, and error guidance, typical of a v0.1 project.
Add a typed directional edge between two artifacts.
Post a comment on an artifact. Anchors are always semantic — they target a typed component (and optionally a sub-element path), never pixel coordinates. v1 supports `text` payloads; future payloads (sketch, pen, image overlay) plug in without schema changes.
Promote the current working state of an artifact to a committed history event. Cancels the pending auto-commit timer. Optional `reason` is surfaced in the history scrubber.
Create a new artifact of the given type. `initial_content` is optional; if omitted, the artifact-type plugin's empty content is used. Returns the artifact, including its id and current version.
Permanently delete an artifact and everything attached to it (history, comments, relations). This cannot be undone. Removes it from every connected viewer live.
Content-based similarity. Returns artifacts whose text overlaps the target's. v1 is keyword-overlap; the backend can be swapped for a vector engine without affecting the tool surface.
Nested object parameters lack property definitions. 'author' (used in 6 tools), 'patch', 'anchor', and 'body' are typed as 'object' with no properties, types, or descriptions. LLMs cannot infer what fields to include.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., artifact_id from create_artifact). Responses are opaque.
Parameter descriptions are missing or generic. 'type' in create_artifact says 'Plugin-registered artifact type' but does not list valid values or format. 'limit' in list_artifacts says 'Maximum 500' but does not explain what happens if omitted or what the default is.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Fetch an artifact. Returns the current state by default; pass `version` to time-travel to a past committed snapshot.
Fetch the append-only history log for an artifact, with optional version range.
Returns the typed-relation graph for an artifact: outgoing edges (this artifact → others) and incoming edges (others → this artifact). Edges are explicit, never inferred.
List artifacts ordered by most recently updated. Supports filtering by `type`.
Remove a typed directional edge between two artifacts.
Post a comment back to a Desk artifact, visible to the operator in the viewer. Use the artifact_id from the inbound <channel> tag. Optionally thread under the comment you are answering.
Full-text + structural search across artifact title and content.
Apply a patch to an artifact's working state. Working-state changes do not enter the history log until they are committed (explicitly via `commit`, or automatically after 2s of idle). Returns the updated artifact.
No error handling guidance. Tools do not document what errors can occur, whether they are retryable, or what the LLM should do next. E.g., delete_artifact says 'cannot be undone' but provides no confirmation mechanism or dry-run option.