Skip to main content
Glama

mcp-coda

PyPI version PyPI downloads Python License: MIT CI MCP Registry

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

uvx mcp-coda                          # with writes
MCP_READ_ONLY=true uvx mcp-coda       # locked read-only: write tools are not listed

mcp-coda is a Model Context Protocol (MCP) server for Coda. It lets an AI assistant read and write Coda docs, pages, tables, and rows through the Coda API. It also runs formulas, manages permissions and folders, publishes docs, and triggers automations. The server exposes 54 tools, 12 resources, and 5 prompts. It supports the MCP 2026-07-28 specification (often called MCP 2.0) and stays compatible with 2025-11-25 clients. It works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client. Runs in one of two modes: with writes, or locked read-only (MCP_READ_ONLY=true) so the 20 write tools are never offered to the model.

mcp-coda uses FastMCP, httpx, and Pydantic.

1-Click Installation

Install in Cursor

Install in VS Code Install in VS Code Insiders

Tip: For other AI assistants (Claude Code, Windsurf, IntelliJ, Gemini CLI), visit the Coda MCP Installation Gateway.

Prerequisite: Install uv first (required for all uvx install flows). Install uv.

Claude Code

# with writes
claude mcp add coda -e CODA_API_TOKEN=your-token-here -- uvx mcp-coda
# locked read-only
claude mcp add coda -e MCP_READ_ONLY=true -e CODA_API_TOKEN=your-token-here -- 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. Remove MCP_READ_ONLY to allow writes.

{
  "mcpServers": {
    "coda": {
      "command": "uvx",
      "args": ["mcp-coda"],
      "env": {
        "CODA_API_TOKEN": "your-token-here",
        "MCP_READ_ONLY": "true"
      }
    }
  }
}

Gemini CLI

# with writes
gemini mcp add -s user -e CODA_API_TOKEN=your-token-here coda uvx mcp-coda
# locked read-only
gemini mcp add -s user -e MCP_READ_ONLY=true -e CODA_API_TOKEN=your-token-here coda uvx mcp-coda

VS Code

Add to .vscode/mcp.json:

{
  "servers": {
    "coda": {
      "type": "stdio",
      "command": "uvx",
      "args": ["mcp-coda"],
      "env": { "CODA_API_TOKEN": "your-token-here", "MCP_READ_ONLY": "true" }
    }
  }
}

Codex

# with writes
codex mcp add coda --env CODA_API_TOKEN=your-token-here -- uvx mcp-coda
# locked read-only
codex mcp add coda --env MCP_READ_ONLY=true --env CODA_API_TOKEN=your-token-here -- uvx mcp-coda

pip / uv

uv pip install mcp-coda

Drop MCP_READ_ONLY to allow writes. On a shared or hosted server put it in the deployer's env, not the client config.

Related MCP server: Coda MCP Server

Configuration

Variable

Required

Default

Description

CODA_API_TOKEN

Yes

-

Coda API token (get one here)

MCP_READ_ONLY

No

false

Shared name across the mcp-* servers. Any value other than false/0/no/off/empty locks the server read-only: the 20 write tools and write-workflow prompts are not listed, and nothing can turn it back off at runtime

CODA_READ_ONLY

No

false

Per-server alias for MCP_READ_ONLY; either one locks the server read-only. --read-only can only raise the lock

CODA_BASE_URL

No

https://coda.io/apis/v1

API base URL

CODA_TIMEOUT

No

30

Request timeout in seconds

CODA_HTTP_BEARER_TOKEN

No

-

Required to bind an HTTP transport to a non-loopback host. Clients send Authorization: Bearer <token>. Minimum 16 characters

Supported Token Types

The server checks these environment variables in order — first match wins:

  1. CODA_API_TOKEN

  2. CODA_TOKEN

  3. CODA_PAT

Generate tokens at coda.io/account#apiSettings. Tokens grant access to all docs accessible by the token owner. Tokens have no scope restrictions. Coda's sharing settings control doc-level access.

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

Protocol support

mcp-coda implements the Model Context Protocol 2026-07-28 specification, often called MCP 2.0. It also stays compatible with 2025-11-25 clients. A FastMCP client pinned to 2026-07-28 and a legacy client both list all tools and reach the Coda API over stdio. The companion code PR adds a regression test that checks tools/list with an in-memory client pinned to 2026-07-28.

  • Spec version: MCP 2026-07-28 (MCP 2.0), backward compatible with 2025-11-25.

  • Built on: FastMCP 4.x and the MCP Python SDK 2.x.

  • Transports: stdio (default) and streamable-http (recommended for remote). sse (HTTP+SSE) still works, but the 2026-07-28 specification deprecates it, so the server prints a warning.

  • Capabilities: tools, resources, and prompts. The server uses no Roots, Sampling, Logging, elicitation, or resource subscriptions, so the 2026-07-28 deprecations do not affect it.

Error results

