Show HN: Open-Source Paper Tracepaper, an open-source MCP server that gives AI agents a visual canvas for drawing HTML frames and receiving human feedback via pinned comments, is now available via a one-line install with Bun 1.3+ or Node. The server, created by Caffeineum, runs a single process serving both MCP over stdio and a canvas web app over HTTP, sharing one SQLite database and event bus, with the canvas accessible at http://127.0.0.1:4321 by default. The tool enables a draw-comment-read feedback loop between agents and humans, and supports configuration via environment variables for port, host, and database path. An MCP server that gives an agent a canvas. The agent pushes HTML frames onto it. A human opens the canvas in a browser, scrolls around, and drops pinned comments on the frames. The agent reads those comments back through MCP and replies inside the thread. That round trip — draw → comment → read feedback — is the whole product. One process serves both halves — an MCP server on stdio and the canvas web app over HTTP, sharing one SQLite database and one event bus. You start nothing by hand: your MCP client launches it, and the canvas comes up with it. An agent's push html shows up in the human's open browser within seconds, and a human's comment is readable by the agent on the next poll. One line, nothing to clone and nothing to build: claude mcp add tracepaper -- bunx github:caffeinum/tracepaper or in any MCP client's JSON: { "mcpServers": { "tracepaper": { "command": "bunx", "args": "github:caffeinum/tracepaper" } } } That is the whole install. bunx resolves the GitHub repo directly — no npm package needed — and the canvas bundle compiles itself on first boot. Requires Bun https://bun.sh 1.3+, since the server uses bun:sqlite and Bun.serve : curl -fsSL https://bun.sh/install | bash npx -y github:caffeinum/tracepaper also works — the bin is a plain Node launcher that execs Bun, and prints an install line rather than a missing-interpreter error when Bun is absent. But it needs Node and Bun to run one Bun program, so prefer bunx . BothIf you are changing tracepaper, point the client at your clone bunx and npx cache the fetched repo. bun run /path/to/tracepaper/src/index.ts — otherwise your agent can sit on a weeks-old copy while you edit, with no sign that it is happening. For hacking on it: git clone https://github.com/caffeinum/tracepaper.git cd tracepaper bun install No build step to remember — the canvas bundle compiles on first boot if it is missing. bun run build:web exists for up-front builds, and you need it after editing web/canvas.ts . One command runs everything. There is no separate canvas server to start: bun run src/index.ts MCP over stdio AND the canvas over HTTP, one process That is what your MCP client launches, and it is the whole setup — the canvas comes up with it, at http://127.0.0.1:4321 http://127.0.0.1:4321 the resolved URL is also written to ~/.tracepaper/server.json , and every tool returns it as canvasUrl . bun run src/index.ts serve optional: HTTP only, the canvas with no agent attached serve drops the MCP half. It is a convenience for keeping a canvas open in your browser across agent restarts, not a requirement. Running both is safe: a second process started against the same database detects the live canvas and joins it instead of binding another port, so agent pushes land in the tab you already have open. | env | default | meaning | |---|---|---| TRACEPAPER PORT | 4321 | HTTP port. If busy, the next free port is used and reported. | TRACEPAPER HOST | 127.0.0.1 | bind address | TRACEPAPER DB | ~/.tracepaper/tracepaper.db | SQLite file. :memory: for throwaway runs. | stdout belongs to the MCP stdio transport; every log line goes to stderr. One canvas per machine, by default. ~/.tracepaper/tracepaper.db and port 4321 are global, so two projects both wired with the config below share one canvas — project B's agent will call list frames and get project A's frames, and push html with no frameId will land its work next to them. To give a project its own, set TRACEPAPER DB and TRACEPAPER PORT in that project's MCP config. The one-liner above works in every MCP client — Claude Code, Cursor, Windsurf, Zed, Claude Desktop — via .mcp.json , ~/.cursor/mcp.json or claude desktop config.json : { "mcpServers": { "tracepaper": { "command": "npx", "args": "-y", "github:caffeinum/tracepaper" } } } Running from a clone instead? Point at the entry file, with an absolute path — the client sets its own working directory: { "mcpServers": { "tracepaper": { "command": "bun", "args": "run", "/absolute/path/to/tracepaper/src/index.ts" , "env": { "TRACEPAPER PORT": "4321" } } } } Verify it end to end without restarting your agent, using the mcpt CLI https://github.com/f/mcp-tools brew install f/mcptools/mcp : mcpt tools bun run src/index.ts mcpt call push html --params '{"html":"