Skip to main content
Glama
rcarmo

office-document-mcp-server

by rcarmo

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
OFFICE_MCP_METADATA_CACHE_DIRNoOverride for the metadata cache directory. Default is .office-metadata-cache/

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
azure_calculate_costA

Calculate monthly cost for an Azure resource.

Looks up pricing and calculates the estimated monthly cost based on quantity and usage hours.

Example: # Cost for 3 D4 v5 VMs running 24/7 azure_calculate_cost( service="Virtual Machines", sku_match="D4 v5", quantity=3 )

# Cost for 1000 GB storage
azure_calculate_cost(
    service="Storage",
    product_match="Blob Storage",
    sku_match="Hot LRS",
    quantity=1000,
    hours_per_month=1  # Storage is per GB, not per hour
)

Args: service: Azure service name region: ARM region name (default: "westeurope") sku_match: SKU name to match product_match: Product name to match quantity: Number of units (VMs, instances, GB, etc.) hours_per_month: Hours of usage per month (default: 730 = 24/7) price_type: Price type (default: "Consumption") currency: Currency code (default: "USD")

Returns: Dictionary with pricing details and calculated costs

azure_clear_cacheA

Clear Azure pricing cache.

Args: service: Clear cache for specific service only (None = all) region: Clear cache for specific region only (None = all) clear_disk: Clear disk cache (default: True) clear_memory: Clear memory cache (default: True)

Returns: Dictionary with cleared cache information

azure_fetch_pricesA

Fetch and cache Azure retail prices for specified services and regions.

Downloads pricing data from the Azure Retail Prices API and stores it locally for fast subsequent queries. Data is cached on disk for 24 hours.

Example: azure_fetch_prices( services=["Virtual Machines", "Azure Databricks", "Storage"], regions=["westeurope", "eastus"] )

azure_fetch_prices(services=["API Management"], force_refresh=True)

Args: services: List of Azure service names to fetch pricing for. If None, fetches common services. regions: List of ARM region names (e.g., "westeurope", "eastus"). If None, fetches common regions. currency: Currency code (default: "USD") force_refresh: If True, ignore cache and fetch fresh data

Returns: Dictionary with fetch status and summary statistics

azure_list_cached_servicesA

List all services currently cached in memory and on disk.

Returns: Dictionary with cached service/region combinations and statistics

azure_list_regionsA

List available ARM regions for a service or cached data.

Args: service: Optional service name to filter by currency: Currency code (default: "USD") from_cache_only: If True, only uses cached data max_pages: Maximum API pages to scan when fetching (default: 2) max_regions: Maximum regions to return (default: 200)

Returns: Dictionary with region names and source metadata

azure_list_servicesA

List available Azure service names for a region.

Args: region: ARM region name (default: "westeurope") currency: Currency code (default: "USD") from_cache_only: If True, only uses cached data max_pages: Maximum API pages to scan when fetching (default: 2) max_services: Maximum services to return (default: 200)

Returns: Dictionary with service names and source metadata

azure_query_pricesA

Query cached Azure pricing data with flexible filters.

Searches the in-memory price cache for matching items. If data is not cached, it will be fetched automatically.

Example: # Get VM pricing azure_query_prices( service="Virtual Machines", region="westeurope", sku_contains="D4" )

# Get Databricks DBU pricing
azure_query_prices(
    service="Azure Databricks",
    sku_contains="All-purpose"
)

# Get reserved instance pricing
azure_query_prices(
    service="Virtual Machines",
    sku_contains="D4",
    price_type="Reservation"
)

Args: service: Azure service name (required for initial query) region: ARM region name (default: "westeurope") sku_contains: Filter by SKU name containing this string product_contains: Filter by product name containing this string price_type: Price type filter: "Consumption", "Reservation", "DevTestConsumption", or None for all currency: Currency code (default: "USD") max_results: Maximum items to return (default: 50)

Returns: Dictionary with matching price items and summary

excel_add_chartA

Add a chart to an Excel worksheet.

Example: excel_add_chart( file_path="report.xlsx", data_range="Sheet1!A1:D8", chart_type="line", title="Growth Forecast", position="F2" )

Args: file_path: Path to the .xlsx or .xlsm file data_range: Range containing data (e.g., "A1:D10" or "Sheet1!A1:D10") chart_type: "line", "bar", "column", or "pie" sheet_name: Optional sheet name (overrides sheet in data_range) title: Optional chart title position: Top-left anchor cell for the chart (default "E2") has_header: Treat first row as header for series names use_first_column_as_categories: Use first column as category labels output_path: Optional output path (defaults to overwriting input)

Returns: Status dictionary with chart details

excel_add_sheetA

Add a new sheet to an Excel workbook.

Creates a new empty sheet in the workbook at the specified position. The sheet can be inserted at the start, end, or after a specific existing sheet.

Example: excel_add_sheet(file_path="data.xlsx", sheet_name="Summary") excel_add_sheet(file_path="data.xlsx", sheet_name="NewSheet", position="start") excel_add_sheet(file_path="data.xlsx", sheet_name="Details", position="Sheet1")

Args: file_path: Path to the .xlsx or .xlsm file sheet_name: Name for the new sheet position: Where to insert - 'start', 'end' (default), or name of sheet to insert after output_path: Optional output path (defaults to overwriting input file)

Returns: Dictionary with success status and sheet details

excel_delete_commentA