An expected failure — a 404, a 401, a rate limit, or a write that reaches the read-only guard — comes back as a tool result with isError: true rather than a value the caller must inspect for an error key. (In locked read-only mode the write tools are hidden, so calling one returns an Unknown tool error; the error envelope below is the guard's own response, returned only when a client reaches a write tool anyway.) The result body is the text content: a JSON object with error, an actionable hint, and, where relevant, status_code, body, and retry_after. The result carries no structuredContent — the TypeScript MCP SDK validates structuredContent against the tool's output schema even when isError is true, so an error payload there would make strict clients reject the whole result. Unexpected exceptions (a bug in a tool) are also isError: true, their text is TypeName: message, and the server logs them with a traceback.

A successful result carries the Coda JSON object as structuredContent beside the pretty-printed text, and tools advertise no outputSchema: payloads pass the upstream fields through untyped, so strict clients validate nothing and receive the object directly rather than a double-encoded {"result": "<json>"} wrapper. A typed schema is opt-in per tool via @mcp.tool(output_schema=…).

Tools (54)

Category

Count

Tools

Account

3

whoami, resolve browser link, mutation status

Docs

5

list, get, create, update, delete

Pages

9

list, get, create, update, delete, get content, delete content, export, export status

Tables

4

list tables, get table, list columns, get column

Rows

7

list, get, insert/upsert, update, delete, bulk delete, push button

Permissions

6

sharing metadata, list, add, delete, search principals, ACL settings

Folders

5

list, get, create, update, delete

Misc

8

formulas (list, get), controls (list, get), publishing (list categories, publish, unpublish), trigger automation

Analytics

7

doc analytics, doc summary, page analytics, pack analytics, pack summary, formula analytics, analytics updated

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

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

coda_get_export_status

Poll an export started by coda_export_page

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 and do not consume 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_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 MCP_READ_ONLY=true (or CODA_READ_ONLY=true) in the launch you control and the server starts locked: the 20 write tools and the write-workflow prompts are not listed, a call to one returns "Unknown tool", and the guard refuses any write that still reaches it. Nothing lifts the lock at runtime — not a false from another source, not a .env file, not tool arguments; any value other than false/0/no/off/empty locks, and --read-only can only raise it. The lock is only as strong as the launch: set it where users cannot edit it (a managed MCP config such as Claude Code managed-mcp.json, a container, k8s or systemd env, or a hosted HTTP deployment). A user who starts the server themselves controls its environment. A Coda token has no scopes, so this lock is the only read-only control.

  • MCP tool annotations: Each tool declares readOnlyHint, destructiveHint, and idempotentHint for client-side permission prompts.

  • No credential storage: The server does not persist tokens. It reads credentials from environment variables at startup.

  • HTTP transport auth: Host/Origin protection is not authentication. Binding an HTTP transport to a non-loopback host requires CODA_HTTP_BEARER_TOKEN (min 16 chars); clients send Authorization: Bearer <token> and anything else gets a 401. Without it the server refuses to start on a non-loopback host.

Upgrading to 0.9.0

Two defaults changed. Both are breaking for callers that relied on the old behaviour:

  • coda_publish_doc no longer lists docs in the public gallery by default. discoverable now defaults to False — publishing alone makes a doc reachable by URL; pass discoverable=True to list it in the Coda gallery. mode is now restricted to view, play, or edit.

  • An HTTP transport on a non-loopback host now requires a bearer token. uvx mcp-coda --transport streamable-http --host 0.0.0.0 (or any non-loopback host) exits with an error unless CODA_HTTP_BEARER_TOKEN (min 16 chars) is set; clients then send Authorization: Bearer <token>. Binding to 127.0.0.1 is unchanged.

Rate Limits & Permissions

Rate Limits

Coda enforces per-token rate limits (varies by plan). When Coda rate-limits a request, the tool returns a 429 error with retry_after seconds. The client retries a 429 once when its Retry-After is ≤ 5s (GET only, with jitter, also covering 502/503/504); otherwise it surfaces retry_after without retrying — wait that many seconds, then retry. Writes are never retried. Most paginated endpoints default to 50 results per page (coda_list_docs 25, coda_list_columns 100). Use limit to adjust.

Async Mutations

Coda processes write operations (insert, update, delete rows) asynchronously. Tools return a requestId. Check it 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 / MCP_READ_ONLY=true hides every write tool (deployer-owned launch required)

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

# Binding to a non-loopback host requires a bearer token
CODA_HTTP_BEARER_TOKEN=$(openssl rand -hex 32) \
  uvx mcp-coda --transport streamable-http --host 0.0.0.0 --port 9000
# Clients authenticate with the token:
#   curl -H "Authorization: Bearer $CODA_HTTP_BEARER_TOKEN" http://host:9000/mcp

# Config comes from env vars
CODA_API_TOKEN=your-token uvx mcp-coda --read-only

--coda-token still works but is deprecated and hidden from --help: it exposes the token to ps and shell history. Use CODA_API_TOKEN.

The server loads .env files from the working directory automatically via python-dotenv.

Docker

The image is a minimal, non-root python:3.13-slim build. The image defaults to locked read-only (MCP_READ_ONLY=true); pass -e MCP_READ_ONLY=false to allow writes.

docker build -t mcp-coda .

# stdio (default), locked read-only
docker run -i --rm -e CODA_API_TOKEN=your-token mcp-coda

# HTTP transport on a non-loopback host requires a bearer token (min 16 chars);
# clients then send Authorization: Bearer <token>
BEARER=$(openssl rand -hex 32)
docker run --rm -p 9000:9000 \
  -e CODA_API_TOKEN=your-token \
  -e CODA_HTTP_BEARER_TOKEN="$BEARER" \
  mcp-coda --transport streamable-http --host 0.0.0.0 --port 9000

FAQ

Does mcp-coda support MCP 2.0 (the 2026-07-28 spec)?

Yes. mcp-coda implements the MCP 2026-07-28 specification, commonly called MCP 2.0. It also works with 2025-11-25 clients.

Which transports does mcp-coda support?

The server supports stdio (the default) and streamable-http. It also supports sse, but the 2026-07-28 specification deprecates it. Prefer streamable-http for remote connections.

Can I run mcp-coda read-only so the assistant cannot change anything?

Yes. Start it with MCP_READ_ONLY=true (or CODA_READ_ONLY=true). The 20 write tools and the write-workflow prompts are then not listed at all, so the model never sees them; a call to one returns "Unknown tool", and nothing can turn writes back on while the process runs. Set it in a launch you control — a managed MCP config, a container or systemd env, or a hosted deployment — because a user who starts the server themselves can start it without the variable. A Coda token has no scopes, so this lock is the only read-only control.

What token scopes does mcp-coda need?

Coda tokens have no scopes. A token reaches every doc its owner can reach. Coda's sharing settings control doc-level access. Use a dedicated service account to limit exposure.

Does mcp-coda work with self-hosted Coda?

Coda is a hosted service, so there is no self-hosted deployment. Set CODA_BASE_URL only to target a proxy or a non-default API base.

Which clients work with mcp-coda?

mcp-coda works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client over stdio or HTTP.

How many tools, resources, and prompts does it provide?

mcp-coda provides 54 tools, 12 resources, and 5 prompts. They cover docs, pages, tables, rows, formulas, controls, permissions, folders, publishing, automations, and analytics.

  • mcp-gitlab — GitLab integration (83 tools, 7 resources, 6 prompts)

  • mcp-atlassian-extended — Jira + Confluence integration (22 tools, 15 resources, 5 prompts)

  • mcp-argocd — Argo CD integration (37 tools, 7 resources, 7 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

Available Tools

54 tools
coda_add_permissionCoda Add PermissionA

Add a permission entry to a Coda doc.

Grants access to a user by email or to an entire domain. Specify either principal_email or principal_domain (not both). The access level controls what the principal can do: readonly, write, comment, or none (removes implicit access). Returns the created permission entry.

NameRequiredDescriptionDefault
accessYesAccess level to grant
doc_idYesThe doc ID to add permission to
principal_emailNoEmail address of the user to grant access to
principal_domainNoDomain to grant access to (e.g. 'example.com')
suppress_notificationNoIf True, don't send an email notification

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false and openWorldHint=true, so the description carries most of the burden and does add real context: it discloses the side effect that access 'none' removes existing implicit access rather than merely setting a level, and that a permission entry is returned. It omits auth/permission prerequisites (who may grant access) and the default notification behavior is left to the schema, so it is strong but not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action, then constraints, then enum semantics, then the return value. No sentence is filler and none restates the schema verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, explaining that the created permission entry is returned is the right call, and the mutation's side effects are covered. Missing only operational context an agent might want — required permission level to grant access and whether notifications fire by default (implied only through the schema).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description genuinely adds meaning the schema does not: it declares principal_email and principal_domain mutually exclusive, and it glosses the 'none' enum value as removing implicit access. That is value beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a permission entry to a Coda doc') and immediately scopes what the operation does — grants access to a user or domain. This is clearly distinguishable from sibling tools like coda_list_permissions and coda_delete_permission without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the operative selection rule for the two principal parameters — 'Specify either principal_email or principal_domain (not both)' — which is genuine when-to-use guidance. It does not explicitly route the agent away from siblings (e.g. use coda_delete_permission to revoke, coda_search_principals to find a user first), so it stops short of full alternative coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_create_docCoda Create DocA

Create a new Coda doc.

Creates a blank doc or a copy of an existing doc. Returns the new doc's ID, name, and browser URL. The doc is created in the specified folder, or the user's root if no folder is given. Use source_doc to clone an existing doc as a template.

NameRequiredDescriptionDefault
titleYesTitle for the new doc
folder_idNoFolder ID to create the doc in (omit for root)
source_docNoDoc ID to copy as a starting point

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a write operation (readOnlyHint=false, openWorldHint=true); the description adds value beyond them by stating the return payload (doc ID, name, browser URL), the default destination when folder_id is omitted, and the cloning behavior. It omits permission/auth requirements and any rate limits, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action before the modes and defaults. Slight redundancy between the opening two sentences ('Create a new Coda doc' / 'Creates a blank doc or a copy'), but no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no output schema, the description covers the essentials: what is created, the two creation modes, destination defaults, and what is returned. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented. The description's 'omit for root' and 'clone as a template' framings largely restate the schema wording rather than adding new syntax or constraints. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create a new Coda doc) and clarifies the two modes (blank vs. clone from source_doc). An agent can distinguish this from coda_create_page, coda_create_folder, and coda_update_doc without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when to use source_doc (cloning an existing doc as a template) and where the doc lands (specified folder, else user root). No explicit when-not guidance or sibling routing (e.g., 'if you want a page, use coda_create_page'), but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_create_folderCoda Create FolderB

Create a new folder in a Coda workspace.

Creates a folder in the specified workspace. Returns the new folder's ID and metadata. Use the folder ID when creating docs with coda_create_doc to organize them.

NameRequiredDescriptionDefault
nameYesName for the new folder
descriptionNoDescription for the folder
workspace_idYesWorkspace ID where the folder will be created

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and openWorldHint=true, so the mutating nature is covered. The description adds useful output context ('Returns the new folder's ID and metadata') in the absence of an output schema, but discloses nothing about permissions, workspace requirements, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening two sentences are largely redundant — 'Create a new folder in a Coda workspace' and 'Creates a folder in the specified workspace' restate the same fact. The return-value and usage notes earn their place, but the overlap wastes space and blurs the front-loading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, fully-documented create tool, the description covers purpose, the returned value, and a follow-up usage path, which is enough to invoke it correctly. Missing only edge-case behavior (naming conflicts, permission requirements), which is minor at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents name, description, and workspace_id. The description adds no syntax, format, or constraint details beyond what the schema already provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Create a new folder in a Coda workspace') that clearly distinguishes it from the list/get/update/delete folder siblings. It also names coda_create_doc as the downstream consumer of the returned folder ID. It stops short of explicitly contrasting its scope against siblings beyond that link.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives workflow context ('Use the folder ID when creating docs with coda_create_doc to organize them'), which implies when the tool fits into a broader flow. However, it offers no explicit when-to-use/when-not guidance, prerequisites, or comparison to alternatives like update_folder or delete_folder.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_create_pageCoda Create PageA

Create a new page in a Coda doc.

Creates a page with optional initial content. Returns the new page's ID and metadata. The page is created at the top level unless parent_page_id is specified. Content can be HTML or markdown — specify the format via content_format. Pack formulas cannot be inserted via the API.

NameRequiredDescriptionDefault
nameYesName/title for the new page
doc_idYesThe doc ID to create the page in
contentNoInitial page content in HTML or markdown
subtitleNoSubtitle text for the page
content_formatNoFormat of the content parameter
parent_page_idNoParent page ID to nest under (omit for top-level)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the mutation profile (readOnlyHint=false, openWorldHint=true), so the bar is lower. The description still adds real behavioral context: default top-level placement, the returned ID/metadata, and the notable constraint that pack formulas cannot be inserted via the API. Auth/permission requirements are not stated, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the primary action, and every sentence carries distinct information (purpose, return value, nesting default, format control, limitation). No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description helpfully states what is returned (ID and metadata), and it covers formats, nesting, and a key API limitation. It does not mention permissions or failure modes, but for a create tool against rich annotations and a fully documented schema, it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds relational semantics the per-parameter schema does not: parent_page_id defaults to top-level nesting, and content format is controlled jointly by content and content_format. That interplay is genuinely useful beyond the individual field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new page in a Coda doc') and is immediately distinguishable from siblings like coda_update_page, coda_get_page, and coda_create_doc. An agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The create intent is self-evident, and it implies usage context (nesting via parent_page_id, format via content_format). However, it names no alternatives and gives no explicit when-to-use/when-not guidance against siblings such as coda_update_page or coda_create_doc.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_docCoda Delete DocA
Destructive

Permanently delete a Coda doc.

This is irreversible — the doc and all its pages, tables, and data will be permanently removed. Verify the doc name with coda_get_doc before calling this. Returns a confirmation status.

NameRequiredDescriptionDefault
doc_idYesThe ID of the doc to delete

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine value beyond that: it spells out the blast radius (pages, tables, data), confirms irreversibility, and notes a confirmation status is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: action, warning/blast radius, precondition. The irreversible warning is front-loaded where it matters most.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an irreversible single-parameter mutation, the description covers the action, the consequence, the safe pre-check, and the return shape. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single well-documented doc_id parameter. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently delete a Coda doc'), which is clearly distinct from sibling page/row/folder delete tools. The adverb 'Permanently' immediately scopes the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition — verify the doc name with coda_get_doc before calling — which routes the agent through a safe read step. It does not name when *not* to use it versus other delete siblings, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_folderCoda Delete FolderA
Destructive

Delete a folder from the Coda workspace. Returns confirmation with folder_id.

Permanently removes the folder. Docs inside the folder may be moved to the root level or deleted depending on Coda's behavior. Verify the folder with coda_get_folder before deleting.

NameRequiredDescriptionDefault
folder_idYesThe folder ID to delete

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true and openWorld=true, so the mutation profile is covered; the description still earns credit by disclosing the cascading side effect that annotations cannot express — child docs "may be moved to the root level or deleted depending on Coda's behavior." The honest admission of uncertainty is useful, though it does not resolve what actually happens to the contents, which is exactly the risk an agent needs to price in.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then the return value, then the safeguard, then the side-effect caveat — a sensible order. "Delete a folder" and "Permanently removes the folder" restate each other slightly, but there is little waste overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with no output schema, the definition covers the action, the return payload, the recommended pre-check, and the destructive ripple effect. The only remaining gap is that the fate of contained docs is left as "depends on Coda's behavior," but the agent is at least warned of the ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single required parameter already documented as "The folder ID to delete," so the schema does the full job. The description only echoes that a folder_id comes back; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a folder from the Coda workspace") and even names the return payload ("confirmation with folder_id"). The resource "folder" cleanly separates it from the many other delete siblings (delete_doc, delete_page, delete_row, delete_permission).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent through a precondition ("Verify the folder with coda_get_folder before deleting"), which names a sibling and the condition for using it. It stops short of stating when NOT to delete or what alternatives exist for archiving/moving instead, so it is clear context rather than full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_pageCoda Delete PageA
Destructive

Permanently delete a page from a Coda doc.

This is irreversible — the page and all its content will be removed. Child pages are reparented to the deleted page's parent. Verify the page name with coda_get_page before calling this.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the page
page_id_or_nameYesPage ID or name to delete

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds genuinely new behavioral detail: the operation is irreversible, all page content is removed, and child pages are reparented to the deleted page's parent. That side-effect disclosure exceeds what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and irreversibility warning, followed by the side effect and the prerequisite. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no output schema, the description covers the action, irreversibility, side effects on child pages, and a verification step. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters (doc_id, page_id_or_name) are documented in-schema. The description adds no syntax, format, or lookup guidance for the parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently delete a page from a Coda doc'), and the detail about child-page reparenting clarifies it acts on the page node itself rather than its contents, distinguishing it from siblings like coda_delete_page_content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear pre-call prerequisite — 'Verify the page name with coda_get_page before calling this' — naming a sibling tool to use first. It does not explicitly contrast when to use page deletion vs. coda_delete_page_content (delete content but keep the page), so a 5 is not warranted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_page_contentCoda Delete Page ContentA
Destructive

Delete all content from a page, leaving it blank.

Removes the page's text content but does NOT delete the page itself. The page remains in the doc with its name and metadata intact. This is irreversible. Use coda_delete_page to remove the page entirely.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the page
page_id_or_nameYesPage ID or name to clear content from

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive and non-read-only. The description adds important behavioral context beyond the annotations: exactly what is removed (text content), what remains (page, name, metadata), and that the operation is irreversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action and its boundary. Each sentence adds useful information: scope, what is preserved, irreversibility, and the alternative tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive operation with full schema coverage, destructive annotations, and no output schema, the description supplies everything an agent needs to call it correctly and avoid confusion with page deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters are fully documented in the input schema. The description does not add syntax, format, or edge-case meaning beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: deleting all content from a page. It explicitly distinguishes the operation from deleting the page itself, so an agent can tell it apart from sibling tools like coda_delete_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly explains when to use this tool versus coda_delete_page: use this to blank a page while keeping the page, and use coda_delete_page to remove the page entirely. The alternative and its selecting condition are named explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_permissionCoda Delete PermissionA
Destructive

