Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Inkscape (inksmcp)

PYPI · INKSMCP

Create, edit and export SVG graphics with Inkscape: measured layout, templates, export.

Available components

+18 this week 83 Trust /100

Last scanned (20 hours ago)

Scores higher than 86% of PyPI servers

Category Design and Media

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 29 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to bhanutpt/inksmcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 29 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability51
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 5104 tokens (~212/item across 24 items; 24 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management70
  • Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_elements" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 25 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

  • 31 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 26 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 24 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed pypi/inksmcp@0.3.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo bhanutpt/inksmcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/bhanutpt/inksmcp/.github/workflows/release.yml@refs/tags/v0.3.0
Rekor log index 3104016108
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:88219094d016e641a21b8a75e48acc14af66feed0920a0c81e5030d030de6ae5

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 29 packages
Packages resolved 29
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 24 exposed · ~4,933 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_elements ~786

Add one or more elements in a single call. Returns the new ids. Element spec keys — common: type, id, label, layer (name; created if missing), parent (group id), transform, style (css string or dict). Style shorthands: fill, stroke, stroke_width, opacity, fill_opacity, stroke_opacity, stroke_dasharray, stroke_linecap, stroke_linejoin, font_size, font_family, font_weight, font_style, text_anchor. Geometry per type: rect: x, y, width, height, rx, ry, fit_to, fit_padding, fit; circle: cx, cy, r; ellipse: cx, cy, rx, ry; line: x1, y1, x2, y2, marker_start, marker_end; polyline: points, marker_start, marker_end; polygon: points; path: d, marker_start, marker_end; text: x, y, text, line_height, vertical_anchor, width, halo, halo_width; group: -; arrow: x1, y1, x2, y2, shaft_width, head_width, head_length; image: x, y, width, height, href, object_fit, embed; use: x, y, width, height, href. points = [[x,y],...]. text supports '\n' for multiple lines; font_size is in user units. Coordinates are in the parent's system: inside a transformed layer or group (e.g. after layout moved it, or a scaled plan group) they are offset/scaled with it. use: href "symbol_id" places a symbol (or any element) of this document; "library.svg#symbol_id" copies that symbol from a file first (list a library's symbols: document_open it, inspect find {"type": "symbol"}); width/height scale a symbol that has a viewBox. clip: an element id (its current shape) or [x, y, w, h] — the element is cut to it and the clip then moves with the element; null removes it. text halo: '#ffffff' outlines the glyphs behind the fill so text reads over lines (halo_width default 0.3 x font size; 'none' removes). place: {"below": id, "gap": 1.5} (or above / left_of / right_of; "align": start|center|end on the other axis) puts the element beside the MEASURED box of another (real glyph extents, any script) and keeps it there when that element changes; inside repeat, ids are template names; null frees it. Responses warn abou…

NameTypeReqDescription
defaults–––
doc_id–––
elements–––
elements_path–––
previewboolean––

No output schema declared.

No examples provided.

align ~104

Align elements to the page, to each other, or inside another element — e.g. centre a label in a box: {"ids": ["label"], "to": "box", "horizontal": "center", "vertical": "middle"}. Operations run in order, each seeing the previous moves. Returns the moves [dx, dy] and new bboxes in user units.

NameTypeReqDescription
doc_id–––
operationsarrayyes–
previewboolean––

No output schema declared.

No examples provided.

connect ~172

Draw arrows/lines between elements that stay attached when things move (align/layout/ update_elements/page_fit). Default: native Inkscape connectors — clipped to the real shape (circles etc.) and still live in the Inkscape GUI. With from_side/to_side/via you control the route (e.g. a loop diagram: {"from": "condenser", "to": "valve", "from_side": "left", "to_side": "top", "routing": "elbow"}); those attach at the middle of the chosen side of the bounding box, as do connectors with start_gap/end_gap. Returns the connector ids, their layers, label ids and warnings.

NameTypeReqDescription
connectionsarrayyes–
doc_id–––
previewboolean––

No output schema declared.

No examples provided.

delete_elements ~78

Delete elements (and their children) by id. Connectors attached to them and their labels are deleted too; all removed ids are returned. Defs only they used (symbols of an imported library, gradients, clip paths) go too: `defs_removed` counts them.

NameTypeReqDescription
doc_id–––
idsarrayyes–

No output schema declared.

No examples provided.

document_create ~79

Create a new blank document and make it current. The viewBox matches width/height, so coordinates are in `unit`. `background` (e.g. '#ffffff') adds a full-page rect with id 'background'.

NameTypeReqDescription
background–––
heightnumberyes–
unitstring––
widthnumberyes–

No output schema declared.

No examples provided.

document_open ~94