Delete a comment from a specific cell.

Args: file_path: Path to the .xlsx or .xlsm file cell_ref: Cell reference (e.g., 'B5', 'Sheet1!C10') sheet_name: Optional sheet name (overrides sheet in cell_ref) output_path: Optional output path (defaults to overwriting input)

Returns: Status dictionary with deletion details

excel_from_markdownA

Convert Markdown tables to an Excel workbook from inline content or markdown_file.

    This is the primary tool for creating Excel workbooks from text content.

    Parses GitHub Flavored Markdown content and extracts all tables.
    Each table becomes a separate sheet in the workbook.

    Features:
    - Auto-detects multiple tables in the content using GFM parser
    - Header row gets bold formatting with gray background
    - Auto-filter on header row
    - Column widths auto-sized based on content
    - Numbers and percentages are coerced to numeric types
    - Supports inline formatting in cells (bold, italic, code)
    - Supports formulas when a cell starts with '='
    - Uses nearby '##' headings to name sheets (up to 31 chars)

    Example:
        excel_from_markdown(
            output_path="04. Artifacts/budget.xlsx",
            markdown='''

Category

Q1

Q2

Q3

Q4

Total

Personnel

$50,000

$52,000

$54,000

$56,000

$212,000

Infrastructure

$15,000

$15,000

$16,000

$16,000

$62,000

Software

$8,000

$8,500

$9,000

$9,500

$35,000

Training

$5,000

$3,000

$4,000

$3,000

$15,000

Milestone

Target Date

Owner

Status

Phase 1 Complete

2026-03-31

Alice

100%

Phase 2 Complete

2026-06-30

Bob

45%

Go-Live

2026-09-30

Carol

0%

'''

        )

    Args:
        output_path: Path for the output .xlsx file
        markdown: GitHub Flavored Markdown content containing one or more tables (inline)
        sheet_name: Optional sheet name for the first/only sheet
        markdown_file: Optional path to a Markdown file. Use this for
            very large inputs to avoid MCP argument-size limits.

    Returns:
        Status dictionary with file path and sheet count
    
excel_list_sheetsA

List all sheets in an Excel workbook with their properties.

Provides detailed information about each sheet including visibility, dimensions, and whether it contains tables or data validations.

Example: excel_list_sheets(file_path="template.xlsx")

Args: file_path: Path to the .xlsx or .xlsm file include_hidden: Include hidden and very hidden sheets (default True)

Returns: Dictionary with sheet information including names, states, and metadata

list_supported_formatsA

List supported document formats and their availability.

Returns: Dictionary showing which formats are available

office_auditA

Audit documents for completeness, placeholders, and issues.

Replaces: excel_audit_placeholders, word_audit_completion, word_audit_sow, pptx_audit_placeholders

Examples: # Check for unfilled placeholders office_audit(file_path="contract.docx", checks=["placeholders"])

# Full completion audit
office_audit(file_path="sow.docx", checks=["completion"])

# Check Excel for placeholders
office_audit(file_path="estimate.xlsx", checks=["placeholders"])

# Multiple checks
office_audit(
    file_path="document.docx",
    checks=["placeholders", "tracking"]
)

Args: file_path: Path to the document checks: List of checks to perform: - "placeholders": Find unfilled <...>, [...], [TBD] patterns - "completion": Full completion audit (Word SOW) - "tracking": Check for pending track changes - "formatting": Check for formatting issues - "empty_cells": Check required Excel cells for empty values - "totals": Verify Excel totals based on configured ranges - "dates": Validate Excel date formats (MM/DD/YYYY) audit_config: Optional configuration for Excel checks: - required_cells: list of cell refs to check for empty values - date_cells: list of cell refs to validate as MM/DD/YYYY - totals: list of dicts with sum_range, target, and optional tolerance

Returns: Dictionary with audit findings

office_commentA

Manage comments in Word, Excel, or PowerPoint documents.

Replaces: excel_add_comment, excel_get_comments, word_add_comment, pptx_add_comment, pptx_get_comments

Examples: # Get all comments from Excel office_comment(file_path="data.xlsx", operation="get")

# Add comment to Excel cell
office_comment(
    file_path="data.xlsx",
    operation="add",
    target="B5",
    text="Review this value"
)

# Add comment to Word text
office_comment(
    file_path="report.docx",
    operation="add",
    target="project timeline",
    text="Verify dates with PM"
)

# Reply to an existing Word comment by comment ID
office_comment(
    file_path="report.docx",
    operation="reply",
    target="12",  # comment ID from office_comment(..., operation="get")
    text="Acknowledged - updated in v2"
)

# Add comment to PowerPoint slide
office_comment(
    file_path="deck.pptx",
    operation="add",
    target="3",  # or "slide:3"
    text="Update chart data"
)

Args: file_path: Path to the document operation: add/get/reply/delete plus resolve/reopen for Word target: Target location/ID - Excel add/delete: cell reference (e.g., "B5") - Excel get: optional sheet name filter - Word add: text span to annotate - Word reply/resolve/reopen/delete: comment ID - PowerPoint add: slide number ("3" or "slide:3") - PowerPoint delete: "slide:N" or "slide:N/comment:I" text: Comment text (required for add/reply) author: Author display name. Also used by Word get(filter="mine") output_path: Optional output path (defaults to overwriting input) format: For Word get only: "flat" (default) or "threaded" filter: For Word get only: "all" (default), "open", "resolved", "mine"

