MCP server for AI agents to read and safely edit Adobe InDesign IDML files. No InDesign required.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y idml-mcp
MCP client config
{
"mcpServers": {
"idml": {
"command": "npx",
"args": [
"-y",
"idml-mcp"
]
}
}
}The AI-native toolkit for Adobe InDesign files (IDML) — parse, summarize, and safely write back. No InDesign required.
AI tools have transformed how we write code and build web pages, but print and layout designers have largely been left out: the InDesign ecosystem has no AI-ready open interface. Existing InDesign MCP servers all remote-control a running InDesign instance — which means a license, a desktop, and an open app for every operation.
idmlkit takes the other road: it works directly on .idml files (InDesign's open, XML-based interchange format). That means it runs anywhere Node.js runs — servers, CI pipelines, Linux, a designer's laptop — with nothing from Adobe installed.
JSON data in ──► idmlkit ──► perfectly laid-out IDML out ──► open in InDesign / print
LLMs are great at understanding a document and deciding what should change, and terrible at hand-editing 5,000 lines of layout XML without breaking it. So idmlkit splits the work:
Validated against real InDesign 2025 exports: on Adobe's official Flex Layout sample (14.5 MB, with a single 20 MB spread), summarize runs in under half a second and a text edit changes exactly one zip entry — every other entry verified byte-identical by CRC.
| Package | What it is |
|---|---|
idmlkit | Core library + CLI: open, summarize, safe text/image write-back |
idml-mcp | MCP server exposing those abilities to Claude and any MCP-capable agent |
npm install
npm run build
node scripts/make-sample-idml.mjs # generates examples/sample.idml
$ node packages/idmlkit/dist/cli.js summary examples/sample.idml
Pages: 1 Spreads: 1
Story u123 (11 words, 2 runs): Spring Catalog 2026 Fresh arrivals for the new season…
Image link u202: file:/images/hero.jpg
Paragraph styles: $ID/NormalParagraphStyle, Headline, Body
$ node packages/idmlkit/dist/cli.js set-text examples/sample.idml u123 0 "Summer Sale 2026" -o out.idml
$ node packages/idmlkit/dist/cli.js relink out.idml u202 "file:/images/summer.jpg"
{
"mcpServers": {
"idml": {
"command": "node",
"args": ["<repo>/packages/idml-mcp/dist/server.js"]
}
}
}
Then ask Claude things like "Summarize catalog.idml and replace every 2025 date with 2026" — it will use these tools:
| Tool | Purpose |
|---|---|
idml_summarize | Structured summary of pages, frames, stories, images, styles |
idml_get_story | One story's plain text + indexed runs with styles |
idml_set_text | Replace one run's text (layout untouched, byte-for-byte) |
idml_relink_image | Point an image link at a new file (geometry untouched) |
import { IdmlDocument, summarizeDocument, setStoryRunText } from "idmlkit";
const doc = await IdmlDocument.open("catalog.idml");
console.log(summarizeDocument(doc)); // LLM-friendly JSON
setStoryRunText(doc, "u123", 0, "New headline");
await doc.save("catalog-updated.idml");
npm install
npm run build # tsc project references
npm test # vitest — includes byte-for-byte preservation tests
MIT. Not affiliated with or endorsed by Adobe. "Adobe" and "InDesign" are trademarks of Adobe Inc., used here only to describe compatibility.