Open an existing SVG (.svg or .svgz) and make it current. Returns its outline, and `notes` when the file was normalised for editing without changing how it renders: a page whose viewBox doesn't match its width/height (or uses %), fill/stroke set on the root (new elements would inherit them), ids given to elements that had none.

NameTypeReqDescription
pathstringyes–

No output schema declared.

No examples provided.

document_save ~41

Save the document as Inkscape SVG (to `path`, or where it was opened/last saved).

NameTypeReqDescription
doc_id–––
path–––

No output schema declared.

No examples provided.

export ~177

Export via Inkscape. Format defaults to the file extension. What is exported: `region` [x, y, w, h] (user units, everything visible); or `ids` — only those objects cropped to them (only_ids=true, default) or the area around them with everything visible (only_ids=false); otherwise area 'page' or 'drawing'. For PNG set dpi or width/height (px); background e.g. '#ffffff' (default transparent).

NameTypeReqDescription
areastring––
background–––
doc_id–––
dpi–––
format–––
height–––
ids–––
only_idsboolean––
pathstringyes–
region–––
text_to_pathboolean––
width–––

No output schema declared.

No examples provided.

grid ~509

Draw a grid / graph paper inside rect [x, y, w, h] — linear or logarithmic per axis — without computing any line positions. Axis specs: linear: {"scale": "linear", "major": 10, "medium": 5, "minor": 1, "label_start": 0, "label_step": 1} (spacings in user units, each a whole multiple of the finest; labels on major lines) log: {"scale": "log", "cycles": 3, "subdivisions": "standard" | "fine" | "integers", "start": 10} (decades major, 2..9 medium, subdivisions minor; "start" = value at the origin (default 1); "labels": "decades" (start, start*10, ...; default when start is given) | "paper" (1..9 per cycle)) "reverse": true flips an axis (default x left→right, y bottom→top); "lines": false keeps the axis (labels, `plot` mapping) but draws none of its gridlines, e.g. vertical-only lines for a bar chart. weights: {"major", "medium", "minor"} stroke widths (defaults 0.45/0.22/0.08 mm); border: stroke width of the frame (default 0.6 mm, 0 = none). labels: {"sides": ["left", "bottom"], "font_size", "gap", "color", "font_family", "bold_major", "x_title", "y_title", "title_font_size"} — placed outside the grid, centred on their lines (measured); major labels are bold unless "bold_major": false; titles go below / left (rotated) of the tick labels. Result: one path per weight class in layers '<layer_prefix> minor/medium/major', labels in '<layer_prefix> labels'. Use `plot` with grid=<id_prefix> to draw data on it.

NameTypeReqDescription
border–––
colorstring––
doc_id–––
id_prefixstring––
labels–––
layer_prefixstring––
previewboolean––
rectarrayyes–
weights–––
x–––
y–––

No output schema declared.

No examples provided.

import_file ~233

Place a file into the current document. An SVG (e.g. geometry a script generated) becomes one group scaled to this document's units, its top-left at `at` (default 0,0); width or height scales it (both: stretch). Its layers become labelled groups, its defs join ours, clashing ids get "<id>-" in front. An image (png/jpg/gif/webp/bmp) becomes an image element: natural size at 96 dpi unless width/height (one keeps the ratio), linked by default (embed: true stores the pixels in the SVG), object_fit contain|cover|fill for a given box. Relative paths start at the document's folder. For whole documents use document_open; for data rows see repeat rows_path.

NameTypeReqDescription
at–––
doc_id–––
embedboolean––
height–––
id–––
layer–––
object_fit–––
parent–––
pathstringyes–
previewboolean––
width–––

No output schema declared.

No examples provided.

inkscape_info ~23

Inkscape version and location, server version, and open documents.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

inspect ~228

Outline of the document: layers, groups and elements with ids, fill/stroke as rendered (style, attributes or inherited), text, `use` targets (href) and real visual bounding boxes [x, y, width, height] in user units (measured by Inkscape). Layers/groups with more than `max_children` children are summarised (counts per type, first/last ids, bbox). To list one of them, pass `layer` (layer name or group id) and a larger max_children. find: a flat list of matching elements instead of the tree, e.g. {"fill": "#99cc32"} (colours compared in any notation), {"type": "text", "text": "total"}, {"type": "use", "href": "Parking"}, {"type": "symbol"} (symbols in defs, with titles), {"id_prefix": "card-"}.

NameTypeReqDescription
bboxboolean––
doc_id–––
find–––
layer–––
max_childreninteger––

No output schema declared.

No examples provided.

layout ~242