Returns: Dictionary with operation results

office_helpA

Get structured workflow help and recommendations for office document work.

Use this as the preferred discovery entry point for systems architecture and consulting workflows. Prefer goal plus optional document_type and constraints. task is supported only as a thin convenience layer for mapping common natural-language requests onto the structured workflow catalog.

office_imageA

Insert an image into a Word, Excel, or PowerPoint document.

Auto-detects document format from file extension and inserts the image at the specified location. Supports PNG, JPG/JPEG, and GIF formats.

Examples: # Insert image at end of Word document office_image( file_path="report.docx", image_path="logo.png", width_inches=2.0 )

# Insert image at specific paragraph in Word
office_image(
    file_path="report.docx",
    image_path="chart.png",
    target="after:Executive Summary",
    width_inches=5.0
)

# Insert image in Excel cell
office_image(
    file_path="data.xlsx",
    image_path="logo.png",
    target="A1",
    width_inches=1.5
)

# Insert image on specific Excel sheet
office_image(
    file_path="data.xlsx",
    image_path="chart.png",
    target="Sheet2!B5"
)

# Insert image on PowerPoint slide
office_image(
    file_path="deck.pptx",
    image_path="diagram.png",
    target="slide:2",
    width_inches=4.0,
    height_inches=3.0
)

Args: file_path: Path to the document (.docx, .xlsx, .pptx) image_path: Path to the image file (.png, .jpg, .jpeg, .gif) target: Where to insert the image: - Word: "after:Section Title" or "end" (default) - Excel: cell reference like "A1" or "Sheet1!B5" - PowerPoint: "slide:N" where N is slide number (1-based) width_inches: Image width in inches (height auto-scales if not set) height_inches: Image height in inches (width auto-scales if not set) output_path: Optional output path (defaults to overwriting input)

Returns: Dictionary with insertion result

office_inspectA

Inspect document structure and metadata.

Auto-detects document format and returns requested structural information.

Replaces: excel_list_sheets, excel_list_tables, excel_list_named_ranges, excel_list_merged_cells, excel_get_comments, excel_get_change_log, word_list_sections, word_list_tables, word_check_tracking, pptx_list_slides, pptx_list_shapes, pptx_list_masters, pptx_get_notes, pptx_get_comments, pptx_get_hidden_slides

Examples: # List all sheets in Excel workbook office_inspect(file_path="data.xlsx", what="sheets")

# List tables in Excel
office_inspect(file_path="data.xlsx", what="tables")

# Get comments from Excel
office_inspect(file_path="data.xlsx", what="comments")

# List slides in PowerPoint
office_inspect(file_path="deck.pptx", what="slides")

# List sections in Word
office_inspect(file_path="report.docx", what="sections")

# Get shapes on a specific slide
office_inspect(file_path="deck.pptx", what="shapes", target="3")

Args: file_path: Path to the document what: What to inspect: - "structure": Overview of document structure - "sheets": Excel sheets list - "slides": PowerPoint slides list - "sections": Word sections list - "tables": Tables in document - "named_ranges": Excel named ranges - "merged_cells": Excel merged cell regions - "comments": Comments/notes in document - "tracking": Track changes status (Word) - "shapes": Shapes on a slide (PowerPoint) - "masters": Slide masters (PowerPoint) target: Optional target for scoped inspection: - Sheet name for Excel - Slide number for PowerPoint

Returns: Dictionary with inspection results

office_patchA

Apply edits to Word, Excel, or PowerPoint documents.

Accepts a list of changes and applies them to the document. Each change specifies a target (cell, shape, placeholder, section) and new value.

Replaces: excel_patch_cell, excel_patch_range, excel_replace_placeholders, word_patch_section, word_patch_placeholder, word_fix_split_placeholders, word_replace_global_variables, pptx_patch_shape, pptx_replace_text, pptx_replace_placeholders

Examples: # Patch Excel cells office_patch( file_path="data.xlsx", changes=[ {"target": "B5", "value": "New Value"}, {"target": "C10", "value": 42}, {"target": "D1", "value": "=SUM(A1:A10)"}, ] )

# Patch Excel range (multiple cells at once)
office_patch(
    file_path="data.xlsx",
    changes=[{"target": "A1:B3", "value": [["H1", "H2"], ["A", 1], ["B", 2]]}]
)

# Patch cells on a specific sheet (quote sheet names with special chars)
office_patch(
    file_path="form.xlsm",
    changes=[
        {"target": "'ECIF Work Scope (E)'!B5", "value": "Contoso Ltd"},
        {"target": "'ECIF Work Scope (E)'!B28", "value": "02/01/2026"},
    ]
)

# Replace placeholders in Word
office_patch(
    file_path="template.docx",
    changes=[
        {"target": "<Customer Name>", "value": "Acme Corp"},
        {"target": "<Date>", "value": "2026-01-23"},
    ]
)

# Patch PowerPoint shape
office_patch(
    file_path="deck.pptx",
    changes=[{"target": "slide:1/Title 1", "value": "New Title"}]
)

# Patch PowerPoint with soft return
office_patch(
    file_path="deck.pptx",
    changes=[{"target": "slide:1/Title 2", "value": "Contoso{br}Project"}]
)

