mcp-coda
Enables AI assistants to interact with Coda docs, pages, tables, rows, formulas, and more via the Coda API, offering 54 tools, 12 resources, and 5 prompts for comprehensive document management.
README
mcp-coda
<!-- mcp-name: io.github.vish288/mcp-coda -->
Install: uvx mcp-coda | PyPI | MCP Registry | Changelog
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.
Built with FastMCP, httpx, and Pydantic.
1-Click Installation
Tip: For other AI assistants (Claude Code, Windsurf, IntelliJ, Gemini CLI), visit the Coda MCP Installation Gateway.
<details> <summary><b>Manual Setup Guides (Click to expand)</b></summary> <br/>
Prerequisite: Install
uvfirst (required for alluvxinstall 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
codainside themcpServersobject.
{
"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
uv pip install mcp-coda
</details>
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 |
CODA_SSL_VERIFY |
No | true |
Set to false to skip SSL verification |
Supported Token Types
The server checks these environment variables in order — first match wins:
CODA_API_TOKENCODA_TOKENCODA_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.
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 |
Tools (54)
| Category | Count | Tools |
|---|---|---|
| Account | 4 | whoami, resolve browser link, mutation status, rate limit budget |
| 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 |
| Formulas | 2 | list, get |
| Controls | 2 | list, get |
| Permissions | 6 | sharing metadata, list, add, delete, search principals, ACL settings |
| Publishing | 3 | list categories, publish, unpublish |
| Folders | 5 | list, get, create, update, delete |
| Automations | 1 | trigger automation |
| Analytics | 7 | doc analytics, doc summary, page analytics, pack analytics, pack summary, formula analytics, analytics updated |
<details> <summary>Full tool reference (click to expand)</summary>
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 |
coda_rate_limit_budget |
Get remaining rate limit budget |
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 |
Formulas
| 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 |
</details>
Resources (12)
The server exposes MCP resources that provide ambient context without consuming 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"}]})
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": "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=trueto 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, andidempotentHintfor client-side permission prompts. - SSL verification:
CODA_SSL_VERIFY=trueby 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.
Related MCP Servers
- 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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。