SeaTable MCP
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| METRICS_PORT | No | Prometheus metrics port (default: 9090, HTTP mode only). | 9090 |
| SEATABLE_MOCK | No | Enable mock mode for offline testing (set to 'true'). | false |
| SEATABLE_MODE | No | Operation mode: 'selfhosted' (default) or 'managed' (multi-tenant HTTP with per-client auth). | selfhosted |
| SEATABLE_BASES | No | Multi-base configuration as a JSON array string (e.g. '[{"base_name":"CRM","api_token":"token_abc"}]'). Required in self-hosted mode if SEATABLE_API_TOKEN is not provided. | |
| SEATABLE_API_TOKEN | No | Single-base API token. Required in self-hosted mode if SEATABLE_BASES is not provided. | |
| SEATABLE_SERVER_URL | Yes | Your SeaTable server URL (e.g., https://cloud.seatable.io or your own instance) | |
| CORS_ALLOWED_ORIGINS | No | Comma-separated list of allowed origins for CORS (HTTP mode only, disabled if unset). |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_tablesA | List tables in the SeaTable base with their columns (name, type, key). Includes select options and link configuration where applicable. |
| list_rowsA | 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. |
| get_rowA | Get a row by ID from a table |
| add_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. |
| 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. |
| update_rowsA | Batch update rows. Rejects unknown columns. Link and file/image columns cannot be modified here — use link_rows/unlink_rows and upload_file instead. |
| delete_rowsA | Delete one or more rows from a table by their IDs. |
| find_rowsA | 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":{...}}. |
| search_rowsB | Search rows with a filter object |
| upsert_rowsA | 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. |
| link_rowsA | 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. |
| unlink_rowsA | 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. |
| get_schemaA | Returns the normalized schema for the base |
| query_sqlA | Execute SQL queries against SeaTable (SELECT, UPDATE, DELETE, INSERT). Use ? placeholders for parameters. Syntax rules:
UPDATE limitations:
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. |
| list_collaboratorsA | 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. |
| 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. |
| download_fileA | 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:
|
| 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. |
| get_row_activitiesA | 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. |
| add_select_optionsA | Add new options to a single-select or multi-select column. Use this before writing rows with option values that do not exist yet. |
| ping_seatableA | Health check that verifies connectivity and auth to SeaTable |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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