Remove a permission entry from a Coda doc.

Revokes the specified permission. The principal will lose access to the doc unless they have access through another permission (e.g. domain-level). Get the permission_id from coda_list_permissions first.

NameRequiredDescriptionDefault
doc_idYesThe doc ID to remove permission from
permission_idYesThe permission ID to delete (from coda_list_permissions)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=true, so safety is covered. The description adds genuinely new behavioral context, namely the caveat that the principal loses access only unless covered by another permission such as domain-level. It does not mention reversibility or auth requirements, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, action front-loaded, then effect, then caveat, then prerequisite. No repetition of the title and nothing extraneous.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with no output schema, the description covers the operation, its effect, and the prerequisite. Annotations carry the safety profile. Only minor gaps remain, such as what the response confirms after deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds real value beyond the schema by naming the source of permission_id (coda_list_permissions), which clarifies how to obtain a valid value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Remove a permission entry from a Coda doc') plus the effect ('Revokes the specified permission'). An agent can distinguish this from coda_add_permission and coda_list_permissions without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite and routing hint: 'Get the permission_id from coda_list_permissions first,' pointing at the sibling that produces the required ID. It lacks explicit when-not guidance (e.g. when to prefer changing a permission level over deleting it), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_rowCoda Delete RowA
Destructive

Delete a single row from a Coda table.

Permanently removes the row. This is irreversible. Verify the row with coda_get_row before deleting. For bulk deletion, use coda_delete_rows with a list of row IDs instead.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the table
row_id_or_nameYesRow ID or name to delete
table_id_or_nameYesTable ID or name

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is partly structured. The description still adds real behavioral value by spelling out that removal is permanent and irreversible, plus the recommended verify-before-delete workflow. It stops short of noting auth/permission requirements or what happens to row references, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then consequence, then the safety workflow and escape hatch to the bulk sibling. No padding or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive single-row delete with fully documented params and annotation coverage, the description closes the important gaps: irreversibility, verification prerequisite, and the bulk alternative. Nothing an agent needs to invoke it safely is missing, and no output schema is expected for a delete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with all three required parameters documented (doc_id, table_id_or_name, row_id_or_name), so the baseline is 3. The description adds no syntax, format, or name-vs-ID nuance beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a single row from a Coda table') and explicitly scopes it to ONE row, which is exactly what distinguishes it from the sibling coda_delete_rows. An agent can pick between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative explicitly ('For bulk deletion, use coda_delete_rows with a list of row IDs instead') and adds a pre-flight verification step with coda_get_row. Both when-to-use and when-not-to-use are covered with concrete conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_delete_rowsCoda Delete RowsA
Destructive

Delete multiple rows from a Coda table in a single call.

