---
title: "Grist MCP server for AI agents - actionlake"
description: "Give Claude 108 Grist actions through one MCP server: docs, attachments, workspaces, orgs. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/grist
updated: 2026-10-23
---

Connectors · Developer & infrastructure

# Grist MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Grist and the rest of your systems. It gives your agent 108 Grist actions (38 reads, 50 writes and 20 that wait for a confirmation) and holds the Grist credential itself, so the agent never does. It paces Grist's limits and records every call.

[Connect Grist free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "grist.orgs.list_orgs",
  intent: "check which Grist account is connected"
}
# List the orgs you have access to · read · 1 upstream call
```

- 108 actions in one signed file
- 38 read look, never change
- 50 write create and update
- 20 wait for a yes destructive, confirmed first

Set up

## Connect Grist in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Grist.
   Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `access_token` Grist API key, sent as `Authorization
   - `host` Where your Grist lives: your host
   ```
   account { op: "connections.requirements", service: "grist" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "grist.orgs.list_orgs" }
   # list the orgs you have access to · read · 1 upstream call
   check { action: "grist.tables.add_tables", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Grist at a glance

**Sign-in**

Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.

**You provide**

`access_token`

**Setup fields**

`host`

**Limits we pace to**

10 calls a second, per connection

**API covered**

Grist API 1.0.1 (OpenAPI 3.0.0), at your Grist instance's API base URL, which you enter when connecting (path /api)

**Built from**

Grist's documentation, read 23 October 2026[OpenAPI spec (GitHub)](https://raw.githubusercontent.com/gristlabs/grist-help/master/api/grist.yml) [support.getgrist.com](https://support.getgrist.com/api/)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

38 of 38 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

5, so ask can line Grist up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Grist.

108 actions in 17 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **38** read look, never change
- **50** write create and update
- **20** destructive wait for a confirmation

1. ### Docs
   36
   10 read · 22 write · 4 destructive
   Create an empty document · Describe a document · Modify document metadata (but not its contents) · Delete a document
2. ### Attachments
   10
   5 read · 3 write · 2 destructive
   List external attachment stores · Get attachment transfer status · Get external store · Set external store
3. ### Workspaces
   9
   3 read · 4 write · 2 destructive
   List workspaces and documents within an org · Create an empty workspace · Describe a workspace · Modify a workspace
4. ### Orgs
   7
   4 read · 2 write · 1 destructive
   List the orgs you have access to · Describe an org · Modify an org · Delete an org
5. ### Service accounts
   7
   2 read · 3 write · 2 destructive
   Get all your service accounts · Create a service account · Get a service account's details · Modify a service account
6. ### Webhooks
   6
   1 read · 2 write · 3 destructive
   Create new webhooks for a document · Webhooks associated with a document · Modify a webhook · Remove a webhook
7. ### Columns
   5
   1 read · 3 write · 1 destructive
   Add columns to a table · List columns in a table · Modify columns of a table · Delete a column of a table
8. ### Records
   5
   1 read · 3 write · 1 destructive
   Add records to a table · Fetch records from a table · Modify records of a table · Delete records of a table

**9 more areas · 23 actions**

- Data **4**
- Profile **4**
- Session **3**
- Tables **3**
- Users **3**
- SQL **2**
- Templates **2**
- Forms **1**
- Widgets **1**

Top actions

## The Grist API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 37 of Grist's 37 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `grist.tables.list_tables` List tables in a document | List tables in a document | read | `content.table.list` 21 connectors |
| `grist.profile.get_profile` Get current user's profile | Get current user's profile | read | `identity.current_user.get` 307 connectors |
| `grist.workspaces.list_workspaces` List workspaces and documents within an org | List workspaces and documents within an org | read | `work.workspace.list` 50 connectors |
| `grist.tables.add_tables` Add tables to a document | Add tables to a document | write | `content.table.create` 16 connectors |
| `grist.service_accounts.list_service_accounts` Get all your service accounts | Get all your service accounts | read | `identity.service_account.list` 35 connectors |
| `grist.workspaces.create_workspace` Create an empty workspace | Create an empty workspace | write | `work.workspace.create` 36 connectors |
| `grist.records.add_records` Add records to a table | Add records to a table | write | `content.record.create` 15 connectors |
| `grist.records.list_records` Fetch records from a table | Fetch records from a table | read | `content.record.list` 13 connectors |
| `grist.service_accounts.create_service_account` Create a service account | Create a service account | write | `identity.service_account.create` 32 connectors |
| `grist.orgs.list_orgs` List the orgs you have access to | List the orgs you have access to | read | `platform.tenant.list` 70 connectors |
| `grist.docs.create_doc` Create an empty document | Create an empty document | write | `content.spreadsheet.create` 4 connectors |
| `grist.users.delete_user` Delete a user from Grist | Delete a user from Grist | destructive | `identity.user.delete` 253 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Grist actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   List the orgs you have access to in Grist and tell me what stands out.
   calls `grist.orgs.list_orgs`
2. Write write
   Add tables to a document in Grist. Show me exactly what you will send before you save it.
   calls `grist.tables.add_tables`

Governance for Grist

## Destructive actions wait for a yes.

20 Grist actions are destructive. These are all of them:

- Delete a workspace `grist.workspaces.delete_workspace`
- Delete records of a table `grist.records.delete_records`
- Delete a user from Grist `grist.users.delete_user`
- Delete a service account `grist.service_accounts.delete_service_account`
- Delete user's API key `grist.profile.delete_api_key`
- Delete a document `grist.docs.delete_doc`
- Remove a webhook `grist.webhooks.delete_webhook`
- Delete an org `grist.orgs.delete_org`
- Move document to trash `grist.docs.remove_doc`
- Truncate the document's action history `grist.docs.delete_actions`
- Delete a column of a table `grist.columns.delete_column`
- Remove document snapshots `grist.docs.remove_snapshots`
- Move workspace to trash `grist.workspaces.remove_workspace`
- Delete rows of a table `grist.data.delete_rows`
- Disable a user `grist.users.disable_user`
- Empty a document's queue of undelivered payloads `grist.webhooks.clear_webhook_queue`
- Delete unused attachments from the document `grist.attachments.remove_unused_attachments`
- Start transferring attachments `grist.attachments.start_attachment_transfer`
- Clear queue for a specific webhook `grist.webhooks.clear_webhook_queue_for_webhook`
- Delete a service account's api key `grist.service_accounts.delete_service_account_api_key`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do grist.workspaces.delete_workspace confirm_policy: **human**

Delete a workspace?

**intent:** the user asked me to delete a workspace

run suspended · waiting for a named person · key _grist-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "grist-agent",
  allowed_actions: ["grist.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "grist.workspaces.delete_workspace", approver: "lead@example.com" },
    { match: "grist.records.delete_records", approver: "lead@example.com" },
    { match: "grist.users.delete_user", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Grist only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Grist costs on actionlake.

Every Grist action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Grist refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 108 Grist actions
- 108 actions page each page of a long list is one call
- 38 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Grist action.

108 actions by area: the id your agent calls, what it does, and its effect.

**Docs 36**

- `grist.docs.apply_proposal` Apply a change proposal write
- `grist.docs.apply_user_actions` Apply a list of user actions write
- `grist.docs.assign_doc` Reassign document to appropriate worker write
- `grist.docs.compare_documents` Compare two documents read
- `grist.docs.compare_versions` Compare document versions read
- `grist.docs.copy_doc` Copies a document to a workspace. write
- `grist.docs.create_doc` Create an empty document write
- `grist.docs.create_doc_unified` Create a document write
- `grist.docs.create_proposal` Create a change proposal write
- `grist.docs.delete_actions` Truncate the document's action history destructive
- `grist.docs.delete_doc` Delete a document destructive
- `grist.docs.describe_doc` Describe a document read
- `grist.docs.disable_doc` Disable a document. write
- `grist.docs.download_table_schema` The schema of a table read
- `grist.docs.enable_doc` Enable a document. write
- `grist.docs.flush_doc` Flush document to storage write
- `grist.docs.force_reload` Reload a document write
- `grist.docs.fork_doc` Fork a document write
- `grist.docs.get_states` Get document action history states read
- `grist.docs.get_timing_status` Get formula timing status read
- `grist.docs.get_users_for_view_as` Get users for 'View As' feature read
- `grist.docs.list_doc_access` List users with access to document read
- `grist.docs.list_proposals` List change proposals read
- `grist.docs.list_snapshots` List document snapshots read
- `grist.docs.modify_doc` Modify document metadata (but not its contents) write
- `grist.docs.modify_doc_access` Change who has access to document write
- `grist.docs.move_doc` Move document to another workspace. write
- `grist.docs.pin_doc` Pin a document write
- `grist.docs.recover_doc` Set recovery mode for a document write
- `grist.docs.remove_doc` Move document to trash destructive
- `grist.docs.remove_snapshots` Remove document snapshots destructive
- `grist.docs.replace_doc` Replace document content write
- `grist.docs.start_timing` Start formula timing write
- `grist.docs.stop_timing` Stop formula timing write
- `grist.docs.unpin_doc` Unpin a document write
- `grist.docs.unremove_doc` Restore document from trash write

**Attachments 10**

- `grist.attachments.get_attachment_metadata` Get the metadata for an attachment read
- `grist.attachments.get_attachment_transfer_status` Get attachment transfer status read
- `grist.attachments.get_document_attachment_store` Get external store read
- `grist.attachments.list_attachment_stores` List external attachment stores read
- `grist.attachments.list_attachments` List metadata of all attachments in a doc read
- `grist.attachments.remove_unused_attachments` Delete unused attachments from the document destructive
- `grist.attachments.set_document_attachment_store` Set external store write
- `grist.attachments.start_attachment_transfer` Start transferring attachments destructive
- `grist.attachments.update_used_attachments` Update attachment usage tracking write
- `grist.attachments.verify_attachment_files` Verify attachment file integrity write

**Workspaces 9**

- `grist.workspaces.create_workspace` Create an empty workspace write
- `grist.workspaces.delete_workspace` Delete a workspace destructive
- `grist.workspaces.describe_workspace` Describe a workspace read
- `grist.workspaces.list_workspace_access` List users with access to workspace read
- `grist.workspaces.list_workspaces` List workspaces and documents within an org read
- `grist.workspaces.modify_workspace` Modify a workspace write
- `grist.workspaces.modify_workspace_access` Change who has access to workspace write
- `grist.workspaces.remove_workspace` Move workspace to trash destructive
- `grist.workspaces.unremove_workspace` Restore workspace from trash write

**Orgs 7**

- `grist.orgs.delete_org` Delete an org destructive
- `grist.orgs.describe_org` Describe an org read
- `grist.orgs.get_org_usage` Get organization usage summary read
- `grist.orgs.list_org_access` List users with access to org read
- `grist.orgs.list_orgs` List the orgs you have access to read
- `grist.orgs.modify_org` Modify an org write
- `grist.orgs.modify_org_access` Change who has access to org write

**Service accounts 7**

- `grist.service_accounts.create_service_account` Create a service account write
- `grist.service_accounts.delete_service_account` Delete a service account destructive
- `grist.service_accounts.delete_service_account_api_key` Delete a service account's api key destructive
- `grist.service_accounts.get_service_account` Get a service account's details read
- `grist.service_accounts.list_service_accounts` Get all your service accounts read
- `grist.service_accounts.modify_service_account` Modify a service account write
- `grist.service_accounts.regenerate_service_account_api_key` Generate a new service account's api key write

**Webhooks 6**

- `grist.webhooks.clear_webhook_queue` Empty a document's queue of undelivered payloads destructive
- `grist.webhooks.clear_webhook_queue_for_webhook` Clear queue for a specific webhook destructive
- `grist.webhooks.create_webhooks` Create new webhooks for a document write
- `grist.webhooks.delete_webhook` Remove a webhook destructive
- `grist.webhooks.list_webhooks` Webhooks associated with a document read
- `grist.webhooks.modify_webhook` Modify a webhook write

**Columns 5**

- `grist.columns.add_columns` Add columns to a table write
- `grist.columns.delete_column` Delete a column of a table destructive
- `grist.columns.list_columns` List columns in a table read
- `grist.columns.modify_columns` Modify columns of a table write
- `grist.columns.replace_columns` Add or update columns of a table write

**Records 5**

- `grist.records.add_records` Add records to a table write
- `grist.records.delete_records` Delete records of a table destructive
- `grist.records.list_records` Fetch records from a table read
- `grist.records.modify_records` Modify records of a table write
- `grist.records.replace_records` Add or update records of a table write

**Data 4**

- `grist.data.add_rows` Add rows to a table write
- `grist.data.delete_rows` Delete rows of a table destructive
- `grist.data.get_table_data` Fetch data from a table read
- `grist.data.modify_rows` Modify rows of a table write

**Profile 4**

- `grist.profile.delete_api_key` Delete user's API key destructive
- `grist.profile.get_profile` Get current user's profile read
- `grist.profile.update_user_locale` Update user's locale write
- `grist.profile.update_user_name` Update user's name write

**Session 3**

- `grist.session.get_active_session` Get active session information read
- `grist.session.get_all_sessions` Get all session users and organizations read
- `grist.session.set_active_user` Set active user for organization write

**Tables 3**

- `grist.tables.add_tables` Add tables to a document write
- `grist.tables.list_tables` List tables in a document read
- `grist.tables.modify_tables` Modify tables of a document write

**Users 3**

- `grist.users.delete_user` Delete a user from Grist destructive
- `grist.users.disable_user` Disable a user destructive
- `grist.users.enable_user` Enable a user write

**SQL 2**

- `grist.sql.run_sql` Run an SQL query against a document, with options or parameters read
- `grist.sql.run_sql_get` Run an SQL query against a document read

**Templates 2**

- `grist.templates.get_template` Get template details read
- `grist.templates.list_templates` List available templates read

**Forms 1**

- `grist.forms.get_form_data` Get form view data read

**Widgets 1**

- `grist.widgets.list_widgets` List available custom widgets read

Questions

## The Grist MCP server, answered.

**Is there a Grist MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 108 Grist actions across docs, attachments, workspaces and orgs, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Grist.

**What do I need to connect Grist?**

Grist API key, sent as `Authorization. Plus your host. The free call account { op: "connections.requirements", service: "grist" } lists exactly what to paste.

