airtable-user-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_base_schemaA | Get the full schema of an Airtable base including all tables, fields, and views. |
| list_tablesA | List all tables in an Airtable base with their IDs and names. Uses lightweight scaffolding data. |
| get_table_schemaA | Get the full schema for a single table including all fields and views. |
| list_fieldsA | List all fields (columns) in a specific table of an Airtable base. |
| list_viewsA | List all views in a specific table with their IDs, names, and types. |
| get_viewA | Read a view's live configuration from the base. Returns filters, sorts, groupLevels, columnOrder (rich per-column visibility + width), frozenColumnCount, colorConfig, metadata (view-type specific, e.g. gallery cover, calendar date field), rowHeight, description. Use this before update_view_filters / apply_view_sorts / update_view_group_levels to audit current state and choose between replace and append modes. Data source: internally hits /v0.3/table/{tableId}/readData with includeDataForViewIds=[viewId]. The application/read endpoint alone does NOT return filter/sort/group state — that's why the update tools need either "append" mode or a prior get_view call to merge safely. Fields:
|
| create_tableA | Create a new table in an Airtable base. Returns the generated table ID. The table starts with default fields (Name, Notes, Attachments, Status, etc.) — use list_fields after creation to inspect them. |
| rename_tableB | Rename a table in an Airtable base. |
| delete_tableA | Delete a table from an Airtable base. Requires both tableId AND the expected table name as a safety guard — refuses to delete if the name does not match. Airtable rejects deleting the last remaining table in a base. |
| list_record_templatesA | List all record templates for a table. Templates are embedded in the base scaffolding data. If the templates array is empty, pass debug:true and inspect the raw response to locate the templates key — the API path may vary by base. |
| create_record_templateA | Create a new record template for a table. Returns the generated templateId (rtp-prefixed). After creating, use set_record_template_cell to pre-fill field values. |
| rename_record_templateA | Rename an existing record template. |
| update_record_template_descriptionA | Set or update the description text of a record template. |
| set_record_template_cellA | Pre-fill a field value on a record template. CELL OBJECT TYPES (verified via API capture 2026-05-01): Static value (text, number, boolean, single-select choice ID): { "type": "static", "value": "some text" } { "type": "static", "value": 42 } { "type": "static", "value": true } { "type": "static", "value": "selXXXXXXXXXXXXXX" } ← single-select: pass choice ID Linked record(s): { "type": "linkedRows", "value": [{ "foreignRowId": "recXXX", "foreignRowDisplayName": "Record Name" }] } To clear a field, omit the cellObject or pass null value. |
| set_record_template_visible_columnsA | Set which columns are shown (pre-fillable) on a record template. Pass an empty array to show all columns. isPartialSelection:true means only listed columns are shown; false means all are shown. |
| duplicate_record_templateA | Duplicate a record template within the same or a different table. Returns the new template ID. |
| apply_record_templateA | Apply (instantiate) a record template to create a new record pre-filled with the template's field values. Returns the new record data. |
| delete_record_templateA | ⚠️ DESTRUCTIVE — Permanently delete a record template. This cannot be undone. |
| create_fieldA | Create a new field in an Airtable table. Supports all field types including computed fields (formula, rollup, lookup, count) that are not available via the official API. FIELD TYPES (fieldType parameter): Canonical (internal-API names): "text", "multilineText", "number", "checkbox", "date", "singleSelect", "multipleSelects", "rating", "formula", "rollup", "lookup", "count" Friendly aliases (auto-normalized to internal shape): "url" → type: "text" with typeOptions.validatorName = "url" "email" → type: "text" with typeOptions.validatorName = "email" "phone" / "phoneNumber" → type: "text" with typeOptions.validatorName = "phoneNumber" "dateTime" → type: "date" with typeOptions: { isDateTime: true, dateFormat, timeFormat, timeZone, shouldDisplayTimeZone } TYPE OPTIONS by fieldType: formula: { formulaText: "..." } rollup: { fieldIdInLinkedTable, recordLinkFieldId, resultType, referencedFieldIds } lookup: { recordLinkFieldId, fieldIdInLinkedTable } count: { recordLinkFieldId } number (integer): { format: "integer", negative: false } number (currency): { format: "currency", symbol: "$", precision: 2, negative: false } number (percent): { format: "percentV2", precision: 2, negative: false } date / dateTime: { dateFormat: "Local"|"us"|"european"|"iso"|"friendly", timeFormat: "12hour"|"24hour", timeZone: "UTC"|"client"|, shouldDisplayTimeZone: true|false, isDateTime: true (auto for dateTime) } singleSelect: { choices: [{ name: "Option A", color: "blueLight2" }] } |
| create_formula_fieldB | Create a new formula field in a table. Shorthand for create_field with type "formula". |
| validate_formulaA | Validate a formula expression before creating or updating a formula field. Returns whether the formula is valid and what result type it produces (text, number, etc). Use this before create/update to catch errors early. |
| update_field_configB | Update the configuration of any computed field (formula, rollup, lookup, count, etc). Use this to change formula text, rollup settings, etc. |
| update_formula_fieldA | Update the formula text of an existing formula field. Shorthand for update_field_config with type "formula". |
| rename_fieldA | Rename a field (column) in an Airtable table. Pre-validates the field exists before mutating. |
| delete_fieldA | Delete a field from an Airtable table. Requires both fieldId AND the expected field name as a safety guard. First checks for downstream dependencies — if found, returns dependency info instead of deleting. Set force=true to delete even with dependencies. |
| create_viewA | Create a new view in an Airtable table. Optionally copy configuration from an existing view. View types: "grid", "form", "kanban", "calendar", "gallery", "gantt", "levels" (list view). |
| duplicate_viewA | Duplicate an existing view with all its configuration (filters, sorts, field visibility, etc). |
| rename_viewB | Rename a view. |
| delete_viewA | Delete a view from a table. Cannot delete the last remaining view in a table. |
| update_view_descriptionA | Update the description text of a view. |
| update_view_filtersA | Update the filter configuration of a view. Supports AND/OR conjunctions, nested filter groups, and Airtable's internal filter operators. FILTER FORMAT: Leaf filter: { columnId: "fldXXX", operator: "", value: } Nested group: { type: "nested", conjunction: "and"|"or", filterSet: [...] } Clear filters: { filterSet: [], conjunction: "and" } (or pass filters: null) Filter IDs (flt-prefixed) are auto-generated — do NOT include them. OPERATORS by field type — verified against Airtable's internal API (2026-04-17 capture; user report 2026-04-30):
Text / URL / Email / Phone:
"=" (exact match — value: string)
"!=" (not equal)
"contains" (value: string)
"doesNotContain"
"isEmpty" / "isNotEmpty" — input-side; auto-rewritten to "=" / "!=" "" before sending (the internal API rejects them on text fields with FAILED_STATE_CHECK)
Number / Percent / Currency:
"=", "!=", "<", ">", "<=", ">=", "isEmpty", "isNotEmpty"
Single select:
"=" (value: "selXXX" — the choice ID, NOT the choice name)
"!="
"isAnyOf" / "isNoneOf" (value: ["selXXX", "selYYY"] — array of choice IDs)
"isEmpty" / "isNotEmpty"
Multiple select:
"hasAnyOf", "hasAllOf", "hasNoneOf", "isExactly", "isEmpty", "isNotEmpty"
Checkbox:
"=" (value: true|false)
Date (absolute):
"is", "isBefore", "isAfter", "isOnOrBefore", "isOnOrAfter", "isEmpty", "isNotEmpty"
value: ISO date string e.g. "2026-01-15"
Date (relative) — "isWithin":
value: { "mode": "", "timeZone": "", "shouldUseCorrectTimeZoneForFormulaicColumn": true }
timeZone: IANA string e.g. "Europe/Istanbul", "America/New_York", "UTC"
Modes (no numberOfDays): "pastWeek", "pastMonth", "pastYear",
"nextWeek", "nextMonth", "nextYear",
"thisCalendarMonth", "thisCalendarYear"
Modes (add numberOfDays key): "pastNumberOfDays", "nextNumberOfDays"
Example — past week: { "operator": "isWithin", "value": { "mode": "pastWeek", "timeZone": "UTC", "shouldUseCorrectTimeZoneForFormulaicColumn": true } }
Example — past N days: { "operator": "isWithin", "value": { "mode": "pastNumberOfDays", "numberOfDays": 7, "timeZone": "UTC", "shouldUseCorrectTimeZoneForFormulaicColumn": true } }
Example — this month: { "operator": "isWithin", "value": { "mode": "thisCalendarMonth", "timeZone": "UTC", "shouldUseCorrectTimeZoneForFormulaicColumn": true } }
Formula / Lookup / Rollup (text result type):
Same as Text. "isEmpty" / "isNotEmpty" are auto-rewritten to "=" / "!=" "".
Linked record (foreignKey):
"contains" (value: linked record name) works.
"isEmpty" / "isNotEmpty" do NOT work — the call throws a clear error directing
you to a helper formula like AUTO-NORMALIZATION (applied client-side before the request):
NESTING LIMIT:
The internal API accepts at most 2 levels of nesting (top conjunction + one
layer of nested groups). Deeper trees are rejected with FAILED_STATE_CHECK.
Workaround: flatten by repeating shared conditions inside each leaf group,
e.g. EXAMPLES: Text equals: { filterSet: [{ columnId: "fldXXX", operator: "=", value: "Prime" }], conjunction: "and" } SingleSelect equals: { filterSet: [{ columnId: "fldXXX", operator: "=", value: "selABC123" }], conjunction: "and" } Text contains: { filterSet: [{ columnId: "fldXXX", operator: "contains", value: "hello" }], conjunction: "and" } Number range: { filterSet: [{ columnId: "fldX", operator: ">=", value: 10 }, { columnId: "fldX", operator: "<=", value: 100 }], conjunction: "and" } Nested (a AND (b OR c)): { filterSet: [{ columnId: "fldA", operator: "contains", value: "x" }, { type: "nested", conjunction: "or", filterSet: [{ columnId: "fldB", operator: "=", value: 1 }] }], conjunction: "and" } |
| reorder_view_fieldsA | Reorder the fields (columns) displayed in a view. Accepts a partial map: pass only the field IDs you want to move, e.g. |
| show_or_hide_view_columnsA | Show or hide specific fields (columns) in a view. Pass an array of column IDs and a single visibility flag — every ID in the array is set to that visibility. To toggle many fields at once, send the full set in one call (no separate "show all" / "hide all" tool exists today; that lives in 2.4.0+). |
| apply_view_sortsA | Apply sort conditions to a view. Default mode replaces all existing sorts — pass an empty array with operation="replace" to clear. Use operation="append" to add new sorts on top of the view's existing sort stack without rewriting them. |
| update_view_group_levelsA | Set grouping on a view. Default mode replaces all existing group levels — pass an empty array with operation="replace" to clear grouping. Use operation="append" to add new group levels below the existing ones without rewriting them. |
| update_view_row_heightA | Change the row height of a grid view. |
| list_view_sectionsA | List all sidebar sections for a table. Sections are user-organized groupings of views in the Airtable left sidebar (e.g. "🚀 Posting workflow", "🗑️ Sold workflow"). Returns each section's id, name, and the views inside it. The table-level |
| create_view_sectionA | Create a new sidebar section in a table. Returns the new section ID (vsc-prefixed). Use |
| rename_view_sectionA | Rename a sidebar section. |
| delete_view_sectionA | Delete a sidebar section. Views inside the section are NOT deleted — Airtable auto-promotes them to ungrouped at the table-level position the section used to occupy. Verified 2026-04-30. |
| move_view_to_sectionA | Move a view (or a section itself) within the sidebar. The single endpoint covers four user actions depending on the arguments:
|
| set_view_columnsA | One-shot view-column setup. Hides every column in the view, then shows only |
| show_or_hide_all_columnsA | Show or hide every column in a view in one call. Use |
| move_visible_columnsA | Move one or more columns to a new position in the visible-only index. Index 0 is the leftmost visible column. Distinct from |
| move_overall_columnsA | Move one or more columns to a new position in the overall index (visible + hidden). Sibling of |
| update_frozen_column_countA | Set the frozen-column divider position for a grid view. The first N columns from the left are frozen and stay visible during horizontal scroll. |
| set_view_coverA | Set the cover-image field and crop/fit mode for Kanban or Gallery views. Pass |
| set_view_color_configA | Apply a color config to a view (Kanban / Gallery / Calendar). Currently supports |
| set_view_cell_wrapA | Toggle whether long cell values wrap (multi-line) or truncate (single-line with ellipsis). |
| set_calendar_date_columnsA | Set the date-column ranges shown on a Calendar view. Each entry is either { startColumnId } for single-point events or { startColumnId, endColumnId } for range events. The array form lets a single calendar overlay multiple date series at once (e.g. "Created date" + "Start → End range" together). |
| set_form_metadataA | Update one or more legacy-form-view metadata properties in a single call. Unset properties are not touched. Each property fans out to its own atomic Airtable endpoint. Supported properties: description — intro text shown above the form afterSubmitMessage — "thank you" text after submission redirectUrl — URL to redirect to after submit refreshAfterSubmit — post-submit behavior (e.g. "REFRESH_BUTTON") shouldAllowRequestCopyOfResponse — boolean: show "send me a copy" toggle to respondents shouldAttributeResponses — boolean: track which user submitted (for signed-in respondents) isAirtableBrandingRemoved — boolean: hide Airtable branding (paid plans only) Note: "form title" is the view name itself — use rename_view to change it. "Field labels on the form" use a per-field endpoint that has not been captured yet. |
| set_form_submission_notificationA | Toggle email-on-submit notifications for a specific user on a form view. Per-user, not per-form (separate from set_form_metadata). |
| update_field_descriptionA | Update the description text of a field. |
| duplicate_fieldA | Duplicate (clone) a field in a table. Optionally also duplicate the cell values. |
| create_extensionA | Create a new extension (block) in an Airtable base. Returns the block ID needed for installation. Use this to register custom extensions before installing them. |
| create_extension_dashboardC | Create a new extension dashboard page in a base. Extensions are installed onto dashboard pages. |
| install_extensionA | Install an extension onto a dashboard page. Requires a block ID (from create_extension) and a page ID (from create_extension_dashboard). |
| update_extension_stateA | Enable or disable an extension installation. |
| rename_extensionA | Rename an installed extension. |
| duplicate_extensionB | Duplicate an installed extension on a dashboard page. |
| remove_extensionA | Remove an installed extension from a dashboard. |
| manage_toolsA | Control which tools are available. Actions: list_profiles, switch_profile, get_tool_status, toggle_tool, toggle_category. Use this to switch between read-only, safe-write, full, or custom profiles, or enable/disable individual tools. Active profile: "full" — all tools enabled. |
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/Automations-Project/VSCode-Airtable-Formula'
If you have feedback or need assistance with the MCP directory API, please join our Discord server