papercanvas-mcp
PaperCanvas MCP server lets agents create, inspect, patch, lay out, validate, and render editable vector scientific figures via a versioned Figure IR.
Create a new figure IR file with path, figure ID, and canvas dimensions/margin.
Read the full IR (nodes, edges, groups, theme, canvas) plus blocking structural errors before patching.
Apply all-or-nothing semantic patch batches for nodes, edges, groups, styles, labels, and moves, with optional revision concurrency control.
Auto-layout figures using
linear-h,linear-v, orlayeredpresets.Render figures to SVG, PDF, and PPTX as true vector, editable output without modifying the IR.
Run FC001–FC008 quality lint checks for bounds, structure, overflow, overlap, font issues, arrows through nodes, and raster images.
Inspect all objects or detailed geometry/style/connections/groups for a specific object.
Run
doctorfor aggregated validation, lint, font coverage, renderability, and suggested fixes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@papercanvas-mcpCreate a three-node ML pipeline figure and export it as SVG, PDF, and PPTX."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
PaperCanvas
Agent-native scientific figure engine. Create, edit, and export publication-ready SVG, PDF & PPTX with MCP, CLI, and structured patches — the figure stays editable vector, never a bitmap.
A versioned Figure IR (JSON) is the single source of truth. Coding agents modify it through semantic patches — change one node without re-drawing the figure — and deterministic renderers produce true-vector output for papers, theses, and slides.
What it looks like
Real rendered output from the bundled examples (committed SVGs, shown inline):
Example | Figure | Sources |
Linear ML pipeline | ||
Video unlearning framework | ||
Multi-branch architecture with grouped heads |
Related MCP server: gitcad
Why PaperCanvas
Agent-native: seven MCP tools plus a CLI on one shared service layer — agents patch figures incrementally; untouched objects never move.
Figure IR as the single source of truth: SVG/PDF/PPTX are build products; nothing is hand-edited, everything is reproducible.
Transactional semantic patches: nine operations applied all-or-nothing with revision control — a failed patch leaves the file byte-identical.
Truly vector, truly editable: SVG
<text>, PDF with embedded TTF subsets, PPTX with native shapes/connectors — no rasterization anywhere.Deterministic: same IR + same fonts ⇒ byte-identical output; safe to re-export and diff.
Quality lint built in: FC001–FC008 (overflow, overlap, arrows through nodes, font substitution, …) with machine-readable JSON output.
60-second quickstart
pip install papercanvas # PyPI publication pending final approval
# for now, from a clone:
uv sync
papercanvas init figures.json --id demo
# 2. describe the figure as a patch (save as ops.json)
cat > ops.json <<'JSON'
{
"operations": [
{"op": "add_node", "node": {"id": "input", "type": "rounded_rect", "label": "Input Video"}},
{"op": "add_node", "node": {"id": "encoder", "type": "rounded_rect", "label": "Video Encoder"}},
{"op": "add_node", "node": {"id": "output", "type": "rounded_rect", "label": "Prediction"}},
{"op": "add_edge", "edge": {"id": "e1", "source": "input", "target": "encoder"}},
{"op": "add_edge", "edge": {"id": "e2", "source": "encoder", "target": "output"}}
]
}
JSON
papercanvas patch figures.json --ops ops.json
papercanvas layout figures.json --preset layered
papercanvas lint figures.json
papercanvas render figures.json --format all
# -> figures.svg figures.pdf figures.pptx
# 3. revise in place — rename ONE node and re-render, no rebuild:
echo '{"operations": [{"op": "update_label", "target": "output", "label": "Final Prediction"}]}' > round2.json
papercanvas patch figures.json --ops round2.json
papercanvas render figures.json --format allWindows PowerShell: replace the cat > ops.json <<'JSON' ... JSON block with
@' ... '@ | Set-Content ops.json (same JSON), and the last patch with
echo '...' | ... via a file — process substitution <(...) is bash-only.
Try it without writing anything:
uv run papercanvas build examples/basic_pipeline.json --format all
uv run papercanvas lint examples/basic_pipeline.jsonCLI
papercanvas init PATH --id FIGURE_ID [--width] [--height] [--margin]
papercanvas validate PATH
papercanvas patch PATH --ops ops.json # {"operations": [...], "expected_revision": N}
papercanvas layout PATH --preset linear-h|linear-v|layered
papercanvas lint PATH [--min-font-size PT] [--format text|json]
papercanvas inspect PATH [OBJECT_ID] [--format text|json]
papercanvas render PATH [--format svg|pdf|pptx|all] [--out FILE]
papercanvas build PATH [--preset ...] [--format ...] # layout + render in one commandEvery mutating command is transactional: validation errors leave the file
byte-identical; successes bump revision by one.
MCP server (for coding agents)
papercanvas-mcp --root path/to/projectSeven tools: papercanvas_create, papercanvas_get, papercanvas_patch,
papercanvas_layout, papercanvas_render, papercanvas_lint,
papercanvas_inspect. All paths must stay inside --root; failures return
structured {"ok": false, "error": ...} so agents can self-correct. See
docs/mcp.md.
Codex / Claude Code / OpenCode
PaperCanvas speaks standard MCP stdio, so any MCP client works. Point the
client at papercanvas-mcp with the project directory as --root:
Claude Code:
claude mcp add papercanvas -- papercanvas-mcp --root .(or add the JSON below to.mcp.jsonin the project)Codex CLI: add to
~/.codex/config.toml:[mcp_servers.papercanvas]withcommand = "papercanvas-mcp",args = ["--root", "."]OpenCode: add to
opencode.json:"mcp": {"papercanvas": {"type": "local", "command": ["papercanvas-mcp", "--root", "."]}}
Generic stdio JSON (most clients accept this shape):
{
"mcpServers": {
"papercanvas": {
"command": "papercanvas-mcp",
"args": ["--root", "."]
}
}
}The Agent Skill at
skills/papercanvas/SKILL.md (bundled inside
the wheel at papercanvas/skills/SKILL.md) teaches agents the full
workflow. Verification scope: all tool behavior is covered by real-protocol
tests (tests/test_mcp_e2e.py,
tests/test_mcp_stdio.py); the third-party client
UIs themselves were not exercised in this project's environment.
Install as a DSH plugin
PaperCanvas is also a DeepSeek Harness plugin — the seven tools surface directly inside DSH sessions:
dsh plugin --profile <profile> add github:HarryHeYu/figcraftThe plugin is a thin adapter over the papercanvas CLI (which must be
installed — from this repository until the PyPI publication). Verified
channels, same discipline as dsh-sessionflow:
DSH | install resolves | DSH loads it | tool call answered |
| ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ |
Cold-start CI: cold-start-figcraft — 5 matrix rows (install path × DSH channel), each proving install → bundle → prepare → profile layer → a real bridge call into the engine.
The Figure IR in one minute
Copy-paste this into quickstart.json — it validates and renders as-is:
{
"schema_version": "0.1",
"id": "method_pipeline",
"revision": 1,
"canvas": {"width": 100, "height": 40, "unit": "mm", "margin": 4},
"theme": {"font_family": "Arial", "font_size_pt": 8, "palette": {}},
"nodes": [
{
"id": "input",
"type": "rounded_rect",
"label": "Input Video",
"x": 8, "y": 13, "w": 34, "h": 14,
"style": {"fill": "#E8F0FE", "stroke": "#4275C4"}
},
{
"id": "encoder",
"type": "rounded_rect",
"label": "Video Encoder",
"x": 58, "y": 13, "w": 34, "h": 14,
"style": {"fill": "#E5F4EC", "stroke": "#418968"}
}
],
"edges": [
{
"id": "e1",
"source": "input",
"target": "encoder",
"source_port": "right",
"target_port": "left",
"style": {"stroke": "#444444", "arrow": "end"}
}
],
"groups": []
}uv run papercanvas validate quickstart.json # -> valid
uv run papercanvas render quickstart.json # -> quickstart.svgCapabilities & limitations
Figure IR v0.1 supports boxes (rect / rounded_rect), port-annotated
edges with orthogonal routing, groups, palette-driven styling, auto-sizing,
layered/linear layouts, and FC001–FC008 lint. CJK labels are measured and
rendered with a system CJK font when one exists (FC007 reports the
substitution). The full IR reference is in
docs/figure-ir.md.
Naming (final decision)
Surface | Name |
GitHub repository |
|
PyPI package |
|
CLI |
|
MCP server & tool prefix |
|
Python import |
|
Documentation
Changelog · milestone history in PROJECT-PLAN.md
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. Security reports: SECURITY.md.
Roadmap
v0.2: obstacle-aware routing everywhere, broader CJK font fallback, two-column paper presets, visual regression baselines
later: additional figure types, web canvas exploration
License
Available Tools
8 toolspapercanvas_createC
Create a new figure IR file. Returns the path and initial revision.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| width | No | ||
| height | No | ||
| margin | No | ||
| figure_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return shape ('path and initial revision'), but says nothing about overwrite behavior for an existing file, whether the file is written to disk immediately, permission requirements, or the units used for sizing fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the return value — no filler. It is efficient, though the brevity comes at the cost of substance rather than being genuinely tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, and the description covers only the headline result. For a file-creating mutation tool with five undocumented parameters, missing overwrite semantics and sizing units leave the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does not: none of the five parameters (path, figure_id, width, height, margin) are explained. Only a weak implied link between 'figure IR file' and the required path/figure_id fields, and the numeric defaults (182/58/4) are left uninterpreted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new figure IR file') and adds a return-value note. The action is clearly distinct from siblings like papercanvas_get, papercanvas_patch, papercanvas_layout, or papercanvas_render, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus papercanvas_patch or papercanvas_get, and no prerequisites stated. An agent cannot tell from the description what happens if the path already exists or which figure state is required before creating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_doctorB
Aggregated quality diagnosis: hard validation, FC001-FC008 lint, font coverage/substitution, renderability per format. Returns findings classified as blocking / advisory / environment, with suggested patches for fixable issues. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does useful work by stating 'read-only' and by explaining the output taxonomy (blocking / advisory / environment) and that suggested patches are proposed rather than applied. It does not say how expensive the multi-check sweep is, whether it renders all formats or just checks renderability, or how findings are ordered or capped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler: the first enumerates the checks, the second defines the output contract and the read-only guarantee. The scope statement is front-loaded and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe returns, and it does explain the three finding classes and the presence of suggested patches. What it omits is the meaning of the 'path' input and the granularity/pagination of findings. Overall a solid but not airtight fit for a single-input diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% — the single required parameter is documented only as an untyped-in-practice string titled 'Path'. The description never clarifies what that path points to (a canvas file, a project directory, a document ID) or what forms are accepted. With a 1-param schema that tells the agent nothing, the description needed to compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb-and-resource ('aggregated quality diagnosis') and enumerates the checks it bundles: hard validation, FC001-FC008 lint, font coverage/substitution, renderability. That distinguishes it from the narrower siblings papercanvas_lint and papercanvas_inspect. It loses a point because the object being diagnosed (the 'path') is never identified as a canvas file, document, or directory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Aggregated' implies this is the one-shot umbrella call rather than calling lint/inspect/render separately, and 'read-only' signals it is safe to run. But there is no explicit when-to-use guidance, no statement that it should be preferred over the individual sibling tools, and no mention of prerequisites or cost before running the whole sweep.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_getA
Read the full figure IR (nodes, edges, groups, theme, canvas) plus hard_errors — the list of structural problems that block render/patch. Call this before patching.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the returned payload and the meaning of hard_errors (structural problems that block render/patch), which also implies a pure read. It omits failure behavior for a bad path and says nothing about cost or whether the read is idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the payload description first and the workflow instruction second. Every clause earns its place, with no redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema and no annotations, the description provides the return shape and the key semantic of hard_errors, which is the important missing piece. The unexplained path parameter is the only substantial omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter 'path', and the description never mentions it. The agent cannot tell from either source whether path is a file path, a figure identifier, or a directory, which is a real gap for the only required input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (full figure IR) and enumerates what the IR contains: nodes, edges, groups, theme, canvas. That is far more informative than a name restatement, though it does not explicitly distinguish itself from siblings like papercanvas_inspect or papercanvas_lint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this before patching" gives a clear sequencing constraint that tells the agent when this tool belongs in a workflow. It stops short of naming when not to use it or how it differs from papercanvas_inspect/lint, so no exclusions or alternatives are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_inspectA
Inventory of all objects (ids, kinds, labels), or full detail for one object_id (geometry, style, connected edges, groups). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| object_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does declare 'Read-only' plus the shape of what each mode returns (ids, kinds, labels vs geometry, style, edges, groups). It omits behavior for a nonexistent object_id, large-canvas pagination/truncation, and any permission requirements, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the primary behavior, using compact parentheticals to enumerate returned fields. Nothing is wasted and the mode split is placed before the read-only note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does describe both return shapes reasonably well, so the return-value burden is mostly met. The unexplained required path parameter and the absent guidance versus papercanvas_get and the mutating siblings are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it only half does. object_id is given real semantics as a mode switch to full detail, but the required 'path' parameter is never explained at all — presumably a canvas file path, but the agent must guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete dual purpose: an inventory of all objects with ids/kinds/labels, or full detail for a single object_id including geometry, style, edges and groups. The verb+resource pairing is specific and an agent can tell what it returns. It falls short of 5 because it never contrasts itself with the sibling papercanvas_get, which by name appears to overlap heavily.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two modes are clearly inferred from whether object_id is supplied, which is genuine usage guidance. However there is no explicit statement of when to choose this tool over papercanvas_get, nor any prerequisite or exclusion. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_layoutA
Arrange nodes (preset: linear-h | linear-v | layered) and commit the coordinates to the IR; revision increments by 1. Cycles are hard errors.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| preset | No | linear-h |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations the description carries the full burden and delivers real behavioral facts: coordinates are committed to the IR, the revision increments by exactly 1, and cycles are hard errors. Gaps remain around whether existing positions are overwritten, permissions required, and what a revision conflict looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that packs the action, the preset options, the mutation semantics and the error condition with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated mutation tool with no output schema, the description covers effects and failure modes reasonably but omits the required `path` argument and says nothing about what comes back (updated IR, new revision value). Complete enough to attempt a call, not complete enough to call confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema defines no enum for `preset`, so the description's enumeration of linear-h | linear-v | layered is genuinely load-bearing information the schema lacks. However the required `path` parameter is never mentioned, leaving half the surface undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Arrange nodes') and the effect ('commit the coordinates to the IR'), which separates it from read-only siblings like papercanvas_inspect and papercanvas_get. It stops short of explicitly distinguishing it from papercanvas_patch, which could plausibly also write coordinates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance, and no alternative is named despite patch/render being adjacent operations. The preset list hints at scenarios but the agent must infer that layout is the right tool after nodes are created or edited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_lintA
Run quality checks FC001-FC008 (canvas bounds, structure, text overflow, overlap, font size, arrows through nodes, font substitution, raster images). Returns findings with rule_id/severity/object_id; severity 'error' means fix before delivering. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| min_font_size_pt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key traits: it is read-only, it returns findings with rule_id/severity/object_id, and 'error' severity is blocking. It omits whether checks are configurable beyond font size or how findings are ordered/limited, keeping it from 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and rule list, then result shape, then severity semantics and safety flag. Nothing is padded and every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only validator with no output schema and no annotations, the description covers the rule set, return fields, severity interpretation, and safety profile well. The only meaningful gap is parameter explanation, which matters given 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the two parameters, but it never mentions `path` or `min_font_size_pt` explicitly. The font-size threshold can only be weakly inferred from the 'font size' rule name, leaving both parameters effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('run quality checks') and resource (canvas), and enumerates the eight checks so the agent knows exactly what is validated. It does not differentiate from sibling papercanvas_inspect, which likely overlaps in the 'structure' area, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage through 'severity 'error' means fix before delivering', which tells the agent what to do with results but not when to call lint versus inspect/render. No explicit when-to-use or prerequisite guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_patchA
Apply a batch of semantic operations in ONE all-or-nothing transaction: add_node, remove_node (+remove_edges:true), update_node, set_style, add_edge, remove_edge, add_group, update_label, move_node. On success the revision increments by 1; on failure nothing changes. Pass expected_revision for optimistic concurrency.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| operations | Yes | ||
| expected_revision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does substantial work: atomicity, revision increment on success, no-op on failure, and the remove_edges:true side effect of remove_node. Missing are error shapes, permission requirements, and rate/size limits on the batch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the atomic-batch guarantee, then operation types, then transactional semantics. No filler, and the most decision-relevant facts come first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and a free-form operations array, the description is strong on transactional semantics but leaves the agent unable to construct an operation payload or understand what 'path' refers to. It is not sufficient on its own to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three parameters. The description rescues expected_revision with a clear concurrency rationale, but 'path' is never explained and the operations array is documented only by operation names — the shape of each operation object (fields for add_node, add_edge, etc.) remains undefined anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Apply a batch of semantic operations') and an explicit scope: a single all-or-nothing transaction. The enumeration of nine operation types makes the tool's capability concrete. It never names or contrasts with siblings such as papercanvas_create or papercanvas_layout, so an agent must infer why it would patch instead of create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pass expected_revision for optimistic concurrency' is a real usage hint for one parameter, and 'on failure nothing changes' implies retry safety. However, there is no guidance on when to choose this over papercanvas_create or papercanvas_layout, nor any stated prerequisites. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
papercanvas_renderA
Render the figure to svg / pdf / pptx (a list, e.g. ['svg','pdf','pptx']). Output files are written next to the IR and are true vector + editable. Strictly read-only on the IR.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| formats | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It helpfully discloses that the operation is strictly read-only on the IR, that output files are written next to the IR, and that outputs are true vector and editable. It does not say whether existing files are overwritten, what permissions are needed, or how errors are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the action and formats. Every clause adds information: the format list, the output location, the vector/editability guarantee, and the read-only constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter render tool with no output schema and no annotations, the description covers the core action, output location, and read-only nature. It is incomplete on the meaning of the required path parameter, overwrite behavior, and what is returned or reported to the caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It clarifies the formats parameter with a concrete list example, but the required path parameter is never explained beyond the indirect hint that outputs are written next to the IR.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: render the figure to svg/pdf/pptx. It is distinguishable from siblings like papercanvas_create or papercanvas_patch, but it does not explicitly contrast itself with them or clarify that those siblings manipulate the IR rather than export it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this when you need output files in svg, pdf, or pptx. However, there is no explicit when-to-use versus when-not-to-use guidance, no mention of prerequisites, and no routing to alternatives among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Added
papercanvas_doctor
7 tool updates
v0.1.0- First observed
papercanvas_create - First observed
papercanvas_get - First observed
papercanvas_inspect - First observed
papercanvas_layout - First observed
papercanvas_lint - First observed
papercanvas_patch - First observed
papercanvas_render
TDQS
Scored across 8 tools
Most tools have clearly distinct roles: create/get/patch mutate or read the IR, inspect inventories objects, layout arranges nodes, render exports files. The main ambiguity is between doctor and lint, since doctor aggregates lint results along with validation and renderability, and between get and inspect for read operations. Descriptions help, but an agent may still hesitate over doctor vs lint in particular.
All tools use the same papercanvas_ prefix and snake_case convention. The action words are predictable and readable, and there is no mixing of camelCase or unrelated naming styles.
Eight tools is a well-scoped set for a figure IR editor, covering creation, inspection, mutation, layout, quality checks, and rendering. Each tool earns its place without excessive surface area.
The surface covers the core lifecycle: create, read, inspect, patch, layout, lint/diagnose, and render. A dedicated delete/remove-file operation is missing, and theme-level editing is only indirectly covered, but these are minor gaps that agents can work around.
Maintenance
Related MCP Connectors
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
Immutable agent diagrams: create, edit, validate and render versioned diagrams over MCP.
Create and manage Mermaid.js flowcharts and diagrams with AI agents via MCP.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to control Inkscape for vector graphics editing via MCP tools.92MIT

gitcadofficial
AlicenseNot gradedqualityCmaintenanceEnables agents to create and manipulate 3D CAD models using natural language via MCP, with git-based versioning and manufacturing output generation.1Apache 2.0- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create, inspect, validate, and export SVG designs using Inkscape CLI through MCP tools.1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to create, inspect, edit, render, and export SVG/Inkscape documents through typed drawing tools, with a deterministic offline backend and an optional bridge to a locally running Inkscape instance for limited live editing and snapshots.5BSD 3-Clause