Skip to main content
Glama
SheetForge MCP

SheetForge MCP

by iHeldan

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FASTMCP_HOSTNoBind address for the server process (HTTP and SSE)127.0.0.1
FASTMCP_PORTNoPort for the server process (HTTP and SSE)8017
EXCEL_FILES_PATHNoBase directory for relative workbook paths (HTTP and SSE)./excel_files

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

SheetForge MCP for manipulating Excel workbooks. Server-side workbook path. Reuse the supplied path; NEVER prepend client cwd. Rooted server: relative paths use EXCEL_FILES_PATH, not cwd. Without a root (normal stdio): ask for a supplied absolute path; do not guess. On path errors, follow error.details and retry the corrected path on the same tool. Do not try other tools with the rejected path or bypass confinement.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
apply_formulaC

Apply Excel formula to cell. Excel formula will write to cell with verification.

validate_formula_syntaxB

Validate Excel formula syntax without applying it.

inspect_formulaA

Inspect a formula string for functions, references, and risky signals.

format_rangeC

Apply formatting to a range of cells. Colors accept RRGGBB, #RRGGBB, AARRGGBB, or #AARRGGBB.

format_rangesB

Apply formatting to multiple ranges in a single workbook pass. Colors accept RRGGBB, #RRGGBB, AARRGGBB, or #AARRGGBB.

read_range_formattingC

Read a compact formatting summary for a worksheet range.

read_data_from_excelA
Read data from Excel worksheet with cell metadata including validation rules.

Args:
    filepath: Path to Excel file
    sheet_name: Worksheet tab name, NOT a native table name; list_tables maps tables to tabs
    start_cell: Starting cell (default A1)
    end_cell: Ending cell (optional, auto-expands if not provided)
    max_rows: Optional maximum number of rows to return from the starting row
    max_cols: Optional maximum number of columns to return from the starting column
    cursor: Optional continuation token returned by an earlier range read
    preview_only: Whether to return preview only
    compact: Whether to omit default validation metadata for smaller responses
    values_only: Whether to return a 2D value grid without per-cell metadata

Returns:  
JSON string containing either structured cell data with validation metadata
or a plain 2D value grid when values_only=True.
read_excel_as_tableA
Read Excel data as a compact table with headers and rows or record objects.
sheet_name is a worksheet TAB, not a native table. For an approved named
table use read_excel_table(table_name=...); list_tables maps tables to tabs.
Much more context-efficient than read_data_from_excel for structured data,
with optional inferred schema hints for downstream steps.
quick_readA

Read a compact table from an explicit sheet or the first workbook sheet.

Can return either array rows or object-shaped records, plus optional schema
hints inferred from the returned rows.
sheet_name is a worksheet tab, NOT a native table name. For named tables use
read_excel_table(table_name=...); list_tables verifies the containing worksheet.
describe_datasetC

Summarize a worksheet or native Excel table for agent-friendly orientation.

suggest_read_strategyC

Recommend the best SheetForge read tool for the requested workbook target.

query_tableC

Filter, project, sort, and limit worksheet or table data. Filters support eq/neq/ne, comparisons, string matching, blank checks, and in/not_in with value or values.

bulk_filter_workbooksC

Filter comparable worksheet or table data across multiple workbooks. Uses the same filter operators and aliases as query_table.

union_tablesC

Union comparable worksheet or table data across multiple workbook files.

cross_workbook_lookupC

Enrich one workbook dataset from matching rows in one or more lookup workbooks.

aggregate_tableC

Compute grouped metrics over worksheet-shaped data or a native Excel table.

bulk_aggregate_workbooksC

Aggregate comparable worksheet or table data across multiple workbooks.

read_excel_tableA

Read a native Excel table by its table name, not by a worksheet tab name.

Use the exact table_name from list_tables. Omit sheet_name when unknown;
if supplied, it must be the table's containing worksheet tab, not the table name.
Supports compact table payloads, object-shaped record output, and optional
inferred schema hints.
write_data_to_excelB
Write rows to a worksheet, starting at start_cell. Formulas are not evaluated.

dry_run serializes an isolated candidate and reports package_fidelity and
ready_to_commit without saving. Writes recheck protected XLSX content before
replacing the source. This is not a guarantee of full XLSX fidelity.
create_workbookC

Create a new Excel workbook with an optional initial worksheet name.

create_worksheetC

Create new worksheet in workbook.

create_chartA

Create chart in worksheet from a contiguous range or explicit series.

This is the preferred chart authoring entry point; explicit-series calls are
also still available via create_chart_from_series for backward compatibility.
create_chart_from_seriesC