Permanently removes all specified rows. This is irreversible. List the rows first with coda_list_rows to get their IDs. Returns a requestId for async mutation tracking. Prefer this over calling coda_delete_row in a loop for better performance and rate limit efficiency.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the table
row_idsYesList of row IDs to delete
table_id_or_nameYesTable ID or name

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the safety profile is partly covered, but the description adds genuinely new context: irreversibility ('Permanently removes all specified rows. This is irreversible') and the async contract ('Returns a requestId for async mutation tracking'). It stops short of naming required permissions or whether partial failures roll back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the destructive scope, then prerequisite, return behavior, and the alternative. Every sentence carries distinct information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly supplies the return value (requestId for async tracking), the prerequisite lookup, the irreversibility warning, and the sibling preference. An agent has everything needed to call and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds only one piece of parameter meaning — that row_ids values come from coda_list_rows — and says nothing about doc_id or table_id_or_name formats, so it does not exceed the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource with an explicit batch scope ('Delete multiple rows from a Coda table in a single call'), which immediately separates it from the singular coda_delete_row sibling. An agent can select correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite ('List the rows first with coda_list_rows to get their IDs') and an explicit alternative with the condition that selects it ('Prefer this over calling coda_delete_row in a loop for better performance and rate limit efficiency'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_export_pageCoda Export PageA
Read-only

Export a page's content, initiating an async export if needed.

Starts an export job and returns the export status. For small pages, the content may be returned immediately. For large pages, call coda_get_export_status with the returned id. Prefer coda_get_page_content for quick reads — use this only when you need a full export with embedded images resolved.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the page
output_formatNoExport formatmarkdown
page_id_or_nameYesPage ID or name to export

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, so the description must carry the operational detail — and it does, disclosing the async job semantics, that small pages may return content inline, and that large pages yield an id requiring a status poll. It stops short of discussing export quotas, latency, or whether repeated exports are deduplicated, keeping it just below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs, front-loaded with the operation and its async nature, then the polling path, then the routing advice as a closing preference. Every sentence carries distinct information with no restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description explains what comes back in both branches (immediate content vs. an id for polling) and names the sibling that consumes that id. Combined with the schema's full parameter coverage, an agent has everything needed to call this tool and handle its result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all three parameters (doc_id, page_id_or_name, output_format) are documented in the schema itself, so the baseline of 3 applies. The description hints at format relevance via 'embedded images resolved' but adds no format syntax, defaults, or page-name resolution rules beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Export a page's content, initiating an async export if needed.' It immediately differentiates itself from the closest sibling by framing the operation as a heavier full export rather than a quick read, so an agent can distinguish it from coda_get_page_content without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Prefer coda_get_page_content for quick reads — use this only when you need a full export with embedded images resolved.' It also names the follow-up tool, coda_get_export_status, and states the condition that triggers it (large pages), giving when-to-use, when-not-to-use, and the alternative in a single paragraph.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_acl_settingsCoda Get Acl SettingsA
Read-onlyIdempotent

Get the ACL settings for a Coda doc.

Returns doc-level access control settings such as whether the doc allows copying, whether editors can change permissions, and the default access mode. These are administrative settings, not individual permission entries.

NameRequiredDescriptionDefault
doc_idYesThe doc ID to get ACL settings for

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds meaningful context beyond that: it enumerates what the settings actually contain (copying allowed, editor permission changes, default access mode), which gives the agent a concrete sense of the payload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The response is compact and front-loaded: the purpose sentence leads, followed by a scope-clarifying sentence. Both sentences carry information and there is no filler, though the second sentence is slightly verbose for the value it adds.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming representative fields returned in the settings, so an agent knows roughly what to expect. For a one-parameter read tool this is nearly complete, with only the comparison to sharing metadata left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage, so the schema fully documents doc_id. The description adds no additional format or acquisition detail for the parameter, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the ACL settings for a Coda doc') and clarifies the scope is administrative doc-level settings rather than individual permission entries, which routes the agent away from coda_list_permissions. It does not explicitly distinguish itself from the close sibling coda_get_sharing_metadata, leaving some ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by contrasting administrative settings with permission entries, giving a degree of implicit guidance. However, it never states when to choose this tool over coda_get_sharing_metadata or coda_list_permissions, and offers no prerequisites or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_analytics_updatedCoda Get Analytics UpdatedA
Read-onlyIdempotent

Get the timestamp of when analytics data was last updated.

Returns a timestamp indicating the freshness of analytics data. Analytics are not real-time — they are typically updated every few hours. Check this before relying on analytics data for time-sensitive decisions.

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so the safety profile is covered. The description adds genuinely useful context beyond that: analytics are not real-time and refresh every few hours. With no output schema, stating 'Returns a timestamp' is a helpful disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action. Minor redundancy: 'Get the timestamp of when analytics data was last updated' and 'Returns a timestamp indicating the freshness' say nearly the same thing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description covers what it returns (a timestamp) and why it matters (freshness before time-sensitive decisions). Adequate; only the lack of explicit sibling routing keeps it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and it correctly stays silent on inputs. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get the timestamp of when analytics data was last updated.' The purpose is self-evidently distinct from the analytics-listing siblings (coda_list_doc_analytics, coda_get_pack_analytics_summary), but the description never names or contrasts those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: 'Check this before relying on analytics data for time-sensitive decisions.' This tells the agent when the tool is worthwhile, though it names no alternative and states no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_columnCoda Get ColumnA
Read-onlyIdempotent

Get metadata for a single column in a Coda table.

Returns the column's name, ID, type, format, and configuration details. Use this to check a specific column's type before writing data to it. For the full column schema, use coda_list_columns instead.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the table
table_id_or_nameYesTable ID or name
column_id_or_nameYesColumn ID or name

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safe-read profile is covered structurally. The description adds value beyond that by enumerating the returned fields (name, ID, type, format, configuration), which matters given there is no output schema. It stops short of noting failure behavior for a missing column, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each earning its place: purpose, return contents, primary use case, and the alternative. Purpose is front-loaded and nothing is padded or repeated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by listing the returned fields, and annotations carry the safety/idempotency profile. Parameters are fully covered by the schema, so nothing an agent needs to call this read tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (doc_id, table_id_or_name, column_id_or_name) are already documented in the schema. The description only implies that column_id_or_name identifies "a single column" and adds no new naming/format semantics beyond what structured data provides, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get metadata for a single column") and immediately scopes it to one column versus the whole table. It explicitly distinguishes itself from the sibling coda_list_columns, so an agent can select between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use case ("check a specific column's type before writing data to it") and names the alternative tool plus the condition that selects it ("For the full column schema, use coda_list_columns instead"). When-to-use and when-to-use-something-else are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_controlCoda Get ControlA
Read-onlyIdempotent

Get the current value of a control in a Coda doc.

Returns the control's name, ID, type, and current value. Controls include sliders, select lists, date pickers, text inputs, and buttons. The value reflects the current user-facing state. Use coda_list_controls to discover available controls.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the control
control_id_or_nameYesControl ID or name

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so safety is covered. The description adds value beyond that by disclosing the returned fields (name, ID, type, value), the control types covered, and that the value reflects current user-facing state — all useful since no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a compact list of returned fields and a routing hint. Slight redundancy between the returned-fields sentence and 'the value reflects the current user-facing state,' but no significant waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read with no output schema, the description covers purpose, return fields, and the discovery path adequately. It omits only minor edge-case behavior such as what happens when a control is not found, which keeps it short of a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both doc_id and control_id_or_name are already documented in the schema. The description adds no syntax or format guidance beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the current value of a control in a Coda doc') and enumerates what a control is, so the agent can distinguish it from sibling tools like coda_list_controls or coda_push_button. The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes discovery to 'coda_list_controls' and clarifies that the returned value is the current user-facing state. It gives clear context for when this tool applies, though it does not state when-not to use it (e.g., for button-press side effects, see coda_push_button).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_docCoda Get DocA
Read-onlyIdempotent

Get metadata for a single Coda doc by ID.

Returns name, owner email, folder, created/updated timestamps, and doc size. Does NOT return page content or table data — use coda_list_pages or coda_list_tables for those. The doc_id can be obtained from coda_list_docs or coda_resolve_browser_link.

NameRequiredDescriptionDefault
doc_idYesThe ID of the doc (from coda_list_docs or coda_resolve_browser_link)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds real behavioral value by enumerating exactly what comes back (name, owner email, folder, timestamps, doc size) and what does not, which is the main ambiguity for a metadata getter. It omits auth/permission requirements, but for a read-only call that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, followed by return contents and then exclusions/alternatives. It is tight overall, with only slight redundancy in repeating the doc_id provenance that the schema already carries.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by listing the returned fields and explicitly bounding the scope. Combined with the annotation-declared safety profile and the 100%-documented single parameter, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema description already documents the single doc_id parameter, including its source. The description restates the same sourcing guidance, adding no format or constraint detail beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get metadata for a single Coda doc by ID') and immediately distinguishes itself from the content-oriented siblings by naming coda_list_pages and coda_list_tables. An agent can select this over the many other coda_get_* tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit negative scope ('Does NOT return page content or table data') plus the named alternatives for that case, and tells the agent where the required doc_id comes from (coda_list_docs or coda_resolve_browser_link). Nothing about when-to-use is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_doc_analytics_summaryCoda Get Doc Analytics SummaryA
Read-onlyIdempotent

Get aggregated analytics summary across all docs.

Returns total views, unique viewers, copies, and other metrics summed across all accessible docs. Use this for a high-level overview — use coda_list_doc_analytics for per-doc breakdown.

NameRequiredDescriptionDefault
since_dateNoStart date for analytics (ISO 8601)
until_dateNoEnd date for analytics (ISO 8601)
is_publishedNoFilter to published (True) or unpublished (False) docs

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety and repeatability are covered. The description still adds value by disclosing that results are summed rather than listed and that scope is limited to 'all accessible docs', which explains why counts may differ from a naive total. It does not mention rate limits or caching, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads what is returned, the second routes to the alternative. No redundancy, no filler, and the aggregation semantics precede the disambiguation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only aggregation tool with no output schema, the description usefully previews the returned metrics and clarifies scope and the sibling relationship. It is largely complete; only minor details such as default date-range behavior or response shape are left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all three filters (since_date, until_date, is_published) are documented with format and semantics in the schema itself. The description adds no further parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get aggregated analytics summary') with an explicit scope, 'across all docs', that separates it from the per-doc scoped siblings. It also enumerates the metric categories returned (views, unique viewers, copies), so an agent knows what the tool produces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names an alternative tool, coda_list_doc_analytics, and the exact condition that selects it ('per-doc breakdown' vs 'high-level overview'). The when-to-use decision is fully resolved in the text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_export_statusCoda Get Export StatusA
Read-onlyIdempotent

Check a page export started by coda_export_page.

Pass the id from coda_export_page as request_id. status is inProgress, failed or complete. When complete, downloadLink holds the exported file; the link expires after a short time — call this tool again for a fresh one. When failed, error says why. Poll every 2 s for up to 30 s (same cadence as coda_get_mutation_status). The request itself expires: 404/410 means start a new export.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the page
request_idYesExport request ID returned by coda_export_page
page_id_or_nameYesPage ID or name that was exported

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover safety (readOnly, idempotent, openWorld); the description adds substantial behavior beyond that: the terminal states inProgress/failed/complete, that downloadLink expires and must be re-fetched, that error explains failures, and that the request itself expires. This is exactly the added context annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the request_id mapping, then the state machine, then the expiry caveat. Every sentence carries operational information; nothing is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly documents the returned fields (status, downloadLink, error) and their lifecycle. Combined with the polling and expiry guidance, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value the schema cannot: it clarifies the naming mismatch that the `id` returned by coda_export_page must be passed as request_id. That resolves a genuine ambiguity for the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Check a page export') and immediately anchors it to the sibling that creates the request ('started by coda_export_page'). An agent can distinguish this from the other ~50 coda_* tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly defines when to call (after coda_export_page), the polling policy (every 2 s up to 30 s), the same cadence as coda_get_mutation_status, and the recovery path when 404/410 is returned (start a new export). Both when-to-use and failure handling are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_folderCoda Get FolderA
Read-onlyIdempotent

Get metadata for a single folder.

Returns the folder's name, ID, parent folder, and child items. Use coda_list_folders to discover available folders first.

NameRequiredDescriptionDefault
folder_idYesThe folder ID to get details for

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety is covered. The description adds value by enumerating the return fields (name, ID, parent folder, child items), which is important since there is no output schema. It does not cover error behavior or permission requirements, but the annotations carry the main behavioral burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences that are front-loaded with the core purpose, followed by return values and a routing hint. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-resource getter with full schema coverage and annotations covering safety, the description is complete: it explains what is returned, and how to discover folder IDs. No output schema is present, and the description adequately covers the return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single parameter (folder_id) is documented in the schema. The description adds no additional syntax, format, or constraint details beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get metadata for a single folder'), and the phrase 'single folder' distinguishes it from the sibling coda_list_folders. An agent can immediately tell it apart from list/update/delete/create folder tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs the agent to use coda_list_folders first to discover available folders, which is useful prerequisite context. However, it does not state when not to use this tool or contrast it with other sibling getters, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_formulaCoda Get FormulaA
Read-onlyIdempotent

Get the current value of a named formula in a Coda doc.

Returns the formula's name, ID, type, current value, and whether it has an error. The value is computed by Coda and reflects the latest state. Use coda_list_formulas to discover available formulas in a doc.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the formula
formula_id_or_nameYesFormula ID or name

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond that: the return fields (name, ID, type, current value, error state) and the note that the value is computed by Coda and reflects the latest state, which explains the openWorld/live-computation behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, followed by return-value context and the sibling pointer. Efficient with no filler, though the second sentence is slightly enumerative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields, compensating for that gap. It is complete for a simple two-parameter read tool; only minor details like error semantics or permission requirements are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both doc_id and formula_id_or_name documented in the schema, so the schema carries the burden. The description only indirectly reinforces that formula_id_or_name accepts a name ('named formula') and adds no format or lookup semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('the current value of a named formula in a Coda doc'), and distinguishes itself from the sibling coda_list_formulas by describing what it retrieves versus what it enumerates. An agent can tell it apart from other coda_get_* tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use coda_list_formulas to discover available formulas in a doc,' which clarifies the discovery-vs-fetch workflow. It gives clear context for use but states no exclusions or preconditions (e.g., permissions needed to read formulas).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_mutation_statusCoda Get Mutation StatusA
Read-onlyIdempotent

Check the status of an asynchronous mutation (write operation).

Coda write operations return 202 with a requestId. Use this tool to poll whether the mutation has completed, is still processing, or failed. Returns a completed boolean and any error details. Poll every 2 seconds, up to 30 seconds maximum.

NameRequiredDescriptionDefault
request_idYesThe requestId returned by a write operation (202 response)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, and the description is consistent with them. Beyond that it discloses the polling contract (2s interval, 30s ceiling), the failure states it distinguishes (completed / processing / failed) and the return shape ('completed boolean and any error details') that no output schema provides. It does not say what to do once the 30s budget is exhausted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with what the tool does, then the trigger, the return value and the polling budget. Every sentence carries distinct information and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter polling tool with no output schema, the description covers the trigger, the lifecycle states and the return value, which is close to everything an agent needs. The one gap is the post-timeout behavior, which is left for the caller to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single request_id parameter is already documented in the schema as 'the requestId returned by a write operation (202 response)'. The description restates that same origin rather than adding format or sourcing detail, so the schema does the heavy lifting and the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check the status of an asynchronous mutation') and scopes it to write operations, which distinguishes it in substance from the sibling polling tool coda_get_export_status. It stops short of naming that sibling explicitly, so the routing is inferable rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear triggering context ('Coda write operations return 202 with a requestId. Use this tool to poll...') plus concrete operational guidance (poll every 2 seconds, up to 30 seconds). It never states when not to use it or names the alternative status tool for exports, so it falls short of a full when/when-not/alternative treatment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_pack_analytics_summaryCoda Get Pack Analytics SummaryA
Read-onlyIdempotent

Get aggregated analytics summary for packs.

Returns total installs, doc usage, and formula invocations summed across packs. Only available to pack makers.

NameRequiredDescriptionDefault
pack_idsNoFilter to specific pack IDs
since_dateNoStart date for analytics (ISO 8601)
until_dateNoEnd date for analytics (ISO 8601)
is_publishedNoFilter to published (True) or unpublished (False) packs

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint/idempotentHint, so the safety profile is covered. The description adds real value beyond that: it specifies the access restriction (pack makers only) and the aggregated nature of the result, which an agent cannot derive from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler, and the core action is front-loaded ahead of the return-value detail and access note. Nothing is padded, though the layout is slightly fragmented across lines.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the returned aggregates (installs, doc usage, formula invocations) and stating the access restriction. Combined with the fully documented schema, an agent has enough to invoke it correctly, though the missing distinction from coda_list_pack_analytics is a residual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (pack_ids, since_date, until_date, is_published) are fully documented in the schema. The description adds no further parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'aggregated analytics summary for packs,' and enumerates the metrics returned (installs, doc usage, formula invocations). It implicitly distinguishes from the sibling coda_list_pack_analytics by emphasizing aggregation/summary, though it never names that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The prerequisite 'Only available to pack makers' is clear and useful context for eligibility. However, there is no explicit when-to-use guidance versus the closely related coda_list_pack_analytics or coda_get_analytics_updated, leaving the agent to infer the distinction between summary and list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_pageCoda Get PageA
Read-onlyIdempotent

Get metadata for a single page in a Coda doc.

Returns the page's name, ID, parent, subtitle, icon, and image. Does NOT return the page's text content — use coda_get_page_content for that. Page names can change; always use page IDs for reliable access.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the page
page_id_or_nameYesPage ID or name (prefer ID — names are unstable)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered; the description goes further by disclosing the exact return surface and, critically, that page names are mutable and unreliable. That instability caveat is genuine operational context an agent cannot get from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero filler; the core purpose is front-loaded and the exclusion plus stability caveat follow in priority order. Every sentence changes how an agent would call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing the return value and does so by naming the returned fields, which is exactly the missing piece. It omits error behavior (e.g. what happens if the page name is ambiguous or not found), which is a minor gap for a two-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented in the schema, which sets the baseline at 3. The description's "always use page IDs" mildly reinforces the schema's "prefer ID" note but adds no new syntax, format, or constraint information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get metadata for a single page in a Coda doc") and explicitly contrasts itself with the sibling coda_get_page_content, so an agent can distinguish the two without opening either schema. It also enumerates the exact metadata fields returned, leaving no ambiguity about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear negative condition ("Does NOT return the page's text content — use coda_get_page_content for that") plus a practical calling convention ("always use page IDs"). It does not explicitly address when to prefer this over coda_list_pages, so it falls just short of full when/when-not/alternatives coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_page_contentCoda Get Page ContentA
Read-onlyIdempotent

Get the text content of a page in a Coda doc.

Returns the page's content in the specified format (HTML or markdown). Markdown output may be lossy for complex Coda content (embedded objects, pack formulas). Use this for reading page text — use coda_get_page for metadata only.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the page
output_formatNoContent output formatmarkdown
page_id_or_nameYesPage ID or name to read content from

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety and repeatability are covered. The description adds useful behavioral context by warning that markdown output may be lossy for complex content such as embedded objects and pack formulas.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is front-loaded with the core action and stays brief, with each sentence contributing either format details, a lossiness caveat, or routing guidance. The second sentence partially restates what the name and schema already imply, but overall it is tight and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only content retrieval tool with full schema coverage and no output schema, the description covers purpose, format, lossiness, and the main alternative. Minor omissions such as large-page truncation behavior or pagination are not critical for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents doc_id, page_id_or_name, and output_format. The description adds meaning beyond the schema by noting the HTML/markdown choice and the trade-off that markdown can be lossy, which helps an agent choose the output_format value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the text content of a page in a Coda doc') and explicitly distinguishes itself from the closest sibling, coda_get_page, which is for metadata only. An agent can tell exactly what this tool returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use case ('reading page text') and names an alternative ('use coda_get_page for metadata only'). It does not address other potentially confusing siblings such as coda_export_page, so the routing guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_rowCoda Get RowA
Read-onlyIdempotent

Get a single row from a Coda table by ID or display column value.

Returns all column values for the specified row. Use this when you have a specific row ID or know the display column value. For querying multiple rows with filters, use coda_list_rows instead.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the table
row_id_or_nameYesRow ID or name (display column value)
table_id_or_nameYesTable ID or name
use_column_namesNoUse column names (True) or IDs (False) in row values

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context by stating that it returns all column values for the specified row, though it does not mention error behavior (e.g., row not found) or permission scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose and return behavior, then usage constraint and alternative. Every sentence earns its place with no redundant or vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-row read tool with rich annotations and complete schema coverage, the description supplies the needed scope, alternative routing, and return summary. Although no output schema exists, it states that all column values are returned, which is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters including row_id_or_name and use_column_names. The description adds the ID/display-column-value distinction, but that is essentially repeated from the schema and it says nothing about use_column_names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (single row from a Coda table), including the accepted lookup keys (row ID or display column value). It explicitly distinguishes itself from coda_list_rows, so an agent can route correctly without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (when you have a specific row ID or know the display column value) and names the alternative for multi-row filtering (coda_list_rows). This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_sharing_metadataCoda Get Sharing MetadataA
Read-onlyIdempotent

Get sharing metadata for a Coda doc.

Returns whether the doc can be shared, copied, or has sharing restrictions. This is metadata about the doc's sharing configuration, not the list of who has access — use coda_list_permissions for that.

NameRequiredDescriptionDefault
doc_idYesThe doc ID to get sharing metadata for

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), and the description adds useful substance by defining what the metadata actually contains (shareability, copyability, restrictions). It stops short of noting permission requirements or error behavior, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the return semantics, then the disambiguation. No filler and no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by stating what the call returns and what it does not. For a single-parameter read tool with full annotation coverage, nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (doc_id) with 100% schema description coverage, so the schema already carries the meaning. The description adds nothing about the ID's format or origin, which is the correct baseline when structured data does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get sharing metadata for a Coda doc') and immediately distinguishes itself from the closest sibling by naming coda_list_permissions as the tool for access lists. An agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-not rule ('not the list of who has access') and routes to the correct alternative ('use coda_list_permissions for that'), which is exactly the confusion this tool name could create against its permissions siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_get_tableCoda Get TableA
Read-onlyIdempotent

