cnvs.app
REMOTE · CNVS.APP · SCANNED SEP 27
Real-time collaborative whiteboard — AI agents and humans edit the same board live over MCP.
Available components
Recent critical change
Authorization (21 Aug 2026). See the changelog before you install this server.
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 → Why this is hard to score →
Endpoint Security46
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (add_text). See how to fix → View diagnostics → Fail
- HTTPS check failed: the endpoint is reachable over plaintext HTTP. See how to fix → View diagnostics → Fail
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8466 tokens (~302/item across 28 items; 25 tools + 3 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 Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage83
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 49% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
How do I install the cnvs.app MCP server?
cnvs.app is a hosted endpoint at https://cnvs.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · cnvs.app
claude mcp add --transport http app-cnvs-whiteboard 'https://cnvs.app/mcp'
{
"mcpServers": {
"app-cnvs-whiteboard": {
"url": "https://cnvs.app/mcp"
}
}
} {
"servers": {
"app-cnvs-whiteboard": {
"type": "http",
"url": "https://cnvs.app/mcp"
}
}
} [mcp_servers.app-cnvs-whiteboard] url = "https://cnvs.app/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"app-cnvs-whiteboard": {
"type": "remote",
"url": "https://cnvs.app/mcp",
"enabled": true
}
}
} openclaw mcp add app-cnvs-whiteboard --url 'https://cnvs.app/mcp' --transport streamable-http
mcp_servers:
app-cnvs-whiteboard:
url: "https://cnvs.app/mcp" {
"McpServers": {
"app-cnvs-whiteboard": {
"Transport": "http",
"Url": "https://cnvs.app/mcp"
}
}
} assistant mcp add app-cnvs-whiteboard -t streamable-http -u 'https://cnvs.app/mcp'
{
"mcpServers": {
"app-cnvs-whiteboard": {
"type": "http",
"url": "https://cnvs.app/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.
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Aug 26 0
- Stability: 0.97 → pass security
- 21 Aug 26 0
- Authorization: unverified → fail ▼ critical
- The server rewrote its instructions, which are the text every model session reads security
- Tool “add_image” is now declared destructive security
- Tool “add_text” is now declared destructive security
- Tool “delete_column” is now declared destructive security
- Tool “delete_task” is now declared destructive security
- Tool “draw_stroke” is now declared destructive security
- Tool “erase” is now declared destructive security
- Tool “set_board_mode” is now declared destructive security
- Tool “set_lane” is now declared destructive security
- Tool “update_column” is now declared destructive security
- Tool “update_task” is now declared destructive security
- “add_image” reworded the description of “access_key” cosmetic
- “add_link” reworded the description of “access_key” cosmetic
- “add_text” reworded the description of “access_key” cosmetic
- “create_column” reworded the description of “access_key” cosmetic
- “create_task” reworded the description of “access_key” cosmetic
- “create_tasks” reworded the description of “access_key” cosmetic
- “delete_column” reworded the description of “access_key” cosmetic
- “delete_task” reworded the description of “access_key” cosmetic
- “draw_stroke” reworded the description of “access_key” cosmetic
- “erase” reworded the description of “access_key” cosmetic
- “export_tasks” reworded the description of “access_key” cosmetic
- “get_board” reworded the description of “access_key” cosmetic
- “get_preview” reworded the description of “access_key” cosmetic
- “list_tasks” reworded the description of “access_key” cosmetic
- “move” reworded the description of “access_key” cosmetic
- “move_task” reworded the description of “access_key” cosmetic
- “open_board” reworded the description of “access_key” cosmetic
- “query_tasks” reworded the description of “access_key” cosmetic
- “set_board_mode” reworded the description of “access_key” cosmetic
- “set_column_width” reworded the description of “access_key” cosmetic
- “set_lane” reworded the description of “access_key” cosmetic
- “update_column” reworded the description of “access_key” cosmetic
- “update_task” reworded the description of “access_key” cosmetic
- “wait_for_update” reworded the description of “access_key” cosmetic
- Tool “add_image” changed its title: Add Image cosmetic
- Tool “add_link” changed its title: Add Link cosmetic
- Tool “add_text” changed its title: Add Text cosmetic
- Tool “create_board” changed its title: Create Board cosmetic
- Tool “create_column” changed its title: Create Column cosmetic
- Tool “create_task” changed its title: Create Task cosmetic
- Tool “create_tasks” changed its title: Create Tasks cosmetic
- Tool “delete_column” changed its title: Delete Column cosmetic
- Tool “delete_task” changed its title: Delete Task cosmetic
- Tool “draw_stroke” changed its title: Draw Stroke cosmetic
- Tool “erase” changed its title: Erase Item cosmetic
- Tool “export_tasks” changed its title: Export Tasks cosmetic
- Tool “get_board” changed its title: Get Board cosmetic
- Tool “get_preview” changed its title: Get Board Preview cosmetic
- Tool “list_tasks” changed its title: List Tasks cosmetic
- Tool “move” changed its title: Move Item cosmetic
- Tool “move_task” changed its title: Move Task cosmetic
- Tool “open_board” changed its title: Open Board cosmetic
- Tool “query_tasks” changed its title: Query Tasks cosmetic
- Tool “set_board_mode” changed its title: Set Board Mode cosmetic
- Tool “set_column_width” changed its title: Set Column Width cosmetic
- Tool “set_lane” changed its title: Set Lane cosmetic
- Tool “update_column” changed its title: Update Column cosmetic
- Tool “update_task” changed its title: Update Task cosmetic
- Tool “wait_for_update” changed its title: Wait for Board Update cosmetic
- 11 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 3 Aug 26 0
- Tool “create_board” rewrote its description, which is the text the model reads security
- Schema quality: poor → excellent functional
- “create_board” reworded the description of “content” cosmetic
- 31 Jul 26 0
- 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 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
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 27 Sept 2026 · Probed https://cnvs.app/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=cnvs.app | CN=WE1,O=Google Trust Services,C=US | 9 Aug 2026 | 7 Nov 2026 | ECDSA 256 | ECDSA-SHA256 | 20610320e5d2ee430e93cf5192a67cf4 |
| SANs: cnvs.app, *.cnvs.app | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of cnvs.app. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| app. | present | 23684 | 8 | Verified |
| cnvs.app. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://cnvs.app/mcp | Verified | 200 | |
| http (plaintext) | http://cnvs.app/mcp | Served over HTTP | 200 |
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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_image Add Image ~277
Place a raster or SVG image on the board at (x, y) with explicit width/height in board pixels. `data_url` MUST be a `data:image/(png|jpeg|gif|webp|svg+xml);base64,...` string ≤ ~900 kB; hosted URLs are not accepted. Strongly recommended: also pass a tiny `thumb_data_url` (≤8 kB JPEG/PNG/WebP, ~64 px on the long edge) — it is embedded into the SVG preview so OTHER AI viewers (and you, on later `get_preview` calls) can actually see the image instead of a placeholder box.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | – |
| board_id | string | yes | – |
| data_url | string | yes | – |
| height | number | yes | – |
| id | string | – | – |
| thumb_data_url | string | – | – |
| width | number | yes | – |
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
add_link Add Link ~173
Drop a URL capsule onto the board — rendered as a clickable pill showing the hostname. Use this instead of `add_text` when the node is just a link; the capsule styling signals clickability to humans. Same coordinate rules as `add_text` (+x right, +y down).
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | – |
| board_id | string | yes | – |
| url | string | yes | – |
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
add_text Add Text ~495
Create a NEW text node, or update an existing one (pass the same `id` to overwrite content/position in place — preferred over creating a duplicate). Supports cnvs markup (Markdown-ish) and Mermaid diagrams in the content. When using Mermaid, the ENTIRE content of this text node must be a single Mermaid diagram (one ```mermaid fenced block and nothing else — no heading, no prose before or after). If you need prose + a diagram, create two separate text nodes. `postit: true` renders as a yellow sticky; `diagram: true` renders as a framed box (2px border in the text colour, centred text) — the two are mutually exclusive. Coordinates are in board-world pixels, +x right, +y DOWN; pick a spot that does not overlap existing items (check `get_preview` first). Default width auto-fits content up to ~320 px; pass `width` for explicit wrapping (160–4096). Keep content under 100 000 chars.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | Author tag, defaults to ai:claude. |
| board_id | string | yes | – |
| color | string | – | Named ink only (no hex). Accepted (case-insensitive): 'auto'/''/'black'/omitted for theme-aware ink, or 'red', 'blue', 'green', 'orange', 'yellow', 'pink', 'purple', 'maroon', 'brown', 'gray', 'light… |
| content | string | yes | – |
| diagram | boolean | – | Render as a framed diagram box (2px border in the text colour, centred text). Mutually exclusive with postit. |
| id | string | – | Optional stable id; generated when omitted. |
| postit | boolean | – | – |
| width | number | – | Explicit width in px (160–4096). |
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
create_board Create Board ~1,027
Create a fresh board in ONE call — optionally pre-filled with content, auto-laid-out, and/or PIN-locked at create time. Mirrors the extended `POST /api/boards` REST body exactly (same server-side implementation). With no arguments it returns a blank draw board; `mode: 'todo'` (+ optional `template`) seeds a kanban board. `content` imports initial items atomically: everything is validated FIRST and the board is created only if every item passes — on any invalid item you get a structured error naming its kind + index and NOTHING is created. `autolayout: true` (draw mode) fills in x/y for texts/images that omit them (deterministic masonry grid; explicit coordinates are never touched). `lock: 'write'|'all'` locks the board atomically with creation and returns the plaintext `access_key` ONCE — there is no recovery. The response's `imported` counts confirm what was created, `ids` returns the server-minted item ids per kind in the order you supplied them (index i of `ids.texts` is the id created for `content.texts[i]`; `ids.columns` is empty when the columns came from the template seed, and lanes have no id — they are keyed by board + lane index), and `embed_url` (the `?embed=1#<id>` iframe view) is returned for any board readable without a key — it is omitted for `lock:'all'` boards, whose embed frame can't read the board anonymously. Prefer this over open_board + N per-item calls when you are building a whole board from scratch.
| Name | Type | Req | Description |
|---|---|---|---|
| author | string | – | Author tag stamped on every created item (e.g. 'ai:plai'). Defaults to 'ai:import'. |
| autolayout | boolean | – | Draw mode only: fill x/y for texts/images that omit them (deterministic masonry). Without it, items missing coordinates are rejected. No-op in todo mode. |
| content | object | – | Initial board content, applied atomically at create time. Draw mode: `texts` [{x?, y?, content, color?, width?, postit?, diagram?, kind?, author?, sourceId?}], `lines` [{points, color?, anchors?, aut… |
| lock | string | – | PIN-lock the board atomically at create time; the plaintext key is returned ONCE as `access_key`. |
| mode | string | – | Board mode. Defaults to 'draw'. |
| template | string | – | Starter column set when mode is 'todo' and content.columns is empty/absent. Defaults to 'kanban'. |
No output schema declared.
No examples provided.
create_column Create Column ~276
Add a kanban column (swimlane) to a 'todo' board. Generates and returns a stable column id. `sort` is a float ordering key (ascending); omit to default to 0. `lane` is an integer row index for multi-row layouts (defaults to 0). `color` is an optional title color ('red' / 'blue' / 'green', or 'auto' / omit for default). To rename, reorder, recolor or move between lanes later use `update_column`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | Author tag, defaults to ai:claude. |
| board_id | string | yes | – |
| color | string | – | Title color: 'red', 'blue', 'green', or 'auto' (default). |
| lane | integer | – | Row index for multi-row layouts. Defaults to 0. |
| sort | number | – | Float ordering key (ascending). Defaults to 0. |
| title | string | yes | – |
No output schema declared.
No examples provided.
create_task Create Task ~320
Create a task (card) in a column on a 'todo' board. Generates and returns a stable task id. `column_id` must reference an existing column (see `list_tasks`). `description` is free-form prose stored on the card; `priority` is one of 'H' | 'M' | 'L' (omit for none); `due_date` is an ISO 8601 date string; `assignee` is free text (name / initials / email). `sort` is a float ordering key within the column (ascending), defaulting to 0.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| assignee | string | – | – |
| author | string | – | Author tag, defaults to ai:claude. |
| board_id | string | yes | – |
| column_id | string | yes | – |
| description | string | – | – |
| done | boolean | – | Whether the task is completed (checked off). Defaults to false. |
| due_date | string | – | ISO 8601 date. |
| name | string | yes | – |
| priority | string | – | High / Medium / Low. Omit for none. |
| sort | number | – | Float ordering key within the column. Defaults to 0. |
No output schema declared.
No examples provided.
create_tasks Create Tasks ~221
Bulk-create multiple task cards in one call — far cheaper than calling `create_task` N times. Pass `tasks`: an array of task objects, each with `column_id` (required) + the same fields `create_task` accepts (`name`, `description`, `due_date`, `priority`, `assignee`, `done`, `sort`). Returns the array of created ids in order. Stops at the first invalid item and reports its index; items before it are still created (not transactional).
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | Author tag applied to every task, defaults to ai:claude. |
| board_id | string | yes | – |
| tasks | array | yes | Array of task objects to create. |
No output schema declared.
No examples provided.
delete_column Delete Column ~119
Delete a kanban column by id. Tasks in the column are removed with it. Get the id from `list_tasks`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| id | string | yes | – |
No output schema declared.
No examples provided.
delete_task Delete Task ~111
Delete a task (card) by id. Get the id from `list_tasks`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| id | string | yes | – |
No output schema declared.
No examples provided.
draw_stroke Draw Stroke ~393
Draw a freehand stroke on the board. Use for arrows, underlines, connector lines, annotations, or simple shapes — a straight line needs two points, a rough circle wants ~20. Stroke width is fixed at 3 px; `color` is a NAME, not hex (case-insensitive): 'auto'/''/'black'/omitted for theme-aware ink, or 'red', 'blue', 'green', 'orange', 'yellow', 'pink', 'purple', 'maroon', 'brown', 'gray', 'lightgray', 'teal', 'sage', 'sky', 'lavender' — anything else (including a literal hex like '#ff0000') silently clamps to auto. Accepts three equivalent point formats — pick whichever your MCP client serialises cleanly: nested `[[x,y],[x,y],...]`, flat `[x1,y1,x2,y2,...]`, or a JSON string of either. Some clients (Claude Code as of 2026-04) drop nested arrays during tool-call serialisation, so prefer the flat form or the JSON-string form when in doubt. To delete a stroke later, use `erase` with `kind: 'line'` and the id returned here.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | – |
| board_id | string | yes | – |
| color | string | – | – |
| id | string | – | – |
| points | – | yes | Points as [[x,y],...], flat [x1,y1,x2,y2,...], or a JSON string of either. |
No output schema declared.
No examples provided.
erase Erase Item ~187
Delete a single item by id. `kind` MUST match the item type: 'text' for text nodes, 'line' for freehand strokes, 'image' for images — the wrong kind silently targets the wrong table and is a common mistake. Get the id + type from `get_board` (texts[], lines[], images[]). There is no bulk/erase-all tool: loop if you need to delete multiple items.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| id | string | yes | – |
| kind | string | yes | – |
No output schema declared.
No examples provided.
export_tasks Export Tasks ~182
Export a 'todo' board's columns + tasks as a single text document. `format` is 'markdown' (a checklist grouped by column, the default) or 'csv' (one row per task with column/name/priority/assignee/due_date/done). Returns the rendered text. Same data as the GET /api/boards/<id>/tasks.md and tasks.csv REST endpoints.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| format | string | – | Output format. Defaults to 'markdown'. |
No output schema declared.
No examples provided.
get_board Get Board ~218
Full structured JSON state of a board: texts (id, x, y, content, color, width, postit, author), strokes (id, points, color, author), images (id, x, y, width, height, dataUrl, thumbDataUrl, author; heavy base64 >8 kB elided to dataUrl:null, tiny images inlined). Use this for EXACT ids/coordinates/content (needed for `move`, `erase`, editing a text by id). For visual layout (where is empty space? what overlaps?) call `get_preview` instead — it's much cheaper for spatial reasoning than a huge JSON dump.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
No output schema declared.
No examples provided.
get_preview Get Board Preview ~182
Compact schematic SVG render of the board (typically a few kB even for dense boards). Returns both an image/svg+xml content block (you can SEE it) and the raw SVG text. CALL THIS any time you need to understand where things are — before placing new items, before deciding whether the canvas is crowded, before picking a free region. AI-authored items get a purple border so you can tell which contributions were yours. For precise text content prefer `get_board`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
No output schema declared.
No examples provided.
list_tasks List Tasks ~171
Read the full kanban state of a 'todo' board: `{ mode, columns, tasks }`, both ordered by their `sort` key (ascending). Each task carries its hot fields (name, due_date, priority, assignee, done, column_id, sort) plus an opaque `content` JSON string (holds the description). Use this to get exact column/task ids before updating, moving or deleting.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
No output schema declared.
No examples provided.
move Move Item ~255
Reposition an existing item to a new (x, y) without retyping its content. Works for every item kind: `text` and `link` set the top-left to (x, y); `line` translates every point so the stroke's bounding box top-left lands at (x, y); `image` sets the top-left like text. `kind` defaults to `text` for backward compat with older callers. Find the id + kind via `get_board`. Prefer `move` over re-creating an item when only the location changes — it preserves the id, content, author and avoids a round-trip of base64 bytes for images.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| id | string | yes | – |
| kind | string | – | Item kind. Defaults to `text`. |
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
move_task Move Task ~152
Move a task to a column at a given sort position — the kanban drag-and-drop primitive. `column_id` is the destination column and `sort` its float order key (ascending) within that column.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| column_id | string | yes | – |
| id | string | yes | – |
| sort | number | yes | – |
No output schema declared.
No examples provided.
open_board Open Board ~196
ALWAYS call this first when given a board URL or ID. Resolves the canonical board id and auto-creates the board row if it does not exist yet. Returns a summary (item counts, authors). After this, call BOTH `get_preview` and `get_board` before editing so you can see the layout visually AND know the exact ids/coordinates — do not skip `get_preview`, otherwise you will place new items blindly on top of existing ones.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| url_or_id | string | yes | Full board URL (https://cnvs.app/#<id>) or bare UUID. |
No output schema declared.
No examples provided.
query_tasks Query Tasks ~285
Read tasks from a 'todo' board with server-side filtering — handy for 'what's overdue?' / 'what's assigned to X?' without pulling the whole board. All filters are optional and AND together: `assignee` (exact match), `priority` ('H'|'M'|'L'), `done` (boolean), `overdue` (true → due_date strictly before today, not done), `due_before` / `due_after` (ISO date window on due_date). Returns `{ boardId, mode, tasks }` — tasks ordered by sort, each with the same fields as `list_tasks`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| assignee | string | – | Exact-match assignee filter. |
| board_id | string | yes | – |
| done | boolean | – | – |
| due_after | string | – | ISO date; due_date > this. |
| due_before | string | – | ISO date; due_date < this. |
| overdue | boolean | – | Only tasks past due and not done. |
| priority | string | – | – |
No output schema declared.
No examples provided.
set_board_mode Set Board Mode ~315
Choose whether this board is a freeform whiteboard ('draw', the default) or a kanban task board ('todo'). Mode is switchable WHENEVER the board is empty of real content: drawings (text/strokes/images) and tasks. Empty or seeded columns DON'T count (switching to 'draw' clears them), so a cleared board can be switched again, and you can flip draw<->todo freely until the first stroke/text/image or task lands. Setting 'todo' auto-seeds three starter columns (To do / In progress / Done). Returns `{ mode, columns }`. Use the task/column tools (`create_task`, `create_column`, …) once the board is in 'todo' mode.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| mode | string | yes | Board mode. |
| template | string | – | Optional starter column template when mode is 'todo': 'kanban' (To do / In progress / Done, the default), 'sprint' (Backlog / Sprint / Review / Done), or 'bugs' (Triage / Confirmed / In progress / Fi… |
No output schema declared.
No examples provided.
set_column_width Set Column Width ~153
Set the shared kanban column width in pixels for a 'todo' board (all columns share one width). Clamped to [200, 480]. Read the current value as `colWidth` from `list_tasks`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| width | number | yes | Column width in px, clamped to [200, 480]. |
No output schema declared.
No examples provided.
set_lane Set Lane ~205
Set (or clear) the title of a kanban row (lane). Lanes group columns into horizontal swimlanes; a lane is identified by its integer `lane` index (the same index columns carry). Pass a `title` to name the row, or an empty string to clear it. Read current lane titles + the shared column width via `list_tasks`.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | Author tag, defaults to ai:claude. |
| board_id | string | yes | – |
| lane | integer | yes | Row index (>= 0). |
| title | string | – | Row title; empty string clears it. |
No output schema declared.
No examples provided.
update_column Update Column ~212
Rename, reorder, recolor or move an existing kanban column. Requires the column `id` (from `list_tasks`). Pass `title`, `sort`, `lane` and/or `color` to change them.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| author | string | – | Author tag, defaults to ai:claude. |
| board_id | string | yes | – |
| color | string | – | Title color: 'red', 'blue', 'green', or 'auto' (default). |
| id | string | yes | – |
| lane | integer | – | Row index for multi-row layouts. |
| sort | number | – | Float ordering key (ascending). |
| title | string | – | – |
No output schema declared.
No examples provided.
update_task Update Task ~271
Update an existing task by `id` (from `list_tasks`). Pass only the fields you want to change: `name`, `description`, `due_date`, `priority` ('H'|'M'|'L'), `assignee`, `done` (true once completed), `column_id` (to reassign), `sort`. To move a card between columns while setting its order, `move_task` is the dedicated tool.
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| assignee | string | – | – |
| author | string | – | Author tag, defaults to ai:claude. |
| board_id | string | yes | – |
| column_id | string | – | – |
| description | string | – | – |
| done | boolean | – | Whether the task is completed (checked off). |
| due_date | string | – | ISO 8601 date. |
| id | string | yes | – |
| name | string | – | – |
| priority | string | – | – |
| sort | number | – | – |
No output schema declared.
No examples provided.
wait_for_update Wait for Board Update ~422
Long-poll: blocks until the next edit lands on this board, then returns. WHEN TO CALL THIS: if your MCP client does NOT surface `notifications/resources/updated` events from `resources/subscribe` back to the model (most chat clients do not — they receive the SSE event but don't inject it into your context), this tool is how you 'wait for the human' inside a single turn. Typical flow: you draw / write what you were asked to, then instead of ending your turn you call `wait_for_update(board_id)`. When the human adds, moves, or erases something, the call returns and you refresh with `get_preview` / `get_board` and continue the collaboration. Great for turn-based interactions (games like tic-tac-toe, brainstorming where you respond to each sticky the user drops, sketch-and-feedback loops, etc.). If your client DOES deliver resource notifications natively, prefer `resources/subscribe` — it's cheaper and has no timeout ceiling. BEHAVIOUR: resolves ~3 s after the edit burst settles (same debounce as the push notifications — this is intentional so drags and long strokes collapse into one wake-up). Returns `{ updated: true, timedOut: false }` on a real edit, or `{ updated: false, timedOut: true }` if nothing happened within `timeout_ms`. On timeout, just call it again to keep waiting; chaining calls is cheap. `timeout_ms` is clamped to [1000, 55000]; default 25000 (leaves headroom under typical 60 s proxy timeouts).
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | 8-character lowercase alphanumeric board access key when the board is locked (legacy 6-character lowercase alphanumeric keys are also accepted). Equivalent to setting the `X-Board-Key` HTTP header on… |
| board_id | string | yes | – |
| timeout_ms | number | – | – |
No output schema declared.
No examples provided.
What is the cnvs.app MCP server?
cnvs.app is an MCP server listed in the public MCP registry as app.cnvs/whiteboard. Real-time collaborative whiteboard, AI agents and humans edit the same board live over MCP. This page covers its hosted endpoint (https://cnvs.app/mcp).
Is the cnvs.app MCP server safe to use?
cnvs.app scores 71 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the cnvs.app MCP server expose?
cnvs.app exposes 25 tools: open_board, create_board, get_board, get_preview, add_text, and 20 more. Their descriptions and schemas cost roughly 6,818 tokens of context every time the server is loaded.
Does the cnvs.app MCP server require authentication?
No. We connected to cnvs.app without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the cnvs.app MCP server still maintained?
cnvs.app is still listed as active in the MCP registry. We last reached this channel on 27 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.