
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
adobe-mcp-indesign
Advanced tools
MCP server that turns Adobe InDesign into an AI design automation platform — 135+ tools for layout, styles, export, and publishing workflows
Turn Adobe InDesign into an AI design automation platform — 420+ MCP tools for documents, layout, typography, styles, tables, images, long documents, interactive documents, prepress, and PDF and EPUB export. Drive InDesign from Claude, Cursor, Warp, or any MCP client using natural language.
Design ops still means repeating the same layout chores by hand. This server exposes InDesign as structured tools an agent can call: create pages, place assets, apply brand styles, export PDF — without leaving the chat.
Each area covers the panels and dialogs of one part of InDesign, mapped feature by feature to the capability atlas:
osascript) bridge; InDesign version is auto-detected (or set via INDESIGN_APP_NAME)New-Object -ComObject); tries current and recent InDesign ProgIDsINDESIGN_BACKEND=uxp|auto via local bridge + plugin under uxp/tools/listsrc/utils/jsxSafe.js for validated string/number/path interpolation into ExtendScriptUses AppleScript. Grant Automation permissions for your terminal/Node if prompted (System Settings → Privacy & Security → Automation).
InDesign version is resolved in order:
INDESIGN_APP_NAME environment variable (e.g. Adobe InDesign 2026)Adobe InDesign *.app under /Applications or ~/ApplicationsAdobe InDesign 2025Uses COM automation through PowerShell. No extra install steps. InDesign should be installed; the server will attach to a running instance or launch via COM.
Nothing to clone. MCP clients start the server with npx, which downloads it from npm on first run. It is listed in the official MCP Registry as io.github.zachshallbetter/adobe-mcp-indesign.
Claude Code:
claude mcp add indesign -- npx -y adobe-mcp-indesign
Any other client (Claude Desktop claude_desktop_config.json, Cursor, Warp, …):
{
"mcpServers": {
"indesign": {
"command": "npx",
"args": ["-y", "adobe-mcp-indesign"]
}
}
}
Optional environment overrides:
{
"mcpServers": {
"indesign": {
"command": "npx",
"args": ["-y", "adobe-mcp-indesign"],
"env": {
"INDESIGN_APP_NAME": "Adobe InDesign 2026",
"INDESIGN_ALLOWED_DIRS": "/Users/you/Projects:/Users/you/Documents"
}
}
}
}
INDESIGN_APP_NAME — macOS only; force a specific app name for AppleScriptINDESIGN_ALLOWED_DIRS — extra directories allowed for file operations (delimiter is : on macOS, ; on Windows)Restart the client, open InDesign, then try: Create an A4 doc and add a centered title.
To run from a clone instead (for development), use "command": "node" with "args": ["/ABSOLUTE/PATH/TO/adobe-mcp-indesign/src/index.js"] after npm install.
await tools.call("help");
await tools.call("help", { tool: "create_document" });
await tools.call("help", { category: "text" });
await tools.call("help", { format: "detailed" });
await tools.call("help", { format: "examples" });
await callTool('create_document', {
width: 210,
height: 297,
pages: 1
});
await callTool('create_text_frame', {
content: 'Hello, InDesign!',
fontSize: 14
});
await callTool('create_paragraph_style', {
name: 'Heading',
fontSize: 24,
alignment: 'CENTER_ALIGN'
});
137 tools in seven areas. The full reference, with every parameter, is docs/TOOLS.md (generated from the same definitions the server advertises).
| Area | Tools | Examples |
|---|---|---|
| Documents & books | 46 | create_document, open_document, save_document, preflight_document, data_merge, validate_document, create_book, export_book |
| Pages & spreads | 30 | add_page, resize_page, create_page_guides, place_file_on_page, list_spreads, duplicate_spread |
| Text & tables | 5 | create_text_frame, edit_text_frame, create_table, populate_table, find_replace_text |
| Graphics & images | 8 | place_image, create_rectangle, create_polygon, create_object_style |
| Styles & colors | 8 | create_paragraph_style, create_character_style, create_color_swatch, apply_color |
| Layout, masters & layers | 30 | move_page_item, create_group, create_master_spread, detach_master_items, create_layer |
| Export & utilities | 10 | export_pdf, export_images, export_epub, package_document, indesign_status, execute_indesign_code |
initialize response (units, indexes, colors, fonts, paths, errors), which MCP clients pass to the model.readOnlyHint, destructiveHint, idempotentHint and openWorldHint let clients ask before destructive calls such as delete_page, cleanup_document or close_document (which discards unsaved changes).isError: true with a message such as "No document open" or "Error: color swatch 'Brand' not found".help({ tool }) returns any tool's parameters; help({ category }) lists tools by area."#RRGGBB", fonts as "Family\tStyle". See docs/LLM_PROMPT.md for workflows.The server tracks page dimensions and active document metadata so tools can place content with sensible defaults when coordinates are omitted.
await callTool('get_session_info', {});
await callTool('clear_session', {});
await callTool('create_text_frame', {
content: 'Auto-positioned text',
fontSize: 12
});
src/
├── core/
│ ├── InDesignMCPServer.js # MCP server
│ ├── scriptExecutor.js # macOS AppleScript + Windows COM
│ └── sessionManager.js # Session state
├── handlers/ # Tools by domain
│ ├── documentHandlers.js
│ ├── pageHandlers.js
│ ├── textHandlers.js
│ ├── styleHandlers.js
│ ├── graphicsHandlers.js
│ ├── bookHandlers.js
│ ├── pageItemHandlers.js
│ ├── groupHandlers.js
│ ├── masterSpreadHandlers.js
│ ├── spreadHandlers.js
│ ├── layerHandlers.js
│ ├── exportHandlers.js
│ ├── utilityHandlers.js
│ ├── helpHandlers.js
│ └── index.js
├── types/ # Tool definitions
├── utils/
│ ├── stringUtils.js # Response helpers, escapeJsxString
│ └── jsxSafe.js # Validated ExtendScript literals / paths
└── index.js
| Platform | Mechanism | Notes |
|---|---|---|
| macOS | osascript → do script | App name auto-detected; temp .jsx in OS temp dir |
| Windows | PowerShell COM DoScript | ProgIDs tried newest-first; temp .jsx in OS temp dir |
Tool arguments that flow into JSX should go through src/utils/jsxSafe.js:
str(), num(), bool(), index(), enumOf(), measure(), json(), numList()validateFilePath() / jsxPath() for filesystem paths (INDESIGN_ALLOWED_DIRS)Every handler uses these helpers; raw argument strings never reach a script.
Scripts report failures as text ("No document open", "Error …", "… not found"). The server recognizes these (looksLikeFailure in src/utils/stringUtils.js) and returns them with success: false and MCP isError: true, so clients can tell a failed call from a successful one.
npm run check # syntax check core modules
npm test # everything below that needs no InDesign
npm run test:audit # script audit only; pass a regex to audit some tools
npm run test:integration # full suite — requires InDesign running
npm run test:unified # single-document unified runner
npm test covers:
INDESIGN_ALLOWED_DIRShelp for eachisError resultsdocs/TOOLS.md matches the definitionsThe script audit (tests/audit/scripts.audit.js) calls every tool with arguments built from its schema, captures the ExtendScript it would send, and fails if any advertised tool is not dispatched, if a script is not valid ES5 (ExtendScript has no let, arrow functions or JSON), or if a script uses a property, method, enum or global that does not exist in the InDesign 2023 scripting DOM (types-for-adobe).
CI runs check and npm test on every push and pull request. The audit checks scripts against Adobe's published DOM; it does not run them, so the integration suite against a live InDesign remains the final check.
| Backend | How to enable |
|---|---|
| ExtendScript / COM (default) | unset or INDESIGN_BACKEND=extendscript |
| UXP bridge + plugin | INDESIGN_BACKEND=uxp (or auto) + npx -p adobe-mcp-indesign adobe-mcp-indesign-uxp-bridge + load uxp/plugin |
Details: docs/architecture-execution.md and uxp/README.md.
Optional packaging reference: theloniuser/indesign-uxp-server (bridge/plugin adapted into uxp/ with attribution).
See examples/basic-flyer.md and examples/mcp-config.json for a first-run workflow and client config.
See CONTRIBUTING.md. Report security issues privately as described in SECURITY.md.
This server began as lucdesign/indesign-mcp-server by Lukas Drechsel-Burkhard, released under the MIT License. This project builds on that work; the original copyright notice is kept in LICENSE.
MIT. See LICENSE.
FAQs
MCP server that turns Adobe InDesign into an AI design automation platform — 135+ tools for layout, styles, export, and publishing workflows
We found that adobe-mcp-indesign demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.