IMPORTANT for PowerPoint: When patching content placeholders (body, Content Placeholder), do NOT include bullet characters (•, -, *, etc.) in text lines. PowerPoint placeholders automatically render each line as a bullet. Including bullet characters causes duplication like '- • text'. Use newlines to separate items, and leading spaces (4 spaces) for indentation.

Args: file_path: Path to the document changes: List of changes, each a dict with "target" (cell ref, placeholder, or shape path) and "value" (new content, no bullet chars for PPTX body) track_changes: Log changes for audit trail (default True) output_path: Optional output path (defaults to overwriting input)

Returns: Dictionary with results of all changes. Each successful result includes a "value_preview" field with a truncated preview of the value applied.

office_readA

Read content from Word, Excel, or PowerPoint documents.

Auto-detects document format from file extension and extracts content in the requested output format.

Replaces: word_extract, word_to_markdown, excel_extract, excel_to_markdown, excel_get_range, pptx_extract, pptx_to_markdown

Examples: # Read entire Excel file as JSON office_read(file_path="data.xlsx")

# Read Excel file as markdown
office_read(file_path="data.xlsx", output_format="markdown")

# Read specific range from Excel
office_read(file_path="data.xlsx", scope="Sheet1!A1:D10")

# Read a single worksheet
office_read(file_path="data.xlsx", scope="Sheet1")

# Read Word document as markdown
office_read(file_path="report.docx", output_format="markdown")

# Read PowerPoint as JSON
office_read(file_path="deck.pptx")

Args: file_path: Path to the document (.docx, .xlsx, .xlsm, .pptx) output_format: Output format - "json" for structured data, "markdown" for text representation scope: Optional scope limiter: - Excel: sheet name like "Sheet1" or range like "A1:D10" or "Sheet1!B2:C5" - Word: section title (not yet implemented) - PowerPoint: slide number like "slide:3" (not yet implemented) include_formulas: For Excel, return formulas instead of values

Returns: dict for JSON format, str for markdown format

office_set_comment_identityA

Set default commenter identity for subsequent comment operations.

This updates in-memory defaults used by office_comment and format-specific add-comment tools when the author argument is omitted.

Args: name: Display name for comments (for example, "Jane Doe") identity: Optional identity string (for example, email or alias) initials: Optional initials override for formats that support it

Returns: Updated identity configuration

office_tableA

Manage tables in Word, Excel, or PowerPoint documents.

Replaces: excel_get_table, excel_append_table_row, excel_update_table_row, word_get_table, word_insert_table_row, word_patch_table_row, word_create_new_table, pptx_get_table, pptx_insert_table_row, pptx_patch_table_cell

Examples: # Get Excel table data office_table(file_path="data.xlsx", operation="get", table_id="Sales")

# Add row to Excel table
office_table(
    file_path="data.xlsx",
    operation="add_row",
    table_id="Sales",
    data={"Product": "Widget", "Amount": 100}
)

# Update Excel table row
office_table(
    file_path="data.xlsx",
    operation="update_row",
    table_id="Sales",
    row_index=2,
    data={"Amount": 150}
)

# Get Word table (by index, passed as string)
office_table(file_path="report.docx", operation="get", table_id="0")

# Create Word table
office_table(
    file_path="report.docx",
    operation="create",
    data={
        "headers": ["Phase", "Owner", "Target Date"],
        "rows": [{"Phase": "Discovery", "Owner": "PM", "Target Date": "2026-04-01"}],
        "insert_after_section": "Delivery Plan"
    }
)

# Get PowerPoint table (slide number as string)
office_table(file_path="deck.pptx", operation="get", table_id="3")

Args: file_path: Path to the document operation: "get" to retrieve table data, "add_row" to append a row, "update_row" to modify an existing row, or "create" to create a new table (Word and PowerPoint) table_id: Table identifier as a string. For Excel pass the table name (e.g. "Sales"). For Word pass the 0-based table index for get/add/update (e.g. "0"). For PowerPoint pass the slide number (e.g. "3"). For Word create, table_id is optional. data: Row data as a dict with column names or indices as keys and cell values as values. Required for add_row and update_row. For Word create, provide an object with "headers" and optional "rows", "insert_after_section", "insert_before_section", "output_path", and "author". For PowerPoint update_row include "row", "col", and "value" keys. row_index: 1-based row index for update_row operations

Returns: Dictionary with table data or operation result

office_templateA

Copy templates or analyze template structure.

Replaces: excel_copy_template, word_copy_template, pptx_copy_template, word_analyze_template_formatting

Examples: # Copy Excel template office_template( source_path="templates/budget.xlsx", destination_path="output/q1-budget.xlsx" )

# Copy Word template
office_template(
    source_path="templates/sow.docx",
    destination_path="output/acme-sow.docx"
)

# Analyze Word template formatting
office_template(
    source_path="templates/sow.docx",
    destination_path="",  # Not used for analyze
    operation="analyze"
)

Args: source_path: Path to the template file destination_path: Path for the copy (ignored for analyze) operation: "copy" to copy template, "analyze" to inspect formatting

Returns: Dictionary with operation results

pptx_add_slideA

Add a new slide to an existing presentation.

Common layout_index values (use pptx_list_masters to see all):

  • 0: Title Slide

  • 1: Title and Content (default - has title + bullet area)

  • 5: Title Only (good for tables or custom content)

  • 6: Blank

