Illustrator AI & MCP Control
Enables natural-language generation of vector artwork, logos, geometric patterns, recoloring, and layer organization inside Adobe Illustrator using Google Gemini Flash and Pro models.
Integrates OpenAI GPT-4o into the Illustrator AI assistant, allowing users to generate vector artwork, ExtendScript code, and automated layers from natural language prompts.
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 AI & MCP ControlGenerate a minimalist vector logo of a fox head"
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 AI Assistant & MCP Control
Bridge generative AI directly with Adobe Illustrator.
Generate vector artwork, logos, and layouts directly from natural language prompts, or connect autonomous AI agents via the Model Context Protocol (MCP).
Português • English • Instalação / Installation • Contribuir / Contributing
🇧🇷 Visão Geral (em Português)
O Illustrator AI & MCP Control é uma extensão profissional para o Adobe Illustrator que traz o poder da inteligência artificial generativa diretamente para o fluxo de trabalho vetorial:
💬 AI Assistant Integrado: Converse em linguagem natural direto no painel do Illustrator para desenhar ilustrações vetoriais, criar logos minimalistas, gerar padrões geométricos, recolorir seleções e organizar camadas em tempo real.
⚡ Multi-Provedores de IA: Conecte com Google Gemini (Gemini 2.5 Flash / Pro), OpenAI (GPT-4o), Anthropic Claude (Claude 3.5 Sonnet), Groq (Llama 3.3 70B ultra-rápido) ou OpenRouter.
🎨 Interface 100% Nativa do Illustrator: Desenvolvida com a paleta exata de cores da interface do Adobe Illustrator CC (
#535353), sem barras de rolagem intrusivas e com integração perfeita à área de trabalho.🔌 Ponte MCP (Model Context Protocol): Permite que ferramentas e agentes de IA externos (como Antigravity, Claude Desktop, Cursor ou scripts Python) controlem o Illustrator autonomamente via WebSocket.
🔒 Privacidade Total: Nenhuma chave de API ou dado sai do seu computador. As configurações são salvas apenas localmente.
Related MCP server: illustrator-mcp
🇺🇸 English Overview
Illustrator AI & MCP Control is a hybrid CEP panel and Model Context Protocol server that bridges generative AI models directly into Adobe Illustrator:
Interactive In-Panel AI Chat: Generate production-ready vector artwork, clean ExtendScript code, and automated layers from prompts inside Illustrator.
Top AI Providers Supported: Native integrations for Google Gemini, OpenAI, Anthropic Claude, Groq, and OpenRouter.
Adobe-Native Dark UI: Designed according to Adobe Spectrum / CC Medium Dark standards with invisible scrollbars and artboard awareness.
External MCP Server Bridge: Run the bundled Python MCP server to give external AI assistants full programmatic control over Illustrator.
Zero Configuration Hassle: Includes 1-click automated installers for Windows and macOS with pre-built extension bundles.
🚀 Instalação Rápida (Quick Start)
Windows (1 Clique)
Baixe ou clone este repositório no seu computador:
git clone https://github.com/Bieuulls/Illustrator-AI-MCP.gitClique com o botão direito no arquivo
install-windows.bate selecione "Executar como Administrador".O instalador irá:
Ativar o modo desenvolvedor CEP no Registro do Windows (
PlayerDebugMode).Vincular a extensão diretamente ao diretório de extensões do Adobe Illustrator.
Configurar o ambiente Python para o servidor MCP (caso o Python esteja instalado).
Abra ou reinicie o Adobe Illustrator e acesse: Janela > Extensões > MCP Control (ou Window > Extensions > MCP Control).
macOS
Abra o terminal na pasta do projeto:
bash install-macos.shAbra ou reinicie o Adobe Illustrator e acesse Window > Extensions > MCP Control.
🔑 Configurando sua Chave de IA
Você pode configurar a chave da sua IA preferida de duas formas:
Opção 1: Pela Interface do Painel
No painel MCP Control, clique no botão "Configurar Chave" (ou no ícone de engrenagem ⚙️ no canto superior direito).
Selecione sua IA favorita (Google Gemini, OpenAI, Claude, Groq ou OpenRouter).
Cole sua chave de API e clique em Salvar Chave.
Opção 2: Via Arquivo Local (api_keys.json)
Renomeie o arquivo api_keys.example.json para api_keys.json na raiz e preencha a chave desejada:
{
"gemini": "AIzaSy...",
"openai": "sk-proj-...",
"claude": "sk-ant-...",
"groq": "gsk_...",
"openrouter": "sk-or-..."
}O painel detectará e carregará as chaves automaticamente na inicialização!
🔌 Conexão MCP (Claude Desktop, Antigravity, Cursor)
Para usar com assistentes MCP externos, configure seu cliente adicionando o servidor ao seu arquivo mcp_config.json:
{
"mcpServers": {
"illustrator": {
"command": "python",
"args": ["-B", "-m", "illustrator_mcp.server"],
"env": {
"WS_HOST": "127.0.0.1",
"WS_PORT": "8081",
"TIMEOUT": "30"
}
}
}
}Na aba MCP Bridge do painel dentro do Illustrator, o status ficará verde (● Connected) assim que o cliente MCP iniciar a ponte WebSocket!
🤝 Chamada para Colaboração (Community Call)
Este é um projeto de código aberto feito para e pela comunidade!
Toda ajuda é bem-vinda: seja você um designer testando prompts, um desenvolvedor criando novas ferramentas ou alguém reportando compatibilidade em versões específicas do Illustrator.
Como você pode ajudar a melhorar o projeto?
🧪 Testar Versões do Illustrator: Validar o funcionamento em versões recentes (Illustrator 2022, 2023, 2024 e 2025) tanto no Windows quanto no macOS.
🎨 Melhorar os Prompts de Geração: Aprimorar o system prompt em
cep-extension/src/services/aiService.tspara que a IA crie vetores ainda mais sofisticados (gradientes complexos, malhas, tipografia curvada, máscaras de recorte).💻 Suporte a Modelos Locais (Offline): Adicionar suporte para modelos rodando 100% locais via Ollama, LM Studio ou LocalAI.
🛠️ Novas Ferramentas MCP: Criar novos scripts ExtendScript para automatizar tarefas repetitivas (exportação em lote para SVG/PNG, preflight de arquivos, alinhamento inteligente).
🐛 Reportar Bugs: Encontrou algum erro? Abra uma Issue detalhando o problema!
Consulte o nosso guia CONTRIBUTING.md para saber como rodar o ambiente de desenvolvimento e enviar seus Pull Requests.
📜 Créditos e Agradecimentos
Keda Jin (@jinkeda): Autor original da arquitetura Illustrator_MCP, do servidor Python WebSocket e do motor de execução via ExtendScript.
Desenvolvido com apoio da comunidade open-source para levar IA generativa ao design gráfico vetorial profissional.
📄 Licença
Este projeto é distribuído sob a licença MIT - consulte o arquivo LICENSE para mais detalhes. Livre para uso pessoal, educacional e comercial.
Available Tools
15 toolsillustrator_connection_statusARead-onlyIdempotent
Report whether Illustrator is reachable, and what to fix if not.
CONTRACT: readOnly=True, destructive=False, idempotent=True, openWorld=False
WHEN TO USE:
A call failed with a connection error and you need to know which link broke
Before a session, to confirm the panel is connected
To check whether the panel is busy rather than gone
KEY CONCEPTS: Four layers, outermost first: this server's WebSocket listener, the CEP panel's socket, Illustrator itself, and the active document. The first one that is not ok is reported as blockedAt, and the recovery steps address that link only. Layers behind a broken one read 'unknown' rather than being guessed at.
OPTIONS: probe=false (default) — instant, reads process-local state only probe=true — also round-trips a tiny read-only script to Illustrator
EXAMPLES: Instant report, no host call: {"params": {}} Also confirm Illustrator itself answers: {"params": {"probe": true}}
RESULT: data.ready is true only when every layer is up. data.blockedAt names the first broken layer, or is null. data.recovery lists the steps for it. execution reports whether this report was produced, never whether the connection is healthy — a successful report of a dead panel is a success.
NOTES:
Never starts the server and never reconnects
Trusted probe timeouts retire local waits and require a readiness fence; blocking names the retained job and exact job_status call
Answers normally when Illustrator is closed, which is the point
Without probe, the document name is last-known, not live
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the call read-only, non-destructive, and idempotent. The description adds real behavioral context: it never starts the server or reconnects, answers normally when Illustrator is closed, reports only the first broken layer, and distinguishes a successful report from a healthy connection. This gives the agent a precise behavioral model.
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?
The description is well organized into labeled sections and front-loads the summary. It is verbose and repeats the contract already present in annotations, but each section contributes functional context for diagnosing connection state.
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?
Since there is no output schema, the RESULT section correctly documents data.ready, data.blockedAt, data.recovery, and the execution-vs-health distinction. Combined with examples and notes, nothing essential for calling or interpreting the tool 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 OPTIONS section explains probe's two modes, and the NOTES cover data freshness, which partially compensates for the 0% schema description coverage signal. However, the description never names 'timeout' or 'expected_document_token', so an agent setting those parameters must rely on the input schema alone.
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 opening sentence names a specific verb ('Report') and a concrete resource ('whether Illustrator is reachable') with a recovery angle. It is clearly distinct from sibling tools that execute scripts, export documents, or mutate Illustrator state.
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 'WHEN TO USE' section gives three concrete triggers: after a connection error, before a session, and to distinguish a busy panel from a gone one. It does not explicitly name sibling alternatives or state when not to use this tool, so it stops just short of the top bar for routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
illustrator_documentADestructive
Create, open, list, activate, 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: Create: {"params": {"action": "create", "width": 800, "height": 600, "color_mode": "RGB"}} Open: {"params": {"action": "open", "file_path": "C:/art/figure.ai"}} Save under a new name: {"params": {"action": "save", "file_path": "C:/art/figure_v2.ai"}} Close, saving first: {"params": {"action": "close", "save_before_close": true}}
NOTES:
close without save_before_close=True discards unsaved changes
open/save interact with the filesystem (openWorld)
list exposes live document tokens without changing the shared pin
activate requires expected_document_token and explicitly changes the pin
save/close reject a mismatching active document; close never repins
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond annotations: close without save_before_close=True discards unsaved changes, list does not change the shared pin, activate requires expected_document_token and changes the pin, and save/close reject a mismatching active document. This is valuable operational context.
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?
The description is organized into clear sections: summary, contract, when-to-use, examples, and notes. Every sentence is purposeful, and the most important summary line is front-loaded. No filler or 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 polymorphic tool with six actions, the description covers the full action set with examples, pin semantics, filesystem interaction, and destructive close behavior. There is no output schema, but the description provides enough context for an agent to invoke actions 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?
Despite low schema description coverage reported, the description compensates with concrete examples mapping actions to parameters, such as open requiring file_path and close supporting save_before_close. The notes also clarify shared-pin and expected_document_token semantics, adding meaning beyond the raw schema.
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 opens with a precise verb-plus-resource statement: 'Create, open, list, activate, save, or close an Illustrator document.' This immediately distinguishes it from sibling tools like illustrator_execute_script or illustrator_export_document, which cover other operations.
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 'WHEN TO USE' section gives explicit conditions for create, open, save, and close, plus examples. It does not explicitly name sibling alternatives or state when not to use this tool, but the action-specific guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
To SEE the artwork, use illustrator_observe instead: it returns the image inline with a numbered map of items, their handles and bounds, so there is no file to export, locate and open
EXECUTION CONTRACT:
Your script is evaluated at the top level, not inside a function.
- The value of the LAST EXPRESSION is the result. End with the value
you want back, usually a JSON.stringify(...) call.
- A bare return is a syntax error: "Illegal return outside of a
function body". Wrap the code in a function and call it immediately
when you need an early exit.
- Returning an object is fine; it is serialised for you. Returning
nothing is a valid outcome and is reported as data: null.
Injected helper libraries are declared at the same top level, so they
are in scope either way. See EXAMPLES for both forms.
Top-level {ok:false}, {success:false}, or a string error field produces
a warning, not an execution failure. Nested values remain opaque.
Use throw or mcpFail(message, details) for an explicit failure:
try { doWork(); } catch (e) { mcpFail("Label failed", {cause:String(e)}); }
mcpFail throws an ordinary catchable Error; details are bounded to 2048
characters. Neither throwing nor returning an error rolls back edits.
Host line numbers, when available, refer to injected host code, not
necessarily to the caller's source lines. Verification is separate.
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:
Geometry helpers use artboard-relative coordinates: origin at the active artboard's top-left, with y increasing downward (screen space)
Raw Illustrator DOM positions use document-space coordinates, with y increasing upward; do not assume that the active artboard starts at (0, 0)
Units: points (1 pt = 1/72 inch)
HELPERS — ARTBOARD-RELATIVE, Y-DOWN (includes: ['geometry']): Use these to avoid manual conversion to raw document coordinates: rectXY(x, y, w, h) — rectangle at screen-space (x,y) ellipseXY(x, y, w, h) — ellipse at screen-space (x,y) lineXY(x1, y1, x2, y2) — line between screen-space points polygonXY([[x,y],...], closed)— polygon from screen-space points pointXY(x, y) — returns {left, top} for position assignments drawPathPoints(spec) — full path with handles, UUID, heap registration Example: var rect = rectXY(100, 200, 50, 30); // no -y needed
RAW DOM — DOCUMENT-SPACE, Y-UP (only when helpers are insufficient): These are API snippets to put inside a script, not tool calls. Convert an artboard-relative point before passing it to the DOM: var ab = doc.artboards[doc.artboards.getActiveArtboardIndex()].artboardRect; var position = [ab[0] + x, ab[1] - y]; // Nonzero-origin example: ab top-left (72, 720), (x, y) = (100, 200) // gives the raw DOM position [172, 520]. Rectangle: doc.pathItems.rectangle(position[1], position[0], width, height) ⚠ width & height must be POSITIVE. Negative height → shape above artboard (invisible). Ellipse: doc.pathItems.ellipse(position[1], position[0], width, height) Line: convert each artboard-relative point with the same ab-offset formula 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 = position; Grid helpers: artboardGrid(cols, rows), itemsInCell(cell, mode)
EXAMPLES: Read with a native-coordinate crop: { "params": { "script": "app.activeDocument.name;", "return_preview": true, "clip_box": [ 0, 125, 125, 0 ], "clip_space": "illustrator_native_y_up" } } Draw in artboard-relative Y-down coordinates with geometry helpers: { "params": { "script": "var r = rectXY(50, 80, 200, 100); r.fillColor = makeRGBColor(255, 0, 0); r.name;", "includes": [ "geometry" ], "description": "red banner" } } Position text from an offset artboard using raw DOM coordinates: { "params": { "script": "var doc = app.activeDocument; var ab = doc.artboards[doc.artboards.getActiveArtboardIndex()].artboardRect; var x = 100; var y = 200; var tf = doc.textFrames.add(); tf.contents = 'Offset'; tf.position = [ab[0] + x, ab[1] - y]; tf.position;", "description": "raw DOM offset-artboard placement" } } Read state back; the last expression is the result: {"params": {"script": "JSON.stringify({items: app.activeDocument.pageItems.length});"}} Return early, which needs a function wrapper: { "params": { "script": "(function () { var d = app.activeDocument; if (d.pageItems.length === 0) return 'empty'; return d.pageItems[0].name; })()" } } A readback, declared so it is not treated as an edit: { "params": { "script": "JSON.stringify({name: app.activeDocument.name});", "read_only": true } }
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 per-document mutation counter
Failed executions decrement it again, so failures do not accumulate
A raw script is opaque to this server, so it cannot tell which kind of change you made. Evidence is therefore requested on a backlog rule rather than on the operations performed, unlike illustrator_execute_task
Use final_step=true on the last mutation to require final evidence
NOTES:
When evidence is required the result carries a VERIFICATION REQUIRED block naming what to confirm, and diagnostics.evidence says whether an image was actually supplied
return_preview=false suppresses capture but not the requirement, which is then reported unmet rather than dropped
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
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavior beyond annotations: the execution contract (last-expression value, illegal return), error handling via mcpFail, mutation counter and evidence requirements, safety watchdog, open-world access, coordinate system differences, and helper libraries. It explains that raw scripts are opaque to the server and how read_only parameter affects evidence. This far exceeds what annotations alone convey.
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?
The description is long but well-structured with clear headings (CONTRACT, WHEN TO USE, EXECUTION CONTRACT, etc.). It front-loads the purpose and usage, and uses examples effectively. Some redundancy exists (coordinate system repeated across sections), but given the tool's complexity, the length is justified. It is not over-verbose to the point of harming 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?
The description covers every aspect an agent needs to call the tool correctly: execution semantics, coordinate conversions, helper functions, error handling, safety, mutation evidence, and decision rules. It also references sibling tools for routing. The output schema is absent, but the description clearly explains the result format (last expression serialized, data:null for nothing). Nothing critical 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 schema already contains rich descriptions for every parameter (script, includes, clip_box, read_only, etc.), so the baseline is 3. The description adds context about coordinate systems for clip_box and clip_space, and mentions helper functions that relate to includes, but does not redefine parameter meanings. It does not materially improve upon the schema's own documentation.
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 line states the verb and resource clearly: 'Execute raw JavaScript/ExtendScript code in Adobe Illustrator.' It distinguishes itself from siblings by explicitly naming alternatives like illustrator_observe for seeing artwork and listing higher-level tools in the abstraction ladder. An agent can immediately know this is the low-level script runner.
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 'WHEN TO USE' section lists explicit use cases (one-off items, quick prototypes, operations not covered by higher-level tools) and points to illustrator_observe as the alternative for visual inspection. The 'DECISION RULES' section states MUST-use requirements for other tools (e.g., path_boolean for boolean ops, task+batch for identical shapes), leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
illustrator_execute_taskADestructive
Execute structured SOC operations or a compatibility callback pipeline.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=True
WHEN TO USE:
Prefer params.batch for all 48 JSX operations; the nine pilot models retain stronger nested typing. {operation_index}
Compatibility params.payload remains supported for ordered mixed sequences under payload.params.ops; it uses the same static validation pipeline.
The payload route also accepts compatibility callback hooks: collect_fn selects a callable, while compute_fn and apply_fn are arbitrary ExtendScript callback bodies. They have the same File, Folder, and OS access as raw ExtendScript, so this tool is open-world while they exist.
Provide exactly one of params.batch or params.payload.
EXAMPLES: One structured operation (the preferred form): { "params": { "batch": { "operations": [ { "task": "element_create", "params": { "type": "rect", "x": 40, "y": 40, "width": 200, "height": 120, "fill": { "r": 0, "g": 150, "b": 136 } } } ] } } } Several operations, stopping at the first failure: { "params": { "batch": { "operations": [ { "task": "element_create", "params": { "type": "ellipse", "x": 0, "y": 0, "width": 60, "height": 60, "id": "dot" } }, { "task": "element_modify", "targets": { "type": "id", "ids": [ "dot" ] }, "params": { "x": 120 } } ], "stopOnError": true } } } Validate a batch without applying it: { "params": { "batch": { "operations": [ { "task": "element_create", "params": { "type": "star", "x": 100, "y": 100, "numPoints": 5, "outerRadius": 40, "innerRadius": 18 } } ], "mode": "validate" } } } Create a layer through the compatibility route: {"params": {"payload": {"task": "layer_create", "params": {"name": "Background"}}}} Create a layer, then a rectangle on it, in one batch: { "params": { "batch": { "operations": [ { "task": "layer_create", "params": { "name": "Background" } }, { "task": "element_create", "params": { "type": "rect", "x": 0, "y": 0, "width": 800, "height": 600, "layer": "Background" } } ], "stopOnError": true } } }
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: batch.stopOnError and payload.options.stopOnError stop after the first failed operation. They preserve earlier edits and do not provide transactional rollback. payload.options.mode and stopOnError are honored by the default structured SOC route. trace is honored by both structured and callback routes. payload.options.kind, skipCollect, minCreated, idPolicy, and the deprecated assignIds alias are callback-pipeline controls. The default SOC route forces kind="creation", resolves per-op targets, and has no apply callback. retry, idempotency, and timeout are compatibility fields that still validate but are currently ignored by this executor. It does not call the retry wrapper or use payload.options.timeout as its host deadline. dryRun — NOT SUPPORTED; rejected before execution. It could not prevent mutation (batch ops run during compute) and reported otherwise. To inspect without changing anything, use query_items, preflight_check, or get_document. rollback, snapshot, and recompute — NOT SUPPORTED; enabled requests are rejected before host dispatch. Explicit false/null disabled forms remain valid. Unknown task, payload, batch, operation, option, and nested retry fields are rejected. Use stopOnError instead of the internal strict spelling.
RESULT: structuredContent carries the canonical result object: execution status, data, effects, verification, recovery, warnings and truncation. isError reflects the EXECUTION outcome only — a failed or unavailable visual check never turns a successful edit into a tool error.
NOTES:
With the default SOC executor (no custom compute function), the server injects payload.options.kind="creation" so outer collection is skipped while each operation resolves its own targets. Callers may omit kind.
Both SOC routes validate the complete operation tree before dispatch. Availability, required fields, broad types, enums and unknown keys are checked from the shared contract. Pilot nested models remain stronger.
Path handles and mirror modifiers normalize once for single operations, batch operations and compound children. Runtime fields and targets stay deferred; stopOnError does not promise rollback or successful assertions.
Static request limits: 1000 operations, JSON depth 32, selector depth 16, 10000 expanded items and 100000 expanded geometry points. Dynamic values remain subject to host limits when evaluated.
For boolean ops use illustrator_path_boolean, not execute_task
For raw SVG path data use illustrator_path_import_svg
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the CONTRACT line (readOnly=False, destructive=True, idempotent=False, openWorld=True) which matches and expands on the annotations. It discloses critical behavioral traits beyond the annotations: dryRun is NOT SUPPORTED and rejected because it could not prevent mutation; rollback/snapshot/recompute are rejected; unknown fields are rejected; isError reflects execution outcome only. It also explains the open-world risk from callback functions having File/Folder/OS access. This is far beyond what annotations provide.
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?
The description is extremely long, but it is exceptionally well-structured with clear sections (CONTRACT, WHEN TO USE, EXAMPLES, TARGET SELECTORS, OPTIONS, RESULT, NOTES) and front-loads the most critical facts (purpose, contract, usage guidance) early. Every section earns its place given the complexity of the tool; however, it could be trimmed without losing essential content (e.g., some NOTES details are redundant with OPTIONS). A 4 reflects its length, but the structure prevents it from being unwieldy.
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 description covers every aspect an agent needs to call this tool correctly: the two input routes, target selectors, option semantics (including unsupported ones), static request limits, validation behavior, result structure, and alternatives. It explains the relationship between batch and payload, and how callback pipelines differ. Given the enormous schema and no output schema, the description leaves no major gap.
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?
Though the schema coverage is 0%, the description compensates comprehensively. It explains the meaning of the top-level params.batch and params.payload, details options like stopOnError, mode, dryRun (unsupported), retry/timeout (ignored), and clarifies which options apply to which route. It even provides examples of parameter structures. This is a textbook case of description carrying the full semantic weight.
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 opening line 'Execute structured SOC operations or a compatibility callback pipeline' states a specific verb (execute) and a specific resource (SOC operations / callback pipeline). It also distinguishes itself from siblings in the WHEN TO USE section by naming alternatives like illustrator_path_boolean for boolean ops and illustrator_path_import_svg for SVG data, making the tool's scope unmistakable.
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 WHEN TO USE section is explicit: 'Prefer params.batch for all 48 JSX operations' and explains when the payload route is appropriate (ordered mixed sequences, callback hooks). It also provides direct exclusions: 'For boolean ops use illustrator_path_boolean, not execute_task' and 'For raw SVG path data use illustrator_path_import_svg'. This gives unambiguous guidance on when to use this tool vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
illustrator_export_documentADestructive
Export the active document to PNG or JPG. Native SVG and PDF are refused.
CONTRACT: readOnly=False, destructive=True, idempotent=False, openWorld=True
WHEN TO USE:
Generating raster output (PNG, JPG) with optional scale factor
Native SVG is disabled: live export changed the source file association
Getting visual feedback by setting return_image=True (PNG/JPG only)
NOT for looking at your work in progress. Exporting writes a file to disk and overwrites whatever was there. To see the artwork, call illustrator_observe: it returns the image inline together with a numbered map of items, their handles and their bounds, with no file to create, locate and open. Export when you want a deliverable
EXAMPLES: PNG at twice the size: {"params": {"file_path": "C:/out/fig.png", "format": "png", "scale": 2.0}} PDF refusal; use a separate working copy with Illustrator PDF save: {"params": {"file_path": "C:/out/fig.pdf", "format": "pdf"}} SVG refusal after source-association failure; use a separate working copy: {"params": {"file_path": "C:/out/fig.svg", "format": "svg"}} PNG of the artboard, returned inline as well: {"params": {"file_path": "C:/out/fig.png", "return_image": true, "artboard_only": true}} Refuse rather than overwrite an existing file: {"params": {"file_path": "C:/out/fig.png", "format": "png", "overwrite": "fail"}} Keep the old file and write beside it: {"params": {"file_path": "C:/out/fig.png", "overwrite": "version"}}
NOTES:
artboard_only=True clips export to artboard; a pre-check warns if nothing is on it
Native PDF is temporarily disabled because saveAs changes source state
Native SVG is temporarily disabled after a measured source-association failure
return_image returns base64 image bytes as ImageContent for visual verification
An existing file is resolved before dispatch per
overwrite, so Illustrator is never asked to confirm a replacement. Its Replace Files prompt is modal and would hang the host until a person clicked itoverwrite='replace' retains a unique sibling backup until completion
Unknown completion retains the backup; use illustrator_job_status with finalize_export=true on the returned jobId after completion is established
Backup ownership is in-memory; after server restart use manual recovery
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive=true and readOnly=false, but the description adds crucial behavioral detail: exporting writes a file and overwrites existing ones, the overwrite modes avoid Illustrator's modal prompt, and the backup/recovery nuances. It also explains why SVG/PDF are refused (source-association failure, state changes). This goes well beyond the annotations and warns of 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?
The description is long but deliberately structured with sections (contract, when-to-use, examples, notes). The opening sentence is a clear summary, and subsequent sections add necessary depth. Every paragraph serves a purpose; for a tool with this complexity (overwrite modes, async job handling, format restrictions), the length is justified. It is not redundant or padded.
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 tool's complexity—multiple formats, overwrite policies, async job completion, artboard options, and destructive nature—the description covers all critical aspects: format refusal rationale, overwrite behavior with backup, return_image usage, artboard clipping, and even how to finalize via illustrator_job_status. The agent has everything needed to call it correctly and safely.
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 schema itself provides thorough descriptions for every parameter (scale, format, overwrite, return_image, etc.), so the schema coverage is high. The description adds marginal semantic value—it reinforces format restrictions and explains the overwrite behavior in the notes, but most parameter meaning is already in the schema. The examples illustrate usage but don't redefine semantics. 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?
The description opens with a precise statement: 'Export the active document to PNG or JPG. Native SVG and PDF are refused.' This names the exact verb, resource, and acceptable formats, and explicitly differentiates from sibling tools like illustrator_observe (which returns images inline for viewing) and import tools. The purpose is unmistakable.
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?
A dedicated WHEN TO USE section provides explicit guidance: it states when to use (raster export, visual feedback) and when not to (NOT for looking at work in progress) and names the alternative tool (illustrator_observe) with its advantage. It also gives concrete examples covering normal export, refusal cases, and overwrite strategies, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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')
This reports structure, not appearance. For what the page looks like, call illustrator_observe; for whether it is fit to export, call illustrator_preflight_check
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: Document structure: {"params": {}} Application info, with no document open: {"params": {"scope": "app"}} One layer, paginated: {"params": {"layer_name": "Layer 1", "offset": 200, "max_items": 200}} Symbol definitions and instances, without placing anything: {"params": {"scope": "symbols"}} One symbol, names and counts only: {"params": {"scope": "symbols", "symbol_name": "icon-star", "symbol_contents": false}}
NOTES:
If a layer is truncated, response includes truncated=true and nextOffset
scope='both' returns {document: {...}, app: {...}}
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, and idempotent, and the description reinforces this with a CONTRACT line. It adds meaningful behavioral context beyond the annotations: pagination via truncated/nextOffset, scope='both' return shape, read-only symbol traversal, and token mismatch warnings. This goes well beyond the structured metadata.
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?
The description is long but earns its length: CONTRACT, WHEN TO USE, OPTIONS, EXAMPLES, and NOTES are clearly separated and front-loaded. The examples are representative rather than repetitive, and every section contributes to selecting or invoking the tool correctly.
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 no output schema and a fairly complex parameter space, the description is unusually complete. It covers scope variants, pagination, layer filtering, symbol handling, truncation signaling, and return shape for scope='both'. The sibling guidance and token note fill the remaining contextual gaps an agent needs to call the tool effectively.
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?
Although context signals report 0% schema description coverage at the wrapper level, the nested schema actually documents each parameter, and the description independently summarizes scope, max_items, max_layers, offset, and filters. Examples show realistic parameter combinations and paging usage, adding value beyond schema descriptions, especially for symbol scope and truncation behavior.
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 specific verb and resource: 'Get complete document information and structure as a JSON tree.' It clearly distinguishes itself from siblings by noting it reports structure, not appearance, and routes visual inspection to illustrator_observe and export readiness to illustrator_preflight_check. This gives an agent a precise mental model of what the tool does and does not do.
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?
A dedicated WHEN TO USE section lists concrete scenarios: understanding canvas state before writing scripts, inspecting layers/items/properties, and getting app info. It also explicitly says when not to use it—for appearance use illustrator_observe, for export fitness use illustrator_preflight_check—which is strong alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: Undo three steps: {"params": {"action": "undo", "count": 3}} Save a checkpoint before risky work: {"params": {"action": "checkpoint_save", "name": "before_boolean"}} Restore it: {"params": {"action": "checkpoint_restore", "name": "before_boolean"}} List checkpoints: {"params": {"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)
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The CONTRACT line aligns with annotations, and the NOTES add non-obvious behavioral context: checkpoints only cover MCP-managed items, checkpoint_restore is mutate-in-place and may need multiple undo steps, and undo/redo are destructive. This goes beyond what annotations alone reveal.
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?
Well structured with CONTRACT, WHEN TO USE, EXAMPLES, and NOTES. The primary purpose is front-loaded, examples are compact, and each section earns its place without excessive prose.
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?
Covers the main invocation patterns for undo, redo, checkpoint save/restore/list, and notes the key risks. The schema supplies the remaining enum and parameter details, including checkpoint_delete. Without an output schema, some return-value expectations are left to the agent, but that is not a significant gap for this tool.
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 schema already documents all five parameters with descriptions, so the baseline is 3. The description adds concrete JSON examples showing valid combinations of action with count and name, which clarifies how to structure calls. It does not elaborate on jobId or expected_document_token, but the schema covers those.
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?
Opens with a specific verb and resource: 'Undo or redo actions in Illustrator,' and the examples extend that to named checkpoints. This clearly distinguishes it from the sibling tools, none of which cover undo/redo or history management.
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?
A dedicated WHEN TO USE section lists concrete scenarios: reverting mistakes, restoring undone changes, and saving/restoring checkpoints. It does not explicitly name alternatives or when not to use the tool, but the guidance is clear enough for an agent to select this tool for history operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
illustrator_job_statusADestructiveIdempotent
Inspect a retained Illustrator job; optionally finalize its export files.
CONTRACT: readOnly=False, destructive=True, idempotent=True, openWorld=True
WHEN TO USE:
After illustrator_execute_task returned an unknown/timeout outcome.
To inspect a retained job by its jobId before considering a retry.
RESULT: Returns the Python record immediately for queued/running jobs. For an unresolved terminal record, queries the bounded host ledger when the CEP panel is available and idle, then mirrors a completed outcome locally.
EXAMPLES: Reconcile a job whose reply was lost: {"params": {"jobId": "job_7f3a91c2"}}
NOTES:
This tool never re-executes the original request.
Default inspection never changes files. finalize_export=true explicitly finalizes the selected export's owned backup after known completion. This can restore a destination or delete its backup, and is idempotent. Unknown completion retains both paths. In-memory ownership is lost on process restart; remaining backups then require manual recovery.
Explicit finalization succeeds only for verified output or restored backup. Conflict, pending completion/cleanup, and failure return failed execution with the retained file state; ordinary inspection may still successfully report those states.
A reset, expired record, missing finalizer, or busy host remains unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining that default inspection never changes files, while finalize_export=true can restore or delete backups, and that unknown completion retains both paths. It also discloses failure modes, state loss on process restart, and conditions that result in unknown status. This is rich behavioral disclosure with no contradiction against the annotated hints.
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?
The description is well-structured with clear sections: CONTRACT, WHEN TO USE, RESULT, EXAMPLES, and NOTES. Every section adds meaningful operational information, and the most important distinction—'never re-executes the original request'—is prominently placed. Despite being lengthy, the density and relevance of the information justify the length.
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?
There is no output schema, so the description correctly explains the result behavior: immediate Python record for queued/running jobs, ledger query for unresolved terminal records, and mirrored completion locally. It also covers failure and unknown cases, making the tool's behavior predictable enough for an agent to use correctly without additional context.
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 input schema already provides detailed descriptions for jobId, detail, finalize_export, and expected_document_token. The description adds valuable meaning for jobId (retained job reconciliation) and finalize_export (backup restore/delete semantics), but says nothing about detail or expected_document_token. Since the schema covers those well and the description adds some extra context, a middle score is appropriate.
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 opens with a specific verb and resource: 'Inspect a retained Illustrator job; optionally finalize its export files.' This clearly distinguishes it from sibling execution tools like illustrator_execute_task and illustrator_export_document. The WHEN TO USE section reinforces that this is the reconciliation/inspection tool for previously retained jobs.
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 WHEN TO USE section explicitly states the two intended scenarios: after illustrator_execute_task returns an unknown/timeout outcome, and before considering a retry of a retained job. The NOTES also clarify what the tool does not do ('never re-executes the original request'), giving the agent explicit guidance for choosing this over re-running a task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
illustrator_observeAIdempotent
Capture coordinated visual evidence and precise follow-up handles.
CONTRACT: readOnly=False, destructive=False, idempotent=True, openWorld=True
WHEN TO USE:
Inspecting current artwork before or after managed edits
Obtaining raw or annotated previews and an annotation-to-handle map
Capturing a high-resolution crop without a dummy mutation
OPTIONS: mode: raw, annotated, or both clip_box: optional targeted crop in artboard-relative screen coordinates max_items: annotation-map cap; omissions are reported explicitly
RESULT: Returns image content plus context, timing, annotation map, handle expiry, managed runtime generation, omissions, and preservation verification.
EXAMPLES: Compact annotated evidence and handles: {"params": {"mode": "annotated", "detail": "summary", "map_detail": "compact"}} Look at the page and get handles for what is on it: {"params": {"mode": "both"}} Crop to a region, in artboard-relative points: {"params": {"mode": "raw", "clip_box": [0, 0, 200, 120]}} Compare every artboard on one contact sheet: {"params": {"artboards": "all"}} Three specific boards, on a checkerboard: {"params": {"artboards": [0, 2, 5], "background": "checkerboard"}}
NOTES:
Handles are document/session scoped and never stamp notes
A sampled fingerprint is not used as a document revision
The coordinator prevents managed mutations from interleaving with capture
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is unusually transparent: it restates the contract, explains handle expiry and scoping, says handles never stamp notes, clarifies fingerprints are not revisions, and notes the coordinator prevents managed mutations from interleaving. These details go well beyond the annotations and do not contradict them.
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?
The description is long but well-organized into CONTRACT, WHEN TO USE, OPTIONS, RESULT, EXAMPLES, and NOTES, making it scannable. The first sentence states the core purpose immediately, though the five examples and repeated contract details add bulk without much additional selection value.
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 no output schema, the RESULT section adequately enumerates what is returned: image content, annotation map, handle expiry, timing, omissions, and preservation verification. Combined with the shared pin/expected token guidance, the notes, and schema-rich parameter descriptions, an agent has enough context to invoke this tool 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?
The OPTIONS section summarizes mode, clip_box, and max_items, and adds a behavior not in the schema: max_items omissions are reported explicitly. The input schema already documents the remaining parameters thoroughly, and the EXAMPLES section models valid combinations such as clip_box coordinates and artboard lists.
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 opening line 'Capture coordinated visual evidence and precise follow-up handles' names a specific verb and resource, and the WHEN TO USE section clarifies it is for inspection, previews, and annotation maps rather than edits or exports. This clearly distinguishes it from siblings like illustrator_execute_script and illustrator_export_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?
The WHEN TO USE bullets give concrete scenarios: inspecting artwork before/after edits, obtaining previews plus annotation-to-handle maps, and capturing crops without a dummy mutation. It does not explicitly name sibling alternatives or say 'do not use X instead', so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: Unite: {"params": {"operation": "unite", "subject": "body_id", "clip": ["wing_id"]}} Subtract a hole: {"params": {"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
Each operand is an MCP ID or a selector resolving exactly one path.
Untagged paths use handle selectors from query/observe; notes are not stamped.
Duplicate/overlapping operands and stale handles are refused before commit.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond annotations. It declares the CONTRACT (readOnly=False, destructive=True, idempotent=False, openWorld=False), outlines a 5-step pipeline, and details important behaviors: strokes are ignored, result type depends on holes, selectors must resolve exactly one path, untagged paths use handles, and duplicate/overlapping operands are refused. This fully discloses side effects and constraints.
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?
The description is structured into labeled sections (CONTRACT, WHEN TO USE, PIPELINE, EXAMPLES, NOTES) that front-load the purpose and then provide procedural and edge-case details. It is longer than average but appropriately so for a tool with this complexity; every section earns its place without 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?
The description covers the operation, use cases, execution pipeline, concrete examples, and important behavioral notes (fill-only, result types, selector constraints, duplicate refusal). There is no output schema, but the description compensates by specifying the expected result types. For a tool of this complexity, nothing essential 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?
Although the schema already provides rich parameter descriptions (e.g., clip, subject, operation), the description adds practical clarity through examples (Unite, Subtract) and notes about selector resolution and handle behavior. It explains that each operand must resolve to exactly one path, which is critical for correct use, and clarifies the distinction between PathItem and CompoundPathItem results. This exceeds the schema's static descriptions.
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 opens with a precise statement: 'Perform boolean operations (subtract, unite, intersect, xor) on paths.' This identifies the specific verb, resource (paths), and operation set, making the tool's purpose unmistakable. It naturally distinguishes itself from sibling tools (scripting, export, job status, etc.) as the only path-boolean 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 'WHEN TO USE' section explicitly lists common scenarios (combining shapes, cutting holes, finding overlaps) and broad applicability ('any shape sculpting that needs boolean geometry'). It lacks an explicit 'when NOT to use' or named alternatives, but given the tool's unique role among siblings, this is a minor omission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: A curve: {"params": {"d": "M 10 50 C 20 20, 80 20, 90 50 Z"}} Filled red: {"params": {"d": "M 0 0 L 100 0 L 100 100 Z", "fill": {"r": 255, "g": 0, "b": 0}}} Stroked with no fill: { "params": { "d": "M 0 0 L 50 50 L 100 0", "stroke": { "r": 0, "g": 0, "b": 0, "width": 2 }, "fill": false } } With an explicit id for later targeting: {"params": {"d": "M 0 0 L 100 0 L 100 100 Z", "id": "triangle"}}
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
fill/stroke: None=leave default, False=force off, {r,g,b}=force color
id: must be unique; collision with existing @mcp:id raises an error
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=False, destructive=False, idempotent=False, and openWorld=False, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: it parses SVG server-side, converts arcs to cubic Beziers, enforces safety limits (50,000 chars, 5,000 segments, 100 subpaths, +/-100,000 coords), returns bounds in Y-up space, and explains fill/stroke semantics (None=leave default, False=force off, {r,g,b}=force color). It also discloses that id collisions raise errors. This is rich behavioral disclosure that goes well beyond the structured annotations.
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?
The description is well-structured with clear sections (CONTRACT, WHEN TO USE, EXAMPLES, NOTES) and front-loads the core purpose in the first sentence. The examples are valuable but somewhat lengthy, and the NOTES section contains a mix of critical behavioral details and minor parameter clarifications. Every section earns its place, though the examples could be trimmed slightly without losing value.
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 tool with no output schema and 0% schema description coverage, the description carries a heavy burden. It covers the input format, safety limits, return bounds, fill/stroke semantics, id uniqueness, and the alternative tool for new shapes. The main gaps are the lack of explanation for tag, name, layer, and jobId parameters, and no explicit statement about what the return value looks like beyond bounds. However, the description is substantially complete for an agent to call this tool correctly in most scenarios.
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 0%, so the description must compensate for the schema's lack of parameter documentation. The description does this well: it explains the fill/stroke tri-state semantics (None=leave default, False=force off, {r,g,b}=force color), the id uniqueness requirement, and the d string parsing behavior. The examples also demonstrate how to structure fill, stroke, and id parameters. However, it doesn't explicitly explain the tag, name, layer, or jobId parameters, which are left to the schema (which has no descriptions for them either). Still, the description covers the most critical parameters and the examples are instructive.
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 opens with a specific verb and resource: 'Import an SVG path d attribute into the active document.' This clearly distinguishes the tool from siblings like illustrator_place_file (which imports files) and illustrator_execute_task (which creates new shapes). The WHEN TO USE section reinforces the purpose by naming the exact input type (SVG d strings) and use cases (complex outlines, organic shapes, arcs).
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 explicitly states when to use this tool ('Importing existing SVG path data') and provides a direct alternative: 'For new shapes prefer illustrator_execute_task + element_create with smooth:true.' This gives the agent a clear decision rule between this tool and its closest sibling. The examples also demonstrate realistic usage patterns, which further guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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: Place a linked image: {"params": {"file_path": "C:/img/photo.png", "x": 100, "y": 50, "linked": true}} Place and auto-trace: {"params": {"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)
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it explains key behavioral consequences: linked vs. embedded files, editable vs. live-trace results, PDF vectorization behavior, and the warning about >2000 paths. It also discloses openWorld file-system reads and matches the annotations exactly with no contradiction.
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?
The description is longer than average but well-structured with CONTRACT, WHEN TO USE, KEY CONCEPTS, EXAMPLES, and NOTES sections that make it scannable. The CONTRACT block repeats annotation values and some note content is redundant, which keeps it from a perfect score.
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 description is complete for invocation: it gives when to use, key trade-offs, concrete examples, and operational warnings. The main omission is a clear statement of the return shape beyond the id being 'always returned,' especially since no output schema is present.
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?
Even though the context reports 0% schema coverage, this description adds real meaning to the behavior-driving parameters: linked, trace, expand, embed_editable, and trace_preset. It does not add semantic detail for x/y, id, jobId, or expected_document_token, but those have adequate definitions in the input schema.
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 opens with a specific verb and resource: 'Place an external file (EPS, AI, PDF, image) into the document.' It enumerates supported file types and clearly separates this tool from execution, export, and query siblings by focusing on document insertion. The scope is immediately understandable without needing to inspect the 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?
The 'WHEN TO USE' section explicitly lists importing raster images, placing vector files, and vectorizing via Image Trace, giving clear context for selecting this tool. It does not state when-not-to-use or name alternatives like the SVG path importer, so it falls just short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
EXAMPLES: Check supplied publication thresholds: { "params": { "publication": { "output_width_mm": 89, "min_font_pt": 5, "min_stroke_pt": 0.25, "min_image_ppi": 300 } } } Check the active artboard before exporting: {"params": {}} Check one artboard, counting any overlap as on-artboard: {"params": {"artboard_index": 0, "policy": "intersects"}}
NOTES:
Returns ok=true only when the scan ran and found no non-info issues
Locked layers/items are reported as info and do not fail the check
If the scan cannot be read back, the result is an error with diagnostics.scan_status='unavailable' — never a passing check
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The CONTRACT line mirrors annotations (readOnly=True, destructive=False, idempotent=True, openWorld=False) and adds precise behavioral details beyond annotations: locked items are reported as info, ok=true only for no non-info issues, and an error with scan_status='unavailable' if readback fails. This enriches understanding of return semantics and edge cases without contradicting the annotations.
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?
The description is well-structured with clear section headers (CONTRACT, WHEN TO USE, KEY CONCEPTS, EXAMPLES, NOTES) and front-loaded purpose. It is moderately long but each sentence carries useful information, such as error handling and locked-item behavior. The organization makes it scannable and efficient, though it could be slightly trimmed without losing value.
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 validation tool with no output schema, the description covers essential return semantics (ok flag, info vs. non-info issues, error condition with scan_status). The EXAMPLES illustrate realistic calls, and the 'NOTES' section clarifies behavior around locked items and unavailable scans. Given the tool's complexity (many optional parameters and nested thresholds), this is adequately complete, though it doesn't spell out the full output structure.
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 description does not describe parameters at all; schema_description_coverage is 0%. While the input schema contains detailed descriptions for each property, the tool description only gives examples that illustrate usage patterns (e.g., publication thresholds, artboard_index with policy). It does not add semantic meaning beyond what the schema already provides, and the lack of parameter paragraphs in the description is a gap.
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 opens with a clear, specific verb and resource: 'Perform observational validation on the active document.' It enumerates concrete checks (items outside artboard, zero-size items, empty text frames, locked layers/items) and explicitly states it does not modify the document. This clearly distinguishes it from sibling tools like illustrator_query_items or illustrator_execute_script.
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 'WHEN TO USE' section provides explicit contexts: before export and after a series of modifications. It gives clear scenarios for invocation but does not list exclusions or alternative tools. It stops short of saying 'do not use when...' or naming a specific sibling to prefer, which would justify a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
EXAMPLES: Require exactly one matching text label: { "params": { "targets": { "type": "query", "contents": "alpha-helix", "expect": { "count": 1 } } } } Every path whose name starts with axis_: {"params": {"targets": {"type": "query", "itemType": "PathItem", "pattern": "axis_*"}}} Everything on a named layer: {"params": {"targets": {"type": "layer", "layer": "Layer 1"}}}
NOTES:
Returns ItemRef plus an expiring handle for exact untagged follow-up edits
Handle issuance never writes item.note or item.name
Set include_trace=True for debugging
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=false. The description adds valuable behavioral context beyond annotations: it states the contract explicitly, explains that handle issuance never writes item.note or item.name, and notes that handles are expiring. It also mentions include_trace for debugging. The only minor gap is not detailing failure modes or return structure, but the description adds meaningful behavioral disclosure beyond the annotations.
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?
The description is well-structured with clear sections (CONTRACT, WHEN TO USE, TARGET SELECTORS, EXAMPLES, NOTES) and front-loads the core purpose. It is longer than minimal but every section earns its place by providing actionable guidance. The examples are compact and illustrative. Slight redundancy exists between the CONTRACT line and annotations, but this is acceptable for emphasis.
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 query tool with a complex nested schema, the description covers the key aspects: what it does, when to use it, how to construct targets, and important behavioral notes (handles, no writes). The schema itself is extremely detailed with descriptions for each target type, so the description doesn't need to repeat those. The description is complete enough for an agent to select and invoke the tool correctly, though it could mention the return format or error behavior.
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 0% for the top-level params, but the description compensates substantially. It explains the targets parameter with concrete selector examples ({type: 'selection'}, {type: 'layer', layer: 'Layer 1'}, {type: 'all', recursive: true}, {type: 'query', itemType: 'PathItem', pattern: 'axis_*'}) and provides full JSON examples. It also explains the include_trace and handle behavior. The description adds meaning beyond the raw schema, though the schema itself is rich with descriptions for nested types.
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 opens with a specific verb and resource: 'Query items using the Task Protocol with declarative target selection.' It clearly distinguishes this from siblings like illustrator_execute_script or illustrator_execute_task by focusing on read-only querying with declarative targets. The WHEN TO USE section reinforces the purpose with concrete use cases (finding items, inspecting selection, listing items).
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 provides an explicit WHEN TO USE section listing three concrete scenarios, and the CONTRACT line states readOnly=True, destructive=False, idempotent=True, openWorld=False, which tells the agent when this tool is safe to use. It also implicitly distinguishes from mutation tools by emphasizing 'before modification' and 'inspecting'. The examples further clarify usage patterns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 (action="clear")
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: Set a dimmed tracing reference: {"params": {"action": "set", "file_path": "C:/ref/sketch.png", "opacity": 50}} Legacy set (still accepted): {"params": {"file_path": "C:/ref/sketch.png"}} Clear the reference layer: {"params": {"action": "clear"}}
NOTES:
Clear deletes the reference layer; omit file_path, opacity and fit
Empty calls now reject; migrate old empty clears to action="clear"
Legacy nonempty file_path without action still means set
Uses the active artboard for fit/center calculations
Extracts dominant colors from reference image if Pillow is available
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, readOnly=false, idempotent=true, and openWorld=true, and the description adds substantial behavioral detail: layer is locked/dimmed/non-printable, repeated calls replace the previous reference, clear deletes the layer, active artboard is used for fit, and dominant colors are extracted when Pillow is available. This goes well beyond the structured annotations and matches them with no contradiction.
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?
The description is long but every section earns its place: contract, usage triggers, key behavioral concepts, examples, and migration notes. It is front-loaded with the core purpose and uses structured headings and concrete example payloads, making it easy for an agent to scan and act on.
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 mutate tool with no output schema, the description covers what the operation does, what it affects (dedicated layer), how idempotency works, legacy behaviors, required vs omitted parameters, and even edge cases like empty calls rejecting. An agent has enough context to invoke set or clear correctly without additional inference.
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 0%, so the description carries the burden of explaining parameters. It does so thoroughly: action set/clear, file_path required for set, opacity default of 40 for dimming, fit behavior, legacy nonempty file_path meaning set, and the need to omit file_path/opacity/fit on clear. This compensates fully for the schema gap.
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 opens with a specific verb and resource: 'Set or clear a reference image on a locked background layer for tracing.' It clearly distinguishes this from ordinary file placement by mentioning the dedicated '__reference__' layer, locked/dimmed/non-printable, and tracing purpose. The action parameter (set vs clear) is unambiguous.
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 'WHEN TO USE' section explicitly names the two scenarios: preparing a tracing reference and clearing a previous reference. It does not explicitly compare with sibling tools like illustrator_place_file, but the tracing-specific context strongly implies the appropriate selection, so this is clear guidance with only a minor missing exclusion.
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.
15 tool updates
v0.1.0- First observed
illustrator_connection_status - First observed
illustrator_document - First observed
illustrator_execute_script - First observed
illustrator_execute_task - First observed
illustrator_export_document - First observed
illustrator_get_document - First observed
illustrator_history - First observed
illustrator_job_status - First observed
illustrator_observe - First observed
illustrator_path_boolean - First observed
illustrator_path_import_svg - First observed
illustrator_place_file - First observed
illustrator_preflight_check - First observed
illustrator_query_items - First observed
illustrator_set_reference
TDQS
Scored across 15 tools
Each tool has a distinct purpose and the descriptions repeatedly cross-reference to prevent misselection (e.g., execute_script vs execute_task, observe vs export). A few name pairs like document/get_document and job_status/connection_status could mislead, but the extensive WHEN TO USE guidance resolves ambiguity.
All tools share the illustrator_ prefix and most follow verb_noun, but there are notable exceptions: illustrator_document, illustrator_history, illustrator_observe (verb only), and the awkward illustrator_path_import_svg invert the expected verb-first order. The mixed patterns are still readable but not fully consistent.
15 tools is an appropriate breadth for an Illustrator control server, covering document lifecycle, shape creation/editing, import/export, observation, validation, and diagnostics. No tool feels redundant, and the count sits comfortably within the ideal range.
The tool set covers core workflows: document management, structured and raw editing, boolean geometry, SVG import, file placement, export, visual observation, querying, preflight checks, history, and connection/job status. Minor gaps exist (e.g., dedicated text editing or layer management tools depend on execute_task or raw script), but most operations are reachable through structured operations.
Maintenance
Related MCP Connectors
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for reading, manipulating, and exporting Adobe Illustrator design data via ExtendScript/JSX. 26 tools for text, colors, paths, layers, effects, images, symbols extraction, object creation/modification, SVG/PNG/JPG/PDF export, and pre-press preflight checks. macOS only.386 npm113MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to generate vector graphics in Adobe Illustrator using natural language prompts, by sending ExtendScript commands via a local MCP server.150-
- AlicenseAqualityCmaintenanceAn MCP server that lets AI assistants like Claude control Adobe Illustrator through natural language by executing ExtendScript code and providing document state inspection.127MIT
- FlicenseNot gradedqualityCmaintenanceAn 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.-