{
  "markdown": "# coda-mcp\n\n[![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/)\n[![Crates.io](https://img.shields.io/crates/v/coda-mcp.svg)](https://crates.io/crates/coda-mcp)\n[![CI](https://github.com/nkpar/coda-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/nkpar/coda-mcp/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/nkpar/coda-mcp/graph/badge.svg)](https://codecov.io/gh/nkpar/coda-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![MSRV](https://img.shields.io/badge/MSRV-1.93-orange.svg)](https://www.rust-lang.org)\n\nMCP (Model Context Protocol) server for [Coda.io](https://coda.io) API. Enables AI assistants to read and write Coda documents, tables, and rows.\n\n## Features\n\n- Full CRUD operations on Coda tables\n- Document and page content retrieval\n- Formula and control access\n- Async export workflow for canvas pages\n- Rate limit handling\n\n## Quick Start\n\n### 1. Install\n\n```bash\ncargo install coda-mcp\n```\n\n### 2. Get API Token\n\nGet your token from [coda.io/account](https://coda.io/account) → API settings.\n\n### 3. Configure Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `~/.config/claude/claude_desktop_config.json` (Linux):\n\n```json\n{\n  \"mcpServers\": {\n    \"coda\": {\n      \"command\": \"/Users/YOUR_USERNAME/.cargo/bin/coda-mcp\",\n      \"env\": {\n        \"CODA_API_TOKEN\": \"your_token_here\"\n      }\n    }\n  }\n}\n```\n\n### 4. Restart Claude Desktop\n\nThe Coda tools will now be available.\n\n## Installation\n\n### From crates.io (Recommended)\n\n```bash\ncargo install coda-mcp\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/nkpar/coda-mcp.git\ncd coda-mcp\ncargo build --release\n```\n\nBinary will be at `./target/release/coda-mcp`\n\n### Pre-built Binaries\n\nCheck the [Releases](https://github.com/nkpar/coda-mcp/releases) page.\n\n### Docker\n\nNo Rust toolchain required. Multi-arch image (amd64 + arm64), ~3MB.\n\n```bash\ndocker pull ghcr.io/nkpar/coda-mcp:latest\n```\n\n**Claude Code** (CLI):\n\n```bash\nclaude mcp add coda -e CODA_API_TOKEN=your_token_here -- docker run --rm -i -e CODA_API_TOKEN ghcr.io/nkpar/coda-mcp:latest\n```\n\n**Claude Desktop** config:\n\n```json\n{\n  \"mcpServers\": {\n    \"coda\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"--rm\", \"-i\", \"-e\", \"CODA_API_TOKEN\", \"ghcr.io/nkpar/coda-mcp:latest\"],\n      \"env\": {\n        \"CODA_API_TOKEN\": \"your_token_here\"\n      }\n    }\n  }\n}\n```\n\n### One-Click Install Script\n\nFor Claude Desktop with automatic configuration:\n\n```bash\ngit clone https://github.com/nkpar/coda-mcp.git\ncd coda-mcp\n./scripts/install.sh\n```\n\n## Configuration\n\n### 1. Get API Token\n\nGet your Coda API token from [coda.io/account](https://coda.io/account) → API settings.\n\n**Important:** For write operations (`create_doc`, `delete_doc`, `add_row`, `update_row`, `delete_row`), ensure your token has write permissions enabled. Read-only tokens will return 403 Forbidden for these operations.\n\n### 2. Configure MCP Client\n\n**Claude Desktop** (`~/.config/claude/claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"coda\": {\n      \"command\": \"/path/to/coda-mcp\",\n      \"env\": {\n        \"CODA_API_TOKEN\": \"your_token_here\"\n      }\n    }\n  }\n}\n```\n\n**Claude Code** (CLI):\n\n```bash\n# Binary\nclaude mcp add coda -e CODA_API_TOKEN=your_token_here -- $HOME/.cargo/bin/coda-mcp\n\n# Or via Docker (no Rust required)\nclaude mcp add coda -e CODA_API_TOKEN=your_token_here -- docker run --rm -i -e CODA_API_TOKEN ghcr.io/nkpar/coda-mcp:latest\n```\n\nOr via `.mcp.json` in project root:\n\n```json\n{\n  \"mcpServers\": {\n    \"coda\": {\n      \"command\": \"/path/to/coda-mcp\",\n      \"env\": {\n        \"CODA_API_TOKEN\": \"your_token_here\"\n      }\n    }\n  }\n}\n```\n\n### Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `CODA_API_TOKEN` | Yes | Your Coda API token |\n| `CODA_BASE_URL` | No | API base URL (default: `https://coda.io/apis/v1`) |\n| `RUST_LOG` | No | Log level: `error`, `warn`, `info`, `debug`, `trace` |\n\n## Tools\n\n| Tool | Description |\n|------|-------------|\n| `list_docs` | List available documents |\n| `get_doc` | Get document details |\n| `search_docs` | Search documents by name |\n| `create_doc` | Create a new document (optional: folder, template, timezone) |\n| `delete_doc` | Delete a document (permanent) |\n| `list_pages` | List pages in a document |\n| `get_page` | Get page content (HTML) |\n| `list_tables` | List tables in a document |\n| `get_table` | Get table details |\n| `list_columns` | List columns in a table |\n| `get_rows` | Get rows with optional filtering |\n| `get_row` | Get a specific row |\n| `add_row` | Add a new row |\n| `update_row` | Update an existing row |\n| `delete_row` | Delete a row |\n| `list_formulas` | List named formulas |\n| `get_formula` | Get formula value |\n| `list_controls` | List controls (buttons, sliders) |\n\n## Usage Examples\n\n```\n# List all documents\nlist_docs\n\n# Create a new document\ncreate_doc title=\"My New Doc\"\n\n# Create from template in specific folder\ncreate_doc title=\"Project Plan\" folder_id=\"fl-abc\" source_doc=\"template-xyz\"\n\n# Delete a document (permanent!)\ndelete_doc doc_id=\"AbCdEfGh\"\n\n# Get rows from a table\nget_rows doc_id=\"AbCdEfGh\" table_id=\"grid-xyz\" limit=50\n\n# Filter rows\nget_rows doc_id=\"AbCdEfGh\" table_id=\"grid-xyz\" query=\"Status:Active\"\n\n# Add a row\nadd_row doc_id=\"AbCdEfGh\" table_id=\"grid-xyz\" cells={\"Name\": \"John\", \"Email\": \"john@example.com\"}\n\n# Get page content\nget_page doc_id=\"AbCdEfGh\" page_id=\"canvas-xyz\"\n```\n\n## Rate Limits\n\nCoda API has rate limits:\n- **Reading**: 100 requests per 6 seconds\n- **Writing**: 10 requests per 6 seconds\n\nWrite operations return HTTP 202 (queued). Changes may take a few seconds to appear.\n\n## Security\n\n- API tokens are redacted from all log output\n- Download URLs validated against trusted hosts only (coda.io, codahosted.io, storage.googleapis.com)\n- Request limits capped at 1000 to prevent resource exhaustion\n- Install script uses silent input for tokens and sets restrictive file permissions (600)\n\n## Development\n\n```bash\n# Build\ncargo build --release\n\n# Run unit & integration tests\ncargo test\n\n# Run E2E tests (requires write-enabled API token)\nexport $(cat .env | xargs) && cargo test --test e2e_tests -- --ignored\n\n# Run with debug logging\nRUST_LOG=debug cargo run\n\n# Format & lint\ncargo fmt && cargo clippy\n```\n\nSee [DEVELOPER.md](DEVELOPER.md) for API details and [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.\n\n## License\n\nMIT License. See [LICENSE](LICENSE) for details.\n",
  "bytes": 6593,
  "sha": "1097b044153b8f25f3217b55d81d9ccde686a4f97a8984a73613aec4edb43d89",
  "repo_slug": "nkpar/coda-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_nkpar_coda_80fc9204/readme"
}