graphite-art-mcp
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., "@graphite-art-mcpcreate a new document, insert this SVG, and export a PNG"
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.
graphite-art-mcp
An unofficial MCP connector for the Graphite graphics editor.
It allows Claude Desktop, Claude Code, and other Model Context Protocol clients to create artwork inside a running Graphite editor. The AI client writes SVG, the connector passes it to Graphite, and Graphite converts it into standard vector layers that remain fully editable. Every command is delivered as a regular editor message rather than simulated input, so undo, selection and the Layers panel behave exactly as they would for manual edits.
This project is not affiliated with or endorsed by the Graphite project or the Graphite Foundation. Graphite is an independent open source project (MIT / Apache-2.0). This connector is MIT licensed. It is unrelated to the Graphite code review tool at graphite.com and to the
graphite-mcppackage on PyPI.
Installation
Claude Desktop: one file
Download graphite-art-mcp-<version>.mcpb from the latest release
and open it. Claude Desktop installs the extension, shows its settings (export folder, whether to open Graphite
automatically, an optional fonts folder), and runs it with its own Node runtime. Nothing else is required.
Any MCP client: one line
The only prerequisite is Node.js 20 or newer.
Claude Desktop, if you prefer the config file (Settings, Developer, Edit Config):
{
"mcpServers": {
"graphite": {
"command": "npx",
"args": ["-y", "graphite-art-mcp"]
}
}
}Claude Code:
claude mcp add graphite -- npx -y graphite-art-mcpOn first use, the connector downloads a pre-built copy of Graphite into the user cache directory (a one-time download
of a few megabytes), serves it at http://127.0.0.1:47833, and opens it in the default browser. The page connects
automatically. The session token is included in the URL and stored by the browser tab, so subsequent restarts
reconnect without any manual steps.
To open the tab manually instead, set GRAPHITE_MCP_OPEN_BROWSER=0. The graphite_get_capabilities tool reports the
URL as web_url.
If something does not connect, run npx graphite-art-mcp doctor. It checks the Node version, both ports, the token,
the web app download, the export directory and the fonts, and prints what to fix.
Exported files are written to ~/graphite-mcp-exports unless GRAPHITE_MCP_EXPORT_DIR is set. All settings are
listed under Configuration.
The pre-built copy is Graphite at the commit listed below, with the bridge patch from graphite-patch/ applied. It is
compiled from the upstream sources by this repository's Release workflow. The download can be verified with
GRAPHITE_MCP_BUNDLE_SHA256; the hash is published alongside each release asset.
Related MCP server: inkscape-mcp
Tools
Version 0.2.0 provides thirteen tools for creating and editing layers, inspecting the document, and exporting.
Tool | Description |
| Reports whether a Graphite tab is connected, the Graphite commit, the available commands, and the URL of the served web app. |
| Creates a new document and makes it the active tab. Returns |
| Inserts SVG, either inline or from a file via |
| Renders the active document to SVG, PNG, JPG, WebP, TIFF, BMP, TGA or ICO and writes the file to disk. |
| Returns the active document's layers (id, name, kind, visibility, parent) and the open documents. Use it to confirm an insert before retrying. |
| Renders the active document to a small PNG and returns it as an image, so the AI client can check the result without writing a file. |
| Sets the fill colour, stroke colour and width, or opacity of an existing layer. |
| Moves, scales or rotates an existing layer, or applies a raw affine matrix, in its parent's coordinate space. |
| Renames a layer in the Layers panel. |
| Deletes a layer and its contents. |
| Step through the document's history. |
| Makes another open document active; |
Supported Graphite version: upstream master at commit ae321b3409113b238f1482a5ad71cbfff6929602 (27 September
2026) with the patch in graphite-patch/. Graphite changes frequently. Section 10 of
docs/graphite-internals.md lists what to verify when building against a newer commit.
Architecture
Claude / any MCP client
| MCP over stdio
v
graphite-art-mcp (Node, this repository) listens on ws://127.0.0.1:47832
^ JSON request/response, session token
|
Graphite tab -> frontend/src/automation-bridge.ts (connects to the socket)
| automationInsertSvg(...) and related wrapper calls, via wasm-bindgen
v
frontend/wrapper/src/editor_commands.rs -> standard editor messages
v
Graphite editor (Rust/WASM) -> GraphOperationMessage::NewSvg, PortfolioMessage::SubmitDocumentExport, ...Design decisions:
The browser tab opens the connection to the connector, since a web page cannot accept incoming sockets. The first frame must carry the session token or the socket is closed. Only localhost origins are accepted.
Both sides implement a fixed list of commands. There is intentionally no tool for sending arbitrary editor messages.
Exports do not trigger browser downloads. The bridge captures the bytes Graphite produces and the connector writes the file, restricted to approved directories.
Developer setup
This section applies only when working on the bridge patch or running Graphite from a local checkout.
git clone https://github.com/ACoci86/graphite-art-mcp.git
cd graphite-art-mcp
npm install
npm run buildPatch and run Graphite:
git clone https://github.com/GraphiteEditor/Graphite.git
cd Graphite
git checkout ae321b3409113b238f1482a5ad71cbfff6929602 # tested commit; newer commits may also work
git apply /path/to/graphite-art-mcp/graphite-patch/automation-bridge.patch
cargo run # builds the wasm wrapper and starts the development serverIf the patch does not apply cleanly to a newer Graphite, graphite-patch/README.md describes the four affected files
so the changes can be applied manually.
Configure the connector to use the local Graphite instead of serving its own copy, and set a fixed token:
{
"mcpServers": {
"graphite": {
"command": "node",
"args": ["/absolute/path/to/graphite-art-mcp/dist/index.js"],
"env": { "GRAPHITE_MCP_SERVE": "0", "GRAPHITE_MCP_TOKEN": "choose-a-long-random-string" }
}
}
}Open the URL printed by Graphite (usually http://localhost:8080) once with the token appended:
http://localhost:8080/?automation=choose-a-long-random-stringThe bridge stores the token in localStorage, removes it from the URL, and connects. The browser console shows
[automation-bridge] connected to ws://127.0.0.1:47832.
Alternatively, build the web app with cargo run build web and set
GRAPHITE_MCP_WEB_DIR=/path/to/Graphite/frontend/dist. The connector then serves that build instead of the release
bundle.
Configuration
All settings are environment variables.
Variable | Default | Description |
| generated once, then cached | Session token the tab must present. If unset, a token is generated on the first run and saved in the cache directory so it remains stable across restarts. |
|
| WebSocket port. |
|
| Bind address. Binding to other interfaces exposes the editor to the network. |
|
| Destination for exports when no path is given. |
| (empty) | Additional directories exports may be written to, separated by |
| any localhost origin | Comma-separated browser origins allowed to connect. |
|
| Timeout for simple commands and the minimum wait for |
|
| Export timeout. The first raster render of a large document is the slowest. |
|
| Additional wait per SVG element on insert. Graphite creates one layer per element, so a 500-element file is allowed about 30 seconds. |
|
| After an insert wait expires, how long the connector keeps polling |
|
| Serve the pre-built Graphite web app locally. Set to |
|
| Port of the local web server. |
| (download) | Serve this |
| GitHub release asset for this version | Download location of the pre-built app. |
| (not verified) | Hex SHA-256 the download must match. |
|
| Location of bundles and the generated token. |
|
| Open the served app in the default browser when no tab connects within 3 seconds of start. |
| (bundled fonts only) | Directories with |
Errors
Every failure is returned as an MCP isError result whose text is JSON: { "code": "...", "message": "...", "details"?: ... }.
The codes are GRAPHITE_NOT_CONNECTED, GRAPHITE_CRASHED, NO_ACTIVE_DOCUMENT, LAYER_NOT_FOUND,
LAYER_NOT_CREATED, INVALID_SVG, INVALID_PARAMS, EXPORT_FAILED, EXPORT_PATH_NOT_ALLOWED, UNSUPPORTED_FORMAT,
UNKNOWN_COMMAND, BRIDGE_TIMEOUT, GRAPHITE_VERSION_UNSUPPORTED and UNEXPECTED.
Exported files are also available as MCP resources named graphite-export://<file>, so a client can list and read
them without a filesystem path.
BRIDGE_TIMEOUT from graphite_insert_svg deserves attention. It means Graphite had not confirmed the new layer
within the allowed time; it does not mean the insert failed. The layer usually appears shortly afterwards. Call
graphite_get_document and look for the layer_id given in the error before inserting again. Repeating the insert
without checking creates a duplicate.
Working with large or detailed artwork
Graphite's SVG importer cannot render
<text>in the web build, so the connector converts text to outlined paths before inserting. It ships Liberation Sans, Serif and Mono (regular and bold, SIL Open Font License) and maps common names such as Arial, Helvetica, Times and Courier onto them; italic is synthesised with a skew. For a specific typeface, place.ttfor.otffiles in the directory named byGRAPHITE_MCP_FONT_DIR. Supported:x,y,dx,dy,tspan,font-size(px, pt, em),font-family,font-weight,font-style,letter-spacingandtext-anchor, as attributes or instyle. Passoutline_text: falseto insert the raw text instead.Each SVG element becomes a layer, at roughly 30 to 40 ms per element, so large drawings take time to insert. Save them to a file and pass
svg_pathrather than sending large markup inline on every call.<defs>,<use>,<symbol>and gradients are handled by Graphite's importer and need no preparation.Preview the SVG locally before inserting it. Rendering with Inkscape, rsvg or a browser costs nothing, whereas each Graphite round trip takes seconds. After inserting,
graphite_previewreturns the rendered canvas as an image so the result can be checked directly.Three-dimensional objects such as boxes and trays look correct only when built as real 3D geometry, projected once, and drawn back to front. Shapes positioned by eye rarely look right. Consulting a few reference images first reduces the number of iterations considerably.
Development
npm run typecheck
npm test # protocol, socket client, MCP tools in memory, the bridge under jsdom, the web server and the bundle installer
npm run inspect # MCP Inspector against the built serverThe unit tests do not require a Graphite build. The end-to-end test does:
npm run e2e -- --web-dir /path/to/Graphite/frontend/distIt starts the built connector serving that bundle, opens it in headless Chromium, and drives every tool through a real MCP client. The Release workflow runs it against the bundle it just built before publishing.
Releasing
Set
CONNECTOR_VERSIONinsrc/version.tsandversioninpackage.jsonto the same value.Push a tag
vX.Y.Z.
The Release workflow checks out Graphite at the pinned commit, applies the patch, builds the web app, attaches
graphite-web.tar.gz and its SHA-256 to the GitHub release together with the .mcpb extension, and publishes the
package to npm when an NPM_TOKEN repository secret is configured. The connector downloads the asset matching its own version on first run.
To move to a newer Graphite commit, update GRAPHITE_COMMIT in .github/workflows/release.yml, re-apply and re-test
the patch, and publish a release.
npm run extension builds the Claude Desktop extension into build/. The manifest is generated from package.json
and the server's own tool list, so it cannot drift from the code.
For a manual end-to-end check with a connected Graphite, ask the client:
Create a new Graphite document named "MCP Test". Insert a centered blue five-point star. Export it as SVG.
The document should appear, the star should be present as editable layers, and the export should be written to the export directory.
Known limitations
Undo of a delete restores the layer but Graphite logs "Could not get nested network_metadata" errors in the browser console while doing so; they are harmless.
Documents have no artboard unless the SVG workflow adds one.
graphite_add_artboardis planned.Text becomes outlined paths, not editable text layers. Native text layers are planned.
Export always renders all artwork, not a selection or a single artboard.
One connected tab at a time. A reloaded tab replaces the previous connection.
Style changes cover solid fills and strokes only; gradients and blend modes are not exposed yet.
Transforms are applied in the parent's coordinate space; the connector does not know a layer's bounding box, so rotation and scaling need an explicit
originto pivot around a point other than the parent's origin.
License
MIT, see LICENSE. Graphite itself is MIT / Apache-2.0 and is not redistributed in this repository. The
patch under graphite-patch/ is offered under the same dual license so that it can be upstreamed.
Available Tools
13 toolsgraphite_delete_layerGraphite: delete a layerADestructive
Delete a layer and everything inside it. Reversible with graphite_undo. Fails with LAYER_NOT_FOUND if the id is not in the active document.
| Name | Required | Description | Default |
|---|---|---|---|
| layer_id | Yes | layer_id as returned by graphite_insert_svg or listed by graphite_get_document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| layer_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already flag destructiveHint=true, but the description adds crucial behavior beyond them: the cascade deletion of all contained elements, a recovery path via graphite_undo, and the specific LAYER_NOT_FOUND error for invalid ids. These details materially inform the agent about the operation's impact and failure modes.
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 short sentences, front-loaded with the core action and scope, followed by reversibility and error behavior. Every sentence earns its place with no redundancy.
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?
Given the destructive nature, single required parameter, rich annotations, and the presence of an output schema, the description covers the essential gaps: deletion scope, recovery mechanism, and failure condition. No critical information is missing for correct invocation.
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 100%, and the schema already explains that layer_id comes from graphite_insert_svg or graphite_get_document. The description only adds the error condition that the id must be in the active document, which is useful but minimal beyond the schema baseline.
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 precise verb-resource pair ('Delete a layer') and extends it with the critical scope 'and everything inside it,' which is not obvious from the name alone. It clearly distinguishes this destructive operation from sibling mutation tools like graphite_transform_layer or graphite_rename_layer.
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?
It gives clear contextual guidance: deletion is reversible via graphite_undo, and it fails with LAYER_NOT_FOUND when the id is not in the active document. This tells the agent when the operation succeeds or fails, but does not explicitly state when to choose this tool over alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_exportGraphite: export the active documentADestructiveIdempotent
Render the active Graphite document (all artwork) to a file and write it to disk. Returns the absolute path. Use svg for editable/scalable output and png for a bitmap; png with scale 0.25–0.5 is a cheap way to check what Graphite actually rendered. Fails with EXPORT_FAILED if the document has no layers, BRIDGE_TIMEOUT if rendering did not finish within GRAPHITE_MCP_EXPORT_TIMEOUT_MS (the first raster render of a large document can be slow: simply retry, or raise the limit), and EXPORT_PATH_NOT_ALLOWED if path escapes the approved export directories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Where to write the file. A bare file name goes into the connector's export directory; an absolute path must lie inside one of the approved export roots. The extension is fixed to match format. Omit to use the document name. | |
| scale | No | Raster scale factor (2 = 2× resolution; 0.25–0.5 gives a quick preview). Ignored for svg. | |
| format | No | Output format. svg keeps vectors; the raster formats are rendered at the document's pixel size times scale. | svg |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | Absolute path of the written file. |
| bytes | Yes | |
| format | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by enumerating three concrete failure modes (EXPORT_FAILED, BRIDGE_TIMEOUT with the env var and 'just retry' advice, EXPORT_PATH_NOT_ALLOWED) and the path-sandbox constraint. The destructiveHint=true annotation is consistent with a tool that writes/overwrites files.
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?
Front-loads the core action and return value, then layers guidance and failures compactly. Every sentence carries actionable information with no filler.
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?
An output schema exists, so return details are covered; the description still names the returned path. Combined with error codes, timeout behavior, and path restrictions, an agent has everything needed to invoke it 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 coverage is already 100%, but the description still adds practical meaning: svg vs raster trade-offs and the 0.25–0.5 cheap-preview tip for scale. It doesn't restate the path rules beyond what the schema says, so it is additive without redundancy.
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+resource ('render the active Graphite document to a file and write it to disk') plus the return value (absolute path). The emphasis on writing to disk implicitly distinguishes it from sibling graphite_preview, so an agent can tell what this tool produces.
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?
Gives clear format-selection guidance ('svg for editable/scalable output', 'png for a bitmap') and a cheap verification workflow via png at scale 0.25–0.5. It never explicitly names graphite_preview as the alternative for on-screen inspection, so the when-to-use-this-vs-sibling routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_get_capabilitiesGraphite: connection status and capabilitiesARead-onlyIdempotent
Report whether a Graphite editor tab is connected to this connector, which Graphite commit it runs, and which commands are available. Call this first if another graphite_* tool returned GRAPHITE_NOT_CONNECTED. Read-only; never changes the document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tools | Yes | |
| web_url | Yes | URL of the Graphite web app served by this connector (token included); open it in a browser to connect a tab. Null when the connector is not serving one. |
| endpoint | Yes | |
| connected | Yes | |
| bridge_version | Yes | |
| bridge_commands | Yes | |
| graphite_commit | Yes | |
| protocol_version | Yes | |
| connector_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, and the description reinforces this with 'Read-only; never changes the document.' It usefully discloses what the report contains (connection state, commit, available commands), though it adds little beyond what the annotations and output schema already guarantee.
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 sentences, front-loaded with purpose and followed by the recovery instruction. Every clause carries actionable information with no filler.
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?
The output schema covers return values, annotations cover the safety profile, and the description supplies the diagnostic trigger and scope. Nothing needed to invoke this zero-arg tool correctly is missing.
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?
The tool takes zero parameters, so the baseline is 4; there is no argument syntax an agent needs to interpret. The description correctly avoids inventing parameter details for a call that accepts none.
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 set: it reports tab connectivity, the running Graphite commit, and available commands. This diagnostic role is clearly distinguishable from sibling mutation tools like graphite_insert_svg or graphite_transform_layer.
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?
It gives an explicit invocation trigger: 'Call this first if another graphite_* tool returned GRAPHITE_NOT_CONNECTED.' This is a precise when-to-use rule tied to a named error condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_get_documentGraphite: inspect the active documentARead-onlyIdempotent
Return the active document's id and name, all its layers (id, name, kind, visibility, parent) and the list of open documents. Read-only. Use it to verify that a graphite_insert_svg reported as BRIDGE_TIMEOUT did or did not land (look for the layer_id in layer_ids) before deciding to retry, and to confirm a document is not empty before exporting. Fails with NO_ACTIVE_DOCUMENT when nothing is open.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Tab name of the active document, when known. |
| layers | Yes | Per-layer details: display name, node kind, visibility and parent (null = document root). |
| layer_ids | Yes | Every layer id in the active document (decimal strings), nested groups included. |
| document_id | Yes | Graphite DocumentId of the active document, as a decimal string. |
| layer_count | Yes | |
| open_documents | Yes | All open documents; switch with graphite_select_document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description still adds real behavioral context beyond that: the NO_ACTIVE_DOCUMENT failure mode and the fact that the response carries only identity/layer metadata, not content. It stops short of noting any rate limits or latency expectations, but for a read-only query that is minor.
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 sentences, both front-loaded: the return payload first, then the decision-relevant usage. No filler, and the error code is placed at the end where it belongs.
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?
Complete for a zero-parameter read tool. An output schema exists, yet the description still names the key fields an agent needs for its stated verification workflow (layer_id in layer_ids), and the documented NO_ACTIVE_DOCUMENT branch covers the main failure path.
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?
Zero parameters, so the baseline is 4. There is nothing to mis-specify, and the description correctly implies no arguments are needed by framing the tool entirely around ambient state ('the active document').
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 ('Return the active document's id and name, all its layers... and the list of open documents') and enumerates the shape of what comes back. Distinguishable from siblings like graphite_select_document or graphite_get_capabilities.
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?
Gives two explicit when-to-use scenarios tied to sibling tools: verifying whether a graphite_insert_svg that returned BRIDGE_TIMEOUT actually landed (by checking layer_id in layer_ids), and confirming a document is not empty before exporting. The condition that selects this verification path is spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_insert_svgGraphite: insert SVG as editable artworkA
Insert SVG markup into the active Graphite document as an editable group layer (each SVG element becomes its own vector layer; the user can keep editing it by hand). This is the main way to create artwork: generate the SVG yourself, then call this with either svg (inline markup) or svg_path (a local file; preferred for anything large). Returns the new layer_id. The operation is one undo step. is converted to outlined paths automatically (Graphite cannot render text from SVG); pass outline_text=false to skip that. Large artwork is slow to build (roughly 40 ms per element); the wait scales with the element count. Fails with NO_ACTIVE_DOCUMENT if no document is open (call graphite_new_document first), INVALID_SVG if the markup does not parse, and BRIDGE_TIMEOUT if Graphite has not reported the layer in time even after a grace period — in that case call graphite_get_document and look for the returned layer_id before retrying, because the layer may still appear and a retry would duplicate it.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Horizontal position in document units (pixels). With center=false this is the left edge of the SVG viewBox. | |
| y | No | Vertical position in document units; y grows downward. With center=false this is the top edge of the SVG viewBox. | |
| svg | No | Complete SVG markup starting with <svg …>. Give it a viewBox and explicit width/height; gradients, groups, paths, basic shapes and text are supported (<text> is converted to outlined paths by the connector, see outline_text). Provide either svg or svg_path. | |
| name | No | Optional layer name shown in the Layers panel. | |
| center | No | When true, (x, y) becomes the visual centre of the artwork instead of its top-left corner. | |
| svg_path | No | Absolute path of a local SVG file to insert instead of inline markup. Prefer this for large artwork (hundreds of elements): the file is read by the connector, so the markup is not re-sent on every call. | |
| parent_id | No | Optional layer_id of a group or artboard to insert into. Omit to insert at the document root. | |
| outline_text | No | Convert <text> elements to outlined paths before inserting (default). Graphite's web build cannot render text itself. Uses the bundled Liberation Sans/Serif/Mono faces, or fonts from GRAPHITE_MCP_FONT_DIR matched by family name; italic is synthesised. |
Output Schema
| Name | Required | Description |
|---|---|---|
| elements | Yes | Number of SVG elements sent; each becomes a layer. |
| layer_id | Yes | Node id of the new group layer, as a decimal string. Refer to it in later edits. |
| document_id | Yes | Active document the layer was inserted into, when known. |
| text_outlined | Yes | Number of <text> elements converted to paths before inserting. |
| confirmed_late | Yes | True when the bridge's wait expired but graphite_get_document then showed the layer, so nothing needs to be retried. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the safety flags; the description adds substantial non-obvious behavior: one undo step, ~40 ms per element build cost, automatic <text> outlining (and the outline_text=false escape hatch), and three named failure modes with remediation. The duplicate-layer warning on retry is a real behavioral hazard disclosed only here.
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?
Front-loaded with the core action, then usage, then errors; nearly every sentence carries new information. It is on the long side and a few clauses (e.g. re-explaining that <text> becomes paths) overlap with the schema, costing a point but not readability.
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 8-parameter mutation tool with an output schema, the description covers what the schema cannot: cost model, undo semantics, error taxonomy and retry safety. Nothing an agent needs to call this correctly is missing.
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 already 100%, but the description still adds decision-relevant meaning: which of svg/svg_path to prefer and why (file read by connector, markup not re-sent), and why outline_text defaults to true (Graphite cannot render text). These are trade-offs, not restatements.
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 precise verb+resource+outcome: inserting SVG markup as an editable group layer where each SVG element becomes its own vector layer. It also positions itself among siblings by calling itself 'the main way to create artwork', so an agent can distinguish it from graphite_export or graphite_new_document.
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?
Gives explicit selection guidance between the two input modes ('svg_path ... preferred for anything large'), tells the agent to generate the SVG itself first, and names the prerequisite (graphite_new_document) when NO_ACTIVE_DOCUMENT fires. The BRIDGE_TIMEOUT recovery path — check graphite_get_document before retrying to avoid duplicates — is exactly the kind of when-to-do-what guidance that prevents agent errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_new_documentGraphite: new documentA
Create a new, empty Graphite document and make it the active tab. Returns its document_id. The document has no artboard; artwork inserted afterwards lands at document coordinates where (0,0) is the origin and y grows downward. Use this before graphite_insert_svg when the user asks for a fresh document; do not call it if they want to edit what is already open.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Tab name for the new document. | Untitled Document |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | The name Graphite actually assigned (it de-duplicates names of open documents). |
| document_id | Yes | Graphite DocumentId as a decimal string. Pass it back to other tools when they accept a document_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, non-idempotent, and closed-world, so the mutation safety profile is covered. The description adds genuinely useful context beyond that: the document becomes the active tab, it returns a document_id, it has no artboard, and inserted artwork uses document coordinates with y growing downward. It stops short of describing failure/permission behavior, so not a 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?
Four short sentences, front-loaded with the action and return value, followed by behavioral detail and the routing rule. Every sentence carries distinct information with no redundancy.
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 one-optional-param creation tool with full annotations and an output schema (so return values need no explanation), the description covers action, side effects, coordinate behavior, and sibling routing. Nothing an agent needs to call it correctly is missing.
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 100% and the sole 'name' parameter is fully documented in the schema, including default and length bounds. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
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, empty Graphite document') plus a side effect ('make it the active tab'). It also distinguishes itself from the edit-what-is-open case, so an agent can tell it apart from graphite_get_document/select_document without opening schemas.
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?
Explicitly names when to use it ('before graphite_insert_svg when the user asks for a fresh document') and when not to ('do not call it if they want to edit what is already open'). Both the trigger and the exclusion are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_previewGraphite: look at the canvasARead-onlyIdempotent
Render the active document to a PNG and return it as an image so you can see what Graphite actually drew. Nothing is written to disk. Use it after inserting artwork to check composition, alignment and missing elements before iterating; default scale 0.5 keeps the image small. Fails with EXPORT_FAILED when the document has no layers and BRIDGE_TIMEOUT when rendering is slow (retry).
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Raster scale relative to the document's pixel size. 0.5 is enough to judge composition; use 1 for detail. Larger previews cost more context. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | Yes | |
| scale | Yes | |
| width | Yes | Pixel width of the preview. |
| height | Yes | Pixel height of the preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, closed-world), and the description adds substantial context beyond them: no disk writes, the default scale rationale, and concrete failure modes with recovery guidance (EXPORT_FAILED for layerless documents, BRIDGE_TIMEOUT with retry). This is exactly the behavioral detail annotations cannot express.
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 tight paragraph, front-loaded with the core action, then usage, then constraints, then error handling. Every clause carries information; nothing is padding.
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 an output schema covering return values and annotations covering safety, the remaining gaps an agent needs — when to call it, cost implications, and failure/retry behavior — are all present. Complete for this tool's complexity.
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 100%, so the baseline is 3, but the description reinforces the single parameter's tradeoff ('default scale 0.5 keeps the image small') in plain language that complements the schema's 'larger previews cost more context' note. It adds modest framing rather than new syntax.
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?
Starts with a specific verb+resource: 'Render the active document to a PNG and return it as an image.' It also distinguishes itself from the sibling graphite_export by stating 'Nothing is written to disk,' so an agent can tell the preview apart from the export tool without opening either schema.
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?
Gives clear context: 'Use it after inserting artwork to check composition, alignment and missing elements before iterating.' That is explicit when-to-use guidance. It stops short of naming graphite_export or graphite_get_document as the alternative for the non-visual case, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_redoGraphite: redoA
Redo the most recently undone change in the active document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, covering the safety profile. The description adds useful scoping ('in the active document', 'most recently undone') but does not disclose what happens if there is no undo history or how the mutation affects the document state.
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 with no redundancy or filler; the operation is stated immediately and nothing is wasted.
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?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. For a zero-param tool this is nearly complete; only the no-history edge case is unaddressed.
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?
The tool takes zero parameters with 100% schema coverage, so there are no parameter semantics to clarify. Baseline of 4 applies since the schema fully documents the (empty) 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 (redo) and resource (the most recently undone change in the active document), which is unambiguous and clearly distinct from the graphite_undo sibling. It stops short of explicitly naming the undo counterpart, but an agent can select it correctly without confusion.
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 phrase 'most recently undone change' implies the tool is used after an undo, giving contextual usage guidance. However, it never states when to use it versus graphite_undo or any precondition (e.g. that an undo history must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_rename_layerGraphite: rename a layerBIdempotent
Set the name shown for a layer in the Layers panel.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| layer_id | Yes | layer_id as returned by graphite_insert_svg or listed by graphite_get_document. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| layer_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds that the change affects the display name in the Layers panel, which hints this is a UI-facing label rather than an SVG id, but it says nothing about permissions, reversibility via undo, or side effects.
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 short, front-loaded sentence with no padding or repetition of the title. It is efficient, though it could carry one more clause of guidance at no structural cost.
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?
The tool is simple and an output schema exists, so return values need not be explained. However, for a mutation tool with no usage guidance and only partial parameter documentation, the description leaves the agent short on when to invoke it and whether an undo step is expected.
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 50%: layer_id is documented in the schema while name relies on minLength/maxLength. The phrase 'the name shown for a layer' adds semantic context that 'name' is a display label, which is genuinely useful, but the description does not restate the length constraints or format expectations.
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 (Set) and resource (the name shown for a layer), which is clear enough to distinguish from delete_layer, transform_layer, and set_style. It does not, however, explicitly name or contrast with any sibling tool.
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 description gives no when-to-use guidance, no prerequisites (e.g., an existing layer_id must come from insert_svg or get_document), and no mention of alternatives such as undo for reverting. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_select_documentGraphite: switch the active documentAIdempotent
Make another open document the active tab. graphite_get_document lists open documents. All other tools act on the active document.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| document_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent, non-destructive, non-open-world write semantics, so the bar is lower. The description adds real value beyond them by disclosing the global side effect: every other tool operates on whatever document is active, so this call changes the target of subsequent calls.
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 short sentences, zero filler, front-loaded with the action and followed by the supporting lookup tool and the context for why it matters.
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?
An output schema exists so return values need not be explained, and the description covers the action, the sibling to find IDs, and the cross-tool effect. What is missing is any hint about failure modes (e.g., passing a document that is not open) or the ID format.
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 carry the burden for document_id. It implies the ID comes from graphite_get_document, which is useful, but it never states the numeric-string format (^\d+$) or that exactly one ID is required, so compensation is partial.
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 first sentence gives a specific verb and resource: 'Make another open document the active tab.' It is unambiguous and clearly distinct from graphite_get_document, which is named as the listing tool rather than the switching tool.
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?
It names the sibling that lists candidates (graphite_get_document) and states the consequence that selects this tool: all other tools act on the active document, so this is how you redirect them. There is no explicit when-not-to-use, but the context is clear enough to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_set_styleGraphite: set fill, stroke or opacity of a layerAIdempotent
Change the solid fill colour, stroke colour and width, and/or opacity of an existing layer. Only the fields given are changed; null removes a fill or stroke. Each change is one undo step. Fails with LAYER_NOT_FOUND if the id is not in the active document.
| Name | Required | Description | Default |
|---|---|---|---|
| fill | No | Hex colour #rrggbb or #rrggbbaa, or null for none. | |
| stroke | No | Stroke colour, or null to remove the stroke colour. | |
| opacity | No | Layer opacity from 0 (transparent) to 1 (opaque). | |
| layer_id | Yes | layer_id as returned by graphite_insert_svg or listed by graphite_get_document. | |
| stroke_width | No | Stroke width in document pixels (default 1 when a stroke colour is set). |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | Yes | |
| layer_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (idempotent, non-destructive, not read-only), so the bar is lower, and the description still adds real behavioral detail: partial application ('Only the fields given are changed'), null-as-removal semantics, the one-undo-step per change guarantee, and the specific error code on a missing layer. Only return-shape detail is absent, which the output schema covers.
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 short sentences with no filler, and the primary effect is front-loaded before the partial-update, undo and error clauses. Every sentence carries distinct 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 mutation tool with full schema coverage, an output schema, and annotations declaring its safety profile, the description supplies the remaining operational facts an agent needs: scope of allowed targets, partial-update semantics, undo cost, and error behaviour.
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 100%, so all five parameters (including colour format, opacity range and stroke width) are already documented in the schema. The description only restates the null-removal behaviour and adds no format or default detail beyond what the schema provides.
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?
Names a specific verb and resource ('Change the solid fill colour, stroke colour and width, and/or opacity of an existing layer'), which cleanly separates it from siblings like graphite_transform_layer, graphite_rename_layer and graphite_delete_layer. The agent knows exactly which properties this tool mutates.
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?
Establishes that the target must be an existing layer in the active document and reports the LAYER_NOT_FOUND failure mode, giving clear context for when the call is appropriate. It does not, however, explicitly contrast itself with transform_layer/rename_layer or state prerequisites such as a selected document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_transform_layerGraphite: move, scale or rotate a layerA
Apply a transform to an existing layer, in its parent's coordinate space (document pixels for top-level layers). Give translate, scale and/or rotate (applied as scale, then rotate about origin, then translate), or a raw SVG matrix [a, b, c, d, e, f]. By default the transform is combined with the layer's current one; replace=true sets it outright. One undo step.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Uniform factor or [sx, sy]. | |
| matrix | No | Raw affine matrix; overrides translate/scale/rotate. | |
| origin | No | Pivot [x, y] for scale and rotate; default [0, 0]. | |
| rotate | No | Degrees, clockwise (y grows downward). | |
| replace | No | true sets the layer's transform to exactly this matrix instead of combining. | |
| layer_id | Yes | layer_id as returned by graphite_insert_svg or listed by graphite_get_document. | |
| translate | No | [dx, dy] in pixels. |
Output Schema
| Name | Required | Description |
|---|---|---|
| matrix | Yes | |
| replace | Yes | |
| layer_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-idempotent mutation with no destructive hint. The description adds genuinely useful behavior beyond that: transform is combined by default, replace=true overwrites, and it consumes exactly one undo step. The undo-step disclosure is particularly valuable for an agent planning sequences.
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 tightly packed sentences; the coordinate-space scoping is front-loaded and each clause carries distinct information (coordinate space, composition order, matrix alternative, replace semantics, undo cost). No filler.
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 an output schema present and annotations covering the safety profile, the description supplies everything else an agent needs: coordinate space, argument composition rules, override precedence, and reversibility cost.
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 100%, so baseline is 3, but the description adds semantics the schema does not: the fixed application order (scale, then rotate about origin, then translate) and that matrix overrides the component parameters. That ordering is essential for predicting the result.
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 transform) and resource (existing layer) and immediately scopes the coordinate space (parent's coordinate space, document pixels for top-level layers). An agent can distinguish this from graphite_set_style and graphite_insert_svg at a glance.
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?
Clear context: applies to an *existing* layer, and the compositional rules (translate/scale/rotate vs raw matrix) tell the agent which input mode to pick. It stops short of naming an alternative sibling or stating when NOT to use it, but the use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphite_undoGraphite: undoADestructive
Undo the most recent change in the active document (inserts, style, transform, rename and delete are each one step).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-read-only, destructive, not idempotent, not open-world), and the description usefully adds behavioral detail those annotations cannot convey: the undo granularity ('inserts, style, transform, rename and delete are each one step'). It still omits failure behavior (e.g. no-op or error when history is empty) and undo-depth limits, keeping it out of 5 territory.
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 with no filler; the parenthetical earns its place by defining what constitutes one undo step rather than padding.
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 zero-parameter tool with full schema coverage and an output schema that carries return values, the description covers the essential behavior. The one real gap is the absence of any linkage to the graphite_redo counterpart, which matters in a sibling set that includes redo.
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?
The tool takes zero parameters, which is the baseline-4 case; there is no argument surface for the description to disambiguate. Scoring higher is unnecessary since the description correctly implies the tool acts on the active document implicitly.
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 ('Undo') and a precise scope ('the most recent change in the active document'), which is far more informative than restating the name. It does not name or differentiate itself from the obvious sibling graphite_redo, 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?
Usage is only implied: an agent can infer this is the recovery action after the listed mutations, but the description never says when to prefer undo over redo or any other sibling, nor what happens when there is nothing to undo. Adequate-but-underspecified.
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.
13 tool updates
v0.2.0- First observed
graphite_delete_layer - First observed
graphite_export - First observed
graphite_get_capabilities - First observed
graphite_get_document - First observed
graphite_insert_svg - First observed
graphite_new_document - First observed
graphite_preview - First observed
graphite_redo - First observed
graphite_rename_layer - First observed
graphite_select_document - First observed
graphite_set_style - First observed
graphite_transform_layer - First observed
graphite_undo
TDQS
Scored across 13 tools
Each tool targets a distinct action or resource: document lifecycle (get_capabilities, new_document, get_document, select_document) versus layer editing (insert_svg, set_style, transform_layer, rename_layer, delete_layer) versus output (export, preview). The only near-overlap is export vs preview, but the descriptions sharply distinguish on-disk render from in-memory image and explain when to use each.
Every tool uses the uniform graphite_<verb>_<noun> pattern (graphite_new_document, graphite_insert_svg, graphite_delete_layer), with no mixed casing or alternate verb styles. The convention is predictable and readable across all 13 tools.
13 tools is well-scoped for an editor bridge, covering connection checks, document management, layer creation/editing, undo/redo, and rendering without redundancy. Every tool has a clear, non-duplicative role in the workflow.
The surface covers the core lifecycle: create document, insert artwork, style/transform/rename/delete layers, inspect, export, preview, and undo/redo. Minor gaps exist — no layer reordering, grouping, duplication, or document close/delete — but an agent can work around these for typical artwork generation tasks.
Maintenance
Related MCP Connectors
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
Generate and vectorize clean, editable SVG graphics from text, images, or both.
The Canva MCP server connects AI assistants (like Claude, ChatGPT, and Cursor) to Canva's API, enabling them to create and manage designs directly within chat conversations. Key capabilities include generating new designs from prompts, autofilling templates, searching and resizing existing designs, importing files from URLs, exporting designs as PDFs or images, and managing folders and comments without switching between tools.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI-powered image to SVG vectorization, background removal, and SVG manipulation directly through MCP-compatible clients. Users can convert images, process batches, and edit vector properties like colors and complexity using the svg.new API.710 npm1MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to control Inkscape for vector graphics editing via MCP tools.79MIT
- FlicenseAqualityCmaintenanceEnables annotating SVG paper figures in the browser by picking elements or drawing regions, and feeds those annotations back to Claude via MCP so it can edit the underlying SVG or generation scripts, with automatic page refresh on changes.41-
- AlicenseBqualityAmaintenanceEnables driving Inkscape headlessly from an MCP client, with verified SVG editing, rendering, optimization, and animation tools.23MIT