Skip to main content
Glama

Server Details

Real-time collaborative whiteboard — AI agents and humans edit the same board live over MCP.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
lksrz/cnvs-whiteboard-skills
GitHub Stars
0
Server Listing
cnvs-whiteboard

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.2/5 across 24 of 24 tools scored. Lowest: 2.5/5.

Server CoherenceA
Disambiguation5/5

Each tool targets a distinct action or resource. For example, add_image, add_link, and add_text clearly differentiate content types; create_column and create_task are for kanban elements; get_board and get_preview serve different data needs. There is no ambiguity between tools.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern using snake_case, e.g., add_image, create_task, delete_column, move_task. Even single-word tools like 'erase' and 'move' are unambiguous in context. No mixing of conventions.

Tool Count5/5

24 tools cover the full range of operations for a collaborative whiteboard and kanban board without being excessive. Each tool serves a clear purpose, and the count is well-scoped for the domain.

Completeness5/5

The tool set provides comprehensive coverage: adding and editing text, images, links, strokes; full CRUD for kanban columns and tasks; bulk operations; querying and exporting; board management; and a wait mechanism for collaboration. No obvious gaps that would hinder workflow.

Available Tools

25 tools
add_imageInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
idNo
widthYes
authorNo
heightYes
board_idYes
data_urlYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
thumb_data_urlNo
add_textInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
idNoOptional stable id; generated when omitted.
colorNoNamed 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', 'lightgray', 'teal', 'sage', 'sky', 'lavender'. Anything else (including a literal hex) silently clamps to auto.
widthNoExplicit width in px (160–4096).
authorNoAuthor tag, defaults to ai:claude.
postitNo
contentYes
diagramNoRender as a framed diagram box (2px border in the text colour, centred text). Mutually exclusive with postit.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
create_boardInspect

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, 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
lockNoPIN-lock the board atomically at create time; the plaintext key is returned ONCE as `access_key`.
modeNoBoard mode. Defaults to 'draw'.
authorNoAuthor tag stamped on every created item (e.g. 'ai:plai'). Defaults to 'ai:import'.
contentNoInitial board content, applied atomically at create time. Draw mode: `texts` [{x?, y?, content, color?, width?, postit?, diagram?, kind?}], `lines` [{points, color?, anchors?}] (alias `strokes`), `images` [{x?, y?, dataUrl, width, height}]. Todo mode: `columns` [{title, lane?, color?}] (array order = sort order), `tasks` [{columnIndex, name, description?, due_date?, priority?, assignee?, done?, color?}] (columnIndex indexes into content.columns, or into the template-seeded columns when content.columns is empty), `lanes` [{lane, title}], `colWidth`. Kanban structures with a non-todo mode (or draw items with mode 'todo') are rejected with `content_mode_mismatch`. The combined input arrays may contain at most 40 entries. At most 10 lane-title entries are accepted and every title must reference a lane used by a created column. Standard per-board quotas also apply. A valid X-Import-Token selects higher REST/MCP and board-create rate tiers, but never changes these content limits.
templateNoStarter column set when mode is 'todo' and content.columns is empty/absent. Defaults to 'kanban'.
autolayoutNoDraw 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.
create_columnInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
laneNoRow index for multi-row layouts. Defaults to 0.
sortNoFloat ordering key (ascending). Defaults to 0.
colorNoTitle color: 'red', 'blue', 'green', or 'auto' (default).
titleYes
authorNoAuthor tag, defaults to ai:claude.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
create_taskInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
doneNoWhether the task is completed (checked off). Defaults to false.
nameYes
sortNoFloat ordering key within the column. Defaults to 0.
authorNoAuthor tag, defaults to ai:claude.
assigneeNo
board_idYes
due_dateNoISO 8601 date.
priorityNoHigh / Medium / Low. Omit for none.
column_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
descriptionNo
create_tasksInspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYesArray of task objects to create.
authorNoAuthor tag applied to every task, defaults to ai:claude.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
delete_columnInspect

Delete a kanban column by id. Tasks in the column are removed with it. Get the id from list_tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
delete_taskInspect

Delete a task (card) by id. Get the id from list_tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
draw_strokeInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
colorNo
authorNo
pointsYesPoints as [[x,y],...], flat [x1,y1,x2,y2,...], or a JSON string of either.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
eraseInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
kindYes
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
export_tasksInspect

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//tasks.md and tasks.csv REST endpoints.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoOutput format. Defaults to 'markdown'.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
get_boardInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
get_previewInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
list_tasksInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
moveInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
idYes
kindNoItem kind. Defaults to `text`.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
move_taskInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
sortYes
board_idYes
column_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
open_boardInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_or_idYesFull board URL (https://cnvs.app/#<id>) or bare UUID.
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
query_tasksInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
doneNo
overdueNoOnly tasks past due and not done.
assigneeNoExact-match assignee filter.
board_idYes
priorityNo
due_afterNoISO date; due_date > this.
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
due_beforeNoISO date; due_date < this.
set_board_modeInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesBoard mode.
board_idYes
templateNoOptional 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 / Fixed). Unknown/omitted falls back to 'kanban'.
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
set_column_widthInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesColumn width in px, clamped to [200, 480].
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
set_laneInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
laneYesRow index (>= 0).
titleNoRow title; empty string clears it.
authorNoAuthor tag, defaults to ai:claude.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
update_columnInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
laneNoRow index for multi-row layouts.
sortNoFloat ordering key (ascending).
colorNoTitle color: 'red', 'blue', 'green', or 'auto' (default).
titleNo
authorNoAuthor tag, defaults to ai:claude.
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
update_taskInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
doneNoWhether the task is completed (checked off).
nameNo
sortNo
authorNoAuthor tag, defaults to ai:claude.
assigneeNo
board_idYes
due_dateNoISO 8601 date.
priorityNo
column_idNo
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
descriptionNo
wait_for_updateInspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYes
access_keyNo6-char board access key (a-z, 0-9) when the board is locked. Equivalent to setting the `X-Board-Key` HTTP header on the JSON-RPC POST. Omit for unlocked boards. Obtain via POST /api/boards/<id>/lock.
timeout_msNo

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    -
    quality
    C
    maintenance
    A shared whiteboard for you and your AI agent I wanted my AI agent and me to be able to point at the same thing. Any MCP-capable agent can read the canvas, draw on it, drop thought bubbles, animate elements, and react when you sketch something.
    Last updated
    1
    MIT
  • A
    license
    -
    quality
    B
    maintenance
    Enables AI agents to draw animated, hand-drawn diagrams on a live whiteboard through MCP tools, allowing users to visually explain concepts and edit scenes interactively.
    Last updated
    129
    AGPL 3.0

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.