Create a chart from explicit series definitions for non-contiguous ranges.

list_chartsC

List embedded charts in a workbook or worksheet.

find_free_canvasC

Suggest free worksheet slots for charts or dashboard blocks.

create_pivot_tableC

Create pivot table in worksheet.

create_tableC

Creates a native Excel table from a specified range of data.

list_tablesA

Map native table names to worksheet tabs and ranges; these names are distinct.

Omit sheet_name to search the whole workbook, especially after a missing-tab
error. Table and worksheet names may differ; neither name implies the other.
copy_worksheetC

Copy a worksheet with tables, rules, charts, names, and layout settings.

delete_worksheetC

Delete worksheet from workbook.

rename_worksheetC

Rename worksheet in workbook.

get_workbook_metadataA

Get workbook metadata; sheets lists TABS, not native table names.

Table inventory is not included. A missing table name in sheets does NOT mean
the table is absent. Use list_tables without sheet_name to verify named sources.
describe_sheet_layoutC

Return a structural worksheet layout summary for safe dashboard-style edits.

analyze_range_impactB

Inspect workbook structures that overlap a worksheet range before mutation.

explain_formula_cellB

Explain a formula cell's direct references, upstream formula chain, and downstream dependents.

detect_circular_dependenciesC

Detect circular workbook formula dependencies, including self-references.

profile_workbookB

Return a compact workbook inventory with sheets, tables, charts, and layout state.

audit_workbookC

Audit workbook structure for high-signal issues that affect agent workflows.

plan_workbook_repairsC

Turn workbook audit findings into prioritized next steps for SheetForge workflows.

apply_workbook_repairsB

Apply safe workbook repair actions with dry-run planning and before/after diff output.

apply_workbook_changesetA

Preview or commit an assertion-backed group of workbook mutations as one transaction.

Each operation is {"tool": "name", "args": {...}}. Supported tool names are
create_worksheet, write_data_to_excel, format_range, format_ranges, freeze_panes,
set_autofilter, set_column_widths, set_row_heights, autofit_columns, create_table,
and create_chart. Assertions support sheet_exists, cell_equals, range_equals,
range_values_unchanged, table_exists, freeze_panes_equals, autofilter_equals,
chart_exists, and no_cell_ref_errors.

Call preview first. Commit the identical plan with expected_workbook_sha256 and
changeset_token from that preview. Snapshot creation defaults to enabled.
Inspect package_fidelity: custom XML or untouched formula-cache loss blocks
commit. The check is targeted, not a guarantee of full Excel round-trip fidelity.
save_mode="preserve" patches only literal cell writes in a restricted XLSX.
Unsupported workbook features or formulas block the save; no standard fallback.
Use the same save_mode in preview and commit.
evaluate_workbook_scenariosA

Compare explicit alternatives read-only, or commit one exact verified outcome.

scenario_set requires version=1, a Recipe v1 (only sum/count; output is never
written), key_fields, guards=[{metric, scope: overall|each_group, min?, max?}],
and scenarios=[{id, updates: [{key: {...}, values: {...}}]}]. Bounds are inclusive
exact comparisons. Each-group checks include all baseline/candidate groups;
missing baseline groups and empty coverage fail. No optimization or forecasting.
One native table, existing keys/literal updates only, no formulas/key changes.
Commit requires the identical set, selected_scenario id, scenario_token and
expected_workbook_sha256 from comparison; source drift requires a new comparison.
Full metric checks run again on the saved workbook under ChangeSet rollback.
Limits: 5 alternatives, 8 sum/count metrics, 20 guards, 50000 source cells,
1000 targets/49 column spans per alternative, 256KB JSON, sample_limit 1-5.
apply_table_patchA

Preview/commit a three-way keyed patch against a pinned retained base.

patch requires version=1, source={table_name, optional sheet_name}, nonempty
key_fields, explicit read_fields (use [] only for no extra dependencies), and
updates=[{key: {all key fields}, values: {literal field updates}}]. Write fields
must not be keys/read_fields. Checks complete unique keys and row-local read
dependencies; does not infer undeclared or cross-row dependencies. Existing
rows only, same exact headers with reordering allowed, no formula evaluation.
Conflicts/missing rows/changed premises block the entire batch. Commit requires
the identical patch/base and rebase_token/expected_workbook_sha256 from a fresh
preview. Reuses ChangeSet snapshots, exact-file checks and rollback. Limits:
1000 target cells, 50 contiguous column spans, 50000 table cells/64 columns per
source; sample_limit 1-10 bounds examples only. Tokens are not authentication.
inspect_workbook_contractA

