io.github.vish288/mcp-coda icon

mcp-coda

by vish288

io.github.vish288/mcp-coda

MCP server for Coda API — docs, pages, tables, rows, formulas, permissions, and automation.

mcp-coda

CI

Install: uvx mcp-coda | PyPI | MCP Registry | Changelog

mcp-coda is a Model Context Protocol (MCP) server for the Coda API54 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

Install in Cursor

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

uv pip install mcp-coda

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:

  1. CODA_API_TOKEN
  2. CODA_TOKEN
  3. 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.

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
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
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

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=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.

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