Get metadata for a single table or view in a Coda doc.

Returns the table's name, ID, type, row count, parent page, and sort/filter info. Does NOT return row data or column definitions — use coda_list_rows and coda_list_columns for those.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the table
table_id_or_nameYesTable ID or name

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint/idempotentHint annotations covering the safety profile, the description adds genuine value by enumerating what is returned (name, ID, type, row count, parent page, sort/filter info) and what is not. It does not mention auth requirements or pagination, but for a read-only metadata call the disclosure is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and followed by the return scope and the exclusion. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly compensates by summarizing the returned fields. Combined with the negative scoping and the read-only annotations, an agent has enough to call it correctly; only auth/pagination behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both doc_id and table_id_or_name documented in the schema, so the baseline is 3. The description adds no extra detail on ID vs. name resolution or format, leaving the schema to do all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Get metadata for a single table or view') and scopes it to one entity in a doc. The description also draws a boundary against sibling tools by naming coda_list_rows and coda_list_columns, so an agent can distinguish it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states what the tool does NOT do ('Does NOT return row data or column definitions') and routes the agent to coda_list_rows and coda_list_columns for those cases. It stops short of stating when to prefer this over coda_list_tables for enumerating tables, so it is clear but not fully exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_insert_rowsCoda Insert RowsA

Insert one or more rows into a Coda table, with optional upsert.

Inserts up to 500 rows per call. Use column names (not IDs) in the cells. With key_columns, matching rows are updated (upsert) instead of inserted — this is the only way to bulk-update rows. Returns a requestId for async mutation tracking via coda_get_mutation_status. The operation is async (202).

NameRequiredDescriptionDefault
rowsYesList of rows to insert. Each row is a dict with 'cells' key containing a list of {column: name, value: val} objects. Example: [{'cells': [{'column': 'Name', 'value': 'Alice'}]}]
doc_idYesThe doc ID containing the table
key_columnsNoColumn names to use as upsert keys. If a row matches on these columns, it is updated instead of inserted. Omit for pure insert.
table_id_or_nameYesTable ID or name to insert rows into

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and openWorldHint=true, so the description carries real extra weight: the 500-row cap, the column-name (not ID) requirement, the destructive update semantics of upsert, and the async 202 behavior with a requestId tracked via coda_get_mutation_status. These are exactly the operational facts an agent needs before calling a mutating bulk tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action and upsert caveat, then limits, then async/return behavior. Every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description explains the return contract (requestId for async tracking) and the status-check sibling, plus limits and formatting constraints. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds non-obvious semantics not in the schema: cells must use column names rather than IDs, and key_columns is the only path to bulk-update. That is meaningful added value over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Insert one or more rows into a Coda table') and immediately qualifies it with the upsert variant. An agent can distinguish this from siblings like coda_update_row and coda_delete_rows without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear routing guidance: key_columns enables upsert and 'this is the only way to bulk-update rows,' which steers the agent away from row-by-row update tools. It does not state explicit exclusions (e.g., when to prefer coda_update_row), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_categoriesCoda List CategoriesA
Read-onlyIdempotent

List all available publishing categories in Coda.

Returns the categories that can be used when publishing a doc to the Coda gallery. Each category has a name and ID. Use these category IDs with coda_publish_doc.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and openWorld, so safety semantics are covered. The description adds value beyond them by disclosing the shape of the result ('Each category has a name and ID'), which matters because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and scope, then the return shape, then the downstream consumer. Every sentence carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with no output schema, the description supplies the missing return-shape information (name and ID) and the integration point (coda_publish_doc), leaving nothing an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4; there is nothing for the description to disambiguate and it correctly adds no spurious parameter talk.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('List') plus a precisely scoped resource ('publishing categories in Coda'), and it clarifies these are gallery-publishing categories rather than doc/folder/page categories. An agent can distinguish it from the many other list_* siblings at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the downstream use: 'Use these category IDs with coda_publish_doc,' which routes the agent to the correct consumer tool. It does not state any when-not conditions or prerequisites, but the positive usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_columnsCoda List ColumnsA
Read-onlyIdempotent

List all columns in a Coda table.

Returns column metadata including name, ID, type (text, number, date, etc.), and configuration. Column IDs are internal identifiers — use column names when working with row data. This is the table schema — call this before inserting or updating rows to know the available columns and their types.