Read-only full bounded native-table contract check; never infer business meaning.

Contract v1 requires version=1, name, source={table_name, optional sheet_name},
row_grain (a declaration), key_fields (logical names), and fields=[{name,
headers: [approved exact alternatives], type: string|number|integer|boolean,
nullable?: false, meaning?, allowed_values?, min?, max?}]. Optional min_rows
defaults to 1; filters use logical field names and Recipe predicates. Missing
or multiple matching headers are unresolved, never automatically selected.
Checks all source rows BEFORE filtering, excluding native totals. Declared
meanings are not verified facts. No coercion, formulas, dates, joins or code.
Limits: 32KB JSON, 32 fields, 8 aliases/field, 8 key fields, 20 filters,
50000 table cells/64 columns; sample_limit 1-5 affects row examples only.
Pass the same contract as workbook_contract to run_workbook_recipe to enforce
it in preview/commit; this inspection alone does not guard other tools.
Recovery: omit sample_limit for default 3 (never use Recipe's 10 here).
recipe_input_fields lists the exact logical names to use in Recipe inputs;
bindings values are physical headers for inspection, not Recipe field names.
For {name: "net", headers: ["NetSales"]}, use metrics.field="net", not
"NetSales". For {name: "currency", headers: ["Currency"]}, use
group_by=["currency"]. Metric as="Revenue" is an output label, not remapped.
Follow next_action: unresolved/violated requires an owner decision, not a
changed contract or filtered-out violation. Reuse the supplied filepath;
do not construct an absolute path by prefixing the client working directory.
run_workbook_recipeA

Preview or commit a reusable JSON recipe without echoing intermediate rows.

Recipe v1 requires version=1, source={table_name, optional sheet_name},
group_by=[exact header names], metrics=[{op, field, as}], and
output={sheet_name, range_ref, optional allow_overwrite=false}.
Optional filters use query_table operators; optional checks support unique_key
(fields), row_count (min/max), and sum_matches (source_field/output_field).
count metrics omit field. Other metrics: sum, avg, min, max, count_non_null,
count_distinct. Only literal finite JSON cells in referenced fields are supported.
Optional workbook_contract enforces Contract v1: source selectors must match,
ALL Recipe input references must use contract fields[].name, NEVER physical
fields[].headers. Copy names from inspection.recipe_input_fields (binding keys).
Example: net bound to NetSales -> metrics=[{op:"sum",field:"net",as:"Revenue"}];
currency bound to Currency -> group_by=["currency"]. The as label stays Revenue.
This also applies to filters.field, unique_key.fields and sum_matches.source_field.
Contract field errors return bounded details.examples with Recipe JSON-pointer
paths and exact replace_with names where known: fix the Recipe references only,
keep workbook_contract unchanged, then make a NEW preview before commit.
Contract filters are mandatory
AND predicates. All contract rows are checked before filtering and again on
the saved workbook. Repeat the identical contract on commit; changed contracts
invalidate recipe tokens. Declared meanings are not verified business truth.

Output is one reserved rectangle in the same workbook, fully replaced including
blank padding. Occupied output requires allow_overwrite=true; table/merge overlap
is rejected. Preview first, then commit the unchanged recipe with recipe_token
and expected_workbook_sha256 from preview. A verified snapshot is always enabled.
Limits: 50,000 source cells, 64 source columns, 10,000 output cells; sample_limit 1-10.
explain_recipe_deltaA

Explain sum/count changes by source identity, without modifying either file.

Recompute one shared Recipe v1 on two distinct .xlsx source versions. Requires
nonblank unique key_fields (exact headers) on every source data row, even if
excluded by recipe filters. Supports at most 8 metrics, all sum/count.
Returns added/removed/updated contributions, group changes and bounded physical
source-row examples. Numeric evidence uses exact decimal strings. Recipe float
differences are explicit numeric_adjustment values, not business explanations.

Optional metric selects one exact output alias; group must give all group_by
fields with exact literal values. All calculations/checks remain complete;
sample_limit (1-10) only bounds examples and omitted contributions are reported.
Pin both source sha256 values and recipe_sha256 from a previous response for
repeatable drilldown. The explanation_token is an integrity fingerprint, not
authorization or a commit token. Does not validate saved report cells, infer
historical recipe definitions, evaluate formulas or establish business causes.
Limits per source: 50,000 table cells, 64 columns, 10,000 recomputed result cells.
diff_workbooksB

Diff two workbook files and report structural changes plus sampled cell-value changes.

create_workbook_snapshotB

Create a verified workbook snapshot without overwriting an existing file.

create_named_rangeC

Create a workbook-level or sheet-scoped named range.

inspect_named_rangeB

Inspect a named range, including scope, destinations, and broken-reference signals.

list_named_rangesB

List workbook defined names and their destinations.

delete_named_rangeC

Delete a workbook-level or sheet-scoped named range.

merge_cellsC

Merge a range of cells.

unmerge_cellsC

Unmerge a range of cells.

get_merged_cellsC

Get merged cells in a worksheet.

freeze_panesC

Set or clear worksheet freeze panes.

set_autofilterC

Set worksheet autofilter for an explicit or inferred range.

set_worksheet_visibilityC

Set worksheet visibility to visible, hidden, or veryHidden.

get_worksheet_protectionC

Get worksheet protection status and option flags.

set_worksheet_protectionC

Enable or disable worksheet protection with optional capability flags.

set_print_areaC

Set or clear worksheet print area.

set_print_titlesB

Set, preserve, or clear repeating print title rows and columns.

set_column_widthsC

Set explicit widths for one or more worksheet columns.

autofit_columnsC

Auto-fit worksheet columns based on content width.

set_row_heightsC

Set explicit heights for one or more worksheet rows.

copy_rangeC

Copy a range of cells to another location.

delete_rangeC

Delete a range of cells and shift remaining cells.

validate_excel_rangeC

Validate if a range exists and is properly formatted.

get_data_validation_infoB
Get all data validation rules in a worksheet.

This tool helps identify which cell ranges have validation rules
and what types of validation are applied.

Args:
    filepath: Path to Excel file
    sheet_name: Name of worksheet
    
Returns:
    JSON string containing all validation rules in the worksheet
inspect_data_validation_rulesC

Inspect worksheet data validation rules with stable rule indexes.

remove_data_validation_rulesB

Remove worksheet data validation rules by index or remove all broken ones.

inspect_conditional_format_rulesB

Inspect worksheet conditional formatting rules with stable rule indexes.

remove_conditional_format_rulesB

Remove worksheet conditional formatting rules by index or remove all broken ones.

insert_rowsC

Insert one or more rows starting at the specified row.

insert_columnsC

Insert one or more columns starting at the specified column.

delete_sheet_rowsC

Delete one or more rows starting at the specified row.

delete_sheet_columnsC

Delete one or more columns starting at the specified column.

search_in_sheetC

Search for cells matching a value in a worksheet.

list_all_sheetsA

List all sheets in a workbook with row/column counts. Quick overview before reading data.

append_table_rowsC

Append dictionary-shaped rows by matching worksheet headers on a worksheet dataset.

append_excel_table_rowsC

Append rows to a native Excel table and expand its range safely.

upsert_excel_table_rowsC

Update matching rows in a native Excel table and append missing keys.

update_rows_by_keyC

Update existing table rows using a named key column.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

C2.6/5.0

Scored across 83 tools

Disambiguation2/5

Several tool clusters have genuinely unclear boundaries: get_data_validation_info vs inspect_data_validation_rules, append_table_rows vs append_excel_table_rows, and a four-way read overlap (read_data_from_excel, read_excel_as_table, quick_read, query_table) that only the verbose descriptions partially untangle. Multiple write paths (write_data_to_excel, apply_workbook_changeset, apply_table_patch, upsert_excel_table_rows, update_rows_by_key) also target overlapping mutations, so tool selection is error-prone despite detailed prose.

Naming Consistency3/5

Everything is snake_case and mostly verb_noun, but the read verbs are scattered across read_/get_/inspect_/list_/describe_/profile_/audit_ with no rule distinguishing them (get_merged_cells vs inspect_named_range vs list_named_ranges). A few names invert the pattern (cross_workbook_lookup, search_in_sheet, freeze_panes, bulk_filter_workbooks), keeping it readable but not predictable.

Tool Count1/5

83 tools is far beyond what a coherent Excel surface needs, and much of the bulk is near-duplicate read/write/validation variants rather than distinct capabilities. The set reads as accumulated feature creep, making it hard for an agent to discover the canonical tool for a task.

Completeness4/5

Coverage of the Excel domain is unusually thorough: reading, writing, formatting, tables, charts, pivots, named ranges, protection, print setup, validation/conditional-format inspection, formula analysis, recipes, patches, snapshots, and diffs. Missing pieces exist (creating conditional formatting or data validation rules, sorting, chart/pivot deletion or update, worksheet reordering, workbook-level protection), but agents can work around most of them.

Maintenance

ActivityMaintained
ResponsivenessOutdated data