Skip to main content

Tinta

Tinta — Inkscape × AI × MCP. Give your AI a vector editor.

Python 3.12+ License: AGPL v3 FastMCP 4.0

Tinta (ink in Portuguese) connects AI assistants to an open Inkscape session through MCP. Its structured tools create and edit SVG elements, inspect documents, and export previews using Inkscape.

Requirements

  • Inkscape 1.2 or newer
  • Python 3.12 or newer (uv can download a compatible interpreter automatically)
  • uv

On Windows, Tinta uses the gdbus.exe bundled with Inkscape. On Linux, inkscape and gdbus must be on PATH, with Inkscape and Tinta using the same user session bus. When using WSL, run both in the Linux environment; these instructions do not cover connecting a WSL server to Windows Inkscape.

Installation

Install the Inkscape extension from the PyPI package:

uvx tinta-mcp install

The installer copies the extension to your Inkscape user extensions directory and prints the MCP client configuration. It also offers to install the AI assistant skill in any supported agent directories it detects. Add --yes to accept all detected skill installations without prompts.

Restart Inkscape after installation and open a document, then configure your MCP client below. You do not need to clone the repository or create a virtual environment.

Client configuration

Add this entry to your client's MCP configuration, such as claude_desktop_config.json or mcp_config.json:

{
  "mcpServers": {
    "tinta": {
      "command": "uvx",
      "args": ["tinta-mcp"]
    }
  }
}

The client runs uvx tinta-mcp to start the server. The install subcommand is only needed to set up or update the extension. Make sure uvx is on the client's PATH.

Tinta provides structured SVG operations. It does not run arbitrary Python or textual commands, and the --enable-python argument is no longer accepted. Remove it from older client configurations.

AI assistant skill

The installer checks for Claude, Cursor, and Gemini/Antigravity skill directories and asks before copying tinta-designer into them. The skill provides workflows for batch element creation, non-destructive canvas edits, and visual verification.

For manual installation or other agents, download tinta-designer-skill.zip from the latest release and extract the tinta-designer directory into your agent's skills folder.

Updating

To fetch the latest published version and update the Inkscape extension, run:

uvx tinta-mcp@latest install

Restart Inkscape afterward. Set the client's args to ["tinta-mcp@latest"] and restart its MCP server to use the latest server version too. Without @latest, uvx can reuse a cached version.

To keep the server and extension on a specific release, use the same tinta-mcp@X.Y.Z version in the install command and client configuration, replacing X.Y.Z with the release number. Updating the server alone does not update the files already copied into Inkscape.

How it works

Inkscape exposes internal actions over D-Bus. When Tinta triggers an action, Inkscape runs the extension in its own process. The extension can then read and update the document DOM.

The server and extension exchange requests through a private IPC directory for the current user. The server writes one versioned request, triggers org.tinta.mcp with gdbus, and accepts a response only when its session and request IDs match. The extension serializes the staged SVG before writing that response. If activation times out or no response arrives, Tinta reports that the outcome is unknown and leaves the request pending. It will not reuse the shared request slot until the pending request is resolved.

On Windows, Tinta uses the gdbus.exe bundled with Inkscape and does not require a separate D-Bus daemon. On Linux, it uses the user session bus.

Available tools

Element creation

  • create_elements: Creates multiple SVG elements in a single call. Supports pipeline options to clear the document, set canvas dimensions, fit the viewBox with padding, select the created items, and return a PNG preview immediately.
  • create_shape: Inserts basic shapes (rect, circle, ellipse, line, polygon, polyline).
  • create_path: Inserts a <path> element using SVG path data (d="...").
  • create_text: Inserts text with position, font size, and style attributes.
  • create_group: Creates a <g> group container. Existing children must be contiguous siblings; the group stays at their original paint position. Documents with CSS stylesheets are rejected for this operation.

Document editing

  • modify_elements: Modifies attributes of one or more existing SVG elements by ID in an atomic batch. Each entry needs an ID and at least one attribute, with optional auto-framing (fit_canvas) and preview (return_preview).
  • delete_elements: Removes one or more existing elements by ID in an atomic batch. Pass a one-item list to delete one element.
  • clear_canvas: Removes drawing elements while keeping definitions, Inkscape named view, metadata, title, description, and CSS style elements.

Canvas and viewport

  • fit_canvas_to_elements: Calculates the bounding box of existing elements and fits the page dimensions and viewBox around them with padding.
  • set_canvas_size: Sets explicit width, height, and viewBox values. Supported units are px, mm, cm, in, pt, and pc.

