{
  "markdown": "# mcp-coda\n\n[![PyPI version](https://img.shields.io/pypi/v/mcp-coda)](https://pypi.org/project/mcp-coda/)\n[![PyPI downloads](https://img.shields.io/pypi/dm/mcp-coda)](https://pypi.org/project/mcp-coda/)\n[![Python](https://img.shields.io/pypi/pyversions/mcp-coda)](https://pypi.org/project/mcp-coda/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![CI](https://github.com/vish288/mcp-coda/actions/workflows/tests.yml/badge.svg)](https://github.com/vish288/mcp-coda/actions/workflows/tests.yml)\n[![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io)\n\n<!-- mcp-name: io.github.vish288/mcp-coda -->\n\n**Install:** `uvx mcp-coda` | [PyPI](https://pypi.org/project/mcp-coda/) | [MCP Registry](https://registry.modelcontextprotocol.io) | [Changelog](https://github.com/vish288/mcp-coda/releases)\n\n**mcp-coda** is a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for the [Coda API](https://coda.io/developers/apis/v1) — **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.\n\nBuilt with [FastMCP](https://github.com/jlowin/fastmcp), [httpx](https://www.python-httpx.org/), and [Pydantic](https://docs.pydantic.dev/).\n\n## 1-Click Installation\n\n[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://vish288.github.io/mcp-install?server=mcp-coda&install=cursor)\n\n[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vish288.github.io/mcp-install?server=mcp-coda&install=vscode) [![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install_Server-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vish288.github.io/mcp-install?server=mcp-coda&install=vscode-insiders)\n\n> **Tip:** For other AI assistants (Claude Code, Windsurf, IntelliJ, Gemini CLI), visit the **[Coda MCP Installation Gateway](https://vish288.github.io/mcp-install?server=mcp-coda)**.\n\n<details>\n<summary><b>Manual Setup Guides (Click to expand)</b></summary>\n<br/>\n\n> Prerequisite: Install `uv` first (required for all `uvx` install flows). [Install uv](https://docs.astral.sh/uv/getting-started/installation/).\n\n### Claude Code\n\n```bash\nclaude mcp add coda -- uvx mcp-coda\n```\n\n### Windsurf & IntelliJ\n\n**Windsurf:** Add to `~/.codeium/windsurf/mcp_config.json`\n**IntelliJ:** Add to `Settings | Tools | MCP Servers`\n\n> **Note:** The actual server config starts at `coda` inside the `mcpServers` object.\n\n```json\n{\n  \"mcpServers\": {\n    \"coda\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-coda\"],\n      \"env\": {\n        \"CODA_API_TOKEN\": \"your-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Gemini CLI\n\n```bash\ngemini mcp add -e CODA_API_TOKEN=your-token-here coda uvx mcp-coda\n```\n\n### pip / uv\n\n```bash\nuv pip install mcp-coda\n```\n\n</details>\n\n## Configuration\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `CODA_API_TOKEN` | **Yes** | - | Coda API token ([get one here](https://coda.io/account#apiSettings)) |\n| `CODA_READ_ONLY` | No | `false` | Set to `true` to disable write operations |\n| `CODA_BASE_URL` | No | `https://coda.io/apis/v1` | API base URL |\n| `CODA_TIMEOUT` | No | `30` | Request timeout in seconds |\n| `CODA_SSL_VERIFY` | No | `true` | Set to `false` to skip SSL verification |\n\n### Supported Token Types\n\nThe server checks these environment variables in order — first match wins:\n\n1. `CODA_API_TOKEN`\n2. `CODA_TOKEN`\n3. `CODA_PAT`\n\nTokens are generated at [coda.io/account#apiSettings](https://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.\n\n## Compatibility\n\n| Client | Supported | Install Method |\n|--------|-----------|----------------|\n| Claude Desktop | Yes | `claude_desktop_config.json` |\n| Claude Code | Yes | `claude mcp add` |\n| Cursor | Yes | One-click deeplink or `.cursor/mcp.json` |\n| VS Code Copilot | Yes | One-click deeplink or `.vscode/mcp.json` |\n| Windsurf | Yes | `~/.codeium/windsurf/mcp_config.json` |\n| Any MCP client | Yes | stdio or HTTP transport |\n\n## Tools (54)\n\n| Category | Count | Tools |\n|----------|-------|-------|\n| **Account** | 4 | whoami, resolve browser link, mutation status, rate limit budget |\n| **Docs** | 5 | list, get, create, update, delete |\n| **Pages** | 8 | list, get, create, update, delete, get content, delete content, export |\n| **Tables** | 4 | list tables, get table, list columns, get column |\n| **Rows** | 7 | list, get, insert/upsert, update, delete, bulk delete, push button |\n| **Formulas** | 2 | list, get |\n| **Controls** | 2 | list, get |\n| **Permissions** | 6 | sharing metadata, list, add, delete, search principals, ACL settings |\n| **Publishing** | 3 | list categories, publish, unpublish |\n| **Folders** | 5 | list, get, create, update, delete |\n| **Automations** | 1 | trigger automation |\n| **Analytics** | 7 | doc analytics, doc summary, page analytics, pack analytics, pack summary, formula analytics, analytics updated |\n\n<details>\n<summary>Full tool reference (click to expand)</summary>\n\n### Account\n| Tool | Description |\n|------|-------------|\n| `coda_whoami` | Get current user info |\n| `coda_resolve_browser_link` | Convert browser URL to API IDs |\n| `coda_get_mutation_status` | Check async write status |\n| `coda_rate_limit_budget` | Get remaining rate limit budget |\n\n### Docs\n| Tool | Description |\n|------|-------------|\n| `coda_list_docs` | List accessible docs |\n| `coda_get_doc` | Get doc metadata |\n| `coda_create_doc` | Create a new doc |\n| `coda_update_doc` | Update doc title/icon |\n| `coda_delete_doc` | Delete a doc |\n\n### Pages\n| Tool | Description |\n|------|-------------|\n| `coda_list_pages` | List pages in a doc |\n| `coda_get_page` | Get page metadata |\n| `coda_create_page` | Create a page |\n| `coda_update_page` | Update page name/content |\n| `coda_delete_page` | Delete a page |\n| `coda_get_page_content` | Read page content |\n| `coda_delete_page_content` | Clear page content |\n| `coda_export_page` | Export page as HTML or markdown |\n\n### Tables\n| Tool | Description |\n|------|-------------|\n| `coda_list_tables` | List tables and views |\n| `coda_get_table` | Get table metadata |\n| `coda_list_columns` | List columns in a table |\n| `coda_get_column` | Get column metadata |\n\n### Rows\n| Tool | Description |\n|------|-------------|\n| `coda_list_rows` | List and filter rows |\n| `coda_get_row` | Get a single row |\n| `coda_insert_rows` | Insert or upsert rows |\n| `coda_update_row` | Update a row |\n| `coda_delete_row` | Delete a row |\n| `coda_delete_rows` | Bulk delete rows by filter |\n| `coda_push_button` | Push a button column value |\n\n### Formulas\n| Tool | Description |\n|------|-------------|\n| `coda_list_formulas` | List named formulas |\n| `coda_get_formula` | Get formula value |\n\n### Controls\n| Tool | Description |\n|------|-------------|\n| `coda_list_controls` | List controls |\n| `coda_get_control` | Get control value |\n\n### Permissions\n| Tool | Description |\n|------|-------------|\n| `coda_get_sharing_metadata` | Get sharing config |\n| `coda_list_permissions` | List ACL entries |\n| `coda_add_permission` | Grant access |\n| `coda_delete_permission` | Revoke access |\n| `coda_search_principals` | Search users/groups |\n| `coda_get_acl_settings` | Get ACL settings |\n\n### Publishing\n| Tool | Description |\n|------|-------------|\n| `coda_list_categories` | List publishing categories |\n| `coda_publish_doc` | Publish a doc |\n| `coda_unpublish_doc` | Unpublish a doc |\n\n### Folders\n| Tool | Description |\n|------|-------------|\n| `coda_list_folders` | List folders |\n| `coda_get_folder` | Get folder details |\n| `coda_create_folder` | Create a folder |\n| `coda_update_folder` | Rename a folder |\n| `coda_delete_folder` | Delete a folder |\n\n### Automations\n| Tool | Description |\n|------|-------------|\n| `coda_trigger_automation` | Trigger an automation rule |\n\n### Analytics\n| Tool | Description |\n|------|-------------|\n| `coda_list_doc_analytics` | Doc usage metrics |\n| `coda_get_doc_analytics_summary` | Aggregated doc metrics |\n| `coda_list_page_analytics` | Page usage metrics |\n| `coda_list_pack_analytics` | Pack usage metrics |\n| `coda_get_pack_analytics_summary` | Aggregated pack metrics |\n| `coda_list_pack_formula_analytics` | Formula-level metrics |\n| `coda_get_analytics_updated` | Analytics freshness timestamp |\n\n</details>\n\n## Resources (12)\n\nThe server exposes [MCP resources](https://modelcontextprotocol.io/docs/concepts/resources) that provide ambient context without consuming tool calls.\n\n### Data Resources (live API)\n\n| URI | Name | Description |\n|-----|------|-------------|\n| `coda://docs` | Coda Docs | List of docs accessible to the current API token |\n| `coda://docs/{doc_id}/schema` | Coda Doc Schema | Table and column definitions for a doc |\n\n### Rules (static knowledge)\n\n| URI | Name | Description |\n|-----|------|-------------|\n| `resource://rules/coda-doc-structure` | Coda Doc Structure | Doc/page hierarchy, page types, naming, when to split docs vs folders |\n| `resource://rules/coda-table-design` | Coda Table Design | Column types, relations, display columns, row limits, table vs view |\n| `resource://rules/coda-permissions` | Coda Permission Model | Doc-level vs page-level locking, ACL, domain sharing, principal types |\n| `resource://rules/coda-automations` | Coda Automation Patterns | Webhooks, button triggers, rate limits, payload design, idempotency |\n| `resource://rules/coda-api-patterns` | Coda API Best Practices | Rate limits, pagination, async mutations, error handling, retry |\n\n### Guides (how-to)\n\n| URI | Name | Description |\n|-----|------|-------------|\n| `resource://guides/row-operations` | Row Operations Guide | Insert vs upsert, bulk ops, key columns, cell formats, delete strategies |\n| `resource://guides/page-content` | Page Content Guide | HTML vs markdown, insert modes, export workflows |\n| `resource://guides/formula-controls` | Formulas & Controls Guide | Named formulas, control types, reading values |\n| `resource://guides/publishing-analytics` | Publishing & Analytics Guide | Publishing categories, gallery settings, analytics date filtering |\n| `resource://guides/folder-organization` | Folder Organization Guide | Folder CRUD, doc-folder relationships, hierarchy, bulk organization |\n\n## Prompts (5)\n\nThe server provides [MCP prompts](https://modelcontextprotocol.io/docs/concepts/prompts) — reusable task templates that clients can invoke.\n\n| Prompt | Parameters | Description |\n|--------|-----------|-------------|\n| `analyze_doc_structure` | `doc_id` | Analyze a doc's page hierarchy, table layout, and organization |\n| `design_table_schema` | `description` | Design a table schema from a natural language description |\n| `migrate_spreadsheet` | `doc_id`, `source_format` | Guide for migrating CSV/Excel/Sheets data into Coda |\n| `setup_automation` | `doc_id`, `trigger_type` | Set up a webhook/button/time automation with error handling |\n| `audit_permissions` | `doc_id` | Audit sharing and permissions, suggest tightening |\n\n## Usage Examples\n\n### Docs & Pages\n\n```\n\"List all my Coda docs\"\n→ coda_list_docs(is_owner=True)\n\n\"Get the content of page 'Sprint Planning' in doc d1\"\n→ coda_list_pages(doc_id=\"d1\") → find page ID\n→ coda_get_page_content(doc_id=\"d1\", page_id_or_name=\"canvas-abc\")\n\n\"Create a new doc from a template\"\n→ coda_create_doc(title=\"Q1 Planning\", source_doc=\"template-doc-id\")\n```\n\n### Tables & Rows\n\n```\n\"List all tables in doc d1\"\n→ coda_list_tables(doc_id=\"d1\")\n\n\"Find rows where Status is 'Done'\"\n→ coda_list_rows(doc_id=\"d1\", table_id_or_name=\"Tasks\", query=\"Done\")\n\n\"Insert a new row into the Tasks table\"\n→ coda_insert_rows(doc_id=\"d1\", table_id_or_name=\"Tasks\", rows=[{\"cells\": [{\"column\": \"Name\", \"value\": \"New task\"}]}])\n\n\"Update a row's status\"\n→ coda_update_row(doc_id=\"d1\", table_id_or_name=\"Tasks\", row_id_or_name=\"i-abc\", row={\"cells\": [{\"column\": \"Status\", \"value\": \"In Progress\"}]})\n```\n\n### Formulas & Controls\n\n```\n\"Get the value of the TotalBudget formula\"\n→ coda_get_formula(doc_id=\"d1\", formula_id_or_name=\"TotalBudget\")\n\n\"Check the current value of the DateFilter control\"\n→ coda_get_control(doc_id=\"d1\", control_id_or_name=\"DateFilter\")\n```\n\n### Permissions & Sharing\n\n```\n\"Share a doc with a teammate\"\n→ coda_add_permission(doc_id=\"d1\", access=\"write\", principal={\"type\": \"email\", \"email\": \"alice@example.com\"})\n\n\"List who has access to a doc\"\n→ coda_list_permissions(doc_id=\"d1\")\n```\n\n## Security Considerations\n\n- **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.\n- **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.\n- **MCP tool annotations**: Each tool declares `readOnlyHint`, `destructiveHint`, and `idempotentHint` for client-side permission prompts.\n- **SSL verification**: `CODA_SSL_VERIFY=true` by default. Only disable for development against local proxies.\n- **No credential storage**: The server does not persist tokens. Credentials are read from environment variables at startup.\n\n## Rate Limits & Permissions\n\n### Rate Limits\n\nCoda 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.\n\n### Async Mutations\n\nWrite operations (insert, update, delete rows) are processed asynchronously. Tools return a `requestId` that can be checked with `coda_get_mutation_status` to confirm completion.\n\n### Required Permissions\n\n| Operation | Minimum Coda Doc Role |\n|-----------|----------------------|\n| List docs, read pages, tables, rows, formulas, controls | Viewer |\n| Read permissions, analytics | Viewer (doc owner for analytics) |\n| Create/update pages, insert/update/delete rows | Editor |\n| Create/delete docs, manage folders | Editor (or doc owner) |\n| Add/remove permissions, publish/unpublish | Doc Owner |\n| Trigger automations | Editor |\n\n### Access Control\n\n| Layer | Mechanism |\n|-------|-----------|\n| Server-level | `CODA_READ_ONLY=true` blocks all write tools |\n| MCP annotations | `readOnlyHint`, `destructiveHint`, `idempotentHint` for client-side prompts |\n| Coda token | Doc-level access enforced by Coda's sharing settings |\n\n## CLI & Transport Options\n\n```bash\n# Default: stdio transport (for MCP clients)\nuvx mcp-coda\n\n# HTTP transport (SSE or streamable-http)\nuvx mcp-coda --transport sse --host 127.0.0.1 --port 8000\nuvx mcp-coda --transport streamable-http --port 9000\n\n# CLI overrides for config\nuvx mcp-coda --coda-token your-token --read-only\n```\n\nThe server loads `.env` files from the working directory automatically via `python-dotenv`.\n\n## Related MCP Servers\n\n- [mcp-gitlab](https://github.com/vish288/mcp-gitlab) — GitLab integration (76 tools, 6 resources, 5 prompts)\n- [mcp-atlassian-extended](https://github.com/vish288/mcp-atlassian-extended) — Jira + Confluence integration (23 tools, 15 resources, 5 prompts)\n\n## Development\n\n```bash\ngit clone https://github.com/vish288/mcp-coda.git\ncd mcp-coda\nuv sync --all-extras\n\nuv run pytest --cov\nuv run ruff check .\nuv run ruff format --check .\n```\n\n## License\n\nMIT\n",
  "bytes": 15753,
  "sha": "a5d7bfc7fdb7ff12a9bda742939a5a2d362a9c61a14fefac1bc3b0f82e167c26",
  "repo_slug": "vish288/mcp-coda",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_vish288_mcp_coda_f69fa325/readme"
}