**Can an AI agent delete or change things in Grist?**

Only if its key allows it, and only with an explicit confirmation. 20 Grist actions are destructive, including delete a workspace, delete records of a table and delete a user from Grist. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Grist API limit?**

actionlake paces every call to the limits in the Grist service file: 10 calls a second per connection. Repeated reads are answered from cache (38 Grist actions can be), which never reaches Grist.

**What does a Grist action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (108 Grist actions page). Cache hits, searches, dry runs and calls Grist refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Grist API does it cover?**

The Grist API 1.0.1 (OpenAPI 3.0.0) at your Grist instance's API base URL, which you enter when connecting (path /api). It is built from Grist's documentation as read on 23 October 2026. 108 actions in 17 areas, each one in the signed service file (version 1.0.0).

**Does actionlake keep my Grist data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Grist credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Grist

Shares the most action names with

- [Airtable 17](https://actionlake.com/connectors/airtable)
- [PlanetScale 9](https://actionlake.com/connectors/planetscale)
- [Baserow 8](https://actionlake.com/connectors/baserow)
- [SeaTable 8](https://actionlake.com/connectors/seatable)
- [Cloudsmith 8](https://actionlake.com/connectors/cloudsmith)
- [Zoho Creator 5](https://actionlake.com/connectors/zoho-creator)

Joins with, on shared entities

- [Mistral AI 3](https://actionlake.com/connectors/mistral-ai)
- [Botpress 3](https://actionlake.com/connectors/botpress)
- [Microsoft 365 Users 2](https://actionlake.com/connectors/microsoft-365-users)
- [Rubrik Security Cloud 2](https://actionlake.com/connectors/rubrik-security-cloud)
- [Cloudflare 2](https://actionlake.com/connectors/cloudflare)
- [Metabase 2](https://actionlake.com/connectors/metabase)

Browse

- [All Developer & infrastructure connectors](https://actionlake.com/connectors/category/developer-and-infrastructure)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Grist; the name is the vendor's own. Counts are from the Grist service file, version 1.0.0.

## Give your agent Grist today.

[Connect Grist free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/grist
More: https://actionlake.com/llms.txt
