indesign-nutria-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@indesign-nutria-mcp Create an A4 document with 5 pages, add a red circle on page 3"
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.
Published to npm as
indesign-nutria-mcp. Your agent starts it withnpx -y indesign-nutria-mcpā see Quick Start. InDesign still runs on your machine: the server reaches it over a local bridge, and nothing leaves the box.
š Why This Exists
InDesign automation has been broken for 20 years. ExtendScript is ancient. CEP panels are over-engineered. UXP scripting requires a CS degree. You just want AI to do the layout.
This MCP server fixes that. Clone it, point your agent at it, and InDesign is yours to drive like a puppeteer.
š MCP vs The Old Ways
MCP (this) | ExtendScript | CEP Panels | UXP Scripts | Manual | |
Learn in | 30 seconds | 3 weeks | 2 months | 1 month | 0 (slow) |
AI-native | ā Any MCP agent | ā | ā | ā | ā |
Tool count | 199 | Unlimited (you write them) | 5-20 typical | 5-20 typical | ā (manual) |
Error messages | Human-readable | Opaque crashes | Varies | Better | N/A |
Setup time | 5 minutes | 10 minutes | 2 hours | 30 minutes | Instant |
Undo support | ā Built-in | ā | Varies | ā | ā |
Search text |
| Write 50 lines | Maybe | Maybe | Ctrl+F |
Debug mode | ā Stack traces | ā | Varies | Limited | N/A |
Remote control | ā Anywhere STDIO works | ā InDesign-only | ā | ā | N/A |
Maintenance | Zero (we handle 199 tools) | You write+test everything | Fragile | Fragile | N/A |
Related MCP server: InDesign UXP MCP Server
⨠What It Can Do
š Text & Typography (27 tools)
Create frames, set content, apply paragraph/character styles, control formatting, search with GREP, find/replace, apply fonts, set columns, insets, auto-size, vertical justification, drop caps, keep options, hyphenation, tabs, paragraph rules, text wrap, baseline, linking/unlinking.
šØ Shapes & Objects (20 tools)
Rectangles, ellipses, polygons, lines, groups, anchored objects ā create, modify, delete, list, arrange.
š¼ļø Images (5 tools)
Place from disk, query metadata, fit/proportional, adjust brightness/contrast, relink.
š Colors & Swatches (6 tools)
CMYK/RGB/LAB/spot swatches, ink list, gradients, apply to fill/stroke.
š Pages & Documents (15 tools)
Create, open, save, close, getInfo, listOpen ā plus page add/delete/duplicate/move/getInfo/listAll/applyMaster, sections.
š Tables (20 tools)
Create, set cells, add/delete rows/columns, merge/split, alignment, fills, strokes, insets, header/footer, row/column sizing, table styles, cell styles.
𧬠Styles (10 tools)
Paragraph, character, object styles ā create, list, duplicate, delete, apply.
šļø Masters & Books (10 tools)
Master spreads ā create, duplicate, apply, delete, list, getPages. Books ā list, open, getDocuments, synchronize.
š¤ Export (9 tools)
PDF, EPUB, HTML, JPG, PNG, package ā plus preflight, font/swatch/table lists, and script_run() for custom ExtendScript.
š Find & Replace (5 tools)
GREP find/replace, format-aware find/replace.
š Transform (5 tools)
Align, distribute, rotate, scale, flip.
š Interactive (5 tools)
Hyperlinks, buttons, cross-reference anchors.
š References (10 tools)
Footnotes, endnotes, cross-references, index entries/topics/generation.
š Lists (6 tools)
Define, apply to paragraph/selection, remove, restart numbering.
š§© XML & Data Merge (11 tools)
XML tags, import/export, data merge with CSV/TSV/XML sources.
š§ Other
Layers, effects (drop shadow, feather, transparency), TOC, sections, undo/redo, undo groups.
š§ Included AI Skills
Ten skills ship with the repo, auto-loaded by trigger keywords when you use any AI agent:
# | Skill | What it does for you |
1 | Aesthetic Preference | Asks 8 questions before any creative work ā font, palette, style, margins. Builds a persistent JSON profile. |
2 | Layout Readability | Validates overlays, contrast, orphans/widows, hierarchy, spacing, overflow before delivery. |
3 | Export & Verify | Mandatory modify ā export JPG ā analyze pixels ā fix ā repeat cycle. |
4 | Import Word | Imports |
5 | Batch Operations | Applies the same modification across N pages. |
6 | Image Optimize | Place, resize, DPI check, relink. Profiles for print (300dpi CMYK) vs web (72dpi RGB). |
7 | Table Format | Creates and styles tables ā columns, rows, borders, fills, merge cells. |
8 | Template Manager | Save/load reusable page templates. |
9 | Export Batch | Export same document to multiple formats at once with different profiles. |
10 | Style Extractor | Scans |
šļø Architecture
āāāāāāāāāāāāāāāāāāāāāāā STDIO āāāāāāāāāāāāāāāāāāāāāāāā WebSocket āāāāāāāāāāāāāāāāāāāā
ā Any AI Agent ā āāāāāāāāāāāāāāāāāāŗ ā indesign-nutria-mcp ā āāāāāāāāāāāāāāāāāŗ ā Adobe InDesign ā
ā (Claude, OpenCode, ā ā (Node.js MCP Server) ā port 8120 ā + UXP Plugin ā
ā Cursor, etc.) ā ā 35 handlers ā ā + ExtendScript ā
āāāāāāāāāāāāāāāāāāāāāāā ā 199 tools ā āāāāāāāāāāāāāāāāāāāā
ā 10 AI skills ā
āāāāāāāāāāāāāāāāāāāāāāāāTwo ways to reach InDesign
The MCP protocol always speaks stdio. Only the last hop differs, and you pick one per platform:
macOS | Windows | |
With plugin | UXP panel in | UXP panel in |
Without plugin |
|
|
Both are supported. The plugin is the richer path (it also emits change
events); the proxy exists for setups where you cannot or do not want to load a
UXP panel. See WINDOWS.md for the Windows bridge and
start-bridge.sh for the macOS one.
Full breakdown: the four macOS processes, the request lifecycle, the error contract and the trust boundaries are in docs/architecture.md.
Full Handler Catalog
Handler | Tools | Key Features |
AnchoredObject | 5 | create, getSettings, release, setPosition, setProperties |
Book | 4 | list, open, getDocuments, synchronize |
Changes | 1 | getStatus ā what changed since T?, without touching InDesign |
Color | 6 | swatch CRUD, inks, gradients, apply |
DataMerge | 5 | selectDataSource, listFields, mergeRecords, export, removeDataSource |
Document | 9 | create/open/save/close, getInfo, listOpen, getState, getPageStories, getStoryPages |
Effect | 4 | drop shadow, feather, transparency, gradient feather |
Export | 11 | multi-format export, print packaging, batch folder, preflight, fonts/swatches/tables/masters/XML, executeScript, script_run |
Font | 5 | list, find, change, missing check, glyph insert |
Grep | 4 | find, replace, findFormat, replaceFormat |
Image | 5 | place, info, adjust, fit, relink |
Index | 4 | addEntry, createTopic, generate, listTopics |
Interactive | 5 | hyperlinks, buttons, anchors |
Layer | 5 | create, delete, list, reorder, setProperties |
List | 6 | define, apply, remove, restart numbering |
Master | 6 | create, duplicate, apply, delete, list, getPages |
Note | 4 | footnotes, endnotes |
Object | 6 | shapes, groups, image links |
Page | 7 | add, delete, duplicate, move, getInfo, listAll, applyMaster |
Preview | 1 | document ā render a page as an image the agent can see |
Recipe | 2 | flow a placed text story across pages, export with a named PDF preset ā each in one undo group |
Resources | 6 | list/update/embed/unembed links, getLinkInfo |
Section | 4 | create, list, setNumbering, delete |
Shape | 6 | rectangle/ellipse/line/polygon create, delete, modify |
Style | 7 | paragraph/character/object styles CRUD |
Table | 16 | create, cells, rows/columns, merge/split, alignment, fills, strokes, header/footer |
TableStyle | 4 | tableStyle, cellStyle CRUD |
Text | 7 | frames, content, stories, findReplace, BOM filtering, timeout |
TextAdvanced | 20 | columns, wrap, links, drop caps, rules, tabs, formatting read/write, search |
Typography | 1 | read-only audit of fonts in use, size/leading pairs, style usage and overrides |
Toc | 4 | createStyle, generate, update, listStyles |
Transform | 5 | align, distribute, rotate, scale, flip |
Undo | 5 | undo, redo, history, beginGroup, endGroup |
Xml | 6 | tags CRUD, tag/untag items, import/export |
Xref | 3 | create, list, updateFormat |
199 | 35 handlers, no duplicates |
tests/contract/toolInventory.test.ts pins this number, so the table cannot
drift from the code without failing CI.
Verified end-to-end against InDesign 2026 (21.3) on the plugin-free macOS path: MCP stdio ā WebSocket bridge ā JXA proxy ā InDesign, creating a document, adding a text frame, reading it back, and closing.
Closing documents from an agent?
document_closedefaults tosaveOptions: "no"ā the only value that cannot raise a modal dialog."ask"opens a save prompt, and"yes"opens a Save As dialog for a document that was never saved; both block the script until the bridge times out. Save first withdocument_save { filePath }, then close.
MCP Resources
URI | What it gives you |
| Active document session state |
| WebSocket bridge health + queue depth |
| Full 199-tool catalog for agent self-discovery |
| Currently active document info |
šÆ Use Cases
š¢ Agency Production
"Create a 200-page catalog from this CSV. Product name in 14pt Arial Bold, price in 12pt Arial Regular, description in 10pt. Add a red 'SALE' badge on page 1, 50, 100, 150. Export as PDF."
š Book Publishing
"Import this Word document. Map Heading 1 to 'Chapter Title' style, Normal to 'Body Text'. Add running headers with page numbers. Generate a TOC. Export to PDF with crop marks."
šØ Creative Automation
"Take this InDesign template and generate 50 variations with different colors and text from this spreadsheet. Export each as a separate PDF."
š Print Production
"Check all 200 files for missing fonts and broken links. Fix them. Export as PDF/X-1a."
š Continuous Publishing
"Every morning at 8am, update the daily newspaper template with fresh content from our CMS, preflight, and upload to the web server."
ā” Quick Start (30 seconds)
Two halves: the server your agent runs ā one line from npm, no clone and no build ā and the bridge that reaches InDesign on this machine.
1ļøā£ Connect InDesign
The server listens on 127.0.0.1:8120; something still has to drive InDesign.
Pick by platform:
macOS ā with the UXP panel (also emits change events)
Open UXP Developer Tool
Load the
plugin/directory ā it ships in this repository, so clone it once:git clone https://github.com/nutriandrea/adobe-indesign-mcp(no build step)Open the MCP Bridge panel ā it connects on its own
macOS ā without the panel
git clone https://github.com/nutriandrea/adobe-indesign-mcp
cd adobe-indesign-mcp
npm install # gives the proxy its `ws` dependency; nothing to build
./start-bridge.sh # launches InDesign, then the JXA proxyWindows ā no bridge process. The COM bridge drives InDesign in-process, so
Windows needs neither the clone nor a second process; it is enabled by the env
var in the config you use in step 2 (see
examples/claude-desktop.windows.json).
See WINDOWS.md for the details and caveats.
2ļøā£ Connect your AI agent
Both hosts start the same published package ā nothing to clone, nothing to build.
Claude Desktop:
{
"mcpServers": {
"indesign": {
"command": "npx",
"args": ["-y", "indesign-nutria-mcp"]
}
}
}OpenCode (project opencode.json, or the same block in
~/.config/opencode/opencode.json):
{
"mcp": {
"servers": {
"indesign": {
"type": "local",
"command": ["npx", "-y", "indesign-nutria-mcp"]
}
}
}
}On OpenCode the servers live under mcp.servers, not mcpServers, and the
command is an array ā that is the documented V2 shape.
Ready-made files for Claude Desktop, Cursor and Claude Code ā including the
Windows COM variant ā are in examples/. Each one is
copy-paste.
3ļøā£ Start creating
š¤ "Create a landscape A3 document with 3 pages."
š¤ "Add a blue rectangle covering the top half of page 1."
š¤ "In the rectangle, add text 'Hello World' in white, Arial Bold 72pt."
š¤ "Export page 1 as JPG."š Notes for MCP client developers
Building a custom client (script, harness, test runner) against this server? Two lessons from real-world integration:
Pitfall | Fix |
Large responses arrive split across stdout chunks. | Accumulate stdin into a buffer and only |
Image tools return | Read the base64 payload from |
Every message is a single-line JSON-RPC object terminated by \n; there is no framing beyond the newline.
š What's New in v1.6.0
Fixed
ā ļø | Read this before you script |
The layout skill named tools that do not exist |
|
Change | What it means for you |
The skill names real tools now | It points at the bare tool names the registry actually exposes, and documents the read-only resources ( |
Skills are guarded like the instructions are |
|
Marketplace counts are checked too |
|
Added
Change | What it means for you |
Client configs |
|
Registry and bundle metadata |
|
Release automation |
|
A packaged companion skill |
|
For AI agents
ā ļø | Read this before you script |
Pass | Every tool takes an optional |
Change | What it means for you |
| 199 tools, one extra optional parameter. Omit it and a tool acts on the front document ā exactly the previous behaviour, so nothing you already send changes. |
A target that is not open fails loudly |
|
One shared resolver |
|
Safe by construction |
|
Changed
Change | What it means for you |
The "pin the document" advice is now executable | The connect-time contract used to tell the host to ask which document was meant. It now names |
For AI agents
ā ļø | Read this before you script |
Failures now tell you how to recover | A failing call returns a JSON envelope |
State before action |
|
A recipe is one call, not a chain |
|
Change | What it means for you |
Structured error envelopes | Sixteen failure classes, each with a |
A workflow contract on connect | The server advertises roughly 680 tokens of |
| One round-trip replaces the |
| Render any open document, not only the front one. Exports are capped at 4 MB and re-rendered once at a fitting resolution before failing with |
Two new recipes |
|
Opt-in success envelope |
|
A smaller, correct package | A |
Changed
Change | What it means for you |
Error responses are JSON text | The failure message is preserved verbatim inside the envelope; |
|
|
Fixed
Fix | What it means |
Every call after |
|
| They read |
The server reported itself as v1.0.0 | Four releases after v1.0.0 it advertised the old literal on |
For AI agents
ā ļø | Read this before you script |
Prefer the typed tools |
|
Change | What it means for you |
The bridge protocol is now canonical | Responses are |
Plugin-free macOS setup |
|
The JXA proxy no longer blocks or corrupts | Scripts reach |
Configurable InDesign version |
|
The panel connects itself | The MCP Bridge panel connects on open, so there is no Connect click to miss. |
InDesign 2026 anchoring | Creating an anchored object no longer depends on |
The shipped config starts everywhere | It declared the wrong MCP transport and would have aborted startup on macOS and Linux had it enabled the Windows COM bridge. Both are now covered by a test. |
Change | What it means for you |
Agent vision: | Render any page as an image the agent can actually see ā layout mistakes get caught in the loop, not after export. |
Batch PDF: | Export every |
Windows COM bridge | Run with zero plugins via |
Hardened file paths | Every file-touching tool validates paths up front ā traversal attempts ( |
Change | What it means for you |
InDesign 2026 ready | Color and anchored-object tools work on 2026's renamed enums ā no more silent failures after upgrading. |
Real env var config | Every setting in |
No more 30s hangs | If the plugin isn't connected, tool calls fail instantly with "Bridge is not connected" instead of timing out. |
One escaping path | All handlers share a single battle-tested ExtendScript string escaper. |
Hardened path validation | File-path checks now use true containment (no prefix-collision escapes). |
Honest status |
|
Feature | Tools | What it solves |
Text formatting read |
| Get font/size/style per text range. No more custom scripts. |
Character style apply |
| Apply to a range in one call. |
Font apply |
| Apply font family/style/size to a range. |
Text search |
| GREP + format-aware search with paragraph-relative positions. |
StoryāPage map |
| Which stories are on which pages. |
Undo groups |
| Group operations into one undo step. |
Debug mode |
| Full ExtendScript stack traces. |
BOM filtering | Text reads |
|
Timeout/maxResults |
| Custom limits for large documents. |
MCP resources |
| Agent auto-discovers all tools. |
āļø Configuration
All settings have defaults ā zero config required. To customize, copy .env.example to .env or pass a JSON file; environment variables win over the file:
BRIDGE_PORT=8120 # WebSocket port the UXP plugin connects to
HTTP_BRIDGE_ENABLED=false # optional REST fallback bridge
HTTP_BRIDGE_PORT=3000
SERVER_TRANSPORT=stdio # stdio | websocket
LOG_LEVEL=info # debug | info | warn | error
COM_BRIDGE_ENABLED=false # Windows only: drive InDesign over COM, no plugin
RESPONSE_ENVELOPE_SUCCESS=false # wrap successful results as { ok: true, ... }The plugin-free macOS proxy takes its own variables:
INDESIGN_APP="Adobe InDesign 2026" # matches your installed version
BRIDGE_WS_URL=ws://127.0.0.1:8120
BRIDGE_TIMEOUT_MS=120000 # a long export is not a hang
BRIDGE_RECONNECT_DELAY_MS=3000Precedence: environment variables > JSON config file > defaults. Invalid values are ignored, never fatal.
šŖ Windows
Two ways to run on Windows: the standard UXP plugin flow (identical to macOS) or the new opt-in COM bridge that needs no plugin at all. See WINDOWS.md.
š¦ Project Structure
āāā src/
ā āāā server/ # MCP server (STDIO transport)
ā āāā bridge/ # WebSocket bridge, ScriptExecutor, protocol, COM executor
ā āāā handlers/ # 35 handler modules (199 tools)
ā āāā schemas/ # Zod parameter schemas
ā āāā core/ # Session tracking
ā āāā types/ # TypeScript definitions
ā āāā utils/ # Config, logger, security, JSON polyfill
āāā plugin/ # UXP panel (index.html, index.js, manifest.json)
āāā examples/ # Copy-paste client configs (Claude Desktop, Cursor, Claude Code)
āāā mcpb/ # MCP Bundle manifest (npm run build:mcpb packs the archive)
āāā server.json # MCP Registry manifest (generated from package.json)
āāā llms.txt # llms.txt index for agents and directories
āāā bridge-proxy.mjs # Plugin-free macOS proxy (JXA/osascript)
āāā jxa-driver.js # Runs one ExtendScript inside InDesign
āāā start-bridge.sh # Launches InDesign + the proxy
āāā skills/ # Agent-facing skills shipped with the server
āāā marketplace/ # Store listings that package a skill for third-party channels
āāā tests/ # 1131 tests (vitest)
āāā .opencode/skills/ # 10 AI agent skills
āāā docs/ # Documentation and fork audits
āāā media/ # Social preview, hero images
āāā dist/ # Compiled output
āāā opencode.json # MCP configurationš Requirements
Requirement | Version |
Adobe InDesign | 2022+ (2024/2025/2026 recommended) |
Node.js | 18+ |
OS | macOS or Windows (Linux can run the MCP server, but no InDesign automation path exists there) |
š§Ŗ Development
npm test # Run 1131 tests
npm run test:watch # Watch mode
npm run build # TypeScript compile
npm run lint # ESLintLive smoke test (macOS)
npm run smoke:macosnpm test covers the handlers, the protocol and the startup sequence, but it
cannot see the seams between the four separate processes on the plugin-free
macOS path. That gap is not hypothetical: 965 tests once passed against a build
whose bridge never listened on its port, so every tool call failed in the field
and nothing went red.
smoke:macos drives the real chain ā MCP stdio ā WebSocket bridge ā JXA proxy ā
InDesign ā against a running InDesign, creating a document, writing to it,
reading it back, and closing it. It creates one unsaved document and cleans up
after itself. It needs a desktop app, so it is not part of npm test and does
not run on CI; it exits 0 with a SKIP notice if InDesign is not open.
Run it by hand before releasing a change to the bridge, the protocol, the proxy or the driver.
npm run smoke:recipes # the live gate for the two recipessmoke:recipes does what the unit tests cannot: it flows a long text file with
recipe_flowTextStory, checks the document grew by exactly what the tool
reported, calls undo once to confirm the whole flow is a single undo step,
then exercises both preset paths of recipe_exportPreset. Same rules as above ā
needs a desktop app, exits 0 with a SKIP notice when InDesign is closed.
npm run smoke:target # the live gate for document_idsmoke:target opens two documents and proves the thing document_id is for:
a call that names the non-front document edits that document and leaves the
front one alone. It then checks index targeting, that omitting document_id
still acts on the front document (the additive guarantee), that an unopened
target arrives as a document_not_found envelope suggesting document_listOpen,
and that a hostile document_id is inert rather than executed. It closes only
the documents it created, never saves, and leaves every pre-existing document
untouched. Same rules as above ā needs a desktop app, exits 0 with a SKIP notice
when InDesign is closed.
šŗļø Roadmap
InDesign Server ā headless server support for CI/CD pipelines
Live preview ā stream InDesign canvas to agent
Template marketplace ā share and discover InDesign templates
Natural language ā layout ā describe a page, get a page
Batch PDF processing ā apply changes across hundreds of files
VSCode extension ā control InDesign from your editor
š Deep Dives
Architecture ā the four-process macOS path, request lifecycle, error contract
Available tools ā every tool, generated from the registry
Troubleshooting ā modal hangs, port conflicts, missing fonts, blocked scripts
Development ā build, test, and the live smoke test
Origin Story ā how this project came to life
Comparison docs ā MCP vs CEP vs ExtendScript in depth
Launch thread ā social launch content
š¤ Contributing
PRs welcome! The handler pattern is designed to be simple:
Create
src/handlers/YourHandler.tsDefine tools with Zod schemas
Register in
IndesignMcpServer.tsAdd tests
Check CONTRIBUTING.md for details.
š Acknowledgements
This server is a merge of what four people found in the field. Each of these contributions fixed something that was genuinely broken, not a cosmetic preference.
@graydini ā built the Windows COM bridge that this project runs on today: a persistent
cscriptprocess holding one live COM connection,NEVER_INTERACTso export dialogs can never block, and the path-containment hardening invalidateFilePath. See PR #1 and the PR #21 merge. Also reported the InDesign 2026 API incompatibilities that shaped official Windows support: renamed and read-onlyColorModelandAnchorPointenums, andmove()no longer acceptingInsertionPointtargets. Earlier fixes from the same line of work landed onmainas safebasedOn/pointSizereads in style listing, rich style-creation parameters,\nā paragraph-break normalization in text content, and aneval-free JSON polyfill that survives the ExtendScript sanitizer. Their branch also carried COM-specific operational knowledge ā that a hung script wedges the Windows bridge with no way out, thatfontFamily,italicandweightthrow under COM, and that InDesign must be visibly running ā now documented in WINDOWS.md and the layout skill. A file-by-file audit of what was still unmerged is in docs/forks/graydini-windows-com-bridge-audit.md.@advaitakelkar ā diagnosed why the macOS proxy returned junk, in PR #22. Three real bugs in one report:
osascriptsends script results on stderr, so every successful call was read as a failure; the script was passed through shell-equoting, which mangles any quote, backslash or newline; and the app name was hardcoded to "Adobe InDesign 2024", so every other version failed. The same work also moved the connection handshake out ofapp.doScript, where it was being parsed as ExtendScript. Adopted and extended ā see What's New in v1.4.2.@ijeetu ā two fixes, both easy to miss and both real. The MCP Bridge panel now connects on open instead of waiting for a Connect click, so the panel no longer looks dead when the server is already running. Earlier, they traced a parse failure in the JSON polyfill to
sanitizeCode()rewritingeval(into a comment and orphaning the parentheses ā the shippedwrapExtendScriptalready reflects that fix.
š License
MIT Ā© Andrea Cacioppo
Available Tools
197 toolsanchoredObject_createC
Create an anchored object at an insertion point or attach to a text frame
Inputs: width (required), height (required), storyIndex (required), contentType (required), +7 more.
anchoredObject_getSettingsC
Get anchored object settings
Inputs: itemIndex (required), pageIndex (required), document_id.
anchoredObject_releaseC
Release anchored object to regular page item
Inputs: itemIndex (required), pageIndex (required), document_id.
anchoredObject_setPositionC
Reposition an anchored object
Inputs: itemIndex (required), pageIndex (required), xOffset, yOffset, +4 more.
anchoredObject_setPropertiesC
Set multiple anchored object properties
Inputs: itemIndex (required), pageIndex (required), properties (required), document_id.
book_getDocumentsC
List all documents in a book
Inputs: bookIndex (required), document_id.
book_listB
List all open books in InDesign
Inputs: document_id.
book_openC
Open an InDesign book file (.indb)
Inputs: filePath (required), document_id.
book_synchronizeC
Synchronize book documents with the style source
Inputs: bookIndex (required), document_id.
cellStyle_createC
Create a cell style in the active document
Inputs: name (required), basedOn, topInset, fillColor, +7 more.
cellStyle_listB
List all cell styles in the active document
Inputs: document_id.
changes_getStatusA
Report document change activity pushed by the plugin over the bridge ā no InDesign round-trip. Pass since (epoch ms) to learn whether anything changed after that moment, e.g. to skip re-rendering a preview when nothing changed.
Inputs: since, document_id.
color_applyB
Apply a color swatch to selected item (fill or stroke)
Inputs: swatchName (required), target, document_id.
color_gradient_createC
Create a gradient swatch
Inputs: name (required), stops (required), type, document_id.
color_ink_listB
List all inks in the document
Inputs: document_id.
color_swatch_createC
Create a new color swatch
Inputs: name (required), model (required), red, blue, +7 more.
color_swatch_deleteC
Delete a color swatch by name
Inputs: name (required), document_id.
color_swatch_listB
List all color swatches in the document
Inputs: document_id.
dataMerge_exportC
Export the merged document to a file
Inputs: format (required), outputPath (required), document_id.
dataMerge_listFieldsB
List available data merge fields from the current data source
Inputs: document_id.
dataMerge_mergeRecordsC
Merge records into the document using the selected data source
Inputs: linkImages, document_id, recordsPerPage, generatePreview, +1 more.
dataMerge_removeDataSourceB
Remove the current data source from the document
Inputs: document_id.
dataMerge_selectDataSourceC
Select a data source (CSV/TSV/XML) file for data merge
Inputs: filePath (required), document_id.
document_closeC
Close the active InDesign document with save options
Inputs: document_id, saveOptions.
document_createC
Create a new InDesign document with specified dimensions, margins, and settings
Inputs: slug, bleed, pages, width, +5 more.
document_getInfoB
Get detailed information about the active document including page count, dimensions, and margins
Inputs: document_id.
document_getPageStoriesC
Get all stories that appear on a specific page
Inputs: pageIndex (required), document_id.
document_getStateA
Get the editing state in one call: the front document (name, path, page count, size, margins), the index of that document, the names of every open document, the active layer, and how many objects are selected. Prefer this over chaining document_getInfo and document_listOpen
Inputs: document_id.
document_getStoryPagesC
Get all pages covered by a specific story (for finding which pages a story lives on)
Inputs: storyIndex (required), document_id.
document_listOpenC
List all currently open InDesign documents
Inputs: document_id.
document_openC
Open an existing InDesign document from file path
Inputs: filePath (required), showWindow, document_id.
document_saveC
Save the active InDesign document, optionally to a specific path
Inputs: filePath, document_id, saveOptions.
effect_applyDropShadowC
Apply a drop shadow effect to an object
Inputs: itemIndex (required), pageIndex (required), blur, mode, +5 more.
effect_applyFeatherC
Apply a feather effect to an object
Inputs: itemIndex (required), pageIndex (required), type, noise, +3 more.
effect_applyGradientFeatherC
Apply a gradient feather effect to an object
Inputs: itemIndex (required), pageIndex (required), type, angle, +3 more.
effect_applyTransparencyC
Set transparency and blend mode for an object
Inputs: itemIndex (required), pageIndex (required), opacity, blendMode, +3 more.
export_batchFolderA
Export every InDesign (.indd) file in a folder to PDF in one run ā opens each document invisibly and reports per-file results
Inputs: folderPath (required), outputDir, overwrite, timeoutMs, +1 more.
export_documentC
Export the active document to a specified format (PDF, JPG, PNG, EPUB, HTML, package)
Inputs: format (required), options, filePath, document_id.
export_executeScriptC
Execute arbitrary ExtendScript code in InDesign
Inputs: code (required), document_id.
export_getFontsB
Get all fonts used in the active document
Inputs: document_id.
export_getMasterSpreadsC
List all master spreads in the active document
Inputs: document_id.
export_getSwatchesB
Get all swatches (colors, gradients, tints) from the active document
Inputs: document_id.
export_getTablesC
List all tables in the active document
Inputs: pageIndex, document_id.
export_getXmlTagsC
List XML tags in the active document
Inputs: document_id.
export_preflightC
Run a preflight check on the active document
Inputs: profile, document_id, waitForCompletion.
font_changeC
Change font of selected text
Inputs: fontName (required), size, fontStyle, document_id.
font_findC
Search fonts by name
Inputs: query (required), document_id.
font_glyph_insertC
Insert a special glyph at the cursor position
Inputs: glyphId (required), fontName, document_id.
font_listC
List all available fonts
Inputs: document_id.
font_missing_checkC
Check for missing fonts in the document
Inputs: document_id.
grep_findC
Find text using GREP pattern in the active document
Inputs: grepWhat (required), scope, document_id, includeFootnotes, +1 more.
grep_findFormatC
Find text with specific formatting
Inputs: findWhat (required), scope, format, document_id.
grep_replaceC
Find and replace text using GREP pattern
Inputs: grepWhat (required), replaceWith (required), scope, document_id.
grep_replaceFormatC
Find and replace text while changing formatting
Inputs: findWhat (required), replaceWith (required), format, document_id.
group_listC
List all groups in a page
Inputs: pageIndex (required), document_id.
group_ungroupC
Ungroup a group by index
Inputs: pageIndex (required), groupIndex (required), document_id.
image_adjustC
Adjust image properties (brightness, contrast, etc.)
Inputs: itemIndex (required), pageIndex (required), contrast, brightness, +1 more.
image_fitC
Fit image content to its frame
Inputs: fitting (required), itemIndex (required), pageIndex (required), document_id.
image_getLinksC
Get link status for all placed images
Inputs: document_id.
image_infoC
Get metadata for an image on a page
Inputs: itemIndex (required), pageIndex (required), document_id.
image_listC
List all placed images in a page
Inputs: pageIndex (required), document_id.
image_placeC
Place an image from a file path onto a page
Inputs: x (required), y (required), filePath (required), pageIndex (required), +3 more.
image_relinkC
Relink/replace an image with a new file
Inputs: filePath (required), itemIndex (required), pageIndex (required), document_id.
index_addEntryC
Add an index entry for the current selection
Inputs: topic (required), sortBy, subTopic, pageRange, +2 more.
index_createTopicC
Create a new index topic
Inputs: name (required), parent, document_id.
index_generateC
Generate the index on a specified page
Inputs: pageIndex (required), title, bounds, document_id, +1 more.
index_listTopicsC
List all index topics in the active document
Inputs: document_id.
interactive_addHyperlinkC
Add a hyperlink to a text selection or page item
Inputs: url (required), name (required), itemIndex (required), pageIndex (required), +1 more.
interactive_deleteHyperlinkC
Delete a hyperlink by index
Inputs: index (required), document_id.
interactive_listAnchorsC
List all cross-reference anchors in the active document
Inputs: document_id.
interactive_listButtonsC
List all buttons in the active document
Inputs: document_id.
interactive_listHyperlinksC
List all hyperlinks in the active document
Inputs: document_id.
layer_createC
Create a new layer in the active document
Inputs: name, locked, visible, printable, +2 more.
layer_deleteD
Delete a layer
Inputs: layerIndex (required), document_id.
layer_listC
List all layers in the active document
Inputs: document_id.
layer_reorderC
Move a layer to a new position in the layer stack
Inputs: newIndex (required), layerIndex (required), document_id.
layer_setPropertiesC
Set layer properties (visibility, lock, etc.)
Inputs: layerIndex (required), locked, visible, printable, +1 more.
list_applyToParagraphC
Apply a list to a specific paragraph
Inputs: listName (required), pageIndex (required), frameIndex (required), paragraphIndex (required), +2 more.
list_applyToSelectionC
Apply a list to the current text selection
Inputs: listName (required), level, document_id.
list_defineC
Define a new numbered or bulleted list
Inputs: name (required), type (required), document_id, continueNumbering.
list_listB
List all defined lists in the document
Inputs: document_id.
list_removeFromParagraphC
Remove list formatting from a paragraph
Inputs: pageIndex (required), frameIndex (required), paragraphIndex (required), document_id.
list_restartNumberingC
Restart numbering at a specific paragraph
Inputs: pageIndex (required), frameIndex (required), startNumber (required), paragraphIndex (required), +1 more.
master_applyC
Apply a master spread to a specific page
Inputs: pageIndex (required), masterName (required), document_id.
master_createC
Create a new master spread with a given name and page count
Inputs: name (required), pageCount, document_id.
master_deleteC
Delete a master spread by name
Inputs: name (required), document_id.
master_duplicateC
Duplicate an existing master spread
Inputs: name (required), newName (required), document_id.
master_getPagesC
List all pages on a master spread
Inputs: name (required), document_id.
master_listB
List all master spreads with page count
Inputs: document_id.
note_addEndnoteC
Add an endnote to a story
Inputs: text (required), storyIndex (required), document_id, numberingType.
note_addFootnoteC
Add a footnote to a specific paragraph in a story
Inputs: text (required), storyIndex (required), paragraphIndex (required), prefix, +4 more.
note_footnoteOptionsC
Set footnote options for the active document
Inputs: layout, prefix, suffix, separator, +3 more.
note_listFootnotesC
List all footnotes in a story or the active document
Inputs: storyIndex, document_id.
page_addC
Add a new page to the active document at a specified position
Inputs: position, document_id, referencePage.
page_applyMasterC
Apply a master spread to a page
Inputs: pageIndex (required), masterName (required), document_id.
page_deleteC
Delete a page from the active document by index
Inputs: index (required), document_id.
page_duplicateC
Duplicate a page in the active document
Inputs: index (required), document_id.
page_getInfoC
Get detailed information about a specific page
Inputs: index (required), document_id.
page_listAllB
List all pages in the active document with their properties
Inputs: document_id.
page_moveC
Move a page to a new position in the active document
Inputs: index (required), toIndex (required), document_id.
preview_documentC
Render a page of the active document as an image (PNG or JPEG) so you can visually inspect layout, colors and typography
Inputs: format, pageIndex, document_id, documentIndex, +1 more.
recipe_exportPresetA
Export the active document to PDF using a named PDF export preset in one call ā validates the preset first and, if it is wrong, fails with the list of valid preset names
Inputs: filePath (required), presetName (required), timeout, document_id, +1 more.
recipe_flowTextStoryA
Place a text file and flow it across as many pages as it needs in one call ā creates the frames, links them, adds pages when it runs out, and reports where the story ended and whether it still overflows
Inputs: filePath (required), timeout, maxPages, pageIndex, +2 more.
redoC
Redo the last undone operation
Inputs: document_id.
resources_embedLinkC
Embed a linked file into the document
Inputs: linkIndex (required), document_id.
resources_getLinkInfoC
Get detailed status for a specific link
Inputs: linkIndex (required), document_id.
resources_listLinksC
List all document links with status and file path
Inputs: document_id.
resources_unembedLinkC
Unembed a file and save as linked resource
Inputs: filePath (required), linkIndex (required), document_id.
resources_updateAllLinksC
Re-establish all broken/modified links
Inputs: document_id.
resources_updateLinkB
Update/relink a specific link by index to a new file
Inputs: linkIndex (required), newFilePath (required), document_id.
script_runC
Execute arbitrary ExtendScript code with optional debug mode that returns line-level error stack traces
Inputs: code (required), debug, timeout, document_id.
section_createC
Create a new section starting at a specified page
Inputs: startPageIndex (required), name, document_id, includePrefix, +3 more.
section_deleteC
Delete a section by its index
Inputs: sectionIndex (required), document_id.
section_listB
List all sections in the active document
Inputs: document_id.
section_setNumberingC
Update page numbering for a section
Inputs: sectionIndex (required), pageNumberStart (required), document_id, numberingStyle.
shape_createC
Create a geometric shape (rectangle, ellipse, polygon, line)
Inputs: type (required), bounds (required), pageIndex (required), fillColor, +4 more.
shape_deleteC
Delete a shape from a page
Inputs: itemIndex (required), pageIndex (required), document_id.
shape_ellipse_createC
Create an ellipse or circle on a page
Inputs: x (required), y (required), width (required), height (required), +5 more.
shape_line_createC
Create a graphic line on a page
Inputs: x1 (required), x2 (required), y1 (required), y2 (required), +4 more.
shape_listC
List all shapes on a page
Inputs: pageIndex (required), document_id.
shape_modifyC
Modify properties of an existing shape
Inputs: itemIndex (required), pageIndex (required), x, y, +7 more.
shape_polygon_createC
Create a polygon on a page
Inputs: x (required), y (required), width (required), height (required), +6 more.
shape_rectangle_createC
Create a rectangle on a page
Inputs: x (required), y (required), width (required), height (required), +6 more.
style_createCharacterC
Create a new character style
Inputs: name (required), color, basedOn, fontStyle, +4 more.
style_createParagraphC
Create a new paragraph style
Inputs: name (required), color, basedOn, leading, +7 more.
style_deleteC
Delete a style
Inputs: name (required), type (required), document_id.
style_duplicateD
Duplicate a style
Inputs: name (required), type (required), newName (required), document_id.
style_listCharacterC
List all character styles in the active document
Inputs: document_id.
style_listObjectC
List all object styles in the active document
Inputs: document_id.
style_listParagraphB
List all paragraph styles in the active document
Inputs: document_id.
table_addColumnC
Add a column to a table at a specific index
Inputs: pageIndex (required), tableIndex (required), atIndex, document_id.
table_addRowC
Add a row to a table at a specific index
Inputs: pageIndex (required), tableIndex (required), atIndex, document_id.
table_createC
Create a table on a page at specified bounds with row/column count
Inputs: bounds (required), pageIndex (required), rows, columns, +1 more.
table_deleteColumnC
Delete a column from a table
Inputs: pageIndex (required), tableIndex (required), columnIndex (required), document_id.
table_deleteRowC
Delete a row from a table
Inputs: rowIndex (required), pageIndex (required), tableIndex (required), document_id.
table_getInfoC
Get detailed info about a table (rows, columns, cell contents)
Inputs: pageIndex (required), tableIndex (required), document_id.
table_listB
List all tables on a page or in the document
Inputs: pageIndex, document_id.
table_mergeCellsC
Merge a range of cells into one
Inputs: endRow (required), startRow (required), endColumn (required), pageIndex (required), +3 more.
table_setCellC
Set content of a specific cell
Inputs: row (required), column (required), content (required), pageIndex (required), +2 more.
table_setCellAlignmentC
Set cell text alignment
Inputs: rowIndex (required), pageIndex (required), tableIndex (required), columnIndex (required), +3 more.
table_setCellFillC
Set a cell's fill color and tint
Inputs: rowIndex (required), fillColor (required), pageIndex (required), tableIndex (required), +3 more.
table_setCellInsetC
Set cell inset spacing
Inputs: top (required), left (required), right (required), bottom (required), +5 more.
table_setCellStrokeC
Set cell edge stroke properties
Inputs: edge (required), rowIndex (required), pageIndex (required), tableIndex (required), +5 more.
table_setRowColumnSizeC
Set row height or column width
Inputs: size (required), type (required), index (required), pageIndex (required), +3 more.
table_splitCellC
Split a merged cell
Inputs: rowIndex (required), pageIndex (required), tableIndex (required), columnIndex (required), +3 more.
tableStyle_createC
Create a table style in the active document
Inputs: name (required), basedOn, fillColor, spaceAfter, +6 more.
tableStyle_listB
List all table styles in the active document
Inputs: document_id.
text_addFrameC
Add a text frame to a specified page with content
Inputs: bounds (required), pageIndex (required), content, document_id.
text_applyCharStyleC
Apply a character style to a range of characters within a paragraph
Inputs: endChar (required), startChar (required), styleName (required), storyIndex (required), +2 more.
text_applyFontC
Apply font family, style, and/or size to a range of characters within a paragraph
Inputs: endChar (required), startChar (required), storyIndex (required), paragraphIndex (required), +4 more.
text_applyParagraphStyleC
Apply a paragraph style to a text range
Inputs: pageIndex (required), styleName (required), frameIndex (required), document_id, +1 more.
text_findReplaceC
Find and replace text content
Inputs: findWhat (required), replaceWith (required), scope, document_id.
text_getContentC
Get content from a text frame
Inputs: pageIndex (required), frameIndex (required), timeout, document_id, +1 more.
text_getFormattingB
Get detailed formatting (font, size, style, character style) for each text style range in a paragraph
Inputs: storyIndex (required), paragraphIndex (required), document_id, includeControlChars.
text_getStoriesC
List all stories in the active document with optional timeout and max results
Inputs: timeout, maxResults, document_id, includeControlChars.
text_getTextFramesC
List all text frames on a page with optional timeout
Inputs: pageIndex (required), timeout, document_id, includeControlChars.
text_linkFramesC
Link (thread) two text frames together
Inputs: sourcePageIndex (required), targetPageIndex (required), sourceFrameIndex (required), targetFrameIndex (required), +1 more.
text_searchC
Search text within a story using a GREP pattern, returning match positions and context
Inputs: pattern (required), storyIndex (required), timeout, maxResults, +1 more.
text_searchFormattingC
Find text ranges with specific formatting (font family, style, or size) within a story
Inputs: storyIndex (required), timeout, fontStyle, pointSize, +3 more.
text_setAutoSizeC
Set auto-sizing type for a text frame
Inputs: pageIndex (required), frameIndex (required), autoSizingType (required), document_id, +1 more.
text_setColumnsC
Set column count and gutter for a text frame
Inputs: count (required), pageIndex (required), frameIndex (required), gutter, +1 more.
text_setContentC
Set content of a text frame
Inputs: content (required), pageIndex (required), frameIndex (required), document_id.
text_setDropCapC
Set drop cap options for a paragraph
Inputs: pageIndex (required), frameIndex (required), paragraphIndex (required), lines, +3 more.
text_setFirstBaselineC
Set first baseline options for a text frame
Inputs: pageIndex (required), frameIndex (required), offsetType (required), minOffset, +1 more.
text_setHyphenationC
Set hyphenation settings for a paragraph
Inputs: pageIndex (required), frameIndex (required), hyphenation (required), paragraphIndex (required), +5 more.
text_setIgnoreWrapC
Set whether text frame ignores text wrap
Inputs: pageIndex (required), frameIndex (required), ignoreWrap (required), document_id.
text_setInsetSpacingC
Set text frame inset spacing
Inputs: top (required), left (required), right (required), bottom (required), +3 more.
text_setKeepOptionsC
Set keep options (widow/orphan control) for a paragraph
Inputs: pageIndex (required), frameIndex (required), document_id, keepWithNext, +4 more.
text_setParagraphRuleAboveC
Add or modify rule above a paragraph
Inputs: ruleOn (required), pageIndex (required), ruleColor (required), ruleWidth (required), +8 more.
text_setParagraphRuleBelowC
Add or modify rule below a paragraph
Inputs: ruleOn (required), pageIndex (required), ruleColor (required), ruleWidth (required), +8 more.
text_setTabsC
Set tab stops for a paragraph
Inputs: tabStops (required), pageIndex (required), frameIndex (required), paragraphIndex (required), +1 more.
text_setTextWrapC
Set text wrap preferences for an object
Inputs: mode (required), itemIndex (required), pageIndex (required), side, +2 more.
text_setVerticalJustificationC
Set vertical justification for a text frame
Inputs: pageIndex (required), frameIndex (required), justification (required), document_id.
text_unlinkFramesC
Unlink a text frame from its thread
Inputs: pageIndex (required), frameIndex (required), document_id.
toc_createStyleC
Create or modify a Table of Contents style in the active document
Inputs: name (required), title, entryStyle, titleStyle, +5 more.
toc_generateC
Generate a Table of Contents on a specified page
Inputs: pageIndex (required), styleName (required), title, bounds, +2 more.
toc_listStylesB
List all Table of Contents styles in the active document
Inputs: document_id.
toc_updateC
Update (regenerate) an existing TOC from its story
Inputs: storyIndex (required), styleName, document_id.
transform_alignC
Align objects on a page relative to selection, margins, or page
Inputs: alignMode (required), pageIndex (required), itemIndices (required), relativeTo, +1 more.
transform_distributeC
Distribute objects evenly on a page
Inputs: pageIndex (required), itemIndices (required), distributeMode (required), bounds, +1 more.
transform_flipC
Flip an object horizontally or vertically
Inputs: axis (required), itemIndex (required), pageIndex (required), document_id.
transform_rotateC
Rotate an object by a specified angle
Inputs: angle (required), itemIndex (required), pageIndex (required), layerIndex, +1 more.
transform_scaleC
Scale an object by percentages
Inputs: itemIndex (required), pageIndex (required), scaleX, scaleY, +2 more.
undoC
Undo the last operation
Inputs: document_id.
undo_beginGroupA
Begin an undo group. While active, each subsequent script runs as a single undo step, so one Undo reverts a whole tool call (e.g. a multi-step recipe). It cannot merge separate calls into one step ā each call is still its own undo entry. Call undo_endGroup() to restore the default.
Inputs: document_id.
undo_endGroupB
End the undo group and restore the default undo behavior
Inputs: document_id.
undo_historyC
Get undo/redo state information
Inputs: document_id.
xml_addTagC
Create a new XML tag
Inputs: name (required), document_id.
xml_deleteTagC
Delete an XML tag by name
Inputs: name (required), document_id.
xml_exportC
Export document structure as XML
Inputs: filePath (required), document_id.
xml_importC
Import XML file into the document
Inputs: filePath (required), document_id.
xml_listTagsC
List all XML tags in the active document
Inputs: document_id.
xml_tagPageItemC
Apply an XML tag to a page item
Inputs: tagName (required), itemIndex (required), pageIndex (required), document_id.
xref_createC
Create a cross-reference in the active document
Inputs: sourceText (required), targetName (required), targetType (required), document_id, +1 more.
xref_listB
List all cross-references in the active document
Inputs: document_id.
xref_updateFormatC
Update the format of a cross-reference
Inputs: index (required), appliedFormat (required), document_id.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 197 tools
Many tools duplicate one another (export_executeScript/script_run, page_applyMaster/master_apply, table_list/export_getTables, font_list/export_getFonts), making selection ambiguous. Although some descriptions clarify intent, the sheer overlap forces agents to guess.
Names mix noun_verb and verb_noun patterns (page_add vs export_document) and use inconsistent camelCase (document_getStoryPages) alongside snake_case. Prefixes vary by domain (table_ vs tableStyle_, font_missing_check), preventing a predictable convention.
197 tools is far beyond the 50+ threshold for extreme mismatch, even for a feature-rich domain like InDesign automation. Many tools exist only to duplicate or wrap others, bloating the surface unnecessarily.
The surface covers most InDesign operationsādocuments, pages, text, tables, images, styles, export, data merge, scriptsāwith few obvious gaps. Missing a group_create and book_create/book_close prevents a perfect score, but core workflows are workable.
Maintenance
Related MCP Connectors
Give your AI agents a design superpower. Generate, edit, and publish publication-grade decks, reports, landing pages, resumes, and marketing visuals directly within your agent workflow. Delivering frontier-level design quality at 3Ć the speed and 53Ć lower cost -from conversational prompt to live link or vector PDF in minutes.
Convert, create and edit Word, PowerPoint, Excel and PDF documents from any AI agent.
PDF and image tools for AI agents: compress, merge, split, OCR, sign. Runs locally, never uploads.
Agent-Native design tool - create and edit visual designs with agent assistance
Related MCP Servers
- AlicenseCqualityCmaintenanceEnables AI assistants to automate Adobe InDesign publishing workflows, including document creation, text formatting, image placement, PDF export, and more via 35+ professional tools.3660 npm61MIT
- AlicenseCqualityCmaintenanceA Model Context Protocol (MCP) server that gives AI assistants direct, native control over Adobe InDesign via a UXP plugin bridge, with ~130 tools covering documents, pages, text, graphics, styles, master spreads, books, and export.10060 npm110MIT
- AlicenseCqualityBmaintenanceEnables AI agents to directly control Adobe InDesign through CLI commands, providing 148 discoverable capabilities for document creation, editing, and export automation.11460MIT
- AlicenseCqualityDmaintenanceEnables AI assistants to control Adobe InDesign for automated publishing workflows, document creation, and layout tasks across macOS and Windows.363MIT