Args: file_path: Path to the .pptx file layout_index: Which layout to use (default: 1 = Title and Content) title: Optional title text for the new slide position: Where to insert - 'end' (default), 'start', or 1-based slide number (e.g. '2' to make it slide 2) output_path: Optional output path (defaults to overwriting input)

Returns: Status with new slide_number

pptx_add_tableA

Add a data table to a slide.

Creates a table with column headers and optional data rows. Header row is bold. Position/size in inches (16:9 slide = 13.3" × 7.5").

Args: file_path: Path to the .pptx file slide_number: 1-based slide number headers: Column header names (e.g., ['Phase', 'Duration', 'Deliverables']) rows: Data rows as list of lists (optional) left, top: Position from top-left (default: 1.0", 2.0") width, height: Table size (default: 11.0" × 3.0")

Returns: Status with table dimensions

pptx_delete_commentA

Delete comments from a slide.

Deletes one comment (by index) or all comments on a slide when comment_index is not provided.

Args: file_path: Path to the .pptx file slide_number: 1-based slide number comment_index: Optional comment index on that slide output_path: Optional output path (defaults to overwriting input)

Returns: Status with deletion details

pptx_delete_slideA

Remove a slide from the presentation.

USE THIS to remove template slides you don't need or to clean up unwanted content.

Args: file_path: Path to the .pptx file slide_number: 1-based slide number to delete output_path: Optional output path (defaults to overwriting input)

Returns: Status with remaining slide count

pptx_duplicate_slideA

Copy a slide including all shapes, tables, and formatting.

USE THIS when you need multiple slides based on a template slide. Performs a full XML deep copy so tables, images, and other shapes are faithfully duplicated.

Args: file_path: Path to the .pptx file slide_number: 1-based slide number to copy position: 'after' (right after original) or 'end' output_path: Optional output path (defaults to overwriting input)

Returns: Status with new slide number

pptx_from_markdownA

Convert Markdown content to a PowerPoint presentation from inline content or markdown_file.

    This is the primary tool for creating PowerPoint decks from text content.

    Features:
    - Analyzes content to select appropriate layouts for each slide
    - Sets theme fonts (default: Segoe UI Semibold for titles, Segoe UI for body)
    - Uses millimeters internally for precise positioning
    - Fonts inherit from theme - no hardcoded font overrides

    Slide Mapping:
    - First # heading becomes title slide with large centered title
    - Subsequent # or ## headings start new content slides
    - --- (horizontal rule) also starts a new slide context
    - Bullet points (- or *) become slide body content
    - **Label:** patterns are rendered with bold labels (great for key points)
    - **Context (assumptions):** after title becomes subtitle on title slide
    - Tables (| col | col |) are rendered as PowerPoint tables
    - Non-heading, non-bullet paragraphs become plain text

    Example:
        pptx_from_markdown(
            output_path="04. Artifacts/proposal.pptx",
            markdown='''

Cloud Migration Proposal

Context: Enterprise transformation for ACME Corp


Executive Summary

  • Objective: Migrate 15 legacy applications to Azure

  • Timeline: 12 months with phased approach


Investment

Phase

Cost

Timeline

Phase 1

$400K

Q1

Phase 2

$800K

Q2-Q3


Next Steps

  • Approve project charter

  • Schedule kickoff workshop ''' )

      Args:
          output_path: Path for the output .pptx file
          markdown: Markdown content following the slide pattern (inline)
          title_font: Font for titles (default: Segoe UI Semibold)
          body_font: Font for body text (default: Segoe UI)
          markdown_file: Optional path to a Markdown file. Use this for
              very large inputs to avoid MCP argument-size limits.
    
      Returns:
          Status dictionary with file path and slide count
      
pptx_get_notesA

Read speaker notes from slides.

USE THIS to see existing notes before updating them. Without slide_number, returns notes from ALL slides.

Args: file_path: Path to the .pptx file slide_number: Specific slide (omit for all slides)

Returns: Notes content for requested slide(s)

pptx_hide_slideA

Hide or unhide a slide in the presentation.

Hidden slides are skipped during slideshow but remain editable. Use for backup content or speaker-only material.

Args: file_path: Path to the .pptx file slide_number: 1-based slide number hidden: True to hide, False to show again output_path: Optional output path (defaults to overwriting input)

Returns: Status with visibility state

pptx_import_slideA

Copy one slide from a source presentation into a target presentation.

USE THIS when you need to lift a fully-designed slide across from one deck to another, preserving pictures, charts, embedded assets, and the layout/master/theme chain required for it to render correctly.

The tool validates the source slide's layout/master chain before the copy. If an identical layout already exists in the target package, it reuses it and does not import a new master. Otherwise it imports only the single layout and single master required by the slide.

Args: source_file_path: Source .pptx file containing the slide to copy source_slide_number: 1-based slide number in the source deck target_file_path: Target .pptx file to receive the slide position: 'end' or 'after' after_slide_number: Required when position='after' output_path: Optional output path (defaults to overwriting target) include_notes: Whether to carry the notes slide across too

Returns: Status dictionary with output path, new slide number, and whether the layout/master were reused or copied.

pptx_list_slidesA

Get an overview of all slides in a PowerPoint file.

USE THIS FIRST when working with an existing presentation to understand its structure before making changes.

Returns for each slide:

  • number: Slide position (1-based)

  • title: The slide's title text

  • layout_name: Which layout template is used

  • shape_count: Number of shapes on the slide

  • has_notes: Whether speaker notes exist

  • hidden: Whether the slide is hidden