Inspection and export

  • get_document_info: Returns document dimensions, units, viewBox when present, and element counts as JSON.
  • list_elements: Returns a page of element summaries in document order, including nodes in definitions. The default page size is 100 and the maximum is 500.
  • get_element_info: Returns all attributes and parsed inline style for one element ID.
  • get_selection: Returns IDs and attributes of every selected element as JSON.
  • export_preview: Renders the active page to a PNG through Inkscape's native actions, capped at the requested maximum pixel dimension (default 800, maximum 4096).

Additional structured operations

  • apply_mask: Applies or removes a clipping path or luminance mask. Applying a mask moves the stencil into definitions; transformed targets or stencils, inherited or class-based styles, and documents with CSS stylesheets are rejected.
  • path_boolean_operation: Performs native path boolean operations on existing paths. All operations except combine and break-apart need two or more paths; those two accept one or more. Difference follows Inkscape's canvas paint order; the ID list does not define subtraction order.

A tool that returns a preview includes both the operation result and PNG in its MCP response. If preview export fails after an edit, the response keeps the edit result and adds a warning. Failed operations return MCP tool errors.

SVG tags and attributes are treated as data. Fixed extension handlers make document changes; the server never evaluates Python supplied by a client.

Development

Clone the repository and install the development dependencies:

git clone https://github.com/quenazsoares/tinta-mcp.git
cd tinta-mcp
uv sync --all-groups

To install the extension from the checkout, run install_windows.bat on Windows or bash scripts/install_linux.sh on Linux. These scripts also set up the local environment and save mcp_config.snippet.json in the project root. The Windows PowerShell script can also be run directly with powershell -ExecutionPolicy Bypass -File scripts/install_windows.ps1.

Run the local server with uv run tinta. For MCP clients, use "command": "uv" and "args": ["--directory", "/absolute/path/to/tinta-mcp", "run", "tinta"], replacing the path with your checkout directory. After changing extension code, run the installer again and restart Inkscape.

Run the test suite:

uv run pytest

Live tests are opt-in. Each test starts its own Inkscape process with a separate profile, IPC namespace, and disposable document. Tests do not use the user's open document:

uv run pytest tests/test_dbus_smoke.py --live-inkscape -v

On Linux without a display or session bus, prefix the command with xvfb-run -a dbus-run-session. When live tests are requested, a missing executable or readiness failure causes the test to fail. Each test owns its fixture and can run independently. Set TINTA_TEST_INKSCAPE to choose an Inkscape executable. For isolated extension tests, set TINTA_TEST_INKSCAPE_PYTHON and TINTA_INKEX_PATH to locate the Python interpreter and inkex package without installing them in the server environment.

Check formatting, lints, and types:

uv run ruff check extension tintamcp tests
uv run pyright

For version preparation, TestPyPI validation, and PyPI publication, see the release guide.

Acknowledgements and lineage

Tinta builds upon earlier community work:

Tinta adds typed FastMCP tools, batch element operations, previews exported through GTK actions, input sanitization, and user-isolated temporary IPC directories.

Metadata

Release files for tinta-mcp 0.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tinta-mcp 0.2.2
File Size Uploaded Provenance
tinta_mcp-0.2.2.tar.gz 515.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for tinta-mcp 0.2.2
File Interpreter ABI Platform
tinta_mcp-0.2.2-py3-none-any.whl Python 3 none any Details

Total release size: 567.2 kB

Release files / tinta_mcp-0.2.2.tar.gz

Download URL tinta_mcp-0.2.2.tar.gz
Size 515.6 kB
Tags Source
SHA-256 checksum
How to use checksums
36639d379c1622e8b831969db99d6f3581d37d3510fc646f18834b6afb2b34fa
BLAKE2b-256 checksum
How to use checksums
a8561c614867d546618e7cb92e19ea60d44f994ae01defeafeb5b57eeab60803
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / tinta_mcp-0.2.2-py3-none-any.whl

Download URL tinta_mcp-0.2.2-py3-none-any.whl
Size 51.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ed459059df51d726fe6dc62523ee03d3e320144f9e3d3bdc5448f1feb18b0d15
BLAKE2b-256 checksum
How to use checksums
7cda41d8638b523c328e22f571732313825263d8def40ab32b8184c14936dfe0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for tinta-mcp 0.2.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.2.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page