Shared visual canvas (Excalidraw) for collaborative whiteboarding between AI agents and humans.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Napkin is a shared Excalidraw canvas for agent + human collaboration.
I love using AI assistants for everyday tasks β design, programming, and brainstorming. Iβve always found visual thinking helpful, but there was a gap: I could describe something, and the agent could describe it back, but we couldnβt point to the same thing. What if my agent and I could share a whiteboard β where I draw, it responds, and we build together?
Napkin works with any MCP-capable agent. For true two-way canvas-to-agent, you'll also need a webhook.
Brainstorming
Gaming
"Art" - Don't know why Perry invented a Platabird, but there you are.
Collaboration
Napkin is an Excalidraw whiteboard connected to an MCP server. Any MCP-capable agent can read the canvas, draw on it, annotate it, animate it, and respond to what you draw β all while you interact with the agent through your normal channel (Slack, WhatsApp, Telegram, Terminal, or any MCP client).
The conversation stays in your channel. The canvas is pure whiteboard.
Defaults:
http://localhost:3003ws://localhost:3002Napkin works with any MCP-capable agent. Add to your MCP client config:
Two-way vs one-way: MCP alone gives you agentβcanvas (read, write, animate). For canvasβagent (the agent waking up when you draw something), you need a webhook receiver on your agent's side.
| Mode | What you get | Requires |
|---|---|---|
| MCP only | Agent can read and write the canvas | Any MCP client |
| MCP + webhook | Agent also reacts to human canvas activity | Webhook receiver (see below) |
When you draw on the canvas, Napkin POSTs a trigger to your agent's webhook endpoint. The agent wakes up, reads the canvas diff, and responds.
OpenClaw β built in. Set NAPKIN_TRIGGER_WEBHOOK in your environment and it routes automatically.
NanoClaw β add the webhook channel via PR #1488:
Then pass the webhook URL when starting your session:
Custom / other frameworks β any HTTP server that accepts POST /webhook with { message, sender? } JSON and forwards to your agent works fine.
Common server variables:
NAPKIN_TRANSPORT (http or stdio, default http)NAPKIN_MCP_PORT (default 3003)MCP_WS_PORT (default 3002)AGENT_TRIGGER_DEBOUNCE_MS (default 3000)NAPKIN_TRIGGER_WEBHOOK (optional global webhook URL)NAPKIN_COMPACT_TRIGGERS (true/false, default false)NAPKIN_TRIGGER_INCLUDE_CANVAS (true/false, default false)NAPKIN_SESSION_TTL_MS (default 7200000)NAPKIN_EXPORT_DIR (optional base dir for relative exports)ANTHROPIC_API_KEY (required for vision tools only - others may be used)See ARCHITECTURE.md for full details.
No coordinates. No boilerplate. Describe what you want.
The server handles placement, bindings, and layout. A 3-node diagram takes one short exchange.
get_canvas() returns a semantic structure β nodes, edges, zones β not raw coordinates:
For cheap reasoning passes, get_canvas_summary() returns nodes and edges only β no zones, sketches, or proximity properties.
Every element carries a customData object β invisible in the UI, readable by agents:
Agents use metadata to reason about what elements represent, not just what they look like. trace_path() can filter by metadata to find specific flows.
When you draw or annotate, Napkin notices. After a quiet period, it POSTs a trigger to your agent's webhook:
The agent wakes up, reads what changed, and responds β on the canvas and in your channel.
Trigger sources:
debounce β canvas went quiet (configurable per session, default 3s)chat β injected by your agent frameworkreconnect β browser connected or reconnectedEcho suppression: agent writes don't trigger webhooks. Only genuine human edits fire triggers.
Agents express tentative ideas as thought bubbles β dashed purple, clearly "agent suggestion":
You can confirm them (makes permanent) or dismiss them. Keeps agent suggestions visually distinct from established content.
apply_intentsCollapse many sequential calls into one:
Ref substitution ($ref:n1.id) lets later ops use outputs from earlier ones β no round-trips needed to get IDs. A 10-node diagram with connections and layout ships in a single MCP call.
zone + rowPin nodes to explicit layout rows independent of edge structure. Nodes sharing the same zone and row are snapped to the same rank band after Dagre runs β useful for shared infrastructure (databases, event buses) that should sit on a common row across subtrees:
Row index is the rank axis (top-to-bottom in TB, left-to-right in LR). Unzoned nodes fall back to natural Dagre placement.
trace_pathFind flows through the graph without manual graph walking:
Returns ordered nodes and edges. Filter by metadata to isolate happy paths, error paths, or any subset. Combine with apply_intents to animate the result.
22 operations β 10 nodes, 11 connections, layout β in a single MCP call. The agent then calls trace_path to find the happy path and animates it with another single call.
(See cicd-pipeline-demo.excalidraw for the saved canvas.)
A human types "Change the timer to 120s?" directly on the canvas. The agent's webhook fires. The agent reads changed_elements_compact, finds the text, acts on it, and responds with a thought bubble confirming the change β all without leaving the whiteboard.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/napkin)<a href="https://allmcps.com/mcp/napkin"><img src="https://allmcps.com/api/badge/napkin?style=directory" alt="Napkin on AllMCPs" /></a>