Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
The Airtable MCP server presents moderate definition quality with consistent naming patterns and adequate schemas, but suffers from significant gaps in parameter descriptions, output schema documentation, and error handling guidance. All 12 tools follow the verb_noun convention (list_, get_, create_, update_, delete_, search_, filter_, aggregate_), which is positive. However, most parameters lack detailed descriptions explaining constraints, formats, and valid values. Tool descriptions are present but brief (40-80 chars typically), falling below the 194-char baseline for production tools. Output schemas are not documented, critical for LLM planning. Error handling is minimal; there is no guidance for recovery or error classification. Security validation code is present (injection protection, field name validation) but not reflected in parameter descriptions or error-handling contracts.
Output schemas not documented. Tools return data structures but LLMs cannot see what fields to expect, forcing exploratory calls and breaking response-field-naming alignment for downstream tool chains.
Parameter descriptions lack constraint and format details. 'fields' parameter in create_record and update_record provides no guidance on field names, types, or valid values. 'filter_formula' in list_records and aggregate_records mentions 'Optional Airtable filter formula' but does not explain syntax or injection-prevention expectations, despite defensive validation code present in validators.py.
Document all return types and fields for each tool. E.g. list_bases should specify it returns [{base_id, name, created_time, ...}] with per-field types. Use this to guide LLM planning and enable response-field-naming alignment with downstream tools.
Expand tool descriptions to 150-250 chars. Include WHEN-to-use context: 'List all accessible bases to discover available workspaces before accessing tables. Call this first if you do not know the base_id.' Include dependency hints for related tools.
Enhance parameter descriptions with concrete format expectations. For 'base_id': 'Airtable base ID, always starts with "app" (e.g., "appXYZ123...")'. For 'filter_formula': 'Optional Airtable filter formula string (e.g., "{Status}=\'active\'" to filter by status field). Formula injection is prevented server-side.' For 'fields': 'JSON object mapping field names to values. Field names must match table schema. Example: {"Name": "John", "Email": "john@example.com"}.'
Add error handling documentation to each tool. E.g. delete_record: 'Errors: Record not found (user-fixable: verify record_id), Permission denied (fatal: check credentials), Network timeout (retryable: wait and retry).' Reference error codes and recovery actions.
Explicitly document pagination for list_* and search_* tools. E.g. list_records: 'Returns up to max_records matching results. To fetch all records, make multiple calls incrementing a page offset (offset param if supported) or using a continuation cursor (if returned in next_cursor field). Document what pagination mechanism is supported and how to use it.'
Spec posture evidence
Inferred effective spec: <=2025-11-25.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Score history
Overall score trend
↑ 49 points across a rubric change (v1 → v2)
49/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
49
<=2025-11-25
v2
2026-03-09
F
0
-
v1
78/100
List all accessible Airtable bases
list_recordsread onlyauth50/100
List records from an Airtable table with optional filtering and pagination
list_tablesread onlyauthsource verified77/100
List all tables in a specific Airtable base
search_recordsread onlyauthsource verified78/100
Search for records in an Airtable table by field value
Tool descriptions too brief (40-70 chars). Baseline for production is 194 chars. Descriptions lack WHEN-to-use context, dependencies, or operation consequences. E.g. delete_record says 'Delete a record' but does not warn of irreversibility or suggest dry-run patterns.
No error handling guidance. Code includes SecurityError and ValidationError exceptions but tool definitions provide no guidance on what errors agents should expect, how to classify them (retryable vs. user-fixable), or how to recover. LLMs will not know whether to retry, ask the user, or abandon.
No pagination documentation for list_* tools. list_records and search_records accept max_records but do not document whether they return a cursor, offset, total_count, or how to fetch the next page. Production baselines require explicit pagination guidance.
Parameter type mismatches in naming. 'base_id', 'table_id', 'record_id', 'field_name' parameters lack explicit type descriptions (string vs. ID format). Code validates base_id starts with 'app' but this constraint is not in parameter descriptions, LLMs will not know the expected format.
Destructive operations lack confirmation or dry-run pattern. delete_record is marked DESTRUCTIVE but tool definition provides no mention of confirmation, undo, or dry-run capability. Code does not appear to support these recovery patterns.
max_records defaults and caps not documented. list_records, search_records, and filter_by_date accept max_records with claimed default/cap but description does not state these explicitly. Code comment says 'max: 1000' for list_records but this is not in the schema description.
list_recordssearch_recordsfilter_by_date
Specify constraints for numeric parameters inline in descriptions. E.g. max_records: 'Maximum number of records to return (integer, range 1-1000, default 100).'
Add operation-consequence notices to WRITE and DESTRUCTIVE tools. E.g. delete_record: 'WARNING: This operation is irreversible. The record will be permanently deleted from the Airtable base. Consider implementing a soft-delete workflow if recovery is needed.' update_record: 'Updates an existing record. Partial updates are supported (send only the fields you want to change).'
Provide example usage or pre-filled parameter guidance in descriptions where helpful. E.g. search_records: 'Search for records matching a field value. Example: search in Name field for "John" with exact_match=false to find partial matches. Returns matching record_ids for use with get_record or update_record.'
Consider adding optional 'dry_run' parameter to delete_record to let agents preview impact before committing. Similarly, support a 'simulate' mode for create_record and update_record if feasible.
Document API-level constraints (rate limits, max payload size) in a server-level note or per-tool notes for tools that might hit them (e.g. batch operations).