Illustrator MCP
This server lets AI assistants control Adobe Illustrator through MCP, enabling structured artwork edits, scripting, document management, exports, and vector operations.
Document management: create, open, save, close, list, activate, and inspect documents.
Observation and inspection: get document structure, query items, check preflight issues, and inspect previews.
Structured editing: execute task batches for creating/modifying elements, applying styles, and layout operations.
Raw ExtendScript execution: run custom JavaScript/ExtendScript with safety guards, library injection, and previews.
Vector path operations: boolean geometry (unite/subtract/intersect/xor) and SVG path import.
Place assets and references: place images/PDF/EPS/AI files, optionally trace or embed; set reference overlays.
Export: export documents to PNG, JPG, SVG, or PDF; request visual image previews.
History and recovery: undo/redo and named checkpoints for MCP-managed items.
Job and rendering controls: monitor uncertain jobs, generate annotated previews, and coordinate high-resolution clip boxes.
Allows importing SVG path data into Illustrator documents as editable vector paths.
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., "@Illustrator MCP Create a rectangle at (100,100) with width 200 and height 150."
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.
Illustrator MCP
An MCP server that lets AI assistants control Adobe Illustrator through a CEP panel. Version 3.0.0 supports structured artwork edits, ExtendScript, document management, visual previews, PNG/JPG export, and SVG path import.
Requirements
Python 3.10 or newer.
Adobe Illustrator on Windows or macOS. The panel manifest permits Illustrator 25.0+; this is an installation range, not a verified compatibility guarantee. Compatibility across that range and both platforms has not yet been validated.
Node.js and npm compatible with Vite 6 to build the panel.
An MCP client supporting stdio.
Related MCP server: Illustrator AI MCP Server
Installation
Download or clone this repository, then open a terminal in its root directory.
python -m venv .venvActivate the environment with .venv\Scripts\activate on Windows or
source .venv/bin/activate on macOS, then install:
python -m pip install -e ".[geometry]"
cd cep-extension
npm ci
npm run typecheck
npm run build
python validate_panel.py
cd ..The optional geometry extra enables boolean path operations. Use
python -m pip install -e . if you do not need it.
With the Python environment activated, run install-cep.bat on Windows.
On macOS, run bash install-cep.sh.
The installers copy a filtered panel snapshot into Adobe's CEP extensions directory
and enable unsigned-extension loading for CEP 10, 11, and 12. Local .debug
remote-debugger configuration is excluded from installation and publication. The build
target is Chromium 74, matching the intended Illustrator 25.0 / CEP 10 baseline;
this does not establish real-host compatibility. Reinstall after rebuilding the panel.
Backups are stored outside Adobe discovery under Illustrator MCP/cep-backups
in %APPDATA% on Windows or ~/Library/Application Support on macOS. A failed
activation restores the previous installation. Close Illustrator during upgrades.
An installed connection.json is preserved byte-for-byte during upgrades and
rollback, including invalid settings. Unreadable settings abort the upgrade.
Fresh installs exclude live configuration from the development checkout. When
upgrading a legacy or manual directory symlink, its linked connection.json is
the installed preference and is carried forward into the new copy. Publication
always excludes live configuration.
Restart Illustrator and open Window > Extensions > MCP Control.
MCP client configuration
Add the following server definition to your client's MCP configuration, replacing the interpreter path with the absolute path to your installed virtual environment:
{
"mcpServers": {
"illustrator": {
"command": "C:/path/to/Illustrator_MCP/.venv/Scripts/python.exe",
"args": ["-B", "-m", "illustrator_mcp.server"],
"env": {
"WS_HOST": "127.0.0.1",
"WS_PORT": "8081",
"TIMEOUT": "30"
}
}
}
}On macOS use /absolute/path/to/Illustrator_MCP/.venv/bin/python.
Restart the client's integration and connect the panel. The Python server owns
the WebSocket bridge; only one client should start it at a time.
The default endpoint is ws://127.0.0.1:8081. To select another port, set Python's
WS_PORT and put {"endpoint":"ws://127.0.0.1:8082"} in connection.json at the
installed extension root (beside CSXS and dist), using the same port on both
sides. Use cep-extension/connection.example.json as a template. No rebuild is
needed after editing the installed file. Restart the MCP integration and reload
the panel only after running work and unacknowledged completions are resolved.
The panel reads its file once per load; Python environment settings do not change
it. Managed installs use copies. For a manual symlink installation the config
lives in the linked directory; the installer does not create symlinks.
Both sides accept IPv4 loopback only. localhost is normalized to 127.0.0.1
for both Python binding and the panel connection. Panel URLs require ws://, an
explicit port from 1024 to 65535, and an empty/root path. Remote hosts, IPv6,
wss://, credentials, queries, and fragments are rejected. A missing file uses
the default; invalid/unreadable explicit settings create no socket. An unavailable
configured endpoint is retried without falling back to another port. The panel
footer and connection logs show the chosen endpoint and configuration source.
Distribution and versions
This release pairs server 3.0.0 with CEP panel 1.0.2; their versions are independent.
The repository source ZIP/tarball (including Illustrator_MCP.zip) contains the
server, panel sources, and installers. The installation steps above require that
complete repository archive or a clone.
The Python wheel and Python sdist (illustrator_mcp-*.tar.gz) contain only
the server and its runtime resources. They do not include cep-extension or the
installers. When installing either Python distribution, obtain the matching
panel separately from the complete repository archive.
Usage
Start with illustrator_connection_status using {"params":{"probe":true}}.
Open or create a document, then ask your assistant to inspect it before editing.
illustrator_document: create, open, list, activate, save, or close documents.illustrator_observe: inspect previews and artwork context.illustrator_get_documentandillustrator_query_items: inspect structure and targets.illustrator_execute_task: execute structured batches of artwork operations.illustrator_execute_script: execute ExtendScript with reusable libraries.illustrator_place_fileandillustrator_set_reference: place assets and references.illustrator_path_booleanandillustrator_path_import_svg: work with vector paths.illustrator_preflight_check: check artwork before delivery.illustrator_export_document: export PNG or JPG.illustrator_history: undo, redo, and manage checkpoints.illustrator_job_status: inspect or reconcile an uncertain job.
The server exposes operation descriptions through illustrator://ops, scripting
guidance through illustrator://reference/extendscript, and library help through
illustrator://reference/libraries and illustrator://libraries/{name}.
Files under illustrator_mcp/resources/docs/ supply these runtime references.
Limitations and troubleshooting
This is alpha software. Native SVG/PDF export is currently unavailable; PNG/JPG export and SVG path import are supported. Save your work before automated edits.
A timeout does not mean Illustrator stopped executing. Inspect and reconcile the
job before retrying an uncertain edit. Export supports overwrite="fail" and
overwrite="version" when replacement is unwanted.
If the panel does not connect, check that the client started the server and that its WebSocket port matches the panel. Stop the previous client integration before switching clients. For panel updates, rebuild the extension, reload the panel, and restart the MCP server. Server diagnostics are written to stderr.
License
MIT; see LICENSE. Bundled third-party files retain their own notices.
Available Tools
12 toolsillustrator_documentADestructive
Create, open, save, or close an Illustrator document.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=True
WHEN TO USE:
Starting a new illustration (action='create')
Opening an existing .ai file (action='open', file_path required)
Saving current work (action='save', file_path for save-as)
Closing the active document (action='close')
EXAMPLES: illustrator_document(action="create", width=800, height=600, color_mode="RGB") illustrator_document(action="open", file_path="C:/art/figure.ai") illustrator_document(action="save", file_path="C:/art/figure_v2.ai") illustrator_document(action="close", save_before_close=True)
NOTES:
close without save_before_close=True discards unsaved changes
open/save interact with the filesystem (openWorld)
Inputs: params (required). Returns: result
illustrator_execute_scriptADestructive
Execute raw JavaScript/ExtendScript code in Adobe Illustrator.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=True
WHEN TO USE:
Single one-off items, quick prototypes, or operations not covered by higher-level tools
Full DOM access when structured tools are insufficient
Reading document state with custom logic
ABSTRACTION LADDER — prefer higher levels before using raw script: Level 5 — illustrator_path_boolean: boolean sculpt (unite/subtract/intersect/xor) Level 4 — illustrator_execute_task + element_create_batch: batch-create identical shapes Level 3 — illustrator_path_import_svg: import SVG d-string paths Level 2 — illustrator_execute_task + element_create: smooth curves, handles, mirror Level 1 — illustrator_execute_script (THIS tool): raw ExtendScript
DECISION RULES:
Subtract/unite shapes — MUST use illustrator_path_boolean
Creating >=3 identical shapes — MUST use illustrator_execute_task + element_create_batch
setEntirePath with >12 coord pairs — STOP and use smooth:true or illustrator_path_import_svg
COORDINATE SYSTEM:
API coordinates use top-left origin with y increasing downward (screen space)
ExtendScript expects Y-up internally; use -y when calling Illustrator DOM methods
Units: points (1 pt = 1/72 inch)
Example: to place at visual position (100, 200), use position = [100, -200]
EXAMPLES: Rectangle: doc.pathItems.rectangle(top, left, width, height) ⚠ width & height must be POSITIVE. Negative height → shape above artboard (invisible). Ellipse: doc.pathItems.ellipse(top, left, width, height) Line: var p = doc.pathItems.add(); p.setEntirePath([[x1,-y1], [x2,-y2]]) Color: var c = new RGBColor(); c.red=255; c.green=0; c.blue=0; shape.fillColor = c; Text: var tf = doc.textFrames.add(); tf.contents = "text"; tf.position = [x, -y]; Grid helpers: artboardGrid(cols, rows), itemsInCell(cell, mode)
ELEMENT DISCOVERY:
Use artboardGrid(cols, rows) to partition the artboard into a labeled grid
Use itemsInCell(cell, mode) to find items in a specific grid cell
Modes: 'containsCenter' (default) or 'intersects'
Cell labels follow A1 scheme (letter row + number col, e.g. A1, B3)
MUTATION SAFETY:
Each call increments a mutation counter for VLM QA cadence tracking
Failed executions auto-decrement the counter to avoid cadence drift
Use final_step=true on the last mutation to force a visual checkpoint
NOTES:
Every call increments a mutation counter; annotated preview auto-injected at VLM cadence
Set final_step=true on the last mutation to force a VLM checkpoint
setEntirePath() creates corner points only; set handles after creation
ExtendScript can access File/Folder and OS — treat as open-world
SAFETY:
__mcp_check() watchdog: call as FIRST line inside every for/while body
Never iterate live Illustrator collections if adding/removing items
Use __mcp_forEachSnapshot(collection, fn) or __mcp_snapshot(collection) instead
Inputs: params (required). Returns: result
illustrator_execute_taskADestructive
Execute a structured task using the Task Protocol v2.1.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=False
WHEN TO USE:
Creating/modifying elements with declarative ops (element_create, style_set, etc.)
Batch element creation (element_create_batch)
Any operation that benefits from structured error reports and target selectors
EXAMPLES: Smooth curve: illustrator_execute_task(payload={task: "element_create", params: { type: "path", points: [[0,50],[50,0],[100,50],[150,0]], smooth: true, tension: 0.5, fill: {r: 0, g: 150, b: 136}}}) Batch shapes: illustrator_execute_task(payload={task: "element_create_batch", params: { template: {type: "ellipse", rx: 4, ry: 3}, array: {count: 47, startX: 180, spacingX: 15}}}) Grid layout: illustrator_execute_task(payload={task: "element_create_batch", params: { template: {type: "rect", w: 8, h: 8}, array: {count: 50, cols: 10, spacingX: 15, spacingY: 15}}})
TARGET SELECTORS: {type: "selection"} — current selection (default) {type: "layer", layer: "Layer 1"} — all items on layer {type: "query", itemType: "PathItem", pattern: "axis_*"} — pattern match {type: "all", recursive: true} — all items in document {type: "id", ids: ["A1", "A2"]} — stable MCP ID targeting
OPTIONS: dryRun: true — compute actions without applying trace: true — include execution trace in report assignIds: true — write unique IDs to item.note (opt-in)
NOTES:
All task+params must be wrapped in a 'payload' field
For boolean ops use illustrator_path_boolean, not execute_task
For raw SVG path data use illustrator_path_import_svg
Inputs: params (required). Returns: result
illustrator_export_documentADestructive
Export the active document to PNG, JPG, SVG, or PDF.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=True
WHEN TO USE:
Generating raster output (PNG, JPG) with optional scale factor
Exporting vector formats (SVG, PDF)
Getting visual feedback by setting return_image=True (PNG/JPG only)
EXAMPLES: illustrator_export_document(file_path="C:/out/fig.png", format="png", scale=2.0) illustrator_export_document(file_path="C:/out/fig.pdf", format="pdf") illustrator_export_document(file_path="C:/out/fig.png", return_image=True, artboard_only=True)
NOTES:
artboard_only=True clips export to artboard; a pre-check warns if nothing is on it
PDF export uses saveAs (longer timeout)
return_image returns base64 image bytes as ImageContent for visual verification
Overwrites existing file at file_path (destructive to filesystem)
Inputs: params (required). Returns: result
illustrator_get_documentARead-onlyIdempotent
Get complete document information and structure as a JSON tree.
CONTRACT: readOnly=True, destructive=False, idempotent=True, openWorld=False
WHEN TO USE:
Understanding canvas state before writing modification scripts
Inspecting layers, items, positions, and properties
Getting Illustrator application info (scope='app')
OPTIONS: scope: 'document' (default), 'app', or 'both' max_items: items per layer, 1-5000 (default 200) max_layers: layers to return, 1-200 (default 50) offset: skip first N items per layer (for paging) layer_name / layer_index: filter to single layer
EXAMPLES: illustrator_get_document() illustrator_get_document(scope="app") illustrator_get_document(layer_name="Layer 1", offset=200, max_items=200)
NOTES:
If a layer is truncated, response includes truncated=true and nextOffset
scope='both' returns {document: {...}, app: {...}}
Inputs: params (required). Returns: result
illustrator_historyADestructive
Undo or redo actions in Illustrator.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=False
WHEN TO USE:
Reverting mistakes (action='undo', count=N)
Restoring undone changes (action='redo')
Saving/restoring named checkpoints for recovery
EXAMPLES: illustrator_history(action="undo", count=3) illustrator_history(action="checkpoint_save", name="before_boolean") illustrator_history(action="checkpoint_restore", name="before_boolean") illustrator_history(action="checkpoint_list")
NOTES:
Checkpoints capture MCP-managed items only (those with @mcp:id)
checkpoint_restore is mutate-in-place; may require multiple undo to revert
undo/redo change document state (destructive)
Inputs: params (required). Returns: result
illustrator_path_booleanADestructive
Perform boolean operations (subtract, unite, intersect, xor) on paths.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=False
WHEN TO USE:
Combining shapes (unite), cutting holes (subtract), finding overlaps (intersect)
Any shape sculpting that needs boolean geometry
PIPELINE:
Extract geometry from Illustrator paths (ExtendScript)
Flatten Bezier curves if present (Python)
Run boolean operation via Clipper (Python)
Reconstruct result as PathItem or CompoundPathItem (ExtendScript)
Delete originals on success (if delete_originals=True)
EXAMPLES: illustrator_path_boolean(operation="unite", subject="body_id", clip=["wing_id"]) illustrator_path_boolean(operation="subtract", subject="plate_id", clip=["hole_id"])
NOTES:
Operates on fill geometry only — strokes are ignored (warning emitted)
Simple results produce PathItem; shapes with holes produce CompoundPathItem
Subject and clip identified by MCP ID (@mcp:id in item.note)
Inputs: params (required). Returns: result
illustrator_path_import_svgA
Import an SVG path d attribute into the active document.
CONTRACT: readOnly=False, destructive=False, idempotent=False, openWorld=False
WHEN TO USE:
Importing existing SVG path data (d strings) into Illustrator
Complex outlines, organic shapes, arcs described in SVG syntax
EXAMPLES: illustrator_path_import_svg(d="M 10 50 C 20 20, 80 20, 90 50 Z") illustrator_path_import_svg(d="M 0 0 L 100 0 L 100 100 Z", fill={r: 255, g: 0, b: 0})
NOTES:
Parses SVG d string server-side, converts arcs to cubic Beziers
Safety limits: 50,000 chars, 5,000 segments, 100 subpaths, +/-100,000 coords
Returned bounds are [left, top, right, bottom] in Illustrator's native Y-up space
For new shapes prefer illustrator_execute_task + element_create with smooth:true
Inputs: params (required). Returns: result
illustrator_place_fileADestructive
Place an external file (EPS, AI, PDF, image) into the document.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=True
WHEN TO USE:
Importing raster images (PNG, JPG) into Illustrator
Placing vector files (EPS, AI, PDF, SVG)
Vectorizing raster images via Image Trace (trace=True)
KEY CONCEPTS: linked=True (drafting) — file updates automatically when source changes linked=False (final) — file is embedded and fully editable embed_editable=True — opens PDF, copies content as editable vectors (slower) trace=True — place raster, then run Image Trace to vectorize
EXAMPLES: illustrator_place_file(file_path="C:/img/photo.png", x=100, y=50, linked=True) illustrator_place_file(file_path="C:/img/photo.png", trace=True, trace_preset="6 Colors")
NOTES:
trace + expand=True: editable paths, higher DOM complexity
trace + expand=False: live trace PluginItem, lighter but limited editability
High-complexity images may produce >2000 paths (warning emitted)
Reads external files from filesystem (openWorld)
Inputs: params (required). Returns: result
illustrator_preflight_checkARead-onlyIdempotent
Perform observational validation on the active document.
CONTRACT: readOnly=True, destructive=False, idempotent=True, openWorld=False
WHEN TO USE:
Before export to catch common issues
Validating document state after a series of modifications
KEY CONCEPTS: Checks for: items outside artboard bounds, zero-size items, empty text frames, locked layers/items. Does NOT modify the document.
NOTES:
Returns ok=true if all checks pass, with warnings for issues found
Bounds policy: 'warn' (default) emits warnings; 'error' sets ok=false
Inputs: params (required). Returns: result
illustrator_query_itemsARead-onlyIdempotent
Query items using the Task Protocol with declarative target selection.
CONTRACT: readOnly=True, destructive=False, idempotent=True, openWorld=False
WHEN TO USE:
Finding items by type, name pattern, or location before modification
Inspecting current selection
Listing all items on a layer or in the document
TARGET SELECTORS: {type: "selection"} — current selection (default) {type: "layer", layer: "Layer 1"} — all items on layer {type: "all", recursive: true} — all items in document {type: "query", itemType: "PathItem", pattern: "axis_*"} — filter by type/name
NOTES:
Returns ItemRef for each matched item, enabling stable references
Set include_trace=True for debugging
Inputs: params (required). Returns: result
illustrator_set_referenceADestructiveIdempotent
Set or clear a reference image on a locked background layer for tracing.
CONTRACT: readOnly=False, destructive=True, idempotent=True, openWorld=True
WHEN TO USE:
Preparing a reference image overlay before manual or automated tracing
Clearing a previous reference (omit file_path)
KEY CONCEPTS: Places image on a dedicated 'reference' layer at the bottom of the stack. Layer is locked, dimmed, and non-printable to prevent accidental edits. Calling again with the same file replaces the previous reference (idempotent).
EXAMPLES: illustrator_set_reference(file_path="C:/ref/sketch.png", opacity=50) illustrator_set_reference() -- clears the reference layer
NOTES:
Removal mode (no file_path) is destructive — deletes the reference layer
Uses the active artboard for fit/center calculations
Extracts dominant colors from reference image if Pillow is available
Inputs: params (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
The tools have clearly distinct purposes, with explicit decision rules and an abstraction ladder separating raw script execution from structured task execution. Overlaps such as execute_script vs. execute_task and get_document vs. query_items are well resolved by documented use cases and contracts.
All names use a consistent illustrator_ snake_case prefix and are highly readable. A few names are noun-based rather than strict verb_noun (illustrator_document, illustrator_history, illustrator_path_boolean), but the overall convention is predictable.
With 12 tools, the server covers a well-scoped Illustrator automation surface without feeling bloated. Each tool appears to earn its place by addressing document control, creation, inspection, export, history, or specialized path/image operations.
The surface covers document lifecycle, reading, querying, modification via structured tasks or raw script, boolean geometry, SVG import, placement, references, history, export, and preflight checks. Minor gaps exist for explicit element deletion or advanced layer/text management, but the raw script fallback prevents hard dead ends.
Maintenance
Related MCP Connectors
MCP server for AI dialogue using various LLM models via AceDataCloud
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to generate vector graphics in Adobe Illustrator using natural language prompts, by sending ExtendScript commands via a local MCP server.171-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that lets AI assistants control Adobe Illustrator locally—running ExtendScript, capturing canvas screenshots, exporting artwork, and optionally remembering techniques—all without network activity.-
- AlicenseAqualityCmaintenanceControl Adobe Illustrator with natural language from any MCP client, enabling document creation, editing, and export via ExtendScript.291,222 npm8MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to programmatically control Adobe Photoshop through natural language, supporting design, image manipulation, and workflow automation.9,794 npmMIT