Office Live MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BRIDGE_TLS | No | Set to 1 to enable the emulated SharePoint-style HTTPS catalog. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_presentationsA | Lists all PowerPoint presentations currently connected to the bridge server. Shows presentation IDs (file paths for saved files, generated IDs for unsaved) and connection status. Use this to find the presentationId to pass to other tools when multiple presentations are open. |
| inspect_deckA | Deck overview: slide dimensions, theme (colors + fonts), and all slides with index, ID, and shape count. Use as the first call to understand deck structure. Theme is cached after the first call. For shape details, follow up with scan_slide or inspect_slide on specific slides. For available layouts, use inspect_layouts. |
| inspect_layoutsA | Returns slide layouts with names, OOXML type (e.g. blank, twoObj, secHead), master/layout indices, and detailed placeholders. Use |
| inspect_slideA | Detailed slide inspector (~80 tokens/shape): returns every shape with text content, positions, sizes, and fill colors, plus slide dimensions. Supports slideRange for multiple slides. For just positions without text/fills, use scan_slide instead. |
| scan_slideA | Lightweight shape scanner (~40 tokens/shape): lists shape IDs, types, and positions on slides, plus slide dimensions. Supports slideRange for multiple slides. For text content and fills, use inspect_slide instead. |
| screenshot_slideA | Slide screenshot (~1000 tokens): captures one slide as PNG image. Use to visually verify layout after changes. Do NOT loop over all slides — use preview_deck instead. |
| preview_deckA | Deck preview: batch overview of all/selected slides with optional thumbnails + text. With images: ~900 tokens/slide; text-only (includeImages=false): ~35 tokens/slide. Use for visual review or content audit. Do NOT use to inspect one slide — use inspect_slide or screenshot_slide instead. |
| show_slideA | Bring a slide into view in the live presentation (navigates the user to that slide). Call this BEFORE editing a slide so the user can watch the changes happen; also useful to walk the user through a deck slide by slide. |
| add_slideA | Add a new slide from a layout at a specific position, with placeholder text pre-filled and shapes renamed to layout names. Use inspect_layouts to find available layout names and placeholder names. Returns the new slide index and its placeholder shapes with semantic names. |
| duplicate_slideA | Duplicate a slide within the same presentation. Exports the slide and reimports it at the specified position. Data stays server-side. The reimport makes PowerPoint view jump to the first slide. |
| copy_slidesA | Copies slides between two open presentations entirely server-side — the Base64 data never enters Claude context. Exports from the source presentation and inserts into the destination in a single operation. Both presentations must be connected to the bridge. Requires PowerPointApi 1.8. |
| edit_shape_paragraphsA | Replace paragraph content of a shape with raw OOXML <a:p> XML. Preserves <a:bodyPr> and <a:lstStyle>. Use read_shape_paragraphs first to get the current XML, modify it (using /pptx skill knowledge), then write it back. The slide is exported, modified server-side, and reimported — data never enters Claude's context. NOTE: the reimport deletes and reinserts the slide, which makes PowerPoint's view jump to the first slide. For text-only changes, prefer execute_officejs (in place via shape.textFrame.textRange — view position is preserved). |
| read_shape_paragraphsA | Read raw OOXML <a:p> paragraphs from a shape's text body. Returns the paragraph XML as a string — preserves all formatting (bold, colors, bullets, etc.) that textRange.text strips. Use with the /pptx skill's OOXML knowledge to understand and modify the XML. |
| read_deck_textA | Lightweight text extractor: returns slide titles and body text as plain strings (~20x smaller than inspect_slide). Use for content review, narrative analysis, or any read-only text task. Supports slideRange and optional speaker notes. |
| search_textA | Search for text across all slides (or a slide range) in the presentation — like grep for slides. Searches shape text, table cells, and speaker notes. Returns matching shapes with context at the chosen level. Case-insensitive substring by default; supports regex. |
| format_shapesA | Apply formatting to multiple shapes on a slide in one call. Generates Office.js code internally. Use for fill color, font bold/italic/size/color/name. Cannot set corner radius or borders (use edit_slide_xml code mode for those). Runs in place (no slide reimport), so PowerPoint view position is preserved. |
| edit_slide_xmlA | Edit slide XML and reimport. Two modes: (1) xml mode — provide finished XML string (use read_slide_xml first to get current XML), (2) code mode — provide JS code that manipulates the pre-parsed DOM (receives: doc, findShapeById, NS_P, NS_A, escapeXml, serializeXml, DOMParser). Code mode preserves untouched attributes. The slide is exported, modified server-side, and reimported — data never enters Claude's context. NOTE: the reimport deletes and reinserts the slide, which makes PowerPoint's view jump to the first slide — reserve this for structural changes (new shapes, layout rebuilds). |
| edit_slide_zipA | Update multiple files in the slide zip and reimport in a single operation. Accepts a map of { path: content } — can modify existing files or add new ones (e.g. chart XML + rels). Auto-registers Content_Types for new chart files. Use read_slide_zip first to get the current content. |
| read_slide_xmlA | Read the full raw OOXML of a slide, or filter to a specific shape. Returns the slide's ppt/slides/slide1.xml content. Use with the /pptx skill's OOXML knowledge to understand the XML structure. |
| read_slide_zipA | Read multiple files from the exported slide zip. Returns slide XML, relationships, chart XMLs, and Content_Types. Use this to inspect chart data, rels, or other zip contents beyond what read_slide_xml provides. When no paths specified, auto-discovers all text/XML files in the zip. |
| edit_speaker_notesA | Set speaker notes on one or more slides. Accepts markdown text (paragraphs, bold, italic). Converts to OOXML server-side and injects via single-slide reimport. Replaces all existing notes on the specified slides. |
| read_speaker_notesA | Read speaker notes from slides. Uses full-deck export (cached by revision) to parse notes from OOXML — Office.js has no notes API. Returns plain text per slide. |
| edit_slide_chartA | Create a chart on a slide from structured data. Generates all OOXML automatically (chart XML, rels, graphic frame, Content_Types). Supports column, bar, line, pie, doughnut, and area charts with multiple series. |
| insert_imageA | Inserts an image onto a slide using Office.js setSelectedDataAsync with CoercionType.Image. Accepts a file path, URL, or raw base64 data. Optionally target a specific slide (the view stays there so the user sees the insert; call show_slide first per the view etiquette) and control position/size in points. |
| get_local_copyA | Returns a local file path for the presentation. For local files, returns the existing path. For SharePoint/cloud files, exports server-side and saves to a temp .pptx. Caches by revision number — re-exports only when the presentation has been saved since last export. |
| search_fluent_iconsA | Search Microsoft Fluent UI icon library. Returns matching icons with svgBase64 ready for insert_image (sourceType: "base64") — the SVG content is fetched server-side so dead icon URLs can never break the workflow. Prefer mono (_M) variants for professional decks. Retry with synonyms if no good matches (e.g. "innovation" → "lightbulb", "security" → "shield"). |
| execute_officejsA | Execute arbitrary Office.js code inside the live PowerPoint presentation. The code runs inside PowerPoint.run(async (context) => { ... }) with 'context' available as a variable. Use 'await context.sync()' after loading properties. Return a value to get it back as the tool result. For positioning, all values are in points (1 point = 1/72 inch). Common operations: add shapes, set text, change colors, add/delete slides. Edits run in place without reimporting the slide, so PowerPoint's current view position is preserved — prefer this over edit_shape_paragraphs / edit_slide_xml for text-only or formatting-only changes (to read a shape's text in place, load shape.textFrame with hasText + textRange). |
| verify_slidesA | Run programmatic checks on a slide: detect overlapping shapes, out-of-bounds shapes, empty text, tiny shapes, unused placeholders, placeholder drift from layout defaults, and full-bleed background covers. Returns a list of issues found. Uses the same shape data as inspect_slide — no OOXML needed. |
| list_documentsA | Lists all Word documents currently connected to the bridge server. Shows document IDs (file paths for saved files, generated IDs for unsaved) and connection status. Use this to find the documentId to pass to other Word tools when multiple documents are open. |
| execute_wordjsB | Execute arbitrary Office.js code inside the live Word document. The code runs inside Word.run(async (context) => { ... }) with 'context' available as a variable. Use 'await context.sync()' after loading properties. Return a value to get it back as the tool result. Common operations: read the body (context.document.body), insert paragraphs, search and replace, work with tables, read tracked changes. |
| inspect_documentA | Overview of the live document: paragraph count, section count, table count, inline picture count, and a preview of the first paragraphs with their styles. Use this first to orient yourself in an unfamiliar document. |
| read_paragraphsA | Read paragraphs of the document with their styles, paginated by offset and limit. Returns total count plus the requested slice. |
| get_paragraphB | Read one paragraph in full: text, style, alignment and font properties (name, size, bold, italic, color). |
| insert_paragraphA | Insert a new paragraph into the document, optionally with a style (e.g. "Heading 1", "Title", "Quote"). Insert at the start or end of the body, or before/after a given paragraph index. Returns the new paragraph count. |
| set_paragraph_textA | Replace the text of one paragraph, keeping the paragraph itself (and optionally its style). |
| delete_paragraphB | Delete one paragraph (text and paragraph mark) from the document. |
| format_paragraphA | Format one paragraph: style, alignment, and font (name, size, bold, italic, color, highlight color). Only provided properties are changed. |
| search_documentB | Search the document body for text. Returns up to 50 matches with a text snippet around each hit. |
| replace_textB | Find and replace text throughout the document. Returns the number of replacements made. |
| insert_tableA | Insert a table at the end of the document, optionally pre-filled from a 2D array of strings. Returns row and column counts. |
| read_tableB | Read all cell texts of a table as a 2D array. |
| set_table_cellB | Write text into one table cell (replacing its content). |
| insert_page_breakB | Insert a page break at the end of the document body. |
| comment_on_paragraphC | Add a comment to a paragraph (anchored on its text). |
| get_tracked_changesA | List tracked changes (revisions) in the document: type (insertion/deletion), author, date and a text snippet. Read-only; Office.js cannot create tracked changes. |
| get_selectionB | Read the current user selection (cursor) in the document. |
| save_documentB | Save the document. If it has never been saved, Word applies its default save behavior (may prompt). |
| list_content_controlsA | List all content controls (template fields) in the document: id, title, tag, type, current text and placeholder. Use set_content_control_text with the id to fill them. |
| set_content_control_textA | Replace the text of a content control (template field) identified by its id from list_content_controls. Optionally update its title and tag. |
| read_commentsA | Read all comments in the document body: id, author, text, resolved state, date, and replies. Note: adding replies is not supported by the current Word.js API set. |
| get_document_propertiesB | Read the document metadata: title, author, subject, keywords, comments, category, creation and last-save dates. |
| set_document_propertiesA | Set document metadata (title, author, subject, keywords, comments, category). Only provided fields are changed. |
| edit_table_columnsA | Add or delete columns of a table. Add: position "Before" inserts left of the first column, "After" right of the last column; optionally pre-fill with values (2D array, one column per entry). Delete: remove count columns starting at columnIndex (0-based). Note: some Word builds reject column operations with InvalidArgument. |
| set_table_cellsA | Set the text of multiple table cells in one call. Rows and columns are 0-based indices into the table. |
| list_workbooksA | Lists all Excel workbooks currently connected to the bridge server. Shows workbook IDs (file paths for saved files, generated IDs for unsaved) and connection status. Use this to find the workbookId to pass to other Excel tools when multiple workbooks are open. |
| execute_exceljsB | Execute arbitrary Office.js code inside the live Excel workbook. The code runs inside Excel.run(async (context) => { ... }) with 'context' available as a variable. Use 'await context.sync()' after loading properties. Return a value to get it back as the tool result. Common operations: read/write ranges (workbook.worksheets), formulas, tables, charts. Cell references use A1 notation; values/formulas are returned as arrays matching the range shape. |
| inspect_workbookA | Overview of the live workbook: all worksheets (name, position, visibility, used-range address), all Excel tables (name, sheet, range), all named ranges, and all PivotTables (name, sheet). Use this first to orient yourself in an unfamiliar workbook. |
| read_rangeA | Read values, formulas and number formats from a range of the live workbook. Returns a 2D array (rows x columns) plus the range address and dimensions. Use "usedRange": true to read the whole used range of the sheet. |
| write_rangeA | Write values and/or formulas into a range of the live workbook. Accepts a 2D array (rows x columns) or a single scalar that fills the whole range. Formulas are set separately from values. Also supports setting the number format. Content in the target range is overwritten. |
| format_rangeA | Format a range: font (name, size, bold, italic, underline, color), fill color, borders (all/outline with style, weight, color), alignment, wrap, and number format. Only the provided properties are changed. |
| set_dimensionsB | Set column widths and/or row heights for a range, in points. Optionally autofit columns or rows to their content. |
| add_worksheetA | Add a new worksheet to the workbook, optionally at a specific position, and activate it. Returns the new sheet name and position. |
| update_worksheetA | Update an existing worksheet: rename it, move it to a position, change visibility, set the tab color, or activate it. Only provided properties are changed. |
| delete_worksheetA | Delete a worksheet from the workbook. This removes its contents permanently and can break formulas referencing it. |
| sort_rangeB | Sort a range by one or more columns. Fields are given as zero-based column offsets within the range. |
| find_in_rangeA | Find text in a range or the whole used range. Returns the address of the first match, or all matches as a (possibly multi-area) address string. |
| add_tableB | Create an Excel table (ListObject) over a range. Returns the table name and range. |
| add_chartB | Create a chart from a range. Chart types: ColumnClustered, ColumnStacked, BarClustered, BarStacked, Line, LineMarkers, Pie, Doughnut, Area, XYScatterLines. Returns the chart name and title. |
| add_conditional_formatB | Add a conditional formatting rule to a range. Supports cellValue (compare with a formula and fill on match), colorScale (min/max gradient), dataBar, and iconSet rules. |
| add_nameC | Define a named range (named formula) in the workbook, e.g. name "TaxRate" for "=Sheet1!$B$1". |
| set_data_validationC | Set a data validation rule on a range. Supports list, wholeNumber, decimal, textLength, and date rules. |
| calculate_workbookA | Force Excel to recalculate the workbook. Use after writes when you need formula results to be current before reading them back. |
| insert_or_delete_rangeA | Insert or delete a range, shifting existing cells. For insert, shift is Down or Right; for delete, Up or Left. |
| set_mergeC | Merge or unmerge cells in a range. |
| autofit_rangeB | Autofit column widths and/or row heights of a range to their content. |
| add_commentC | Add a threaded comment to a cell. |
| refresh_pivottablesA | Refresh all PivotTables in the workbook. Use after data changes when pivot summaries must be current. |
| set_worksheet_protectionB | Protect or unprotect a worksheet. Protection restricts user edits; cells formatted as locked are affected. |
| read_threaded_commentsA | Read all threaded comments in the workbook: content, author, creation date, resolved state, and replies. Use reply_to_comment or resolve_comment with a comment id from this output. |
| reply_to_commentB | Add a reply to an existing threaded comment. Use the comment id from read_comments. |
| resolve_commentA | Resolve or reopen a threaded comment. Use the comment id from read_comments. |
| set_hyperlinkA | Set a hyperlink on a cell (address, display text, tooltip). The cell text is replaced by textToDisplay when provided. Pass address as null to remove the hyperlink. |
| freeze_panesA | Freeze rows and columns of a worksheet at a cell (everything above and left of the cell stays visible), or unfreeze. E.g. freezeAt "A2" freezes the first row, "B2" freezes row 1 and column A. |
| replace_in_sheetA | Find and replace text across a whole worksheet (substring match per cell by default). Returns the number of cells changed. Uses findAll so merged/hidden cells behave like the Excel UI. |
| clear_rangeA | Clear the contents and formatting of a range in the live workbook. |
| copy_rangeB | Copy a source range to a target range in the live workbook. Copies values, formulas and formatting by default; valuesOnly copies just the results. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 86 tools
Most tools target distinct resources/actions, but the PowerPoint surface has several overlapping read/inspect variants (inspect_slide, scan_slide, preview_deck, read_deck_text, screenshot_slide) and multiple editing routes (edit_slide_xml, edit_slide_zip, edit_shape_paragraphs, execute_officejs). The descriptions do a good job explaining when to use each, but an agent still faces real selection ambiguity.
Names are consistently snake_case, which helps, but verbs vary widely (inspect, scan, read, get, list, preview, show, edit, execute) and cross-domain tools are not systematically prefixed by app. The pattern is readable but not highly predictable across 86 tools.
86 tools is far beyond a well-scoped set for an MCP server, even one spanning PowerPoint, Word, and Excel. The breadth creates a large surface that is hard for an agent to navigate and invites redundancy.
Coverage is broad: PowerPoint has layout, shape, text, notes, chart, image, and XML/zip operations; Word has paragraph, table, comment, and metadata operations; Excel has range, table, chart, validation, comment, and protection operations. Some lifecycle gaps remain (e.g., PowerPoint slide deletion/reordering, Word table row operations), but core workflows are covered.