Args: file_path: Path to the .pptx file

Returns: Dictionary with slide_count and slides array

pptx_log_changesA

Append change log entries to the first slide's notes.

Use for audit trail since PowerPoint doesn't have track changes. Changes are appended to the notes of slide 1 with timestamps.

Args: file_path: Path to the .pptx file changes: List of change entries, each with slide (number), action (what was done), and detail (specifics) output_path: Optional output path (defaults to overwriting input)

Returns: Status with changes logged count

pptx_recommend_layoutA

Get the best layout for a specific content type.

Content types:

  • 'title': Section title slide

  • 'bullets': Bullet point list

  • 'two_column': Side-by-side content

  • 'comparison': Comparison with headers

  • 'image': Image with caption

  • 'table': Table-heavy content

  • 'blank': Custom content

Args: file_path: Path to the .pptx file content_type: What you want to show on the slide

Returns: Recommended layout_index and alternatives

pptx_reorder_slidesA

Change the order of slides in a presentation.

Provide the complete slide order as a list. For example, [1, 3, 2, 4, 5] moves slide 3 before slide 2.

Args: file_path: Path to the .pptx file new_order: Complete list of slide numbers in desired order (1-based) output_path: Optional output path (defaults to overwriting input)

Returns: Status with new slide order

pptx_set_notesA

Set speaker notes for a slide.

Speaker notes appear below the slide in Presenter View and can be printed as handouts. Use for talking points and context.

Args: file_path: Path to the .pptx file slide_number: 1-based slide number notes_text: The notes content (supports newlines) append: If True, add to existing notes; if False, replace output_path: Optional output path (defaults to overwriting input)

Returns: Status with notes preview

restart_serverA

Restart the MCP server to reload code changes.

Use this tool after modifying tool modules in .github/mcp/tools/ to pick up the changes without manually restarting.

The server will exit and VS Code will automatically restart it, picking up any code changes in the tools/ directory.

Example: restart_server()

Returns: Status message (the server exits immediately after responding)

web_check_urlA

Check if a URL exists and is accessible.

Performs a HEAD request (or GET if HEAD fails) to verify the URL returns a valid response. Useful for validating links before including them in documents.

Example: web_check_url(url="https://example.com/page")

web_check_url(
    url="https://docs.microsoft.com/...",
    timeout=5,
    follow_redirects=True
)

Args: url: The URL to check timeout: Request timeout in seconds (default: 10) follow_redirects: Whether to follow redirects (default: True)

Returns: Dictionary with exists, status_code, final_url, and content_type

web_extract_linksA

Extract all links from a web page.

Fetches a page and extracts all hyperlinks, optionally filtering by pattern or domain. Useful for discovering related pages or building navigation maps.

Example: web_extract_links(url="https://docs.microsoft.com/...")

web_extract_links(
    url="https://example.com",
    filter_pattern=r"/docs/",
    same_domain_only=True
)

Args: url: The URL to extract links from filter_pattern: Regex pattern to filter links (optional) same_domain_only: Only return links to the same domain (default: False) timeout: Request timeout in seconds (default: 30)

Returns: Dictionary with extracted links and their text

web_extract_tablesA

Extract tables from a web page as structured data.

Fetches a page and extracts HTML tables, converting them to a structured format with headers and rows.

Example: web_extract_tables(url="https://example.com/data")

web_extract_tables(
    url="https://example.com/report",
    table_index=0  # Get only the first table
)

Args: url: The URL to extract tables from table_index: Specific table index to extract (optional, 0-based) timeout: Request timeout in seconds (default: 30)

Returns: Dictionary with extracted tables

web_fetchA

Fetch a web page and extract its content as Markdown.

Uses readability to extract the main content from the page, removing navigation, ads, and other clutter. Then converts the clean HTML to Markdown format.

Example: web_fetch(url="https://example.com/article")

web_fetch(
    url="https://docs.microsoft.com/en-us/azure/...",
    include_links=True,
    include_images=True
)

Args: url: The URL to fetch extract_content: Use readability to extract main content (default: True) include_links: Include hyperlinks in output (default: True) include_images: Include image references (default: False) timeout: Request timeout in seconds (default: 30)

Returns: Dictionary with title, content (markdown), url, and metadata

web_searchA

Search the web using DuckDuckGo and return results.

Performs a web search and returns titles, URLs, and snippets for the top results. Does not fetch the full page content - use web_fetch for that.

Example: web_search(query="Microsoft Fabric lakehouse architecture")

web_search(
    query="python-pptx table formatting",
    max_results=10
)

Args: query: Search query string max_results: Maximum number of results to return (default: 5) region: DuckDuckGo region code (default: "wt-wt" for worldwide)

Returns: Dictionary with search results (title, url, snippet)

word_accept_all_changesA

Accept all tracked insertions/deletions in a Word document.

Removes deletion markup and converts insertion markup into normal document content.

word_cleanup_sowA

Clean a SOW document by removing all placeholder and instructional content.

Removes:

  • Highlighted text (turquoise, yellow - template guidance markers)

  • Colored text (blue, red, purple - instructions)

  • Bracket placeholders that weren't filled: <...>, [Template Guidance: ...]

  • Instruction paragraphs containing guidance keywords

