An MCP server that enables LLM-based code generation and execution for Airtable operations. It provides a Python client wrapper for connecting to an Airtable MCP server and executing code dynamically.
This Airtable MCP server has fundamental definition quality issues. While all 15 tools have names and descriptions, the definitions lack rigor expected for production use. Tool descriptions are generic (averaging ~80 chars, well below the 194-char baseline for A+ tools). Parameter descriptions exist but are often vague or missing constraint details. Most critically, the server relies on inferred tool definitions from a code generation pattern rather than explicit, schema-driven registration visible in the MCP handler. No input/output schemas are formally documented or visible in the MCP protocol layer. Error handling is absent, there are no recovery guides, error categorization, or actionable error messages defined. Security posture is weak: API keys and MCP URLs are passed as parameters or environment variables without server-side secret injection patterns. The server appears to be designed around code generation via LangChain rather than direct MCP tool invocation, which means tool definitions may not be statically analyzable from the MCP server code itself.
Create a comment on a record.
Create a new field in a table.
Create a new record in a table.
Create a new table in a base.
Delete records from a table.
Get detailed information about a specific table.
Get a specific record by ID.
Tool definitions appear to be inferred from code generation patterns rather than explicitly registered via MCP protocol. No static MCP handler/server registration visible in provided source.
Parameter descriptions are generic and lack constraint specifications. E.g., 'detail_level' in list_tables says 'Level of detail' but does not explain when to use each option or what performance/cost implications exist. Example values ('tableIdentifiersOnly') appear in descriptions, which risks LLM literal reuse.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | F | 46 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
List all accessible Airtable bases.
List comments on a record.
List records from a table.
List all tables in a specific base.
Search for records containing specific text.
Update a field's name or description.
Update up to 10 records in a table.
Update a table's name or description.
No output schemas documented. Tool descriptions do not specify what fields are returned, data types, or structure. E.g., list_records says 'List records from a table' but does not document whether it returns paginated results, what pagination fields are available, or total count.
No error handling or recovery guidance defined. Tools do not specify what errors are possible, whether they are retryable, or what the LLM should do next. E.g., create_record does not document 'invalid field name' or 'field type mismatch' errors.
Destructive operations (delete_records) lack confirmation or dry-run patterns. No mention of rate limits, batch size limits (delete_records should clarify max items), or safeguards against catastrophic bulk deletes.
API keys and credentials are passed as parameters or embedded in environment variables (mcp_url='http://localhost:8000/mcp'). This violates secret-injection patterns, credentials will appear in traces and agent logs. Airtable API token should be injected server-side.
Tool composition risk: Agent code generation pattern (airtable_agent.py) generates Python code that is then executed. This creates a prompt injection surface, malicious user input could inject arbitrary Python into generated code. No input sanitization or code validation visible.
Pagination is mentioned in some parameter docs (e.g., offset in list_comments) but inconsistently. list_records accepts max_records but does not document total count or whether next/cursor is available. Creates ambiguity about whether subsequent calls return duplicate or new data.
Tool naming 'update_records' (plural) vs 'create_record' (singular) is asymmetric. LLM must reason about singular vs plural. Pattern says use consistent verb_noun: prefer 'update_record' with optional array param, or 'batch_update_records' if bulk-only.
Parameters like base_id, table_id, record_id require opaque Airtable IDs. No support for human-friendly names (e.g., 'base_name' alongside 'base_id'). Forces agents to issue extra discovery calls. Design should accept 'table_name' or 'table_id' and resolve internally.