create_canvasLABSCO SUMMARY
A canvas an agent can keep editing, not just draw once.
Editing is what makes it worth wiring up: nodes and edges go in and out of a stored board in a single atomic write, so a rejected operation leaves the file exactly as it was instead of half-changed. Markdown and SVG are the two export targets that exist today — PNG is written up as a proposal, not built.
What it is
An MCP server for JSON Canvas, the open infinite-canvas format Obsidian uses for its .canvas files. It writes canvases from node and edge objects, reads and edits stored ones, checks data against the JSON Canvas 1.0 specification, and exports a board to Markdown or SVG. Hosts that support the MCP Apps UI extension render a pan/zoom preview inline; text-only clients get the same canvas as structured output.
What you get
- A canvas written from nodes and optional edges into a date-prefixed
.canvasfile, answered with the path and the node and edge counts —create_canvas - Stored boards read back as their nodes and edges, and the available files listed —
read_canvas,list_canvases - Nodes and edges added, updated and removed in one atomic write, where a failed operation leaves the file unchanged and removing a node cascades to its edges —
edit_canvas - Canvas data checked against the JSON Canvas 1.0 specification before it goes anywhere —
validate_canvas - A board exported as an edge-ordered Markdown outline or a standalone SVG image, returned with its MIME type —
export_canvas - Case-insensitive substring search across stored canvases, or scoped to one, returning the filename, id, field and a snippet per match —
search_canvases - Two resources to build against: the JSON Schema at
canvas://schemaand a two-node worked example atcanvas://examples/basic
Requirements
No account and no key. The published package is mcp-server-jsoncanvas 0.2.0 on PyPI, run with uvx over stdio; a container image ships at ghcr.io/cam10001110101/obsidian-jsoncanvas. OUTPUT_PATH is the directory canvases are written to and read from. Set MCP_TRANSPORT to streamable-http to serve over HTTP instead: it binds to 127.0.0.1 and carries no authentication, so anyone who can reach the port can read and write your canvas files — front it with an authenticating reverse proxy before exposing it, and set MCP_CORS_ORIGINS to the origins you trust rather than leaving the * default.
Setup effort
One command — docker run -i --rm -v canvas-data:/data mcp/jsoncanvas
USE CASES
Turning a discussion into a canvas board
Lay the ideas out as text nodes with positions and colours, join the related ones with labelled edges, and write the whole thing to a .canvas file Obsidian opens. Validate the structure first if the layout was generated rather than hand-written.
Reworking a board that already exists
Read the current nodes and edges, then add, update or delete in one call. Removing a node takes its connected edges with it, and a failed operation leaves the stored file untouched.
Getting a canvas out of Obsidian and into a document
Export the board as an edge-ordered Markdown outline for a doc or ticket, or as a standalone SVG for a slide. The SVG carries node title lines only, so keep detail in the Markdown form.
Finding which board a note ended up on
Search across every stored canvas for a phrase and get back the file, the node or edge it matched, which field it was in, and a snippet — instead of opening boards one at a time.
7 tools
Listed in project docs. Your client may show a different list.
validate_canvasread_canvaslist_canvasesedit_canvasexport_canvassearch_canvasesBEFORE YOU INSTALL
What to know first
Tools you get
7 tools named in the project's documentation.
Requires
docker on PATH
Where it runs
Both documented setups run the server on your machine.
INSTALLATION
Connect your client
Server setup
docker run -i --rm -v canvas-data:/data mcp/jsoncanvasMCP Clients
Claude Desktop — Docker
{
"mcpServers": {
"jsoncanvas": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"canvas-data:/data",
"mcp/jsoncanvas"
],
"env": {
"OUTPUT_PATH": "/data/output"
}
}
}
}Claude Desktop — uv
{
"mcpServers": {
"jsoncanvas": {
"command": "uv",
"args": [
"--directory",
"<YOUR_PATH_TO_JSONCANVAS>",
"run",
"mcp-server-jsoncanvas"
],
"env": {
"OUTPUT_PATH": "./output"
}
}
}
}