mcp-coda

Install: uvx mcp-coda | PyPI | MCP Registry | Changelog
mcp-coda is a Model Context Protocol (MCP) server for Coda. It lets an AI assistant read and write Coda docs, pages, tables, and rows through the Coda API. It also runs formulas, manages permissions and folders, publishes docs, and triggers automations. The server exposes 53 tools, 12 resources, and 5 prompts. It supports the MCP 2026-07-28 specification (often called MCP 2.0) and stays compatible with 2025-11-25 clients. It works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client.
mcp-coda uses FastMCP, httpx, and Pydantic.
1-Click Installation


Tip: For other AI assistants (Claude Code, Windsurf, IntelliJ, Gemini CLI), visit the Coda MCP Installation Gateway.
Manual Setup Guides (Click to expand)
Prerequisite: Install uv first (required for all uvx install flows). Install uv.
Claude Code
claude mcp add coda -- uvx mcp-coda
Windsurf & IntelliJ
Windsurf: Add to ~/.codeium/windsurf/mcp_config.json
IntelliJ: Add to Settings | Tools | MCP Servers
Note: The actual server config starts at coda inside the mcpServers object.
{
"mcpServers": {
"coda": {
"command": "uvx",
"args": ["mcp-coda"],
"env": {
"CODA_API_TOKEN": "your-token-here"
}
}
}
}
Gemini CLI
gemini mcp add -e CODA_API_TOKEN=your-token-here coda uvx mcp-coda
pip / uv
Configuration
| Variable | Required | Default | Description |
|---|
CODA_API_TOKEN | Yes | - | Coda API token (get one here) |
CODA_READ_ONLY | No | false | Set to true to disable write operations |
CODA_BASE_URL | No | https://coda.io/apis/v1 | API base URL |
CODA_TIMEOUT | No | 30 | Request timeout in seconds |
Supported Token Types
The server checks these environment variables in order โ first match wins:
CODA_API_TOKEN
CODA_TOKEN
CODA_PAT
Generate tokens at coda.io/account#apiSettings. Tokens grant access to all docs accessible by the token owner. Tokens have no scope restrictions. Coda's sharing settings control doc-level access.
Compatibility
| Client | Supported | Install Method |
|---|
| Claude Desktop | Yes | claude_desktop_config.json |
| Claude Code | Yes | claude mcp add |
| Cursor | Yes | One-click deeplink or .cursor/mcp.json |
| VS Code Copilot | Yes | One-click deeplink or .vscode/mcp.json |
| Windsurf | Yes | ~/.codeium/windsurf/mcp_config.json |
| Any MCP client | Yes | stdio or HTTP transport |
Protocol support
mcp-coda implements the Model Context Protocol 2026-07-28 specification, often called MCP 2.0. It also stays compatible with 2025-11-25 clients. A FastMCP client pinned to 2026-07-28 and a legacy client both list all tools and reach the Coda API over stdio. The companion code PR adds a regression test that checks tools/list with an in-memory client pinned to 2026-07-28.
- Spec version: MCP 2026-07-28 (MCP 2.0), backward compatible with 2025-11-25.
- Built on: FastMCP 4.x and the MCP Python SDK 2.x.
- Transports:
stdio (default) and streamable-http (recommended for remote). sse (HTTP+SSE) still works, but the 2026-07-28 specification deprecates it, so the server prints a warning.
- Capabilities: tools, resources, and prompts. The server uses no Roots, Sampling, Logging, elicitation, or resource subscriptions, so the 2026-07-28 deprecations do not affect it.
| Category | Count | Tools |
|---|
| Account | 3 | whoami, resolve browser link, mutation status |
| Docs | 5 | list, get, create, update, delete |
| Pages | 8 | list, get, create, update, delete, get content, delete content, export |
| Tables | 4 | list tables, get table, list columns, get column |
| Rows | 7 | list, get, insert/upsert, update, delete, bulk delete, push button |
| Permissions | 6 | sharing metadata, list, add, delete, search principals, ACL settings |
| Folders | 5 | list, get, create, update, delete |
| Misc | 8 | formulas (list, get), controls (list, get), publishing (list categories, publish, unpublish), trigger automation |
| Analytics | 7 | doc analytics, doc summary, page analytics, pack analytics, pack summary, formula analytics, analytics updated |
Full tool reference (click to expand)
Account
| Tool | Description |
|---|
coda_whoami | Get current user info |
coda_resolve_browser_link | Convert browser URL to API IDs |
coda_get_mutation_status | Check async write status |
Docs
| Tool | Description |
|---|
coda_list_docs | List accessible docs |
coda_get_doc | Get doc metadata |
coda_create_doc | Create a new doc |
coda_update_doc | Update doc title/icon |
coda_delete_doc | Delete a doc |
Pages
| Tool | Description |
|---|
coda_list_pages | List pages in a doc |
coda_get_page | Get page metadata |
coda_create_page | Create a page |
coda_update_page | Update page name/content |
coda_delete_page | Delete a page |
coda_get_page_content | Read page content |
coda_delete_page_content | Clear page content |
coda_export_page | Export page as HTML or markdown |
Tables
| Tool | Description |
|---|
coda_list_tables | List tables and views |
coda_get_table | Get table metadata |
coda_list_columns | List columns in a table |
coda_get_column | Get column metadata |
Rows
| Tool | Description |
|---|
coda_list_rows | List and filter rows |
coda_get_row | Get a single row |
coda_insert_rows | Insert or upsert rows |
coda_update_row | Update a row |
coda_delete_row | Delete a row |
coda_delete_rows | Bulk delete rows by filter |
coda_push_button | Push a button column value |
| Tool | Description |
|---|
coda_list_formulas | List named formulas |
coda_get_formula | Get formula value |
Controls
| Tool | Description |
|---|
coda_list_controls | List controls |
coda_get_control | Get control value |
Permissions
| Tool | Description |
|---|
coda_get_sharing_metadata | Get sharing config |
coda_list_permissions | List ACL entries |
coda_add_permission | Grant access |
coda_delete_permission | Revoke access |
coda_search_principals | Search users/groups |
coda_get_acl_settings | Get ACL settings |
Publishing
| Tool | Description |
|---|
coda_list_categories | List publishing categories |
coda_publish_doc | Publish a doc |
coda_unpublish_doc | Unpublish a doc |
Folders
| Tool | Description |
|---|
coda_list_folders | List folders |
coda_get_folder | Get folder details |
coda_create_folder | Create a folder |
coda_update_folder | Rename a folder |
coda_delete_folder | Delete a folder |
Automations
| Tool | Description |
|---|
coda_trigger_automation | Trigger an automation rule |
Analytics
| Tool | Description |
|---|
coda_list_doc_analytics | Doc usage metrics |
coda_get_doc_analytics_summary | Aggregated doc metrics |
coda_list_page_analytics | Page usage metrics |
coda_list_pack_analytics | Pack usage metrics |
coda_get_pack_analytics_summary | Aggregated pack metrics |
coda_list_pack_formula_analytics | Formula-level metrics |
coda_get_analytics_updated | Analytics freshness timestamp |
Resources (12)
The server exposes MCP resources that provide ambient context and do not consume tool calls.
Data Resources (live API)
| URI | Name | Description |
|---|
coda://docs | Coda Docs | List of docs accessible to the current API token |
coda://docs/{doc_id}/schema | Coda Doc Schema | Table and column definitions for a doc |
Rules (static knowledge)
| URI | Name | Description |
|---|
resource://rules/coda-doc-structure | Coda Doc Structure | Doc/page hierarchy, page types, naming, when to split docs vs folders |
resource://rules/coda-table-design | Coda Table Design | Column types, relations, display columns, row limits, table vs view |
resource://rules/coda-permissions | Coda Permission Model | Doc-level vs page-level locking, ACL, domain sharing, principal types |
resource://rules/coda-automations | Coda Automation Patterns | Webhooks, button triggers, rate limits, payload design, idempotency |
resource://rules/coda-api-patterns | Coda API Best Practices | Rate limits, pagination, async mutations, error handling, retry |
Guides (how-to)
| URI | Name | Description |
|---|
resource://guides/row-operations | Row Operations Guide | Insert vs upsert, bulk ops, key columns, cell formats, delete strategies |
resource://guides/page-content | Page Content Guide | HTML vs markdown, insert modes, export workflows |
resource://guides/formula-controls | Formulas & Controls Guide | Named formulas, control types, reading values |
resource://guides/publishing-analytics | Publishing & Analytics Guide | Publishing categories, gallery settings, analytics date filtering |
resource://guides/folder-organization | Folder Organization Guide | Folder CRUD, doc-folder relationships, hierarchy, bulk organization |
Prompts (5)
The server provides MCP prompts โ reusable task templates that clients can invoke.
| Prompt | Parameters | Description |
|---|
analyze_doc_structure | doc_id | Analyze a doc's page hierarchy, table layout, and organization |
design_table_schema | description | Design a table schema from a natural language description |
migrate_spreadsheet | doc_id, source_format | Guide for migrating CSV/Excel/Sheets data into Coda |
setup_automation | doc_id, trigger_type | Set up a webhook/button/time automation with error handling |
audit_permissions | doc_id | Audit sharing and permissions, suggest tightening |
Usage Examples
Docs & Pages
"List all my Coda docs"
โ coda_list_docs(is_owner=True)
"Get the content of page 'Sprint Planning' in doc d1"
โ coda_list_pages(doc_id="d1") โ find page ID
โ coda_get_page_content(doc_id="d1", page_id_or_name="canvas-abc")
"Create a new doc from a template"
โ coda_create_doc(title="Q1 Planning", source_doc="template-doc-id")
Tables & Rows
"List all tables in doc d1"
โ coda_list_tables(doc_id="d1")
"Find rows where Status is 'Done'"
โ coda_list_rows(doc_id="d1", table_id_or_name="Tasks", query="Done")
"Insert a new row into the Tasks table"
โ coda_insert_rows(doc_id="d1", table_id_or_name="Tasks", rows=[{"cells": [{"column": "Name", "value": "New task"}]}])
"Update a row's status"
โ coda_update_row(doc_id="d1", table_id_or_name="Tasks", row_id_or_name="i-abc", row={"cells": [{"column": "Status", "value": "In Progress"}]})
"Get the value of the TotalBudget formula"
โ coda_get_formula(doc_id="d1", formula_id_or_name="TotalBudget")
"Check the current value of the DateFilter control"
โ coda_get_control(doc_id="d1", control_id_or_name="DateFilter")
Permissions & Sharing
"Share a doc with a teammate"
โ coda_add_permission(doc_id="d1", access="write", principal_email="alice@example.com")
"List who has access to a doc"
โ coda_list_permissions(doc_id="d1")
Security Considerations
- Token scope: Coda API tokens grant access to all docs the token owner can access. Use a dedicated service account for production deployments to limit exposure.
- Read-only mode: Set
CODA_READ_ONLY=true to disable all write operations (create, update, delete). The server enforces read-only mode before any API call.
- MCP tool annotations: Each tool declares
readOnlyHint, destructiveHint, and idempotentHint for client-side permission prompts.
- No credential storage: The server does not persist tokens. It reads credentials from environment variables at startup.
Rate Limits & Permissions
Rate Limits
Coda enforces per-token rate limits (varies by plan). When Coda rate-limits a request, the tool returns a 429 error with retry_after seconds. The server does not retry. Wait that many seconds, then retry. Most paginated endpoints default to 50 results per page (coda_list_docs 25, coda_list_columns 100). Use limit to adjust.
Async Mutations
Coda processes write operations (insert, update, delete rows) asynchronously. Tools return a requestId. Check it with coda_get_mutation_status to confirm completion.
Required Permissions
| Operation | Minimum Coda Doc Role |
|---|
| List docs, read pages, tables, rows, formulas, controls | Viewer |
| Read permissions, analytics | Viewer (doc owner for analytics) |
| Create/update pages, insert/update/delete rows | Editor |
| Create/delete docs, manage folders | Editor (or doc owner) |
| Add/remove permissions, publish/unpublish | Doc Owner |
| Trigger automations | Editor |
Access Control
| Layer | Mechanism |
|---|
| Server-level | CODA_READ_ONLY=true blocks all write tools |
| MCP annotations | readOnlyHint, destructiveHint, idempotentHint for client-side prompts |
| Coda token | Doc-level access enforced by Coda's sharing settings |
CLI & Transport Options
uvx mcp-coda
uvx mcp-coda --transport sse --host 127.0.0.1 --port 8000
uvx mcp-coda --transport streamable-http --port 9000
uvx mcp-coda --coda-token your-token --read-only
The server loads .env files from the working directory automatically via python-dotenv.
FAQ
Does mcp-coda support MCP 2.0 (the 2026-07-28 spec)?
Yes. mcp-coda implements the MCP 2026-07-28 specification, commonly called MCP 2.0. It also works with 2025-11-25 clients.
Which transports does mcp-coda support?
The server supports stdio (the default) and streamable-http. It also supports sse, but the 2026-07-28 specification deprecates it. Prefer streamable-http for remote connections.
Is mcp-coda read-only safe?
Yes. Set CODA_READ_ONLY=true to disable every write tool. The server enforces read-only mode before any API call.
What token scopes does mcp-coda need?
Coda tokens have no scopes. A token reaches every doc its owner can reach. Coda's sharing settings control doc-level access. Use a dedicated service account to limit exposure.
Does mcp-coda work with self-hosted Coda?
Coda is a hosted service, so there is no self-hosted deployment. Set CODA_BASE_URL only to target a proxy or a non-default API base.
Which clients work with mcp-coda?
mcp-coda works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client over stdio or HTTP.
mcp-coda provides 53 tools, 12 resources, and 5 prompts. They cover docs, pages, tables, rows, formulas, controls, permissions, folders, publishing, automations, and analytics.
- mcp-gitlab โ GitLab integration (76 tools, 6 resources, 5 prompts)
- mcp-atlassian-extended โ Jira + Confluence integration (23 tools, 15 resources, 5 prompts)
Development
git clone https://github.com/vish288/mcp-coda.git
cd mcp-coda
uv sync --all-extras
uv run pytest --cov
uv run ruff check .
uv run ruff format --check .
License
MIT