You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
mcp-coda is a Model Context Protocol (MCP) server for the Coda API — 54 tools, 12 resources, and 5 prompts covering docs, pages, tables, rows, formulas, controls, permissions, folders, publishing, automations, and analytics. Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client.
The server checks these environment variables in order — first match wins:
CODA_API_TOKEN
CODA_TOKEN
CODA_PAT
Tokens are generated at coda.io/account#apiSettings. Tokens grant access to all docs accessible by the token owner. There are no scope restrictions — access is controlled at the doc level via Coda's sharing settings.
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"}]})
Formulas & Controls
"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={"type": "email", "email": "[email protected]"})
"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). Read-only mode is enforced server-side before any API call.
MCP tool annotations: Each tool declares readOnlyHint, destructiveHint, and idempotentHint for client-side permission prompts.
SSL verification: CODA_SSL_VERIFY=true by default. Only disable for development against local proxies.
No credential storage: The server does not persist tokens. Credentials are read from environment variables at startup.
Rate Limits & Permissions
Rate Limits
Coda enforces per-token rate limits (varies by plan). When rate-limited, tools return a 429 error with retry_after seconds. Use coda_rate_limit_budget to check remaining budget before batch operations. Paginated endpoints default to 25 results per page; use limit to adjust.
Async Mutations
Write operations (insert, update, delete rows) are processed asynchronously. Tools return a requestId that can be checked 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
# Default: stdio transport (for MCP clients)
uvx mcp-coda
# HTTP transport (SSE or streamable-http)
uvx mcp-coda --transport sse --host 127.0.0.1 --port 8000
uvx mcp-coda --transport streamable-http --port 9000
# CLI overrides for config
uvx mcp-coda --coda-token your-token --read-only
The server loads .env files from the working directory automatically via python-dotenv.
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
About
MCP server for Coda API — 54 tools, 12 resources, 5 prompts. Docs, pages, tables, rows, formulas, permissions, automation, analytics.