Skip to main content
Glama

WiseGrid MCP

Read and write WiseGrid sheets from Claude, Cursor, or any MCP client. List sheets, page through rows, add and update records, and run reports — from inside a conversation.

Unlike the other servers in this family, these tools operate on your real data, so an API key is required.

Install

{
  "mcpServers": {
    "wisegrid": {
      "command": "uvx",
      "args": ["wisegrid-mcp"],
      "env": {
        "WISEGRID_API_KEY": "wg_live_xxx"
      }
    }
  }
}

Or pip install wisegrid-mcp.

Variable

Required

Purpose

WISEGRID_API_KEY

yes

Create one in WiseGrid under Settings

WISEGRID_BASE_URL

no

Override for self-hosted instances

The key's scopes decide what these tools can reach. Grant read-only scopes if you only want the agent to look.

Related MCP server: MCP Google Sheets Server

Tools

Tool

What it does

whoami

The key's identity, scopes and rate limit — call this first when debugging

list_sheets

Sheets the key can see, cursor-paginated

get_sheet

Sheet + columns + first page of rows, in one call

list_columns

Column IDs, which cell dictionaries are keyed by

list_rows

Rows, cursor-paginated; each carries the version you need to update it

add_rows

Bulk insert, partial success, max 2000

update_row

Update one row's changed cells, version-checked

update_rows

Bulk update, version-checked per row, max 2000

delete_row

Delete a row and its subtree — requires confirm=True

list_reports / get_report / run_report

Reports and their rows

Things that will bite you otherwise

Cells are keyed by column ID, not column name. {"101": "Acme Corp"}, not {"Client": "Acme Corp"}. Call get_sheet or list_columns first.

Updates are version-checked. Every row carries a version; you pass the one you read, and if the row changed in the meantime you get version_conflict instead of a silent overwrite. That is a normal outcome to handle — re-read the row, decide whether your change still applies, then retry. Blindly bumping the version to force the write is how concurrent edits disappear.

update_row merges, update_rows overwrites. The single-row tool takes only the cells you changed. The bulk tool replaces the row's cell set, so send the full set you want the row to end up with.

delete_row takes the children too. It removes the row and its entire subtree, it is not undoable through the API, and it requires confirm=True for exactly that reason. Read the rows first.

Writes are idempotent. Each carries an Idempotency-Key, so a retry after a timeout cannot double-apply. Rate limits are honoured via Retry-After.

Development

git clone https://github.com/RyanKramer/wisegrid-mcp
cd wisegrid-mcp
pip install -e .
WISEGRID_API_KEY=wg_live_xxx wisegrid-mcp

About

Built by WiseGrid. Full REST API reference at wisegrid.co/docs/api.

MIT licensed.

Available Tools

12 tools
add_rowsA

Add rows to a sheet. Each item is a dict of cells keyed by column ID (as a string), e.g. {"101": "Acme Corp", "102": "2026-09-01"}.

Partial success: the response reports per-row results plus succeededCount and failedCount, so some rows can land while others fail validation. Maximum 2000 rows per call.

Inputs: rows (required), sheet_id (required). Returns: object

delete_rowA

Delete a row AND ALL OF ITS CHILD ROWS. Destructive and not undoable through this API.

Requires confirm=True. Read the row and its children first so you know what the subtree contains — a parent row can carry descendants that are not obvious from the row itself.

Inputs: row_id (required), sheet_id (required), confirm. Returns: object

get_reportA

Get a report's definition (its source sheets, columns and filters).

Inputs: report_id (required). Returns: object

get_sheetA

Get a sheet with its columns and first page of rows — one call for a usable snapshot. Use this before writing, to learn the column IDs.

Inputs: sheet_id (required), row_limit. Returns: object

list_columnsA

List a sheet's columns. Cell dictionaries are keyed by these column IDs as strings, so you need them before any write.

Inputs: sheet_id (required). Returns: object

list_reportsB

List reports the API key can see.

Inputs: limit, cursor. Returns: object

list_rowsA

List a sheet's rows, cursor-paginated by row id. Max limit 500.

Each row carries a version — keep it if you intend to update the row.

Inputs: sheet_id (required), limit, cursor. Returns: object

list_sheetsA

List sheets the API key can see. Cursor-paginated; pass the returned nextCursor to get the next page. Max limit 500.

Inputs: limit, cursor. Returns: object

run_reportA

Run a report and return its rows, cursor-paginated. Max limit 500.

Inputs: report_id (required), limit, cursor. Returns: object

update_rowA

Update one row's cells. cells carries ONLY the changed cells.

version is the row's current version and is checked before the write (optimistic concurrency). If the row changed since you read it you get version_conflict rather than a silent overwrite — read the row again and decide whether your change still applies.

Inputs: cells (required), row_id (required), version (required), sheet_id (required). Returns: object

update_rowsA

Update many rows. Each item needs 'id', 'version' and 'cells'.

NOTE: unlike update_row, bulk cells OVERWRITES the row's cells rather than merging them. Send the full cell set you want the row to end up with. Partial success per row, version-checked individually. Max 2000.

Inputs: rows (required), sheet_id (required). Returns: object

whoamiA

Who the current API key belongs to, its scopes, and its rate limit.

Call this first if anything is failing — it distinguishes a bad key from a scope problem.

Inputs: no named parameters. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 12 tools

    Disambiguation4/5

    Tools are clearly separated by resource and action: whoami for identity, list/get for sheets and reports, list for columns/rows, and add/update/delete for row mutations. Slight overlap exists between get_sheet (which includes rows) and list_rows, and between update_row and update_rows, but descriptions explicitly clarify the differences, minimizing misselection risk.

    Naming Consistency5/5

    Names follow a consistent verb_noun pattern with list_* for collections, get_* for single entities, and action verbs (add, update, delete, run) for mutations. The special-case whoami is a standard idiom and doesn't break the overall convention.

    Tool Count5/5

    12 tools cover the server's scope—authentication, sheet/column/row reads, row writes, and report execution—without bloat. This falls well within the ideal 3-15 range and each tool has a clear purpose.

    Completeness4/5

    Row lifecycle is fully covered (list, add, update single/bulk, delete), and reports can be listed, inspected, and executed. However, sheets and reports cannot be created or deleted, and there's no single-row fetch or bulk delete, leaving minor gaps for advanced workflows.

    Maintenance

    ActivityStale
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers