SeaTable MCP
OfficialSeaTable MCP lets AI agents interact with SeaTable bases — reading, writing, searching, linking, and querying data through a focused set of tools.
Schema introspection:
list_tables,get_schema,list_bases,list_collaboratorsReading data:
list_rows,get_row,find_rows,search_rowsSQL querying:
query_sqlwith parameterized SELECT/INSERT/UPDATE/DELETEWriting data:
add_row,append_rows,update_rows,upsert_rows,delete_rowsLinking rows:
link_rowsandunlink_rowsFile handling:
upload_fileanddownload_filefor file/image columnsUtilities:
get_row_activities(row history),create_snapshot,add_select_options,ping_seatableFlexible deployment: stdio, self-hosted HTTP, managed multi-tenant mode with OAuth, multi-base support, mock mode, and Prometheus metrics
SeaTable MCP
The official Model Context Protocol (MCP) server for SeaTable, built and maintained by SeaTable GmbH. It lets AI agents interact with data in your bases — reading, writing, searching, linking, and querying rows through a focused set of tools. The server intentionally focuses on data operations, not schema management (creating/deleting tables or columns), keeping the tool set lean and safe for autonomous agent use.
Quick Start
The fastest way to get started depends on your setup:
SeaTable Cloud — Use the hosted MCP server at
mcp.seatable.com, no installation neededSelf-hosted SeaTable — Run the MCP server locally via
npxin your IDE
SeaTable Cloud (hosted MCP server)
If you use SeaTable Cloud, there is a hosted MCP server ready to use — no installation required. Configure your MCP client with the Streamable HTTP endpoint:
Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"seatable": {
"type": "streamable-http",
"url": "https://mcp.seatable.com/mcp",
"headers": {
"Authorization": "Bearer your-api-token"
}
}
}
}Cursor / VSCode — add to your MCP settings (JSON):
{
"mcp.servers": {
"seatable": {
"type": "streamable-http",
"url": "https://mcp.seatable.com/mcp",
"headers": {
"Authorization": "Bearer your-api-token"
}
}
}
}ChatGPT and other OAuth-compatible clients — use the built-in OAuth flow. In ChatGPT's developer mode, configure:
Server URL:
https://mcp.seatable.com/mcpAuth type: OAuth
Authorization URL:
https://mcp.seatable.com/authorizeToken URL:
https://mcp.seatable.com/token
You will be prompted to enter your SeaTable API token during the authorization step.
Self-hosted SeaTable
For self-hosted SeaTable instances, run the MCP server locally via npx. Your IDE starts and manages the process automatically.
Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"seatable": {
"command": "npx",
"args": ["-y", "@seatable/mcp-seatable"],
"env": {
"SEATABLE_SERVER_URL": "https://your-seatable-server.com",
"SEATABLE_API_TOKEN": "your-api-token"
}
}
}
}Cursor / VSCode — add to your MCP settings (JSON):
{
"mcp.servers": {
"seatable": {
"command": "npx",
"args": ["-y", "@seatable/mcp-seatable"],
"env": {
"SEATABLE_SERVER_URL": "https://your-seatable-server.com",
"SEATABLE_API_TOKEN": "your-api-token"
}
}
}
}Related MCP server: pocketbase-mcp-server
Deployment Options
If you need to run your own server instance — for example on your own infrastructure, with multi-base support, or in multi-tenant mode — use one of the options below.
HTTP Server (Network Access)
Run a local HTTP server with Streamable HTTP transport:
PORT=3001 npx -y @seatable/mcp-seatable --sse
# Health check
curl http://localhost:3001/health
# MCP endpoint: POST/GET/DELETE http://localhost:3001/mcpMulti-Base (Selfhosted)
Serve multiple bases from a single process:
SEATABLE_SERVER_URL=https://your-seatable-server.com \
SEATABLE_BASES='[{"base_name":"CRM","api_token":"token_abc"},{"base_name":"Projects","api_token":"token_def"}]' \
npx -y @seatable/mcp-seatableEach tool automatically gets a base parameter. Use list_bases to see available bases.
Managed Mode (Multi-Tenant HTTP)
For hosting an MCP endpoint where each client authenticates with their own SeaTable API token:
SEATABLE_MODE=managed \
SEATABLE_SERVER_URL=https://your-seatable-server.com \
SEATABLE_TOKEN_SECRET=$(openssl rand -hex 32) \
PORT=3000 npx -y @seatable/mcp-seatable --sseSEATABLE_TOKEN_SECRET is required in managed mode. It seals the OAuth tokens the server issues, so the underlying SeaTable API token never has to be handed to a client. Keep it stable across restarts — changing it invalidates every issued access and refresh token and forces all clients to re-authorize.
Clients pass their credential via Authorization: Bearer <token> — on session initialization and on every subsequent request, including GET and DELETE. The mcp-session-id header is a routing value only; it is never accepted on its own. Each request is re-validated and must resolve to the same identity that created the session, otherwise the server answers 401 (missing/invalid credential) or 403 (valid credential, wrong session). Rate limits apply as before (60 req/min per token, 120/min per IP, 20 concurrent connections per token).
OAuth support: Managed mode also exposes OAuth 2.0 endpoints (/authorize and /token), enabling OAuth-compatible clients like ChatGPT to connect — no external OAuth provider required. During the flow the user enters their SeaTable API token; the server seals it into its own short-lived access token (1 h) and a rotating refresh token (14 d). The raw SeaTable API token is never returned to a client.
Clients must register at /register first: the returned client_id carries the client's name and its redirect_uris, and the server accepts a callback only if it is one the client registered (loopback callbacks may vary the port, per RFC 8252). PKCE with S256 is mandatory, and every authorization code is bound to the client, the exact callback and the challenge.
Where a code may be delivered. With open dynamic registration, "registered client" is not a trust statement — anyone can register. What matters is whether the code leaves the user's machine:
Callback | Behaviour |
Loopback ( | allowed, no extra step — the code stays on the user's machine |
Private-use scheme ( | allowed, no extra step — handed to a local application |
| allowed, no extra step |
| allowed after the user confirms the destination on a separate page |
Remote plaintext | rejected |
The confirmation cannot be skipped from the entry link: it is read from the form body only, and a POST auto-submitted by a foreign page is refused via Sec-Fetch-Site. The trusted-host list therefore removes friction — it is not a gate, and leaving it unset breaks nothing.
The consent screen leads with the destination the authorization will be sent to. The application's name is shown as self-reported, because with open registration it is chosen by whoever registered the client and cannot be verified.
The OAuth endpoints are rate limited per IP (30/min overall, 10/min for token submissions), so /authorize cannot be used as an unthrottled oracle for testing SeaTable API tokens.
OAuth endpoints follow the MCP specification (RFC 8414 metadata discovery, PKCE, dynamic client registration):
Endpoint | Path |
Metadata Discovery |
|
Authorization |
|
Token |
|
Client Registration |
|
Client ID and secret are not validated — dynamic client registration generates one automatically.
Docker
docker run -d --name seatable-mcp \
-p 3000:3000 \
-e SEATABLE_SERVER_URL=https://your-seatable-server.com \
-e SEATABLE_API_TOKEN=your-api-token \
seatable/seatable-mcp:latest
# Health check
curl http://localhost:3000/healthSecurity Model
The security characteristics differ significantly between transport modes:
stdio (default) | Selfhosted HTTP | Managed HTTP | |
Network exposure | None (local process) | TCP port, no auth | TCP port, Bearer auth |
Authentication | Not needed (local) | None | Bearer token or OAuth 2.0, validated against SeaTable |
Rate limiting | None | None | Per-token, per-IP, global |
Connection limits | N/A | None | 20 concurrent sessions per token |
Data scope | All configured bases | All configured bases | One base per client token |
⚠️ Warning: Selfhosted HTTP mode (
--sse/--http) has no authentication. Anyone who can reach the port gets full access to all configured bases, including write and delete operations. Only run it in trusted networks (localhost, Docker-internal) or behind a reverse proxy that handles authentication. For untrusted networks, use managed mode instead.
Rate Limiting
SeaTable's own API gateway enforces rate limits per base (default: 500 requests/minute per base_uuid) and per organization (monthly quota). These limits apply regardless of whether requests come from the MCP server, the web UI, or direct API calls. The MCP server does not duplicate these limits — instead, it retries automatically with exponential backoff when SeaTable returns 429 Too Many Requests.
In managed mode, the MCP server adds its own rate limits to protect the server process itself (not the SeaTable backend): 60 req/min per token, 120/min per IP, 30/min for new session creation, and 20 concurrent connections per token.
Input Validation
All tool inputs are validated with Zod schemas before execution. Write tools (add_row, append_rows, update_rows, upsert_rows) additionally validate row data against the table schema — unknown columns are rejected, and read-only columns (formula, auto-number, creator, etc.) are stripped with a note in the response.
Tool schemas are published with additionalProperties: true to remain compatible with MCP clients that may attach internal fields (e.g. _meta). Unexpected fields are ignored by the server — they do not cause errors but are not processed either. This is a deliberate trade-off: stricter validation would improve error messages for typos but risk breaking compatibility with MCP clients.
Row Responses
Row responses include all columns and SeaTable system fields (_id, _mtime, _ctime, _creator, _last_modifier). System fields are not filtered — _id is required for updates and deletes, timestamps are useful for sorting and freshness checks, and creator/modifier fields can be resolved to display names via list_collaborators.
Caching
The server caches base metadata (table/column definitions) for 60 seconds to avoid redundant API calls during write operations. Schema-reading tools (get_schema, list_tables) always bypass the cache and return fresh data. If a cached schema becomes stale (e.g. a column was renamed), the SeaTable API will reject the write and the AI agent can call get_schema to refresh.
Environment Variables
Required:
SEATABLE_SERVER_URL— Your SeaTable server URL
Authentication (one of these is required in selfhosted mode):
SEATABLE_API_TOKEN— Single-base API tokenSEATABLE_BASES— Multi-base: JSON array (e.g.'[{"base_name":"CRM","api_token":"..."}]')
Optional:
SEATABLE_MODE—selfhosted(default) ormanaged(multi-tenant HTTP with per-client auth)SEATABLE_TOKEN_SECRET— required in managed mode, min. 32 chars. Seals issued OAuth tokens and client registrations; must be stable across restarts (openssl rand -hex 32)SEATABLE_ACCESS_TOKEN_TTL— lifetime of an issued access token in seconds (default3600, range30–2592000). Lower narrows the window after a SeaTable token is revoked; higher spares users a re-prompt if their client renews badly. The refresh token is never issued shorter-lived than the access token.SEATABLE_MOCK=true— Enable mock mode for offline testingCORS_ALLOWED_ORIGINS— Comma-separated list of allowed origins for CORS (HTTP mode only, disabled if unset)METRICS_PORT— Prometheus metrics port (default:9090, HTTP mode only)
Monitoring
In HTTP mode, the server exposes Prometheus metrics on a separate port (default 9090):
curl http://localhost:9090/metricsAvailable metrics:
Metric | Type | Description |
| Counter | Tool calls by name and result (success/error) |
| Counter | Total calls per tool (regardless of outcome) |
| Histogram | Tool execution time |
| Counter | HTTP requests by method and status code |
| Counter | Rate limit rejections (global/per_ip/per_token) |
| Counter | Auth validations (success/failure/cache_hit) |
| Gauge | Currently active HTTP sessions |
| Gauge | Currently active connections |
| Counter | SeaTable API calls by operation |
| Histogram | SeaTable API latency |
Plus standard Node.js metrics (memory, CPU, event loop) via prom-client.
The metrics server only starts in HTTP mode (not stdio) and binds to 0.0.0.0 — in Docker, expose the port only within your internal network.
MCP Tools
Schema Introspection
list_tables— Get all tables with metadataget_schema— Get complete database structurelist_bases— List available bases (multi-base mode only)list_collaborators— List users with access to the base (for collaborator columns)
Reading Data
list_rows— Paginated row listing (use query_sql for filtering/sorting)get_row— Retrieve specific row by IDfind_rows— Client-side filtering with DSLsearch_rows— Search via SQL WHERE clausesquery_sql— Execute SQL queries with parameterized inputs
Writing Data
add_row— Add single new rowappend_rows— Batch insert rowsupdate_rows— Batch update rowsupsert_rows— Insert or update rows by key columnsdelete_rows— Remove rows by ID
Files
upload_file— Upload a file or image to a row (base64-encoded)download_file— Read file content from a file or image column (text files and PDFs as text, binary files as download link, max 1 MB)
Linking
link_rows— Create relationships between rowsunlink_rows— Remove relationships between rows
Utilities
get_row_activities— Get change history of a row (who changed what, when, old/new values)create_snapshot— Create a snapshot of the current base (10 min cooldown)add_select_options— Add new options to single-select or multi-select columns (existing options are skipped, no duplicates)ping_seatable— Health check with latency monitoring
Supported Column Types
SeaTable bases can contain many different column types. The following table shows which types can be written via the API and what format to use.
Column Type | Writable | Value Format |
Text | Yes |
|
Long Text | Yes |
|
Number (incl. percent, currency) | Yes |
|
Checkbox | Yes |
|
Date | Yes |
|
Duration | Yes |
|
Single Select | Yes |
|
Multiple Select | Yes |
|
Yes |
| |
URL | Yes |
|
Rating | Yes |
|
Geolocation | Yes |
|
Collaborator | Yes |
|
Link | Yes | Use |
Image / File | Yes | Use |
Formula / Link Formula | No | Read-only, computed by SeaTable |
Creator / Created Time / Modified Time | No | Read-only, set automatically |
Auto Number | No | Read-only, set automatically |
Button / Digital Signature | No | Not accessible via API |
Tool Examples
// List all tables
{ "tool": "list_tables", "args": {} }
// Get rows with pagination
{ "tool": "list_rows", "args": { "table": "Tasks", "page_size": 10 } }
// Add rows
{ "tool": "append_rows", "args": { "table": "Tasks", "rows": [{ "Title": "New Task", "Status": "Todo" }] } }
// SQL query
{ "tool": "query_sql", "args": { "sql": "SELECT Status, COUNT(*) as count FROM Tasks GROUP BY Status" } }Programmatic Usage
import { createMcpServer } from '@seatable/mcp-seatable'
const server = await createMcpServer({
serverUrl: 'https://your-seatable-server.com',
apiToken: 'your-api-token',
})Mock Mode
SEATABLE_MOCK=true npm run devIn-memory tables and rows for demos and tests without a live SeaTable instance.
Development
Prerequisites
Node.js >= 20
Setup
git clone https://github.com/seatable/seatable-mcp
cd seatable-mcp
npm install
cp .env.example .env # Configure your SeaTable settings
npm run dev # Start in watch modeScripts
npm run dev— Start server in watch mode (tsx)npm run build— Compile TypeScriptnpm run start— Run compiled servernpm test— Run tests (vitest)npm run lint— Lint codenpm run typecheck— TypeScript type check
Testing Tools
node scripts/mcp-call.cjs ping_seatable '{}'
node scripts/mcp-call.cjs list_tables '{}'
node scripts/mcp-call.cjs list_rows '{"table": "Tasks", "page_size": 5}'Troubleshooting
Issue | Solution |
| Check |
| Check API token permissions |
| Check |
| Ensure API token has required base permissions |
| API token is read-only or row limit exceeded |
| Storage quota reached — delete files or upgrade plan |
| Rate-limited by SeaTable — requests are automatically retried with backoff (3 attempts) |
License
MIT
Available Tools
21 toolsadd_rowA
Add a single row. For multiple rows, always use append_rows instead of calling add_row in a loop. Link and file/image columns cannot be set here — use link_rows and upload_file instead.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| row | Yes | Row object (column -> value) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that link and file/image columns cannot be set, which is behavioral beyond annotations. Annotations show readOnlyHint=false (mutation) and destructiveHint=false (not destructive), so no contradiction. Could mention other constraints like required permissions or response behavior, but given annotations, it's adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding value: purpose, usage guideline, and constraints. No fluff, well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description could mention return value (e.g., the new row ID). However, the tool is simple with 2 params and good annotations, so completeness is adequate for a basic add operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with descriptions for both parameters. The description adds no extra meaning beyond schema for 'table' and 'row' parameters. Baseline 3 is appropriate as schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it adds a single row and distinguishes from append_rows for bulk operations. However, it could be more specific about the resource (e.g., 'Add a single row to a table').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises against using this in a loop for multiple rows, directing to append_rows instead. Also clarifies that link and file/image columns cannot be set via this tool, directing to link_rows and upload_file. Provides 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.
add_select_optionsAIdempotent
Add new options to a single-select or multi-select column. Use this before writing rows with option values that do not exist yet.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| column | Yes | Name of the single-select or multi-select column | |
| options | Yes | Array of options to add |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint: true and destructiveHint: false, which the description does not contradict. The description adds the behavioral context that this should be used proactively before row writes, which is helpful. No info about atomicity or error behavior is provided, but the annotations cover the main safety concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core action and follow with usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and three well-documented parameters, the description covers the essential purpose and usage context. It is complete enough for an agent to decide when to use this tool, though it could briefly mention that multiple options can be added in one call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage, so the description does not need to add much for parameters. However, it provides no additional meaning beyond the schema fields. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool adds new options to a single-select or multi-select column. It specifies the resource (column options) and the action (add), and distinguishes from siblings like add_row and append_rows which operate on rows, not column options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use this tool before writing rows with option values that do not exist yet, providing context for when to use it. However, it does not mention when NOT to use it or any alternatives, though the sibling list does offer other add operations for different purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_rowsA
Batch insert rows. Rejects unknown columns. Link and file/image columns cannot be set here — use link_rows and upload_file instead. Note: the response may contain column keys instead of column names due to a SeaTable API limitation.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| rows | Yes | Array of row objects (column name -> value) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses two important behaviors: rejects unknown columns, and response may use column keys instead of names due to API limitation. Annotations are all false (not read-only, not destructive, not idempotent, not open-world), which matches the description's write operation. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences. Each provides distinct value: purpose, constraints, and caveat. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers key behaviors (rejection, limitations) and column key note compensates. Could mention max batch size (from schema: 100 rows) or idempotency, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds context: 'rejects unknown columns' clarifies validation behavior, and 'column name → value' hints at the format of row objects. The note about column keys further aids correct interpretation of return values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Batch insert rows' with a specific verb and resource. Differentiates from siblings like 'add_row' (single row) and 'upsert_rows' (insert-or-update).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when not to use: cannot set link/file/image columns, directing to alternatives 'link_rows' and 'upload_file'. Implicitly distinguishes from 'add_row' for batches, but no explicit when-not for other siblings like 'update_rows'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_snapshotA
Create a snapshot of the current base. Requires at least one change since the last snapshot and at least 10 minutes since the last snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the full burden. It discloses that the tool is not read-only (since it creates something), not destructive (snapshot creation is typically safe), and not idempotent (due to time-based restrictions). However, it does not mention what happens if conditions are not met (e.g., error message), which would be helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, efficient and front-loaded. Every sentence adds value: first states action, second states conditions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, no output schema, and simple preconditions, the description is mostly complete. It could mention what the output is (e.g., snapshot ID or confirmation) but the lack of output schema reduces the need. Slightly incomplete for a new agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no parameters, schema description coverage is 100%, so no additional parameter info is needed. The description adds value by explaining the prerequisites beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action 'Create a snapshot' and the resource 'the current base'. Differentiates from siblings like 'add_row' or 'delete_rows' by specifying it is about creating a snapshot, which is a distinct operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisites: requires at least one change since last snapshot and at least 10 minutes since last snapshot. This helps the agent know when to use it and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_rowsADestructiveIdempotent
Delete one or more rows from a table by their IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| row_ids | Yes | List of row IDs (_id field) to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide key behavioral transparency: `destructiveHint: true` warns that this tool destroys data, `idempotentHint: true` indicates repeated calls safe, `readOnlyHint: false` confirms mutation. The description adds no extra context beyond the deletion action, but annotations already carry the burden. No contradiction with annotations; the description aligns with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, clear sentence front-loads the action and resource. No wasted words; every part is essential. Ideal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 required params with full schema coverage, annotations disclosing destructive nature and idempotency, and no output schema, the description is adequate but minimal. It does not explain the return value (e.g., count deleted, if any) or behavior on non-existent IDs. Sibling tools like 'update_rows' might offer softer alternatives, but not mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both parameters. The description reiterates 'by their IDs' which maps to row_ids, but adds no additional semantic meaning beyond what the schema provides. Baseline 3 is appropriate; no extra value but no deficiency.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Delete' and the resource 'rows from a table', with the qualification 'by their IDs'. This distinguishes it from sibling tools like 'update_rows' or 'link_rows'. However, it does not explicitly clarify the scope (e.g., within a single table or workspace) or contrast with 'clear_rows' if such existed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal guidance on when to use this tool. It implies it should be used to delete specific rows by ID, but does not mention when not to use it (e.g., for bulk deletion, use 'append_rows'? Actually not suitable) or alternatives among siblings (e.g., 'update_rows' for soft deletion). No context on prerequisites (e.g., table must exist) or post-conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_fileARead-onlyIdempotent
Read the content of a file attached to a row in a file or image column. Use get_row first to see available files in the column, then pass the exact file_name to select a specific file.
Returns JSON with: file_name, file_size (bytes), content, content_type, and download_link (only when content_type is "binary_url").
content_type values:
"text": file content returned as text (.txt, .csv, .md, .json, .xml, .html, .yaml, .sql, and common programming languages)
"pdf_text": extracted text from PDF files
"binary_url": non-text files, files >1 MB, or external URLs — content contains a message, download_link contains the URL
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| column | Yes | Name of the file or image column | |
| row_id | Yes | Row ID containing the file | |
| file_name | No | Specific file name to download (if column contains multiple files). If omitted, the first file is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, so tool is safe. Description adds value by explaining content_type behaviors (text, pdf_text, binary_url), file size limit >1MB triggers binary_url, and that download_link is only present for binary_url. This is rich behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: purpose, usage order, return fields, content_type enumeration. Some minor redundancy (file_name explained twice), but overall efficient for the level of detail provided.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only file download tool. Covers all necessary usage: prerequisite get_row, file selection, content types, return fields, edge cases (external URLs, large files). No output schema exists, but description comprehensively documents return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage, so baseline is 3. Description adds significant value: clarifies file_name optionality (omission uses first file), explains behavior of different content types, and describes return structure. This far exceeds the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes exactly what the tool does: reads content of a file attached to a row in a file/image column. Distinct from upload_file (write) and get_row (which only sees file metadata). Clear verb+resource+scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use: after get_row to see available files; how to select a specific file by name; explains that omitting file_name uses first file. Sibling upload_file is inverse operation, clearly distinguishable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_rowsARead-onlyIdempotent
Find rows using a predicate DSL. Filtering is performed client-side. where format: {"eq":{"field":"Name","value":"foo"}} or shorthand {"Name":"foo"}. Operators: eq, ne, in, gt, gte, lt, lte, contains, starts_with, ends_with, is_null. Combine with {"and":[...]} or {"or":[...]}. Negate with {"not":{...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| where | No | Filter predicate (e.g. {"eq":{"field":"Name","value":"foo"}} or shorthand {"Name":"foo"}) | |
| page | No | Page number (1-based) | |
| page_size | No | Rows per page (max 1000) | |
| order_by | No | Column name to sort by | |
| direction | No | Sort direction | asc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds crucial context: filtering is performed client-side (implying all rows may be fetched), and explains the predicate DSL format and operators. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 sentences) and efficiently communicates key material. It front-loads the core purpose and DSL format. Could be slightly more structured but is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema covers all parameters, annotations are present, and there is no output schema, the description sufficiently explains the filtering mechanism. It is complete for a client-side filtering tool, though adding a note about potential large data transfer due to client-side filtering would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters have descriptions. The description adds meaning to the 'where' parameter by providing DSL syntax and operators. Other parameters (table, page, page_size, order_by, direction) are adequately described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds rows using a predicate DSL and specifies it is client-side filtering. It includes the DSL format and operators, which distinguishes it from list_rows (simple listing), search_rows (full-text search), and query_sql (direct SQL). However, it does not explicitly contrast with siblings like list_rows or search_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when predicate-based filtering is needed) but does not explicitly state when not to use it or provide alternatives. With siblings like list_rows, search_rows, and query_sql, clearer guidance would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rowARead-onlyIdempotent
Get a row by ID from a table
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| row_id | Yes | Row ID (the _id field) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description does not contradict these. It adds the context that this tool retrieves a row, which is consistent. No extra behavioral details are needed beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that completely conveys the tool's purpose without extraneous words. It is front-loaded with the verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema), the description covers the core purpose. It could optionally note that the row includes all fields or reference the schema for return format, but it is adequate for a basic getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not add parameter meaning beyond what the schema already provides (table name and row_id). No additional explanation of formats or constraints is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' and resource 'row by ID from a table', clearly identifying the operation and resource. It effectively distinguishes this tool from siblings like 'find_rows', 'list_rows', and 'get_row_activities', which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching a single row by ID, which is intuitive. However, it does not explicitly state when not to use this tool (e.g., for batch operations use 'list_rows' or 'find_rows'), though the sibling context helps disambiguate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_row_activitiesARead-onlyIdempotent
Get the change history of a specific row. Returns a list of activities showing who changed what and when, including old and new values. 25 activities per page.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name (used for context in the response) | |
| row_id | Yes | Row ID to get the activity history for | |
| page | No | Page number (default 1, 25 activities per page) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so behavior is safe. The description adds pagination detail (25 per page) which is useful, but doesn't mention limits on history retention or performance implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences clearly convey purpose and a key behavioral detail. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only history tool with full schema descriptions and annotations, the description is adequate. Missing details on ordering (chronological?) or whether all changes are recorded, but sufficient for selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter has a description. The tool description adds '25 activities per page' beyond schema, but does not explain the 'table' parameter's role beyond context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states that the tool retrieves change history for a specific row, including who changed what and when, with old and new values. This distinguishes it from siblings like get_row (current state) or list_rows (list of rows).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use: to get change history of a specific row. Does not explicitly exclude other tools, but the narrow purpose implies limited usage. Could mention alternatives like get_row or list_rows for non-historical data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schemaARead-onlyIdempotent
Returns the normalized schema for the base
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and not destructive, so the safety profile is clear. The description adds no additional behavioral traits beyond what annotations provide, but does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that effectively communicates the tool's purpose with no unnecessary words. It is appropriately sized for a zero-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not explain the return format or structure of the schema. For a schema tool, agents might need to know the schema format or any constraints. The description is sufficient but could be more complete with format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters, so the description need not add parameter information. The description provides the purpose of the output (schema), which adds meaning beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a schema for a base, which identifies the resource and action. The verb 'Returns' is specific and the resource 'normalized schema' is distinct from sibling tools like add_row or list_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives like list_tables or query_sql. However, returning a schema is a distinct operation, so usage is implied for understanding the structure of the base.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_rowsAIdempotent
Create links between rows via the dedicated links endpoint. This is the ONLY way to create links — link columns cannot be written via add_row or update_rows.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Source table name | |
| link_column | Yes | Name of the link column | |
| pairs | Yes | Array of row ID pairs to link |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare idempotentHint=true, indicating that repeated calls have the same effect, and the description adds context that this is the exclusive method for creating links, avoiding confusion with other write operations. However, no additional behavioral details like failure modes or side effects are provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. The description is concise and front-loaded, stating the core purpose first and then the critical constraint about exclusivity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of a sibling tool unlink_rows and the lack of output schema, the description could benefit from mentioning output behavior, but the combination of annotations (idempotentHint) and schema (required parameters) makes the tool largely complete for its intended use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (table, link_column, pairs) are already documented in the schema. The description does not elaborate on parameter meaning beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states the verb 'Create links between rows' and the resource 'dedicated links endpoint', clearly distinguishing it from sibling tools like add_row or update_rows by noting that this is the ONLY way to create links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use this tool (to create links) and explicitly states that alternative methods (add_row, update_rows) cannot be used, providing clear guidance on when not to use other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collaboratorsARead-onlyIdempotent
List users who have access to this base. Returns email (internal user ID) and display name. Use the email values when writing to collaborator columns. Call this once to resolve @auth.local addresses in collaborator columns before displaying them to the user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive. The description adds context about resolving @auth.local addresses, which is useful but does not disclose additional behavioral traits beyond what annotations cover. It doesn't mention rate limits, response size, or authorization needs, but the annotations sufficiently cover safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, each providing essential information: what it does, what it returns, and how to use it. No wasted words; front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has no parameters, no output schema, and annotations cover safety, the description is complete. It tells the agent what the tool does, what data it returns, and when to call it, which is all needed for correct selection and use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters and schema description coverage is 100%, so there is no parameter semantics to add. The description adds value by explaining what the returned fields (email, display name) mean and how to use them, even though it doesn't explain parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List'), resource ('users who have access to this base'), and provides specific output details (email, display name). It also distinguishes itself from sibling tools by specifying that it returns collaborator information, which is a unique function among the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool: 'Call this once to resolve @auth.local addresses in collaborator columns before displaying them to the user.' It also tells what to do with the output ('Use the email values when writing to collaborator columns'), which helps the agent understand its role in a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rowsARead-onlyIdempotent
List rows from a table with pagination (defaults: page=1, page_size=100). Use find_rows for filtering/sorting or query_sql for SQL queries.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| page | No | Page number (1-based) | |
| page_size | No | Rows per page (max 1000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the safety profile is covered. However, the description does not add any additional behavioral details beyond pagination defaults. It could mention that additionalProperties in schema is allowed (openWorldHint=false suggests no extra fields, but the schema allows them), but that's a schema issue, not description. Score 2 for lacking meaningful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with essential information and no wasted words. Front-loaded with purpose and pagination defaults, followed by sibling alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (3 simple params, no output schema, annotations present), the description is nearly complete. It could mention that additionalProperties are allowed per schema, but that's minor. Annotations cover safety well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for each parameter (table name, page number, page size). The description only restates defaults, adding no new semantic value beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List rows from a table with pagination', specifying the verb, resource, and key behavior. It distinguishes itself from sibling tools like find_rows (filtering/sorting) and query_sql (SQL queries).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool ('use find_rows for filtering/sorting or query_sql for SQL queries'), providing clear guidance and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesARead-onlyIdempotent
List tables in the SeaTable base with their columns (name, type, key). Includes select options and link configuration where applicable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint: true, destructiveHint: false, idempotentHint: true, which covers safety. The description adds specific output details (columns, select options, link config) beyond annotations, making behavior transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is efficient and informative. Every clause adds value: listing tables, columns with specifics, and optional details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless, read-only tool with rich annotations, this description is largely complete. It could optionally mention that it lists all tables, but that is implied. No output schema exists, but the description covers expected return contents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with no parameters. The description adds meaning about what is listed (name, type, key, select options, link config), which is useful context that the empty schema cannot provide. Baseline is 4 for 0 params; the description elevates to 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'list' and the resource 'tables in the SeaTable base' and explicitly mentions returned details: columns (name, type, key), select options, and link configuration. This clearly distinguishes it from siblings like get_schema or list_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for overview exploration of table schemas. It does not explicitly state when not to use it or mention alternatives. Since there is a sibling get_schema, an explicit comparison could be beneficial, 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.
ping_seatableARead-onlyIdempotent
Health check that verifies connectivity and auth to SeaTable
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, covering safety and idempotency. The description adds the behavioral trait of verifying connectivity and auth. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no waste, front-loaded purpose. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and comprehensive annotations, the description is complete enough. It might be helpful to mention that it returns success/failure, but not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters and schema description coverage is 100%. The description does not need to add parameter details, as there are none. Baseline 4 for 0 params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it's a health check that verifies connectivity and auth to SeaTable. The verb 'verifies' and resource 'connectivity and auth' make the purpose specific. It distinguishes itself from sibling tools which are all data operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a diagnostic tool to check connectivity and auth before using other tools. However, it does not explicitly state when not to use or mention alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_sqlADestructive
Execute SQL queries against SeaTable (SELECT, UPDATE, DELETE, INSERT). Use ? placeholders for parameters.
Syntax rules:
Quote table/column names with backticks:
Table Name,Column Name(not double quotes). Required for names with spaces, hyphens, or names matching function names.SELECT returns max 100 rows by default. Use LIMIT to get more (up to 10,000).
Aliases (AS) can be used in GROUP BY, HAVING, ORDER BY — but NOT in WHERE.
ORDER BY columns must appear in the SELECT field list.
No JOIN keyword. Use implicit joins: FROM
T1,T2WHERET1.col=T2.col. Only inner joins are supported.No subqueries, no UNION/UNION ALL.
Empty strings are treated as NULL. Use IS NULL / IS NOT NULL instead of = "".
Use ILIKE for case-insensitive matching (LIKE is case-sensitive).
For multi-select/collaborator columns use: HAS ANY OF, HAS ALL OF, HAS NONE OF, IS EXACTLY (values in parentheses like IN).
UPDATE limitations:
SET only accepts literal values (strings, numbers, booleans). No functions (date(), now(), upper()…) and no expressions (Amount + 10) allowed.
Columns not updatable via SQL: image, file, formula, link, link-formula, geolocation, auto-number, digital-sign, button.
INSERT only works with Big Data storage enabled (Enterprise). For non-archived tables, use append_rows instead.
If a query fails, do not retry with similar syntax. Switch to an alternative tool (e.g. update_rows, find_rows) instead.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SQL query (SELECT, INSERT, UPDATE, DELETE) | |
| parameters | No | Values for ? placeholders in the SQL query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, and description transparently details behavioral traits: UPDATE limitations (no functions/expressions), empty strings treated as NULL, lack of JOIN keyword and subqueries, and row limits with max 100 default, up to 10,000 with LIMIT.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections and examples, but slightly verbose; some rules could be consolidated. Front-loaded with essential purpose and placeholder syntax.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given complexity of tool (SQL queries with many constraints) and lack of output schema, description is remarkably complete: covers syntax rules, limitations for UPDATE/INSERT, failure handling, and even alternative tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage (sql string and parameters array), but description adds significant meaning beyond schema: explains ? placeholders, syntax rules for backticks, clauses where aliases work/not work, and parameter types implied in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states it executes SQL queries (SELECT, UPDATE, DELETE, INSERT) against SeaTable, clearly distinguishing it from sibling tools like find_rows or list_rows that use alternative query methods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides extensive when-to-use and when-not-to-use guidance: details syntax rules, INSERT limitations (requires Big Data storage, suggests append_rows as alternative), and explicit instruction to switch to alternative tools (update_rows, find_rows) on failure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rowsBRead-onlyIdempotent
Search rows with a filter object
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| query | Yes | Filter object with column name -> value pairs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, indicating no side effects. The description adds minimal behavioral context beyond that, but does not disclose limits on result size, pagination, or performance implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no wasted words. It is concise but slightly under-specified for a tool that could benefit from more details about filter structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (nested objects in query parameter), the description is incomplete. It doesn't explain how to construct a filter object, e.g., support for comparison operators, logical operators, or nesting. With no output schema, it also doesn't describe the return format. However, schema descriptions partially compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions: 'table' is target table name, 'query' is filter object with column-value pairs. The description reiterates 'filter object' but does not add new semantic details. However, the schema is clear enough that the tool is functional without augmentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Search rows with a filter object' clearly indicates the tool's purpose: searching rows using a filter. It distinguishes from sibling tools like 'list_rows' (which lists all rows) and 'find_rows' (which might use different criteria). However, it could be more specific about what kind of filtering is supported.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'list_rows', 'find_rows', or 'query_sql'. It doesn't mention that it is read-only (as indicated by annotations) or when it should be preferred over other search methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_rowsADestructiveIdempotent
Remove links between rows via the dedicated links endpoint. This is the ONLY way to remove links — link columns cannot be modified via update_rows.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Source table name | |
| link_column | Yes | Name of the link column | |
| pairs | Yes | Array of row ID pairs to unlink |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true (modification) and idempotentHint=true (safe to retry). The description adds context about the exclusive method for unlinking but doesn't disclose details like rate limits, side effects, or authorization requirements. However, given annotations cover the key behavioral traits, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the action and immediately provide crucial usage distinction. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is straightforward with only three parameters, all required and fully described in the schema. The description, combined with annotations and schema, provides complete context for correct invocation. No output schema, but return value is implied (success/failure), which is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter has a clear description in the schema. The description does not add further meaning 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Remove links between rows'), the specific endpoint ('dedicated links endpoint'), and distinguishes from update_rows by noting that link columns cannot be modified via update_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states that this is the ONLY way to remove links, contrasting with update_rows which cannot modify link columns. This gives clear guidance on when to use this tool vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_rowsADestructiveIdempotent
Batch update rows. Rejects unknown columns. Link and file/image columns cannot be modified here — use link_rows/unlink_rows and upload_file instead.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| updates | Yes | Array of updates, each with row_id and values |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and idempotentHint=true, which the description does not contradict. The description adds behavioral context: 'Rejects unknown columns' and limitations on certain column types. With annotations already covering safety, the description effectively adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: three short sentences covering purpose, constraints, and alternatives. No wasted words, information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, available schema, and annotations, the description covers the essential aspects: purpose, constraints on column types, and sibling tool alternatives. It lacks details about return values or error handling, but the tool has no output schema and is relatively straightforward. A minor gap for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents both parameters thoroughly. The description does not add additional parameter details beyond what the schema provides, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Batch update rows' (specific verb+resource). It also explicitly distinguishes itself from siblings by noting that link/file/image columns cannot be modified here and directing to link_rows/unlink_rows and upload_file instead, which differentiates it from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when not to use this tool: 'Link and file/image columns cannot be modified here — use link_rows/unlink_rows and upload_file instead.' This gives clear alternatives and usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileA
Upload a file or image to a row. Accepts base64-encoded file data and attaches it to the specified file or image column. By default appends to existing files; set replace=true to overwrite.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| column | Yes | Name of the file or image column | |
| row_id | Yes | Row ID to attach the file to | |
| file_name | Yes | File name with extension (e.g. "report.pdf") | |
| file_data | Yes | Base64-encoded file content | |
| replace | No | Replace existing files (default: append) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-destructive, non-idempotent, read-write behavior. The description adds value by clarifying that by default it appends (non-destructive) and that setting replace=true overwrites. It also specifies the input format (base64). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core action and format, then a critical usage detail. No redundancy or wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, 5 required, and no output schema, the description adequately covers the essential behavior: file upload via base64, attach to column, append/replace semantics. It could mention file size limits or supported formats, but the description is functional for a file upload tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema describes all 6 parameters with 100% coverage. The description adds minimal extra meaning beyond the schema, primarily clarifying the append vs replace behavior and the base64 encoding requirement. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Upload a file or image to a row' and specifies the input format (base64). It distinguishes from siblings like 'download_file' by focusing on upload, though it could explicitly differentiate from 'update_rows' which also modifies data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: accepts base64 data, attaches to specified column, and explains default behavior (append vs replace). However, it does not explicitly mention when not to use this tool (e.g., for large files, alternative upload methods) or contrast with related tools like 'update_rows'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_rowsAIdempotent
Batch upsert rows by matching on one or more key columns. If a match exists, update it; otherwise insert a new row. Rejects unknown columns. Link and file/image columns cannot be set here — use link_rows/unlink_rows and upload_file instead.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Target table name | |
| key_columns | Yes | Columns to match on for finding existing rows | |
| rows | Yes | Array of row objects (column name -> value) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it clarifies the upsert logic (update vs. insert), rejection of unknown columns, and limitations on link/file types. Annotations indicate idempotentHint: true and destructiveHint: false, which aligns with the upsert behavior. However, more detail on rate limits or error handling would elevate this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise and front-loaded with the core action. The second sentence adds important caveats. Slightly more could be said about behavior with partial key matches.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of an upsert operation and the presence of sibling tools, the description covers the essentials: logic, constraints, and alternatives. No output schema exists, but the description doesn't need to detail return values. Could mention if there is a limit on number of key_columns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already well-documented. The description adds value by explaining that key_columns are for matching, but does not elaborate on row object structure beyond 'column name -> value'; schema already describes that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Batch upsert rows' and specifies the resource 'rows' against a table. It distinguishes this tool from siblings by explicitly mentioning that link and file/image columns cannot be set here and should use link_rows/unlink_rows or upload_file instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: it describes the matching logic (match on key columns, update if exists, insert otherwise), and explicitly states when not to use it (for link and file/image columns), directing to sibling tools.
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. Dates show when Glama detected each change.
21 tool updates
v1.5.2- First observed
add_row - First observed
add_select_options - First observed
append_rows - First observed
create_snapshot - First observed
delete_rows - First observed
download_file - First observed
find_rows - First observed
get_row - First observed
get_row_activities - First observed
get_schema - First observed
link_rows - First observed
list_collaborators - First observed
list_rows - First observed
list_tables - First observed
ping_seatable - First observed
query_sql - First observed
search_rows - First observed
unlink_rows - First observed
update_rows - First observed
upload_file - First observed
upsert_rows
TDQS
Most tools have distinct purposes (e.g., add_row vs. append_rows, find_rows vs. list_rows vs. search_rows). However, add_row and append_rows could cause confusion, though descriptions clearly advise using append_rows for multiple rows. Similarly, list_rows, find_rows, search_rows, and query_sql overlap in querying but differ in method, with clear guidance on when to use each.
Tool names follow a consistent verb_noun pattern (e.g., add_row, delete_rows, list_rows, update_rows, upload_file). Minor deviations: ping_seatable (ping is not a data operation) and query_sql (verb before the type). Overall, most tools are predictable and follow the same style.
With 21 tools, the count is slightly high but reasonable given the breadth of operations (CRUD, linking, file handling, SQL queries, snapshots). Each tool serves a specific need, and the number aligns well with a comprehensive database-like API. No obvious bloat.
The tool set covers most essential operations: CRUD for rows (add, get, update, delete, upsert), linking, file upload/download, search, schema inspection, and snapshots. Minor gaps: no tool to modify table schema directly (only add_select_options), and no bulk delete or export functionality. Overall, very thorough for a typical use case.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
- mcpOAuthcom.airtable
Official Airtable MCP server — database and operations layer for agents.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol server that provides read and write access to Airtable databases. This server enables LLMs to inspect database schemas, then read and write records.3,739456TypeScriptMIT
- AlicenseDqualityNot gradedmaintenanceA comprehensive MCP server that provides sophisticated tools for interacting with PocketBase databases. This server enables advanced database operations, schema management, and data manipulation through the Model Context Protocol (MCP).1450270MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI tools to interact with Supabase databases, providing tools for reading, creating, updating, and deleting records in Supabase tables.MIT
- AlicenseNot gradedqualityFmaintenanceA Model Context Protocol (MCP) server that enables AI agents to interact with Microsoft SQL Server databases through secure, intelligent database operations. This server provides comprehensive CRUD capabilities, schema introspection, stored procedure execution, transaction management, and bulk opera82940MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/seatable/seatable-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server