{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_5gy8v8b2adfb","handle":"cnvs-app","url":"https://wellknown.network/agents/cnvs-app","links":{"self":"https://wellknown.network/agents/cnvs-app/record.json","html":"https://wellknown.network/agents/cnvs-app","markdown":"https://wellknown.network/agents/cnvs-app/record.md","api":"https://wellknown.network/api/v1/agents/cnvs-app","status":"https://wellknown.network/api/v1/agents/cnvs-app/status","claim":"https://wellknown.network/agents/cnvs-app/claim","claimApi":"https://wellknown.network/api/v1/claims","badge":"https://wellknown.network/agents/cnvs-app/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:cnvs.app:server:cnvs-app","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"cnvs.app","summary":"Real-time collaborative whiteboard — AI agents and humans edit the same board live over MCP.","description":"Real-time collaborative whiteboard — AI agents and humans edit the same board live over MCP.","publisher":{"name":"app.cnvs","url":null},"homepage":"https://cnvs.app","repository":"https://github.com/lksrz/cnvs-whiteboard-skills","version":"1.0.2","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://cnvs.app/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-06-15T18:01:23.940241Z","publishedAt":"2026-06-15T18:01:23.940241Z","registryName":"app.cnvs/whiteboard"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[],"categories":[]},"observed":{"status":"unknown","statusReason":"Not checked yet.","lastOkAt":null,"lastProbedAt":null,"statusComputedAt":null,"reliability30d":null,"latestObservations":[{"at":"2026-09-05T18:27:59.425Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":32,"error":null,"detail":{"tools":[{"name":"open_board","description":"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 "},{"name":"create_board","description":"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` "},{"name":"get_board","description":"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, he"},{"name":"get_preview","description":"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 S"},{"name":"add_text","description":"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 cn"},{"name":"add_link","description":"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 "},{"name":"add_image","description":"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);base"},{"name":"draw_stroke","description":"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 circ"},{"name":"move","description":"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` transl"},{"name":"erase","description":"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 ta"},{"name":"wait_for_update","description":"Long-poll: blocks until the next edit lands on this board, then returns. \n\nWHEN TO CALL THIS: if your MCP client does NOT surface `notifications/resources/updat"},{"name":"set_board_mode","description":"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"},{"name":"create_column","description":"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. `l"},{"name":"update_column","description":"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 "},{"name":"delete_column","description":"Delete a kanban column by id. Tasks in the column are removed with it. Get the id from `list_tasks`."},{"name":"create_task","description":"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`). `d"},{"name":"update_task","description":"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'), `assi"},{"name":"move_task","description":"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 (asc"},{"name":"delete_task","description":"Delete a task (card) by id. Get the id from `list_tasks`."},{"name":"list_tasks","description":"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, "},{"name":"set_lane","description":"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"},{"name":"set_column_width","description":"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 "},{"name":"create_tasks","description":"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` (req"},{"name":"query_tasks","description":"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 a"},{"name":"export_tasks","description":"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 tas"}],"toolCount":25,"serverName":"cnvs-mcp","capabilities":["tools","resources"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"open_board","description":"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 "},{"name":"create_board","description":"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` "},{"name":"get_board","description":"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, he"},{"name":"get_preview","description":"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 S"},{"name":"add_text","description":"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 cn"},{"name":"add_link","description":"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 "},{"name":"add_image","description":"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);base"},{"name":"draw_stroke","description":"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 circ"},{"name":"move","description":"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` transl"},{"name":"erase","description":"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 ta"},{"name":"wait_for_update","description":"Long-poll: blocks until the next edit lands on this board, then returns. \n\nWHEN TO CALL THIS: if your MCP client does NOT surface `notifications/resources/updat"},{"name":"set_board_mode","description":"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"},{"name":"create_column","description":"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. `l"},{"name":"update_column","description":"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 "},{"name":"delete_column","description":"Delete a kanban column by id. Tasks in the column are removed with it. Get the id from `list_tasks`."},{"name":"create_task","description":"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`). `d"},{"name":"update_task","description":"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'), `assi"},{"name":"move_task","description":"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 (asc"},{"name":"delete_task","description":"Delete a task (card) by id. Get the id from `list_tasks`."},{"name":"list_tasks","description":"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, "},{"name":"set_lane","description":"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"},{"name":"set_column_width","description":"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 "},{"name":"create_tasks","description":"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` (req"},{"name":"query_tasks","description":"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 a"},{"name":"export_tasks","description":"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 tas"}],"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"app.cnvs/whiteboard","url":"https://registry.modelcontextprotocol.io/v0/servers/app.cnvs%2Fwhiteboard","firstSeenAt":"2026-09-05T15:22:05.585Z","fetchedAt":"2026-09-05T15:22:05.585Z","normalizedAt":"2026-09-05T15:22:05.585Z"}]},"firstSeenAt":"2026-09-05T15:22:05.585Z","updatedAt":"2026-09-05T15:22:14.439Z"}