NameRequiredDescriptionDefault
limitNoMaximum number of columns to return (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID containing the table
table_id_or_nameYesTable ID or name to list columns from

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the bar is lower, and the description still adds real context: the shape of the returned metadata and the caveat that column IDs are internal identifiers that should not be used with row data. It stops short of disclosing pagination behavior, which matters because limit/cursor exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then layers return shape and the ID-vs-name caveat in three short sentences. Every sentence carries information, though the parenthetical type list ('text, number, date, etc.') is slightly loose padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of describing the return payload (name, ID, type, configuration) and its purpose as a schema pre-check, which is the key thing an agent needs. The notable omission is any mention of pagination despite the cursor/limit parameters and a default limit of 100.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all four parameters (doc_id, table_id_or_name, limit, cursor) are documented in the schema itself. The description adds no format, naming, or scoping detail about the parameters, so it does not go beyond the structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all columns in a Coda table') and immediately characterizes the result as the table schema, which separates it from row-level siblings like coda_list_rows or coda_insert_rows. It also implicitly contrasts with coda_get_column (single column) by scoping to 'all columns'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow trigger: 'call this before inserting or updating rows to know the available columns and their types.' It also advises using column names rather than IDs when working with row data. It does not, however, say when to prefer coda_get_column or coda_list_tables over this tool, so no true alternatives/exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_controlsCoda List ControlsA
Read-onlyIdempotent

List all controls (sliders, select lists, date pickers, etc.) in a Coda doc.

Returns control metadata including name, ID, type, and current value. Controls are interactive UI elements on pages. Use coda_get_control to read a specific control's current value.

NameRequiredDescriptionDefault
limitNoMaximum number of controls to return (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID to list controls from

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuine context by enumerating what the operation actually returns (name, ID, type, current value) and clarifying that controls are interactive UI elements on pages. It does not discuss pagination behavior, but the schema carries that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, with the scope statement front-loaded and the return contents and alternative tool following in priority order. Nothing is wasted and nothing important is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description usefully compensates by summarizing the returned fields. Parameter behavior is fully covered by the 100%-coverage schema. The only minor gap is that pagination sequencing (limit/cursor usage across calls) is never mentioned, but the schema defaults make this inferable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all three parameters (doc_id, limit, cursor) are documented in the schema itself. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all controls ... in a Coda doc') and immediately disambiguates the resource with concrete examples (sliders, select lists, date pickers). An agent can distinguish this from coda_get_control without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative tool and the condition that selects it: 'Use coda_get_control to read a specific control's current value,' which implies this tool is for enumerating controls rather than reading one. That is a clear when-to-use/when-to-use-the-other routing statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_doc_analyticsCoda List Doc AnalyticsA
Read-onlyIdempotent

List analytics data for docs (views, copies, likes, sessions).

Returns usage metrics for docs over the specified date range. Includes total views, unique views, copies, and other engagement metrics. Only available to doc owners. Use coda_get_doc_analytics_summary for aggregated totals instead of per-doc breakdown.

NameRequiredDescriptionDefault
limitNoMaximum number of results (1-200)
cursorNoPagination cursor from a previous response
doc_idsNoFilter to specific doc IDs
since_dateNoStart date for analytics (ISO 8601, e.g. '2024-01-01')
until_dateNoEnd date for analytics (ISO 8601)
is_publishedNoFilter to published (True) or unpublished (False) docs

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: the owner-only access restriction and the list of returned engagement metrics. It does not discuss pagination behavior, but the schema handles that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded, tightly scoped, and every sentence earns its place: it states what is listed, what is returned, who can use it, and which sibling handles the alternative case. There is no redundant or vague language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with rich schema coverage, annotations covering safety, and no output schema, the description supplies what is missing: the metric types returned, the owner-only constraint, and the routing rule to the summary sibling. Nothing needed to select or invoke the tool correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters are already documented in the input schema. The description only implies date-range filtering and adds no syntax, format, or default details beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List analytics data for docs (views, copies, likes, sessions).' It also names the sibling it is not: 'Use coda_get_doc_analytics_summary for aggregated totals instead of per-doc breakdown,' so an agent can distinguish it from related analytics tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit alternative and the condition that selects it: use this tool for per-doc breakdown, and use coda_get_doc_analytics_summary for aggregated totals. It also states the prerequisite 'Only available to doc owners,' which is essential for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_docsCoda List DocsA
Read-onlyIdempotent

List Coda docs accessible to the current API token.

Returns doc metadata including name, owner, folder, and timestamps. Does NOT return page content or table data — use coda_list_pages or coda_list_tables for those. Rate-limited to 4 calls per 6 seconds. Use the query parameter to search by doc name. Pass cursor to paginate through results.

NameRequiredDescriptionDefault
limitNoMaximum number of docs to return (1-200)
queryNoSearch query to filter docs by name
cursorNoPagination cursor from a previous response
is_ownerNoFilter to docs owned by the API token owner
folder_idNoFilter to docs in a specific folder
response_formatNo'json' for structured data, 'markdown' for readable textjson

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, and open-world behavior. The description adds meaningful behavioral context beyond annotations: the exact rate limit (4 calls per 6 seconds), the boundary that no page/table content is returned, and the pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main action, followed by return scope, exclusions, rate limit, and parameter usage. Every sentence carries useful information without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the returned metadata fields (name, owner, folder, timestamps). Combined with annotations and a fully described input schema, the definition is complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters thoroughly. The description only restates query for name search and cursor for pagination, adding little beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list Coda docs accessible to the current API token. It also distinguishes this tool from coda_list_pages and coda_list_tables by explicitly saying it does not return page content or table data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly routes the agent to alternatives for page content and table data, names those alternatives explicitly, and gives operational context such as rate limits, name searching via query, and cursor pagination.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_foldersCoda List FoldersA
Read-onlyIdempotent

List folders accessible to the current API token, one page at a time.

Returns folder metadata (name, ID, parent folder) with pagination — the API defaults to 25 per page, so pass cursor to fetch the rest. Folders organize docs in the Coda workspace. Use the returned folder IDs with coda_create_doc to place new docs in specific folders.

NameRequiredDescriptionDefault
limitNoMaximum number of folders to return (1-200)
cursorNoPagination cursor from a previous response
workspace_idNoLimit results to folders in this workspace (e.g. 'ws-AbCdEf')

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/openWorldHint, but the description adds real value beyond them: pagination behavior, the per-page default, the cursor mechanism, and the shape of returned metadata. Minor flaw: it claims the API "defaults to 25 per page" while the schema's limit default is 50, an inconsistency worth resolving.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and scope, then layers pagination and downstream usage. Every sentence is relevant, though the workspace-organizing aside is slightly tangential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by describing returned fields (name, ID, parent folder) and pagination handling. A low-complexity list tool is adequately covered; only the page-size inconsistency detracts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so limit/cursor/workspace_id are already documented; baseline is 3. The description adds the cursor's usage purpose but also introduces a page-size default (25) that conflicts with the schema's limit default of 50, so it doesn't clearly improve on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List folders accessible to the current API token") with an explicit access scope, which separates it from siblings like coda_list_docs and coda_get_folder at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete downstream guidance ("Use the returned folder IDs with coda_create_doc to place new docs in specific folders") and explains the cursor workflow. It doesn't clarify when to prefer coda_get_folder or coda_search over listing, so it's clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_formulasCoda List FormulasA
Read-onlyIdempotent

List all named formulas in a Coda doc.

Returns formula metadata including name, ID, and value. Named formulas are doc-level computed values (not column formulas). Use coda_get_formula to get a specific formula's current value.

NameRequiredDescriptionDefault
limitNoMaximum number of formulas to return (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID to list formulas from

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds real context beyond them: it defines what a 'named formula' is, notes these are doc-level rather than column-level values, and describes the returned metadata (name, ID, value) in the absence of an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then scope clarification, then the alternative tool. No filler and nothing repeated from structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully states the shape of returned metadata and the tool's scope. Pagination semantics are left to the schema's cursor description, which is acceptable, though a note on large docs or paging would make it fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so doc_id, limit (1-200) and cursor are fully documented in the schema itself. The description adds no additional parameter meaning such as cursor lifecycle or default page size behavior, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all named formulas in a Coda doc') and immediately disambiguates scope by clarifying that named formulas are doc-level computed values, not column formulas. An agent can distinguish this from coda_get_formula and the column/table listing tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to coda_get_formula 'to get a specific formula's current value,' which is a genuine alternative with a stated selection condition. It does not cover when to prefer other listing tools or how pagination should drive repeat calls, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_pack_analyticsCoda List Pack AnalyticsA
Read-onlyIdempotent

List analytics data for Coda packs.

Returns usage metrics for packs including install counts, doc usage, and formula invocations. Only available to pack makers for their own packs.

NameRequiredDescriptionDefault
limitNoMaximum number of results (1-200)
cursorNoPagination cursor from a previous response
pack_idsNoFilter to specific pack IDs
since_dateNoStart date for analytics (ISO 8601)
until_dateNoEnd date for analytics (ISO 8601)
is_publishedNoFilter to published (True) or unpublished (False) packs

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety and repeatability are covered. The description adds the valuable authorization constraint (pack-maker-only, own packs scope) and sketches the returned metric categories, going beyond what annotations convey, though it says nothing about pagination behavior or result ordering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no redundancy, with the core purpose front-loaded and the access restriction following. Every sentence carries information the agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does take on the job of summarizing return content (install counts, doc usage, formula invocations) and states the permission boundary for a six-parameter, all-optional read tool. It is nearly complete, lacking only pagination/volume expectations that the cursor parameter implies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% -- limit, cursor, pack_ids, since_date, until_date, and is_published are all documented in the schema with defaults and formats. The description adds no syntax, format, or interaction detail beyond that, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (List) and resource (analytics for Coda packs) and enumerates what the metrics cover: install counts, doc usage, and formula invocations. It is clearly a pack-scoped analytics reader, but it never explicitly distinguishes itself from nearby siblings like coda_list_pack_formula_analytics or coda_get_pack_analytics_summary, leaving the agent to infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a real precondition -- 'Only available to pack makers for their own packs' -- which tells the agent when the call will succeed. However, there is no guidance on when to prefer this over the aggregate (coda_get_pack_analytics_summary) or formula-level (coda_list_pack_formula_analytics) alternatives, so the when-to-use direction is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_pack_formula_analyticsCoda List Pack Formula AnalyticsA
Read-onlyIdempotent

List analytics data for individual formulas within a pack.

Returns per-formula invocation counts, error rates, and execution times. Only available to the pack maker.

NameRequiredDescriptionDefault
limitNoMaximum number of results (1-200)
cursorNoPagination cursor from a previous response
pack_idYesThe pack ID to get formula analytics for
since_dateNoStart date for analytics (ISO 8601)
until_dateNoEnd date for analytics (ISO 8601)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe-read behavior is covered. The description adds valuable context: the return content (invocation counts, error rates, execution times) and the pack-maker-only authorization requirement, which is behavioral context beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero waste, front-loading the core action and then the return payload and a critical constraint. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a read-only list tool with full schema documentation and no output schema, the description covers purpose, return fields, and access limitation. It would be fully complete if it clarified pagination behavior or edge cases, but it is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters (limit, cursor, pack_id, since_date, until_date) are documented in the schema itself. The description adds no parameter formatting or usage details beyond what the schema provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List analytics data') and a precise resource ('individual formulas within a pack'), clearly distinguishing it from siblings like coda_list_pack_analytics (pack-level) and coda_list_formula (formula metadata, not analytics).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides the crucial access precondition ('Only available to the pack maker'), which helps an agent decide if the call will succeed. However, it does not explicitly name alternative tools or state when to prefer pack-level vs. formula-level analytics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_page_analyticsCoda List Page AnalyticsA
Read-onlyIdempotent

List analytics data for pages within a doc.

Returns per-page usage metrics (views, unique views) for the specified doc. Only available to doc owners. Useful for understanding which pages get the most traffic.

NameRequiredDescriptionDefault
limitNoMaximum number of results (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID to get page analytics for
since_dateNoStart date for analytics (ISO 8601)
until_dateNoEnd date for analytics (ISO 8601)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond that: an authorization constraint (doc owners only) and the shape of the returned metrics (views, unique views). It omits pagination behavior despite the cursor parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and immediately followed by the return contents. The closing sentence about traffic is mildly promotional but does carry usage intent, so no major waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does partially carry the return-value burden by naming views and unique views, and it covers the access requirement. Missing pagination/date-range semantics and result ordering, which an agent would need for full confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including limit, cursor, since_date and until_date is already documented in the schema. The description adds only that doc_id identifies the target doc, which the schema already states — baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List analytics data for pages within a doc') and specifies the unit of analysis — per-page metrics — which separates it from the doc-level siblings coda_list_doc_analytics and coda_get_doc_analytics_summary. It stops short of naming those siblings explicitly, so the routing distinction is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a prerequisite ('Only available to doc owners') and a motivating use case ('understanding which pages get the most traffic'), but never says when to prefer this over the other analytics tools in the sibling set, nor what to do when owner access is unavailable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_pagesCoda List PagesA
Read-onlyIdempotent

List all pages in a Coda doc.

Returns page metadata including name, ID, parent page, and icon. Pages are returned in their tree order. Does NOT return page content — use coda_get_page_content for that. Use the returned page IDs (not names) for all subsequent page operations.

NameRequiredDescriptionDefault
limitNoMaximum number of pages to return (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID containing the pages

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), and the description adds genuinely new behavioral facts: pages come back in tree order, the response contains name/ID/parent/icon metadata, and content is deliberately excluded. It stops short of describing pagination behavior (cursor semantics, what happens when more pages exist than limit), so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and the negative scope, then the return shape, then the downstream ID rule. No filler and no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned metadata fields and ordering, which is what an agent needs to consume the result. The only remaining gap is pagination behavior, though the cursor parameter is self-documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (limit, cursor, doc_id) is already documented inline, including the 1-200 bound and the default of 50. The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('List all pages in a Coda doc') and immediately scopes it against the nearest sibling by stating it does NOT return page content and naming coda_get_page_content. An agent can distinguish it from coda_get_page, coda_list_docs, and coda_get_page_content without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative (coda_get_page_content) and the condition that selects it, and adds a follow-on usage rule ('Use the returned page IDs (not names) for all subsequent page operations'), which is exactly the kind of when-to-use guidance an agent needs for chained calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_permissionsCoda List PermissionsA
Read-onlyIdempotent

List all permission entries (ACL) for a Coda doc.

Returns who has access to the doc and their access level (read, write, etc.). Each entry includes the principal (user or group) and their permission type. Use coda_add_permission to grant access or coda_delete_permission to revoke.

NameRequiredDescriptionDefault
limitNoMaximum number of permissions to return (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID to list permissions for

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description goes beyond them by disclosing the shape of the result: who has access, their access level (read/write), and that each entry includes a principal and permission type — useful because no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, zero filler, with the core purpose and return shape front-loaded before the cross-tool routing sentence. Every sentence contributes something an agent can use.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter read tool with no output schema, the description supplies the essential return content (principal, permission type, access level) and sibling routing. It stops short of describing pagination flow across cursor calls, but the schema already documents limit/cursor semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with limit, cursor and doc_id all documented inline including ranges and pagination intent, so the schema carries the load. The description adds no extra meaning about parameter behavior, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all permission entries (ACL) for a Coda doc') and immediately scopes what an entry contains. It is clearly distinguishable from sibling ACL tools like coda_get_acl_settings and coda_get_sharing_metadata by naming the ACL/permission-entry object explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to coda_add_permission for granting and coda_delete_permission for revoking, which is clear complementary-action guidance. It does not, however, distinguish this tool from other read siblings such as coda_get_sharing_metadata or coda_get_acl_settings, so no true when-not-to-use boundary is drawn.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_rowsCoda List RowsA
Read-onlyIdempotent

List rows in a Coda table with optional filtering and sorting.

Returns row data with column values. By default uses column names (not IDs) for readability. Use the query parameter to filter rows by column values. For a specific row by ID, use coda_get_row instead. Results are paginated — pass cursor to get the next page.

NameRequiredDescriptionDefault
limitNoMaximum number of rows to return (1-500)
queryNoFilter formula (e.g. 'Status:"Active"' or 'c-abc123:"value"')
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID containing the table
sort_byNoRow sort order. One of 'createdAt', 'natural' (the table's own order), or 'updatedAt'. The API does not sort by an arbitrary column.
response_formatNo'json' for structured data, 'markdown' for readable textjson
table_id_or_nameYesTable ID or name to list rows from
use_column_namesNoUse column names (True) or IDs (False) in row values

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the description only needs to add context — and it does: pagination via cursor, the default of column names over IDs, and the presence of column values in results. It doesn't state what happens on an invalid cursor/query or rate-limit behavior, but that is a minor gap against annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, front-loaded with the core action and ending with the pagination mechanic; no filler. Slight redundancy in the query-parameter sentence, which largely echoes the schema, keeps it from being fully tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter read tool with no output schema, the description covers the essential call flows (filter, sort, paginate, column-name output) and the sibling handoff. It doesn't describe the shape of the returned rows beyond 'column values', but with no output schema that is a modest gap rather than a blocking one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, query, cursor, sort_by, use_column_names, and response_format. The description restates the query-as-filter and column-names-by-default behaviors rather than adding syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List rows in a Coda table') plus the supported modifiers (filtering, sorting), and explicitly names the sibling it is not (coda_get_row for a single row by ID). An agent can distinguish this from coda_insert_rows/coda_update_row/coda_delete_rows without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for the query parameter and routes the single-row case to coda_get_row, which is the one realistic ambiguity among siblings. It stops short of stating exclusions for the mutation siblings (insert/update/delete) or when to prefer list_tables/list_columns first, so it is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_list_tablesCoda List TablesA
Read-onlyIdempotent

List all tables and views in a Coda doc.

Returns table metadata including name, ID, type (table or view), row count, and parent page. Does NOT return row data — use coda_list_rows for that. Use coda_list_columns to get the column schema of a specific table.

NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (1-200)
cursorNoPagination cursor from a previous response
doc_idYesThe doc ID to list tables from
table_typesNoFilter by type: 'table' for base tables, 'view' for views

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond that: the exact metadata returned (name, ID, type, row count, parent page) and the explicit exclusion of row data. It does not describe pagination behavior despite limit/cursor parameters, which is the only real gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the return shape, then the negative scope and alternatives. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields and clarifies the read-scope boundary, which is the main thing an agent needs. Pagination semantics (limit 1-200, cursor chaining) are left entirely to the schema, so it is not quite complete for a paginated list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so doc_id, limit, cursor, and table_types are already fully documented in the schema. The description adds no additional parameter meaning (e.g., it never mentions filtering by table_types or paging with cursor), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List all tables and views in a Coda doc") and immediately scopes it against siblings by declaring it does not return row data and pointing to coda_list_rows and coda_list_columns. An agent can distinguish this from coda_list_rows, coda_get_table, and coda_list_columns without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative tools and the condition that selects them: use coda_list_rows for row data, use coda_list_columns for a specific table's schema. This is genuine when/when-not routing rather than implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_publish_docCoda Publish DocA

Publish a Coda doc to make it publicly accessible.

Publishes the doc with optional gallery listing and URL slug. Publishing alone makes the doc public by link; setting discoverable=True is a separate, more public step that lists it in the Coda gallery. Use coda_unpublish_doc to revert. Returns the published doc's URL and settings.

NameRequiredDescriptionDefault
modeNoPublishing mode. One of 'view', 'play', or 'edit'
slugNoURL slug for the published doc
doc_idYesThe doc ID to publish
discoverableNoWhether the doc is listed in the public Coda gallery. Defaults to False — publishing alone makes the doc reachable by URL; set True to list it.
category_namesNoCategory names for the published doc (from coda_list_categories)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and openWorldHint=true; the description adds the important consequence that the doc becomes publicly reachable and how discoverable escalates that exposure. It also discloses the return content (published URL and settings), which matters since no output schema exists. It does not mention required scopes/permissions or whether prior publish settings are overwritten, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action and outcome, then the discoverability nuance and the revert path. No filler or restated title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a public-exposure mutation with no output schema, the description covers purpose, the key flag's effect, reversal, and return values. The remaining gap is permission/scope requirements and what happens on republish, which an agent might need for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the discoverable/gallery distinction and mentions URL slug, but adds no meaning for 'mode' or 'category_names' beyond the schema, and largely restates what the parameter descriptions already say.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Publish a Coda doc') along with the outcome ('make it publicly accessible'). It also names the sibling used to reverse it (coda_unpublish_doc), so an agent can place it among the doc-management tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete context: publishing alone makes the doc public by link, while discoverable=True is a separate, more public gallery step, and coda_unpublish_doc reverts it. Missing is any exclusion against similar mutations (e.g. coda_update_doc, coda_add_permission) or prerequisite permissions, but the when-to-use condition and the alternative are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_push_buttonCoda Push ButtonA

Push a button in a Coda table row.

Triggers the button's configured action (e.g. run automation, modify row). The button must be in a Button-type column. The effect depends on the button's configuration in the Coda doc. Returns a requestId for async mutation tracking.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the table
row_id_or_nameYesRow ID or name containing the button
table_id_or_nameYesTable ID or name
column_id_or_nameYesColumn ID or name of the button column

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a mutating, open-world operation, and the description adds genuinely new behavior: the effect is non-deterministic and depends on the button's doc configuration, and the call returns a requestId for async mutation tracking. It does not mention permissions or error modes, but the async/non-deterministic disclosure is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then constraints, then return behavior — a sensible ordering with little waste. The second sentence ('The effect depends on the button's configuration') partially restates the parenthetical about the configured action, costing a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by naming the returned requestId and its async purpose, and it states the column-type precondition. It misses the obvious next step for the agent — that requestId is consumed by the sibling coda_get_mutation_status — so polling guidance is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all four parameters are already documented in the schema. The description adds one constraint relevant to column_id_or_name (it must reference a Button-type column), but otherwise contributes no syntax or format detail beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource ('Push a button in a Coda table row') and explains what it causes ('triggers the button's configured action'). It is distinguishable from the many read/list siblings, though it never explicitly contrasts itself with the adjacent coda_trigger_automation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a real precondition ('The button must be in a Button-type column'), which tells the agent when the call is valid. However, it offers no guidance on when to prefer this over coda_trigger_automation or what to do when the target column is not a button column.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_search_principalsCoda Search PrincipalsA
Read-onlyIdempotent

Search for users and groups that can be added to a doc's permissions.

Returns matching principals (users and groups) based on the query string. Use this to look up a user's email or find groups before calling coda_add_permission. Results include the principal's type, email, and name.

NameRequiredDescriptionDefault
queryYesSearch query (name or email prefix)
doc_idYesThe doc ID to search principals in

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the bar is lower; the description adds value by disclosing the return payload ('type, email, and name') in the absence of an output schema. It stops short of mentioning pagination, result limits, or matching semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and followed by return content and the recommended next call. Slight redundancy between 'users and groups' and '(users and groups)', but no wasted filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter read tool with no output schema, the description supplies the missing return-field context and the downstream dependency (coda_add_permission). Only result-count/pagination behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (query, doc_id) are already documented. The description restates 'query string' and the doc scope without adding format or matching-behavior detail, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (users and groups that can be added to a doc's permissions), which cleanly separates it from siblings like coda_list_permissions and coda_get_sharing_metadata that read existing state. An agent can identify the tool's job from the first sentence alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the downstream use case ('before calling coda_add_permission') and the lookup scenarios (user's email, groups). It gives clear when-to-use guidance but does not state when-not to use it (e.g., use coda_list_permissions to view current grants).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_trigger_automationCoda Trigger AutomationA

Trigger a Coda automation rule.

Fires the specified automation rule, optionally passing a JSON payload. The automation must have an API-triggerable event type. The payload schema depends on the automation's configuration. Returns a requestId for tracking. The rule_id can be found in the automation's settings in the Coda UI.

NameRequiredDescriptionDefault
doc_idYesThe doc ID containing the automation
payloadNoOptional JSON payload to pass to the automation
rule_idYesThe automation rule ID to trigger

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare write (readOnlyHint=false) and open-world effects, so the safety profile is already covered. The description adds useful behavior: firing a rule, optional payload dependence, and a requestId return for tracking. It stops short of permission/auth or failure-mode detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then five short lines covering prerequisite, payload variance, return value, and rule_id location. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation with no output schema, the description notes the requestId return and the API-triggerable prerequisite, which compensates for the missing output schema. It leaves auth/permission and error handling unstated, but annotations cover the main safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds that rule_id is found in automation settings and that payload shape depends on the target automation, which is meaningfully beyond schema text. Still, payload content itself remains opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The specific verb 'Trigger' and resource 'Coda automation rule' make the core action unambiguous, and the required doc_id/rule_id context is clear. However, the description does not differentiate this from the sibling coda_push_button, which may also initiate automations, so it falls short of the highest bar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a prerequisite ('must have an API-triggerable event type') and tells where to find rule_id, which helps invocation. But it does not say when to choose this over coda_push_button or other trigger mechanisms, nor when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_unpublish_docCoda Unpublish DocA
Destructive

Unpublish a Coda doc, removing public access. Returns confirmation with doc_id.

Reverts a previously published doc to private. The public URL will stop working. This is reversible — you can publish again with coda_publish_doc.

NameRequiredDescriptionDefault
doc_idYesThe doc ID to unpublish

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as a non-read-only, destructive, open-world mutation, and the description usefully adds what actually happens (the public URL stops working), that it is reversible, and that it returns a confirmation with doc_id. The reversibility note materially refines the impact beyond the bare destructiveHint, though it doesn't cover permissions or side effects on existing viewers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and effect in the first sentence, then adds impact and reversibility. Slightly redundant between 'removing public access' and 'the public URL will stop working,' but each sentence otherwise earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description steps in to describe the return (confirmation with doc_id), states the effect on the public URL, and notes reversibility. It is complete enough to call correctly, missing only permission/auth prerequisites that the annotations do not supply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single doc_id parameter, so the schema already carries the semantics. The description only references doc_id in the return value and adds no format or constraint detail beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (unpublish) and resource (Coda doc) with the concrete effect (removing public access). It is cleanly distinguishable from its obvious sibling coda_publish_doc, which it names directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly frames the use case — reverting a previously published doc to private — and names the alternative (coda_publish_doc) for the reverse operation. It stops short of an explicit when-not or a prerequisite/permission statement, so it is strong but not fully prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_update_docCoda Update DocA
Idempotent

Update metadata for an existing Coda doc.

Updates the doc's title and/or icon. Does NOT update page content — use coda_update_page for that. Returns the updated doc metadata. This is an idempotent operation — calling with the same values produces the same result.

NameRequiredDescriptionDefault
titleNoNew title for the doc
doc_idYesThe ID of the doc to update
icon_nameNoNew icon name (e.g. 'rocket', 'star')

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, open-world, idempotent operation. The description adds useful behavioral context by stating what is mutated (title/icon only), what is not mutated (page content), and what is returned (updated doc metadata). It does repeat the idempotent hint, which adds no new information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and efficient, but the final sentence ('This is an idempotent operation — calling with the same values produces the same result') is largely redundant with the idempotentHint annotation and could be removed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description supplies what is needed: the scope of the update, the sibling alternative, and that it returns updated doc metadata. It does not describe auth requirements or returned metadata shape, but those are minor given the annotations and lack of output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so title, icon_name, and doc_id are already documented. The description adds only the high-level mapping that title and/or icon are updated, which is useful but not meaningfully beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update metadata for an existing Coda doc') and immediately bounds the operation to title and icon only. It distinguishes itself from the sibling tool coda_update_page by explicitly saying it does not update page content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use context ('Update metadata') and an explicit when-not with the correct alternative ('Does NOT update page content — use coda_update_page for that'). An agent can route between updating doc metadata and page content without inspecting schemas.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_update_folderCoda Update FolderB
Idempotent

Update a folder's name.

Renames the specified folder. Returns the updated folder metadata. This is an idempotent operation.

NameRequiredDescriptionDefault
nameNoNew name for the folder
folder_idYesThe folder ID to update

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=false, idempotentHint=true, and openWorldHint=true, so 'This is an idempotent operation' is a pure restatement of structured data and earns no credit. The genuinely additive piece is 'Returns the updated folder metadata', which matters because no output schema exists. It still omits permission requirements and what happens when name is null (the schema's default), which is a real behavioral gap for a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action and with zero filler. 'Update a folder's name' and 'Renames the specified folder' are near-duplicates, which is the only wasted sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with no output schema, the description does cover the action, the return value, and the idempotency trait. However it never addresses the nullable 'name' parameter (default null), permission/authorization needs, or error behavior, leaving meaningful gaps for an agent invoking a write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented in the schema ('New name for the folder', 'The folder ID to update'), so the baseline is 3. The description adds the useful implication that name is the only mutable field, but does not clarify that name is optional/nullable or what a null value does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a folder's name', 'Renames the specified folder'), and the phrase 'a folder's name' usefully narrows the scope to renaming only. It does not reference any sibling (coda_get_folder, coda_delete_folder, coda_create_folder), so an agent gets no help distinguishing this from adjacent folder tools beyond the verb itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives, no prerequisites (e.g., needing the folder to exist), and no note on what happens if the folder is not found. Usage is only weakly implied by the verb 'Update'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_update_pageCoda Update PageA
Idempotent

Update a page's name, subtitle, or content in a Coda doc.

Updates page metadata and/or content. When updating content, 'replace' mode overwrites the entire page while 'append' adds to the end. There is no partial inline edit — draft full content locally first. Content format must match what you send (HTML or markdown). Returns the updated page metadata.

NameRequiredDescriptionDefault
nameNoNew name for the page
doc_idYesThe doc ID containing the page
contentNoNew page content (replaces existing content)
subtitleNoNew subtitle for the page
insert_modeNoHow to insert content: 'replace' overwrites, 'append' adds to end
content_formatNoFormat of the content parameter
page_id_or_nameYesPage ID or name to update

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and openWorldHint=true, and the description goes well beyond them: 'replace' overwrites the entire page, 'append' adds to the end, there is no partial inline edit, and content format must match what is sent. That is strong disclosure of destructive scope and failure modes. One caveat: append mode makes repeated identical calls accumulate content, which sits uneasily with idempotentHint=true, though the explicit description of both modes limits the risk to an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, front-loaded with the action and followed by the behavioral constraints in a logical order. The only waste is near-duplication between 'Update a page's name, subtitle, or content' and 'Updates page metadata and/or content,' which say the same thing twice.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description usefully states the return value ('updated page metadata') and the mutation semantics. It is complete for calling the tool, with minor gaps around default resolution for insert_mode/content_format and no mention of auth or permission requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both required IDs and all five optional fields are already documented in the schema; the description mostly restates the insert_mode enum rather than extending it. It does not clarify what the null defaults for insert_mode/content_format resolve to or that those params only matter when content is supplied, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Update a page's name, subtitle, or content in a Coda doc' gives a specific verb (update), resource (page), and the fields touched. The page-vs-doc and page-vs-row distinction is implicit in the naming, but with ~35 siblings including coda_update_doc and coda_create_page, no explicit differentiation is offered, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives operational guidance (draft full content locally first, choose replace vs append) but never states when to choose this tool over alternatives like coda_get_page_content or coda_create_page, nor any prerequisites. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_update_rowCoda Update RowA
Idempotent

Update a single row in a Coda table.

Updates specific column values for one row. Only the specified columns are changed — other columns are left unchanged. Use column names (not IDs). For bulk updates, use coda_insert_rows with key_columns (upsert) instead. Returns a requestId for async mutation tracking.

NameRequiredDescriptionDefault
cellsYesColumn values to update. List of {column: name, value: val} objects. Example: [{'column': 'Status', 'value': 'Done'}]
doc_idYesThe doc ID containing the table
row_id_or_nameYesRow ID or name to update
table_id_or_nameYesTable ID or name

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, openWorldHint=true), and the description adds real context beyond them: partial-update semantics ('only specified columns changed — others left unchanged'), the column-name requirement, and that it returns a requestId for async tracking. It does not state permission requirements, but the async-return disclosure is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core operation, then quickly layers scope, caveat, alternative, and return behavior. Every sentence adds information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers partial-update behavior and the async return value. It omits error/failure modes and any permission prerequisites, but is otherwise complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are documented in the schema, making 3 the baseline. The description adds only one useful bit ('use column names, not IDs'), which the schema's own example already implies, so it doesn't meaningfully exceed the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a single row in a Coda table') and scopes it with 'single row,' which distinguishes it from bulk-update siblings. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes bulk operations to the alternative: 'For bulk updates, use coda_insert_rows with key_columns (upsert) instead.' This gives both the when (single-row update) and the when-not (bulk) with the named sibling, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coda_whoamiCoda WhoamiA
Read-onlyIdempotent

Get information about the current API token owner.

Returns the user's name, email, and token scopes. Use this to verify that the API token is valid and has the expected permissions. If this returns an error, the token is invalid or expired.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, idempotent, and open-world, and the description adds concrete behavioral context beyond them: the returned identity fields and the meaning of an error response. This tells an agent what success and failure look like without an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action, then return values, then usage and error semantics. Every sentence adds distinct information with no repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly supplies the return shape (name, email, token scopes) and error meaning. Annotations cover safety and network traits, so nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to document. Per the rubric, a zero-parameter tool receives a baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Get information about the current API token owner') and enumerates the returned fields. This makes it unmistakable and distinct from all sibling tools, which operate on docs, pages, rows, permissions, and analytics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact purpose ('Use this to verify that the API token is valid and has the expected permissions') and interprets an error as an invalid or expired token. No alternative tool serves this identity-verification function, so the lack of a named sibling alternative is not a gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 54 tool updatesv0.12.1
    • Changedcoda_add_permission1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_create_doc1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_create_folder1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_create_page1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_doc1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_folder1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_page1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_page_content1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_permission1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_row1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_delete_rows1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_export_page1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_acl_settings1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_analytics_updated1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_column1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_control1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_doc1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_doc_analytics_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_export_status1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_folder1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_formula1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_mutation_status1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_pack_analytics_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_page1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_page_content1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_row1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_sharing_metadata1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_get_table1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_insert_rows1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_categories1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_columns1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_controls1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_doc_analytics1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_docs1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_folders1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_formulas1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_pack_analytics1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_pack_formula_analytics1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_page_analytics1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_pages1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_permissions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_rows1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_list_tables1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_publish_doc1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_push_button1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_resolve_browser_link1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_search_principals1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_trigger_automation1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_unpublish_doc1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_update_doc1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_update_folder1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_update_page1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_update_row1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedcoda_whoami1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
  2. 4 tool updatesv0.9.0
    • Addedcoda_get_export_status
    • Changedcoda_list_folders3 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Pagination cursor from a previous response"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "description": "Maximum number of folders to return (1-200)",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / workspace_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Limit results to folders in this workspace (e.g. 'ws-AbCdEf')"
        +}
    • Changedcoda_list_rows2 fields changed
      • changedInput schema / properties / sort_by / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "createdAt",
        +      "natural",
        +      "updatedAt"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / sort_by / description
        Previous value: -"Sort by column (prefix with '-' for descending, e.g. '-Created')"New value: +"Row sort order. One of 'createdAt', 'natural' (the table's own order), or 'updatedAt'. The API does not sort by an arbitrary column."
    • Changedcoda_publish_doc4 fields changed
      • changedInput schema / properties / discoverable / default
        Previous value: -trueNew value: +false
      • changedInput schema / properties / discoverable / description
        Previous value: -"Whether the doc is discoverable in the Coda gallery"New value: +"Whether the doc is listed in the public Coda gallery. Defaults to False — publishing alone makes the doc reachable by URL; set True to list it."
      • changedInput schema / properties / mode / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "view",
        +      "play",
        +      "edit"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / mode / description
        Previous value: -"Publishing mode (e.g. 'view', 'play', 'edit')"New value: +"Publishing mode. One of 'view', 'play', or 'edit'"
  3. 1 tool updatev0.7.1
    • Removedcoda_rate_limit_budget
  4. 54 tool updatesv0.4.14
    • First observedcoda_add_permission
    • First observedcoda_create_doc
    • First observedcoda_create_folder
    • First observedcoda_create_page
    • First observedcoda_delete_doc
    • First observedcoda_delete_folder
    • First observedcoda_delete_page
    • First observedcoda_delete_page_content
    • First observedcoda_delete_permission
    • First observedcoda_delete_row
    • First observedcoda_delete_rows
    • First observedcoda_export_page
    • First observedcoda_get_acl_settings
    • First observedcoda_get_analytics_updated
    • First observedcoda_get_column
    • First observedcoda_get_control
    • First observedcoda_get_doc
    • First observedcoda_get_doc_analytics_summary
    • First observedcoda_get_folder
    • First observedcoda_get_formula
    • First observedcoda_get_mutation_status
    • First observedcoda_get_pack_analytics_summary
    • First observedcoda_get_page
    • First observedcoda_get_page_content
    • First observedcoda_get_row
    • First observedcoda_get_sharing_metadata
    • First observedcoda_get_table
    • First observedcoda_insert_rows
    • First observedcoda_list_categories
    • First observedcoda_list_columns
    • First observedcoda_list_controls
    • First observedcoda_list_doc_analytics
    • First observedcoda_list_docs
    • First observedcoda_list_folders
    • First observedcoda_list_formulas
    • First observedcoda_list_pack_analytics
    • First observedcoda_list_pack_formula_analytics
    • First observedcoda_list_page_analytics
    • First observedcoda_list_pages
    • First observedcoda_list_permissions
    • First observedcoda_list_rows
    • First observedcoda_list_tables
    • First observedcoda_publish_doc
    • First observedcoda_push_button
    • First observedcoda_rate_limit_budget
    • First observedcoda_resolve_browser_link
    • First observedcoda_search_principals
    • First observedcoda_trigger_automation
    • First observedcoda_unpublish_doc
    • First observedcoda_update_doc
    • First observedcoda_update_folder
    • First observedcoda_update_page
    • First observedcoda_update_row
    • First observedcoda_whoami

TDQS

A3.8/5.0

Scored across 54 tools

Disambiguation4/5

Most tools target distinct resources and actions, and list/get pairs plus analytics summary vs per-item tools are clarified in descriptions. Minor confusion possible between coda_get_page_content/coda_export_page and among several analytics endpoints, but descriptions largely guide selection.

Naming Consistency5/5

All tools use a coda_ prefix and snake_case, overwhelmingly following a verb_noun pattern (e.g., coda_create_doc, coda_list_rows, coda_delete_permission). The few domain-specific names like coda_whoami still fit the overall convention.

Tool Count2/5

54 tools is well above the 25+ threshold for 'too many' and risks overwhelming an agent. While each maps to a distinct Coda API operation, consolidation of analytics summaries and CRUD families could reduce the surface without losing coverage.

Completeness4/5

The set covers docs, folders, pages, tables, rows, columns, permissions, analytics, and publishing lifecycles thoroughly. Minor gaps like comments or webhook tools may exist, but core CRUD and administrative operations are well represented.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers