Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

LayoutBridge for Adobe InDesign®

NPM · LAYOUTBRIDGE-SPM · SCANNED SEP 27

layoutbridge-spm – MCP server for Adobe® InDesign®: pages, frames, text, styles, tables, export

Available components

60 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency6
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 37080 tokens (~337/item across 110 items; 110 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 110 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the LayoutBridge for Adobe InDesign® MCP server?

LayoutBridge for Adobe InDesign® runs locally as an npm package, launched with npx -y layoutbridge-spm. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · layoutbridge-spm

# add to Claude Code
claude mcp add com-mcp-interfaces-layoutbridge-spm -- npx -y layoutbridge-spm
// .cursor/mcp.json
{
  "mcpServers": {
    "com-mcp-interfaces-layoutbridge-spm": {
      "command": "npx",
      "args": [
        "-y",
        "layoutbridge-spm"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-mcp-interfaces-layoutbridge-spm": {
      "command": "npx",
      "args": [
        "-y",
        "layoutbridge-spm"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-mcp-interfaces-layoutbridge-spm -- npx -y layoutbridge-spm
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-mcp-interfaces-layoutbridge-spm": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "layoutbridge-spm"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-mcp-interfaces-layoutbridge-spm --command npx --arg -y --arg layoutbridge-spm
# ~/.hermes/config.yaml
mcp_servers:
  com-mcp-interfaces-layoutbridge-spm:
    command: "npx"
    args: ["-y", "layoutbridge-spm"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-mcp-interfaces-layoutbridge-spm": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "layoutbridge-spm"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-mcp-interfaces-layoutbridge-spm -t stdio -c npx -a -y layoutbridge-spm
// mcp.json
{
  "mcpServers": {
    "com-mcp-interfaces-layoutbridge-spm": {
      "command": "npx",
      "args": [
        "-y",
        "layoutbridge-spm"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 +10
    • Known CVEs: unverified → pass ▲ security
    • Dependency health: unverified → 0.85 ▲ functional
  • 23 Sept 26 50

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 27 Sept 2026 · Analysed npm/layoutbridge-spm@1.0.1

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 95 packages
Packages resolved 95
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 110 exposed · ~37,080 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
set_frame_rotation ~164

Set the absolute rotation of an object in degrees (-360 to 360; positive = counterclockwise, as in InDesign; a portrait photo credit is -90; 0 straightens it). Rotates around the centre of the object. Returns frame_id, angle_deg read back and bounds_mm in the rotated space. Rule: draw frames unrotated, then rotate.

NameTypeReqDescription
angle_degnumberyesAbsolute angle in degrees, positive counterclockwise.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.

No output schema declared.

No examples provided.

set_frame_stacking ~131

Change the stacking order (Stapelreihenfolge) of an object within its layer: bring_to_front, send_to_back, bring_forward or send_backward. Newly created objects always start on top. Returns frame_id and action.

NameTypeReqDescription
actionstringyesStacking action within the layer.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.

No output schema declared.

No examples provided.

set_layer_visibility ~250

Set visible, locked and/or printable on one layer (Ebene): at least one of the three. Pass layer_name or layer_id. Returns the layer state after the change, previous {visible, locked, printable}, item_count and changed. Warns when a layer with objects is hidden and when a layer is set to not print (its objects vanish from PDF exports). Unlocking is the fix when writing tools fail on objects of a locked layer.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
layer_idinteger–Layer id from list_layers. Pass either layer_name or layer_id.
layer_namestring–Layer name (Ebene), exact, as list_layers returns it. Pass either layer_name or layer_id.
lockedboolean–Lock (true) or unlock (false) the layer.
printableboolean–Print/export (true) or not (false).
visibleboolean–Show (true) or hide (false) the layer.

No output schema declared.

No examples provided.

set_layout_grid ~427

Set margins, column count and gutter on document pages and, by default, master pages, and redistribute the column guides evenly (relative to the type area). Whatever is omitted stays as it is. margins_mm takes top, left, bottom, right in mm – for facing pages "left" is the inside margin (Bundsteg) and "right" the outside margin. column_count 1–30, column_gutter_mm. page_ids[] limits the change to those pages (document or master pages); without it every page and the document defaults for new pages are changed – a client may block one call over all pages, so pass page_ids in blocks if needed. Optional baseline_grid {start_mm, increment_pt, relative_to: top_of_page | top_of_margin} sets the document baseline grid (Grundlinienraster). Moves only guides, never frames. Returns changed_pages[] {page_id, name, margins_mm, column_count, column_gutter_mm, type_area_mm, column_width_mm, columns_positions_mm} read back from InDesign, with a warning per page whose column positions do not lie on the even grid. A timed-out call may still have completed in InDesign – check with get_layout_grid before repeating.

NameTypeReqDescription
baseline_gridobject–Document baseline grid (Grundlinienraster); document-wide, not per page.
column_countinteger–Number of columns, 1–30.
column_gutter_mmnumber–Gutter (Spaltenabstand) in mm.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
include_parent_pagesboolean–Also include master pages (Musterseiten). Default true.
margins_mmobject–Margins in mm; omitted edges stay.
page_idsarray–Pages to change (document or master pages). Without it: all pages plus the document defaults.

No output schema declared.

No examples provided.

set_paragraph_options ~878

Set paragraph options of a text frame: alignment (left, center, right, justify_left, justify_center, justify_right, justify_full), hyphenation (true/false – usually false for headlines), no_break (true/false, keeps the text of the paragraphs on one line), and the option groups keep_options (Umbruchoptionen: keep_with_next, keep_first_lines, keep_last_lines, keep_lines_together, keep_all_lines_together, keep_with_previous, start_paragraph), hyphenation_options (Silbentrennungseinstellungen: words_longer_than, after_first, before_last, ladder_limit, zone_mm, capitalized_words, last_word, across_columns, weight) and justification_options (word_spacing, letter_spacing, glyph_scaling, single_word_justification, composer, auto_leading_percent). Indents in mm: left_indent_mm, first_line_indent_mm (negative for a hanging indent, never further left than the left indent), right_indent_mm, last_line_indent_mm. tab_stops[] {position_mm, alignment left|center|right|character, leader, align_on} replaces the whole tab list ([] clears it); language selects the dictionary by the name InDesign shows, its untranslated name or an ICU locale (de_DE, en_GB – the safest form). The answer reads them back under indents {left_indent_mm, first_line_indent_mm, right_indent_mm, last_line_indent_mm, tab_stops[], language {name, untranslated_name, icu_locale}}. Without start_index/end_index every paragraph of the frame is changed; with them every paragraph the range touches. Returns paragraphs_changed, alignment, hyphenation, no_break, keep_options, hyphenation_options, justification_options, indents of the first paragraph read back after the change, and overset of the story – strict keep options can push text into overset or leave empty column ends; check get_frame_lines.

NameTypeReqDescription
alignmentstring–Paragraph alignment.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
end_indexinteger–Optional range end (exclusive).
first_line_indent_mmnumber–First-line indent (Einzug erste Zeile) in mm; negative = hanging indent, at most -left_indent_mm.
frame_idintegeryesObject id from get_page_state.
hyphenationboolean–Hyphenation on or off.
hyphenation_optionsobject–Hyphenation settings (Silbentrennungseinstellungen). The plain hyphenation switch stays a separate parameter. Whatever is omitted stays.
justification_optionsobject–Justification settings (Abstandseinstellungen für Blocksatz). Whatever is omitted stays. The paragraph composer recomposes the whole paragraph on every change – check get_frame_lines afterwards.
keep_optionsobject–Keep options (Umbruchoptionen / Absatzkontrolle). Whatever is omitted stays.
languagestring–Language of the text (Sprache, for hyphenation and spelling): the name InDesign shows (e.g. "Deutsch: 2006 Rechtschreibreform", "Englisch: Großbritannien"), its untranslated name as InDesign holds it…
last_line_indent_mmnumber–Last-line right indent (Einzug letzte Zeile) in mm.
left_indent_mmnumber–Left indent (Einzug links) in mm.
no_breakboolean–No-break for the paragraph text.
right_indent_mmnumber–Right indent (Einzug rechts) in mm.
start_indexinteger–Optional range start (inclusive); without it the whole frame.
tab_stopsarray–Complete list of tab stops (Tabulatoren); replaces every existing tab stop, [] removes all. Text reaches a tab stop through {{tab}} in set_text.

No output schema declared.

No examples provided.

set_section ~358

Start a section on page_id or change the one starting there: page_number_start (sets continue_numbering false), continue_numbering, page_number_style (arabic, upper_roman, lower_roman, upper_letters, lower_letters), section_prefix (up to 8 characters), include_section_prefix, marker (text for the section marker), name. remove true deletes the section starting on page_id (never the first). Returns created, section (read back), previous, sections[] and pages[] {page_id, name} – page names change with the numbering, so re-read them before using page names in export_pdf ranges. Use it for an issue that starts at page 3, roman front matter, or a supplement with its own numbering.

NameTypeReqDescription
continue_numberingboolean–true: continue from the previous section.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
include_section_prefixboolean–Show the prefix in page numbers.
markerstring–Section marker text (Abschnittsmarke).
namestring–Section name.
page_idintegeryesDocument page on which the section starts (from list_pages).
page_number_startinteger–Page number of the first page of the section; implies continue_numbering false.
page_number_stylestring–Numbering style.
removeboolean–Remove the section starting on page_id. Not combinable with other settings.
section_prefixstring–Prefix before the page number, up to 8 characters.

No output schema declared.

No examples provided.

set_selection ~221

Select objects in the document window by frame_ids (replaces the selection) – to show the user what you mean – or a text range with text_range {frame_id, start_index, end_index} (story indices as get_frame_text gives them; start_index equal to end_index places the insertion point there), or clear true to deselect everything. Selecting text switches InDesign to the text tool at that place; combine with show_page to make it visible. Objects on hidden or locked layers cannot be selected (warning when fewer objects end up selected). Returns the selection as get_selection does plus cleared (and story_length for a text range).

NameTypeReqDescription
clearboolean–Deselect everything instead.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idsarray–Objects to select.
text_rangeobject–Text to select instead of objects.

No output schema declared.

No examples provided.

set_story_options ~272

Read or set story-wide options of the story a text frame belongs to (frame_id names any frame of the story): optical_margin_alignment (optischer Randausgleich / hängende Interpunktion – punctuation and letter edges hang slightly outside the column edge, which makes justified edges look straight) and optical_margin_size_pt (the point size the alignment is calculated for; usually the body text size, 0.1–1296). Without parameters it is read-only. Returns story_id, frame_ids[] of the story in threading order, the two values after the change, previous {…}, changed[] and overset of the story. Optical margin alignment recomposes every line of the story – check get_frame_lines afterwards. get_frame_options shows the two values under text as well.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.
optical_margin_alignmentboolean–Switch optical margin alignment on or off for the whole story.
optical_margin_size_ptnumber–Reference point size for the alignment, usually the body text size.

No output schema declared.

No examples provided.

set_table_cells ~369

Write cell texts into an existing table from a matrix, starting at start_row/start_column (0-based, rows counted across header, body and footer). By default the matrix must fit; grow true adds body rows and columns as needed. Optional paragraph_style and cell_style for the written cells. Cells hidden by a merged cell are skipped (warning). Returns cells_written, cells_skipped, rows_added, columns_added, overflowing_cells (cells whose text does not fit – widen the column or shorten), overset of the story, and the table summary as get_table.

NameTypeReqDescription
cell_stylestring–Cell style (Zellenformat) by exact name; get_table lists the available ones.
cellsarrayyesRows of cell texts, row-major: [["Datum","Ort"],["12.05.","A"]]. Numbers are written as text, null leaves the cell untouched. Line breaks (\n) become paragraphs inside the cell.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.
growboolean–Add rows and columns when the matrix exceeds the table. Default false = invalid_argument.
paragraph_stylestring–Paragraph style applied in the written cells (exact name).
start_columninteger–First column to write, 0-based. Default 0.
start_rowinteger–First row to write, 0-based across all rows. Default 0.
table_indexinteger–Which table of the story, in text order, 0 = first. Default 0.

No output schema declared.

No examples provided.

set_table_style ~342

Change how a table looks: table_style (Tabellenformat), cell_style with cell_style_scope all|header|body|footer, column_widths_mm (one per column) or width_mm (proportional), header_rows and footer_rows (converted from existing rows; at least one body row must remain). At least one parameter. Unknown style names are not_found with the available names in the details. Returns the table summary (widths, heights, counts, table_style), cells_styled, changed, overset.

NameTypeReqDescription
cell_stylestring–Cell style (Zellenformat) by exact name; get_table lists the available ones.
cell_style_scopestring–Which rows get cell_style. Default all.
column_widths_mmarray–Column widths in mm, one per column.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
footer_rowsinteger–Number of footer rows (taken from the bottom rows).
frame_idintegeryesObject id from get_page_state.
header_rowsinteger–Number of header rows (taken from the top rows).
table_indexinteger–Which table of the story, in text order, 0 = first. Default 0.
table_stylestring–Table style (Tabellenformat) by exact name; get_table lists the available ones.
width_mmnumber–Total table width in mm, columns scaled proportionally.

No output schema declared.

No examples provided.

set_text ~381

Replace the whole story of a text frame (really replace, never append): text with real line breaks as paragraph marks ("\n" or "\r\n" in the parameter become paragraph returns; U+2028 stays a forced line break). "" empties the frame. The text takes the document text defaults as local formatting – apply a paragraph style afterwards with apply_paragraph_style_to_range over the whole story. For a threaded frame the entire story across all frames is replaced (warning). Returns frame_id, character_count read back and overset. Placeholders in the text become InDesign special characters (placeholders true, default): {{line_break}} (forced line break within the paragraph), {{nbsp}} (no-break space U+00A0), {{nbsp_fixed}} (fixed-width no-break space U+202F), {{thin_space}}, {{hair_space}}, {{soft_hyphen}} (discretionary hyphen), {{nb_hyphen}} (no-break hyphen), {{en_dash}}, {{em_dash}}, {{tab}}, {{column_break}}, {{frame_break}}, {{page_break}}. Unknown {{…}} stay as written with a warning; each placeholder is exactly one character in the story. Returns placeholders_replaced {name: count} and placeholders_unknown[].

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.
placeholdersboolean–Expand {{…}} placeholders into special characters. Default true; false writes them literally.
textstringyesNew text; line breaks become paragraph marks, {{line_break}} a forced line break; "" empties the frame.

No output schema declared.

No examples provided.

set_text_in_range ~613

Replace characters start_index (inclusive) to end_index (exclusive) of the story of a text frame with text; start == end inserts, text "" deletes the range. The new text keeps the formatting of the first replaced character up to its first paragraph mark (keep_format_of "start", default) – also when the range begins a paragraph that follows a paragraph with other formatting; every further new paragraph takes the formatting and paragraph style of the replaced paragraph at the same position (beyond the last one: of the last replaced paragraph). If the range begins with a paragraph mark, the paragraphs merge and the new text continues that paragraph in its formatting. The right way for formatted placeholders and for a full swap (0 to story_length). keep_format_of "before" leaves the choice to InDesign (the range is replaced in one step); "none" removes character style and local character formatting from the new text, so it shows its paragraph style. An insertion (start == end) takes InDesign's formatting of the insertion point unless keep_format_of is "none". An empty line is two line breaks. Indexes come from get_frame_text. Returns frame_id, replaced_chars, inserted_chars, story_length and keep_format_of. Placeholders in the text become InDesign special characters (placeholders true, default): {{line_break}} (forced line break within the paragraph), {{nbsp}} (no-break space U+00A0), {{nbsp_fixed}} (fixed-width no-break space U+202F), {{thin_space}}, {{hair_space}}, {{soft_hyphen}} (discretionary hyphen), {{nb_hyphen}} (no-break hyphen), {{en_dash}}, {{em_dash}}, {{tab}}, {{column_break}}, {{frame_break}}, {{page_break}}. Unknown {{…}} stay as written with a warning; each placeholder is exactly one character in the story. Returns placeholders_replaced {name: count} and placeholders_unknown[].

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
end_indexintegeryesEnd of the range (exclusive); equal to start_index inserts.
frame_idintegeryesObject id from get_page_state.
keep_format_ofstring–Formatting of the new text: "start" (default) the first replaced character up to the first new paragraph mark, then paragraph by paragraph the replaced paragraph at the same position; "before" whatev…
placeholdersboolean–Expand {{…}} placeholders into special characters. Default true; false writes them literally.
start_indexintegeryesFirst character to replace (inclusive).
textstringyesReplacement text; "" deletes. Placeholders such as {{nbsp}} are expanded.

No output schema declared.

No examples provided.

set_text_wrap ~233

Set the text wrap (Textumfluss) of an object: mode none, bounding_box, object_shape, jump_object or next_column, with an optional offset as offset_mm or offset_pt {top, left, bottom, right} (one of them, not both; object_shape uses only one distance). The reliable cure for text frames pushed into overset by a new frame is mode "none". Returns frame_id, mode and offset_mm read back. The document is recomposed afterwards; recomposed, overset_stories_before, overset_stories_after and overset_changed report whether the overset state of the document changed.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.
modestringyesText wrap mode.
offset_mmobject–Wrap offset in mm.
offset_ptobject–Wrap offset in points.

No output schema declared.

No examples provided.

show_page ~421

Turn the layout window of the document to a page and fit it – for demonstrations, screen recordings and for checking a page by eye. Address the page by page_id (from list_pages, or a master page from list_parent_pages) or by page_name (the printed page number as list_pages shows it; with sections restarting the numbering the first match is shown with a warning). fit: page (default, centres the page), spread (the whole Druckbogen – InDesign then reports the left page of the spread as active_page, so compare active_spread_id), pasteboard, actual_size (100 %) or none (keep the current zoom); zoom (5–4000 percent) is applied after fit and overrides it. activate true brings the window to the front (default false – other documents stay where they are). Changes only the view, never the document. Fails with invalid_state when the document has no layout window (opened with show_window false). Returns page_id, page_name, is_parent_page, fit, zoom_percentage, view {active_page_id, active_page_name, active_spread_id, is_parent_page, zoom_percentage} read back, and previous_view. Tools that add pages (add_page, create_parent_page, place_text_file with autoflow) keep the view by default (keep_view).

NameTypeReqDescription
activateboolean–Bring the window to the front. Default false.
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
fitstring–How to fit the view. Default page.
page_idinteger–Page to show, from list_pages or list_parent_pages. Either page_id or page_name.
page_namestring–Printed page number as list_pages shows it. Either page_id or page_name.
zoomnumber–Zoom in percent (5–4000), applied after fit.

No output schema declared.

No examples provided.

thread_text_frames ~180

Thread (verketten) two text frames into one story: the text of source_frame_id continues in target_frame_id. Already threaded to each other = no-op (already_threaded true). Text already in the target is merged into the story after the source text (warning). A source that already continues elsewhere, or a target that already continues another frame, is refused with invalid_state. Returns source_frame_id, target_frame_id, story_id and story_character_count.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
source_frame_idintegeryesFrame whose text continues in the target.
target_frame_idintegeryesFrame that receives the continuation.

No output schema declared.

No examples provided.

unanchor_frame ~140

Release an anchored object from its text: it stays where it is drawn but becomes a free object of the page again (the anchor character is removed from the story). Returns frame_id (read back), was_anchored {story_id, index, position}, bounds_mm, page_id/page_name. invalid_state when the object is not anchored.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.

No output schema declared.

No examples provided.

unembed_link ~181

Turn embedded graphics back into links (Einbettung aufheben): without folder_path InDesign links to the original file again (fails when it is gone), with folder_path the file is written to that folder and linked from there. Returns unembedded[] with the new file_path and status, skipped[] (not embedded), links_after.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
folder_pathstring–Existing folder to write the files into.
frame_idinteger–All linked graphics of this object. Pass either link_ids or frame_id.
link_idsarray–Links from list_links. Pass either link_ids or frame_id.

No output schema declared.

No examples provided.

ungroup_frame ~161

Dissolve a group (Gruppe aufheben): its members become independent objects of the page again and keep their ids; the group id disappears. Nested groups inside are kept as groups. Returns frame_id (the former group), member_ids, member_count, landed_on_page_id and landed_on_page_name of the members. Fails with invalid_state when the object is not a group or is itself inside a group (ungroup the outer group first).

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
frame_idintegeryesObject id from get_page_state.

No output schema declared.

No examples provided.

update_links ~155

Update links whose file changed on disk ("Verknuepfung aktualisieren"): link_ids[] (1 to 500) or, without it, every LINK_OUT_OF_DATE link. Ids that are not out of date come back as "nothing to do", no error. Returns results[] {link_id, name, page_name, status_before, status_after}, updated, failed and considered.

NameTypeReqDescription
document_idinteger–Document to act on, from list_documents or open_document. Without it the frontmost document is used. A document opened with show_window false is never the active one and must always be addressed by i…
link_idsarray–Links to update. Default: all out-of-date links.

No output schema declared.

No examples provided.

Common questions

What is the LayoutBridge for Adobe InDesign® MCP server?

LayoutBridge for Adobe InDesign® is an MCP server listed in the public MCP registry as com.mcp-interfaces/layoutbridge-spm. layoutbridge-spm – MCP server for Adobe® InDesign®: pages, frames, text, styles, tables, export. This page covers its npm package (layoutbridge-spm).

Is the LayoutBridge for Adobe InDesign® MCP server safe to use?

LayoutBridge for Adobe InDesign® scores 60 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 27 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the LayoutBridge for Adobe InDesign® MCP server expose?

LayoutBridge for Adobe InDesign® exposes 110 tools: get_app_version, list_documents, open_document, close_document, list_pages, and 105 more. Their descriptions and schemas cost roughly 37,080 tokens of context every time the server is loaded.

Is the LayoutBridge for Adobe InDesign® MCP server still maintained?

LayoutBridge for Adobe InDesign® is still listed as active in the MCP registry. We last reached this channel on 27 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.