Arrange items in a row, column or grid with a gap — no coordinate maths needed. An item is an id or a list of ids that move together, e.g. ["box1", "box1_label"], or {"ids": [...], "anchor": "fig1-border"} to arrange by that member's box (plot frames line up even when their tick labels differ in width); the rest moves along. `gap` is a number or [horizontal, vertical]. `align` places items on the cross axis (grid: within cells). The block stays where the first item is, or its top-left goes to `at` [x, y], or it is aligned to `to` ('page' or an element id) using horizontal/vertical/margin. Connectors follow.

NameTypeReqDescription
alignstring––
at–––
columns–––
directionstring––
doc_id–––
gap–––
horizontal–––
itemsarrayyes–
marginnumber––
previewboolean––
to–––
vertical–––

No output schema declared.

No examples provided.

move_to_layer ~85

Move elements into a layer (by name; created on top if missing) or into a group/layer by id, at its top or bottom. They keep their relative order and stay visually where they were.

NameTypeReqDescription
doc_id–––
idsarrayyes–
layerstringyes–
positionstring––
previewboolean––

No output schema declared.

No examples provided.

page_fit ~98

Resize the page to fit the drawing (or only `ids`) plus `margin` (one number, [vertical, horizontal] or [top, right, bottom, left], user units). All content moves together so the page keeps its 0,0 top-left; full-page background rects are resized, connectors follow.

NameTypeReqDescription
doc_id–––
ids–––
margin–––
previewboolean––

No output schema declared.

No examples provided.

page_resize ~98

Set the page size in user units (e.g. 210 x 297 for A4 in a mm document). anchor='center' keeps the drawing centred on the new page; 'top-left'/'none' leave content where it is. Backgrounds are resized.

NameTypeReqDescription
anchorstring––
doc_id–––
heightnumberyes–
previewboolean––
widthnumberyes–

No output schema declared.

No examples provided.

path_operation ~118

Geometry operations performed by Inkscape on the given ids. For difference, the top-most (later in document order) object is subtracted from the bottom one. to_path converts shapes and text into paths. union/intersection/exclusion/difference keep the BOTTOM object's id, style and layer; combine keeps the TOP object's (E22). `result` lists the ids that hold the outcome.

NameTypeReqDescription
doc_id–––
idsarrayyes–
operationstringyes–
previewboolean––

No output schema declared.

No examples provided.

plot ~391

Plot data on a grid made with the `grid` tool, in DATA values — no coordinate maths. grid: that grid's id_prefix. Each series: {"points": [[x, y], ...], "line": true, "stroke": "#1f77b4", "stroke_width", "stroke_dasharray", "marker": "circle"|"square"|"diamond"|"none", "marker_size", "marker_fill" (default white), "point_labels": ["", "COP 3.2", ...] (one per point, null/"" to skip), "label_offset": [dx, dy], "label_anchor": "start"|"middle"|"end", "label_halo": "#ffffff"|"none", "label_font_size", "label_color", "font_family", "id", "layer"}. Labels: label_offset is from the point to the label's anchor, and the label is vertically CENTRED on point + dy (dy = 0 → centred on the point). Anchor defaults to start for dx >= 0, else end. Without label_offset the label goes right of the point, on the side the line is not heading to. Labels carry a halo stroke (default white) so the line can cross them — set label_halo "none" (or the background colour) for labels on dark fills; recolouring a label later does not remove its halo (use stroke: "none"). Ids follow the series id: <id>-line, <id>-marker-<k>, <id>-label-<k> (k = 1-based point index). Returns per series those ids and the points in user units (for annotations); warns about points outside the grid.

NameTypeReqDescription
doc_id–––
gridstring––
previewboolean––
seriesarrayyes–

No output schema declared.

No examples provided.

render_preview ~110

Render to a PNG image you can look at (white background, longest side = max_size px). Zoom in with `region` [x, y, w, h] in user units, or with `ids` (the area around them, everything still visible). only_ids=true draws just those objects.

NameTypeReqDescription
areastring––
doc_id–––
ids–––
max_sizeinteger––
only_idsboolean––
region–––

No output schema declared.

No examples provided.

repeat ~594

