docs/Agent Integration/MCP Integration

MCP Integration

Connect Claude, Cursor, Windsurf and any MCP client — push, read, edit, version, export, search grids from any AI agent.

Connecting via MCP

The Model Context Protocol gives any LLM tool a typed handshake to your data layer. The Instadash MCP server is hosted at mcp.instadash.io — paste that URL into your client and authorize with GitHub or magic link. No API key paste required.

Hosted (recommended)

For Claude.ai, Cursor, Windsurf and any client that supports remote MCP, add this URL:

https://mcp.instadash.io

The client walks you through a one-time OAuth handshake; your grids show up in the tool list within 30 seconds.

Local (stdio)

For clients that only support stdio, the instadash-mcp npm package proxies stdio to the hosted server.

{
  "mcpServers": {
    "instadash": {
      "command": "npx",
      "args": ["-y", "instadash-mcp"],
      "env": { "INSTADASH_KEY": "sk_live_…" }
    }
  }
}

Hosts we test against

HostStatus
Claude Desktop✓ supported
Claude.ai✓ supported
Cursor✓ supported
Windsurf✓ supported
Zedbeta
Continue.devbeta
VS Code Copilotplanned

Tools your agent gets

The canonical, always-up-to-date manifest lives at /.well-known/mcp.json. The current surface, grouped by capability:

Write

instadash_push(name, rows, title?, description?, tags?,
               editable?, visibility?, ttl_days?, actions?)
    // Create/update a grid. Returns { url, embed_url, version }.

instadash_copy(source, name?)
    // Fork a public grid (or one of your own) into your account.
    // New grid starts at v1, defaults to private, records copied_from.

instadash_update(grid, title?, description?, tags?,
                 visibility?, editable?)
    // Change metadata without re-pushing rows. null clears string fields.

instadash_write_cell(grid, edits)
    // Targeted cell write. Tagged source=agent so HITL pollers
    // can distinguish agent-originated edits from human edits.

Read

instadash_list(q?)
    // Grids in your workspace. q = case-insensitive substring on slug.

instadash_get_schema(grid)
    // Column names, inferred types, sample row.

instadash_read(grid, offset?, limit?, filter?, sort?, q?, version?)
    // Paginated rows. Server-side filter (col=value), sort (col:asc),
    // full-text q, and version selector for historical reads.

instadash_list_versions(grid)
    // Version history with timestamps and row counts.

instadash_stats(grid)
    // Current rows, version count, retained storage bytes,
    // title/visibility/editable, timestamps.

instadash_usage()
    // Account-level: grids used/max, storage, per-push caps,
    // rate limit, feature flags.

HITL & lifecycle

instadash_edits(grid, since?, source?)
    // Flat list of cell edits — what did the human approve/change?
    // source = 'human' | 'agent'. since = ISO 8601 timestamp.

instadash_rollback(grid, version)
    // Restore a previous version as the new latest. History preserved.

instadash_delete(grid)
    // Permanently delete a grid you own. Removes rows, history,
    // mesh listing, and edit overlay.

Export & discovery

instadash_export(grid)
    // CSV download URL. Streams the full grid with RFC 4180 escaping.

instadash_embed_snippet(grid, width?, height?, theme?, compact?)
    // Ready-to-paste iframe snippet for embedding the grid.

instamesh_search(q, k?)
    // Semantic + keyword search across all public grids.

The HITL loop in three calls

The whole reason an agent needs a grid: hand off to a human, read back the decisions.

1. instadash_push(name, rows, editable: true,
                  actions: [{ column: 'approved', type: 'checkbox' }])
   → { url, embed_url, version }

2. (human opens the URL, ticks approved on the real rows)

3. instadash_edits(grid, source: 'human', since: lastChecked)
   → [{ row, col, value, source, timestamp }, …]

Two MCP calls bracket the human review. No clarifying chat. No re-prompting. Just structured approvals.