This is the final step after generate_sow to ensure the document is presentation-ready with no visible template artifacts. All removals are tracked for auditability.

Example: cleanup_sow( file_path="04. Artifacts/contoso-sow.docx", output_path="04. Artifacts/contoso-sow-final.docx" )

Args: file_path: Path to the SOW document to clean output_path: Path for cleaned output (defaults to overwriting input) author: Author name for tracked changes (default: "Solution Architect Agent")

Returns: Cleanup statistics

word_create_sow_from_markdownA

Create a SOW document from inline markdown or markdown_file by filling a template.

    IMPORTANT: This tool requires a template to preserve document structure,
    formatting, and corporate styling. It extracts data from Markdown and
    uses generate_sow to fill the template.

    Workflow:
    1. Parse the Markdown to extract structured SOW data
    2. Load the template document
    3. Fill placeholders and tables with extracted data
    4. Save the result

    Example:
        create_sow_from_markdown(
            output_path="04. Artifacts/contoso-sow.docx",
            template_path=".github/skills/statement-of-work/templates/Agile.docx",
            markdown='''

Contoso – Cloud Migration – Statement of Work

1. Engagement Overview

Customer: Contoso Ltd Provider: Microsoft Project: Cloud Migration Sprint 1

1.1 Business Objectives

Objective

Activities

Assumptions

Migrate 15 apps

Assessment, planning

Apps are containerizable

'''

        )

    Args:
        output_path: Path for the output .docx file
        template_path: Path to the .docx template (REQUIRED)
        markdown: Markdown content of the SOW (inline)
        markdown_file: Optional path to a Markdown file. Use this for
            very large inputs to avoid MCP argument-size limits.

    Returns:
        Status dictionary with file path and extraction summary
    
word_delete_commentA

Delete a comment from a Word document by comment ID.

Removes the comment from comments.xml and strips associated reference markers from document.xml.

Args: file_path: Path to the .docx file comment_id: Comment ID from word_get_comments output output_path: Optional output path (defaults to overwriting input)

Returns: Status dictionary with deletion details

word_document_mapC

Return a lightweight structured document map for a Word file.

word_enable_track_changesA

Enable Track Changes mode in a Word document.

Sets the document settings so that Word will track subsequent changes when the document is opened and edited.

Note: This sets the tracking flag, but changes made by python-docx after this point will NOT be automatically tracked. Use patch_with_track_changes for programmatic tracked edits.

Example: enable_track_changes(file_path="04. Artifacts/contoso-sow.docx")

Args: file_path: Path to the .docx document output_path: Optional output path (defaults to overwriting input)

Returns: Status message

word_extract_sow_structureA

Extract structured data from an existing SOW document.

Parses a SOW document and extracts key information into a structured format that can be used to generate new documents.

Example: extract_sow_structure( file_path="01. Inputs/existing-sow.docx" )

Args: file_path: Path to the SOW document

Returns: Dictionary with extracted SOW data

word_from_markdownA

Convert Markdown to a Word document from inline content or markdown_file.

    This is the primary tool for creating Word documents from text content.

    Supports GitHub Flavored Markdown:
    - Headings (# ## ### ####)
    - Bullet lists (- or *)
    - Numbered lists (1. 2. 3.)
    - Task lists (- [ ] and - [x])
    - Bold (**text**) and italic (*text*) inline formatting
    - Strikethrough (~~text~~)
    - Inline code (`code`) rendered in Consolas font
    - Tables (| col | col |) with proper formatting
    - Code blocks (```) rendered in monospace with language hints
    - Horizontal rules (---)

    Example:
        word_from_markdown(
            output_path="04. Artifacts/report.docx",
            markdown='''

Project Status Report

Executive Summary

The project is on track for Q4 delivery with no minor delays.

Key Metrics

Metric

Value

Status

Budget

$120,000

On track

Timeline

Q4 2026

Green

Quality

95%

Exceeds

Next Steps

  • Complete UAT testing

  • Finalize documentation

  • Schedule go-live review

  1. Phase 1 complete

  2. Phase 2 in progress

  3. Phase 3 planned ''' )

     Args:
         output_path: Path for the output .docx file
         markdown: Full GitHub Flavored Markdown content (inline)
         markdown_file: Optional path to a Markdown file. Use this for
             very large documents to avoid MCP argument-size limits.
    
     Returns:
         Status dictionary with file path
     
word_generate_sowA

Generate a SOW document from a template and structured data.

IMPORTANT: This tool REQUIRES a template document. It fills placeholders and tables but does NOT generate prose sections (Introduction, Executive Summary, etc.). After using this tool, use patch_section to add narrative content to key sections.

Template-based workflow:

  1. Use copy_template to copy .github/skills/statement-of-work/templates/Agile.docx

  2. Use generate_sow to fill placeholders and tables

  3. Use patch_section to add Introduction, Business Context, etc.

  4. Use audit_completion to verify completeness

  5. Use cleanup_sow to remove template artifacts

Takes a SOW template and fills it with actual engagement data, stripping instructional boilerplate and replacing placeholders.

Example: generate_sow( template_path=".github/skills/statement-of-work/templates/Agile.docx", output_path="04. Artifacts/contoso-sow.docx", sow_data={ "customer_name": "Contoso", "customer_short_name": "Contoso", "project_name": "Cloud Migration", "provider_name": "Microsoft", "work_order_number": "WO-2026-001", "language": "English", "business_objectives": [ {"objective": "Migrate 15 apps to Azure", "activities": "Assessment, migration planning", "assumptions": "Apps are containerizable"} ], "epics": [ {"name": "Infrastructure Setup", "description": "Set up Azure landing zone", "assumptions": "Subscription available"} ], "out_of_scope": [ {"area": "Data migration", "description": "Historical data migration not included"} ], "technology_requirements": [ {"item": "Azure subscription", "version": "N/A", "ready_by": "Project start"} ], "assumptions": [ "Customer will provide access to existing systems", "Dedicated product owner available full-time" ] } )

Args: template_path: Path to the .docx template (REQUIRED - use copy_template first) output_path: Path for the output .docx file sow_data: Dictionary containing SOW content

Returns: Status dictionary with file path and next_tools suggestions

word_get_commentsA

Extract comments from a Word document with metadata and thread context.

Args: file_path: Path to the .docx file filter: Optional filter (all/open/resolved/mine) author: Author name for filter='mine' (defaults to comment identity) format: flat (default) or threaded

Returns: Dictionary with comment list/count and optional thread groups

word_get_section_guidanceA

Extract template guidance and instructions from a section.

Reads a section and identifies all instructional content that tells you what to write there. This includes:

  • Template guidance markers: [Template Guidance: ...]

  • Highlighted text (turquoise, yellow) indicating placeholders

  • Colored text (blue, red, purple) indicating instructions

  • Insert instructions: [insert ...]

Use this BEFORE patch_section to understand what content is expected.

Example: get_section_guidance( file_path="04. Artifacts/contoso-sow.docx", section_title="Introduction" )

Args: file_path: Path to the .docx document section_title: Title or partial title of the section

Returns: Structured guidance including instructions, expected content hints, and placeholders to fill

word_insert_at_anchorB

Insert paragraphs before/after a matched anchor or paragraph index.

This is a general-purpose insertion tool for narrative content when a document has a stable anchor paragraph but you do not want to replace the entire section body.

word_list_anchorsA

List likely anchor paragraphs and headings for insertion workflows.

Returns headings plus high-signal non-empty paragraphs that can be used with word_insert_at_anchor.

word_parse_sow_templateC

Parse a SOW template to extract its structure.

Analyzes a Word document template to identify:

  • Document sections and headings

  • Tables and their purposes

  • Placeholder variables that need filling

  • Instructional text to be stripped

Example: parse_sow_template( template_path=".github/skills/statement-of-work/templates/Agile.docx" )

Args: template_path: Path to the .docx template file

Returns: Dictionary with template structure analysis

word_patch_with_track_changesA

Replace text in a document with Word Track Changes enabled.

Creates revision marks (insertions/deletions) that appear in Word's review mode. Old text is marked as deleted (red strikethrough) and new text is marked as inserted (green underline).

This is useful for:

  • Auditable document changes

  • Review workflows where changes need approval

  • Comparing before/after states in Word

Example: patch_with_track_changes( file_path="04. Artifacts/contoso-sow.docx", replacements={ "": "Contoso Ltd", "": "Cloud Migration", "[TBD]": "Q1 2026" }, author="Solution Architect" )

Args: file_path: Path to the .docx document replacements: Dictionary mapping old text to new text author: Name to attribute changes to (appears in Word's review pane) output_path: Optional output path (defaults to overwriting input)

Returns: Status with replacement counts

word_reply_commentC

Backward-compatible alias for word_reply_to_comment.

word_reply_to_commentA

Add a threaded reply to an existing Word comment.

Creates a new w:comment entry in word/comments.xml and links it to the parent thread using w14:paraIdParent on the reply's first paragraph. If the parent comment has no w14:paraId (older docs), a synthetic one is added and reused.

Args: file_path: Path to the .docx file comment_id: ID of the parent comment (from word_get_comments) text: Reply text author: Reply author (defaults to office_set_comment_identity/env) output_path: Optional output path (defaults to overwriting input) auto_resolve: Mark the thread resolved after adding the reply

Returns: Status dictionary with reply details

word_resolve_commentA

Mark a Word comment thread as resolved or open.

Resolution state is stored in word/commentsExtended.xml (w15:commentEx@w15:done). If a reply comment ID is supplied, the root thread comment is updated.

Args: file_path: Path to the .docx file comment_id: Comment ID from word_get_comments resolved: True to resolve, False to reopen output_path: Optional output path (defaults to overwriting input)

Returns: Status dictionary with thread resolution details

Prompts

Interactive templates invoked by user choice

NameDescription
document_auditAudit a SOW document for completion and quality. Category: sow-workflow This prompt guides comprehensive document auditing to ensure all placeholders are filled and the document is ready. Returns: Prompt definition with audit workflow
section_editingEdit prose sections in a SOW document. Category: sow-workflow This prompt guides reading and editing narrative sections like Introduction, Executive Summary, and Business Context. Returns: Prompt definition with section editing workflow
sow_generationGenerate a complete Statement of Work from a template. Category: sow-workflow This prompt guides the complete SOW generation workflow from copying a template through filling all content and final cleanup. Returns: Prompt definition with workflow steps
table_editingEdit tables in a SOW document. Category: sow-workflow This prompt guides reading and editing structured tables like Business Objectives, Epics, and Staffing. Returns: Prompt definition with table editing workflow

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rcarmo/python-office-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server