Stamp a block of elements once per data row — timelines, card grids, tables, legends, map symbols — in one call. template: element specs as for add_elements, drawn for the FIRST row. "{key}" in any string is replaced from the row ("{year}"; a value that is exactly "{w}" keeps the row's number), in geometry and style alike ("fill": "{colour}"); "{n}" is the row number (1-based) and "{i}" the index, so rows can't use the keys n and i. Ids are local names: "card" becomes card-1, card-2, ... A "parent" may name another template element (e.g. a group holding a card and its texts); fit_to and clip may name template elements of the same row. Each row goes into a group <id_prefix>-<n> moved by n-1 steps: step [dx, dy], or a grid with `columns` (step = [column pitch, row pitch]), filled row by row or, with order "column", column by column. cell ["col", "row"]: each row is placed by its own 1-based column/row values (gaps and fractions allowed: periodic tables, calendars, timetables, lanes); the template is drawn for cell (1, 1) and step is the [column, row] pitch. Components (a character, a node, a symbol placed at data positions): a template group with "transform": "translate({x},{y}) scale({s})" and step [0, 0], parts drawn around a local origin, pose/shape parts as placeholders ("d": "{arms}"). mirror {"x": 148.5, "rows": "even"|"odd"|"all"} (or "y") mirrors those rows about the axis: shapes are reflected (pointers flip), texts and groups keep their reading direction and move as blocks — group a card with its texts so they cross together. Per element "mirror": "reflect"|"block"|"none" overrides. rows_path: a .json (list of row objects) or .csv file (header line = keys, numbers parsed) instead of `rows`, so data never passes through the conversation. Returns the row groups, ids per template name (runs shortened to "card-1..card-12"), wrapped_lines, fitted.

NameTypeReqDescription
cell–––
columns–––
defaults–––
doc_id–––
id_prefixstring––
layer–––
mirror–––
orderstring––
previewboolean––
rows–––
rows_path–––
steparrayyes–
templatearrayyes–

No output schema declared.

No examples provided.

run_actions ~100

Escape hatch: run raw Inkscape actions (e.g. "object-align:left last", "transform-rotate:30") after selecting `select` ids. File, export, window and quit actions are blocked. Extensions (org.inkscape.*) always act on the whole document, so they can't be combined with select.

NameTypeReqDescription
actionsarrayyes–
doc_id–––
previewboolean––
select–––

No output schema declared.

No examples provided.

split ~381

Divide a region into named cells — comic panels, dashboard tiles, poster columns, table grids — without computing any positions. region: "page", an element id (its measured box) or [x, y, w, h]; margin insets it (one number, [vertical, horizontal] or [top, right, bottom, left]). rows: one entry per row, either a number of equal columns or a list of column ratios, e.g. [[2, 1], [1, 1], [1, 2]]; heights: row ratios (default equal); gutter: space between cells (number or [horizontal, vertical]). Creates one rect per cell, <id_prefix>-1, -2, ... row by row, in `layer` — invisible unless `style` gives e.g. {"fill": "#fff", "stroke": "#000", "stroke_width": 0.6, "rx": 2}. Use the ids as targets: clip ("clip": "cell-5"), align/layout ("to": "cell-2"), place, fit, connect. An element region is its measured box (stroke included). Tables: split the header strip into columns (e.g. rows [[3, 1, 1]]), then `repeat` the data rows with step [0, row pitch] and texts at the returned column edges (numbers: text_anchor end at the right edge). Returns the cells [x, y, w, h] and their ids per row.

NameTypeReqDescription
doc_id–––
gutter–––
heights–––
id_prefixstring––
layerstring––
margin–––
previewboolean––
region–––
rowsarrayyes–
style–––

No output schema declared.

No examples provided.

update_elements ~71

Change existing elements. Each update is {"id": ..., <any element-spec keys>}; only the given keys change. Style shorthands merge into the existing style. Set transform to "" to clear it.

NameTypeReqDescription
doc_id–––
previewboolean––
updatesarrayyes–

No output schema declared.

No examples provided.

z_order ~121

Change stacking order (what is drawn on top). front/back: top/bottom within the element's own layer or group. forward/backward: one step past the next object it overlaps (visible change). above/below: directly above/below `target`, moving into target's layer/group if needed while keeping the visual position. Several ids keep their relative order. Returns each id's position.

NameTypeReqDescription
doc_id–––
idsarrayyes–
operationstringyes–
previewboolean––
target–––

No output schema declared.

No examples provided.

Install

How do I install the Inkscape (inksmcp) MCP server?

Inkscape (inksmcp) runs locally as a PyPI package, launched with uvx inksmcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · inksmcp

# add to Claude Code
claude mcp add bhanutpt-inksmcp -- uvx inksmcp
Common questions

What is the Inkscape (inksmcp) MCP server?

Inkscape (inksmcp) is an MCP server listed in the public MCP registry as io.github.bhanutpt/inksmcp. Create, edit and export SVG graphics with Inkscape: measured layout, templates, export. This page covers its PyPI package (inksmcp).

Is the Inkscape (inksmcp) MCP server safe to use?

Inkscape (inksmcp) scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Inkscape (inksmcp) MCP server expose?

Inkscape (inksmcp) exposes 24 tools: inkscape_info, document_create, document_open, document_save, inspect, and 19 more. Their descriptions and schemas cost roughly 4,933 tokens of context every time the server is loaded.

Is the Inkscape (inksmcp) MCP server still maintained?

Inkscape (inksmcp) is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Inkscape (inksmcp) MCP server under?

Inkscape (inksmcp) declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.