Skip to main content
Glama
HarryHeYu

papercanvas-mcp

by HarryHeYu

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.

CI Python License Code style: ruff

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

basic_pipeline

Linear ML pipeline

SVG · PDF · PPTX

video_unlearning

Video unlearning framework

SVG · PDF · PPTX

multi_branch

Multi-branch architecture with grouped heads

SVG · PDF · PPTX

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 all

Windows 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.json

CLI

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 command

Every 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/project

Seven 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.json in the project)

  • Codex CLI: add to ~/.codex/config.toml: [mcp_servers.papercanvas] with command = "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/figcraft

The 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

0.1.5-rc.3

✅

✅

✅

0.2.0-rc.2 (next)

✅

✅

✅

0.2.1-rc.5 (next)

✅

✅

✅

0.2.2-alpha.2 (alpha)

✅

✅

✅

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.svg

Capabilities & 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

HarryHeYu/figcraft ("FigCraft" is the historical codename)

PyPI package

pip install papercanvas (verified available)

CLI

papercanvas

MCP server & tool prefix

papercanvas-mcp, papercanvas_*

Python import

papercanvas

Documentation

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

MIT

Available Tools

8 tools
papercanvas_createC

Create a new figure IR file. Returns the path and initial revision.

NameRequiredDescriptionDefault
pathYes
widthNo
heightNo
marginNo
figure_idYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
pathYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
pathYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
pathYes
object_idNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
pathYes
presetNolinear-h

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
pathYes
min_font_size_ptNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
pathYes
operationsYes
expected_revisionNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
pathYes
formatsNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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. 1 tool update
    • Addedpapercanvas_doctor
  2. 7 tool updatesv0.1.0
    • First observedpapercanvas_create
    • First observedpapercanvas_get
    • First observedpapercanvas_inspect
    • First observedpapercanvas_layout
    • First observedpapercanvas_lint
    • First observedpapercanvas_patch
    • First observedpapercanvas_render

TDQS

A3.6/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to create and manipulate 3D CAD models using natural language via MCP, with git-based versioning and manufacturing output generation.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to create, inspect, validate, and export SVG designs using Inkscape CLI through MCP tools.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    5
    BSD 3-Clause