airtable-user-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_base_schemaA | Get the full schema of an Airtable base — all tables, fields (with typeOptions), and views in one call. Use this when you need fields or views; use |
| list_tablesA | List all tables in a base with their IDs and names — lightweight scaffolding call (no field data). Use this when you only need table IDs/names; use |
| get_table_schemaA | Get the full schema for a single table — all fields (with typeOptions) and views. Use instead of |
| list_fieldsA | List fields in a table — returns id, name, type, and typeOptions per field. Use instead of |
| 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_tableA | 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_templateB | 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): Supported names: "text", "multilineText", "number", "checkbox", "date", "singleSelect", "multipleSelects", "rating", "formula", "rollup", "lookup", "count" Friendly aliases (auto-normalized): "url" → type: "text" with validatorName = "url" "email" → type: "text" with validatorName = "email" "phone" / "phoneNumber" → type: "text" with validatorName = "phoneNumber" "dateTime" → type: "date" with isDateTime: true TYPE OPTIONS by fieldType: formula: { formulaText: "..." } rollup: { relationColumnId: "fldLINK", foreignTableRollupColumnId: "fldTARGET", formulaText: "SUM(values)" } (formulaText is REQUIRED — e.g. "SUM(values)", "COUNTA(values)", "IF(OR(values='X'),1,0)")) (old keys fieldIdInLinkedTable/recordLinkFieldId are auto-translated for backward compat) lookup: { relationColumnId: "fldLINK", foreignTableRollupColumnId: "fldTARGET" } (old keys fieldIdInLinkedTable/recordLinkFieldId are auto-translated for backward compat) 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: "blue" }], default: "selXXX" } multipleSelects: { choices: [{ name: "PC", color: "blue" }, { name: "Xbox", color: "cyan" }], default: ["selXXX"] } text / multilineText / checkbox / rating: omit typeOptions entirely — passing {} causes a 422 SELECT CHOICES:
|
| create_formula_fieldA | Create a new formula field — shorthand for |
| 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. |
| download_formula_fieldA | Download the formula text of a formula field to a local file. Writes a .formula file with a # AT: metadata header (appId, tableId, fieldId, fieldName) so the file can later be uploaded back with update_formula_field or the VS Code right-click command. When outputPath is omitted, returns the formula text without writing a file. |
| download_base_formulasA | Download ALL formula fields from a base to local .formula files, organized into per-table subfolders. Each file includes a # AT: header with appId, tableId, fieldId, fieldName, description, and resultType. Tables with no formula fields are silently skipped. outputDir defaults to the current working directory when omitted. |
| update_field_configA | Update the configuration of any field — computed OR non-computed. Works for formula, rollup, lookup, count, singleSelect, multipleSelects, number, date, text, and all other field types. COMMON typeOptions by fieldType: formula: { formulaText: "IF({Field}, 1, 0)" } rollup: { relationColumnId: "fldLINK", foreignTableRollupColumnId: "fldTARGET", formulaText: "SUM(values)" } (formulaText is REQUIRED; old keys fieldIdInLinkedTable/recordLinkFieldId auto-translated) lookup: { relationColumnId: "fldLINK", foreignTableRollupColumnId: "fldTARGET" } (old keys fieldIdInLinkedTable/recordLinkFieldId auto-translated) count: { recordLinkFieldId: "fldXXX" } singleSelect: { choices: [{ name: "Option A", color: "blue" }], default: "selXXX" } multipleSelects: { choices: [{ name: "PC", color: "blue" }, { name: "Xbox", color: "cyan" }], default: ["selXXX"] } number: { format: "integer"|"decimal"|"currency"|"percentV2", precision: 2, symbol: "$", negative: false } text / multilineText / checkbox: omit typeOptions entirely — passing {} causes a 422 SELECT CHOICES:
ADDING TO AN EXISTING SELECT FIELD (merge, not replace): Choices not in the list are DELETED. To add without losing existing choices:
REPLACING ALL CHOICES: just pass the new choices without any IDs. |
| update_formula_fieldA | Update the formula body of an existing formula field — shorthand for |
| 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 fieldId AND expectedName as a safety guard — deletion is refused if the name does not match. ⚠️ Irreversible: deleted field data is permanently lost and cannot be recovered. Always checks downstream dependencies first (formula fields, lookups, rollups referencing this field); returns dependency info without deleting unless force=true. |
| delete_fieldsA | Delete multiple fields from an Airtable table in a single call. Each entry requires fieldId and expectedName as a safety guard (deletion is refused if names do not match). Fields are processed sequentially and all are attempted even if some fail — partial results are always returned. Optionally writes a JSON checkpoint file after each deletion so the batch can be resumed if interrupted. |
| create_viewB | 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_viewC | 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 columns in a view without affecting others. Pass field IDs + a visibility flag — every listed ID is set to that state, all other columns are untouched. Use |
| 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_sectionB | 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 reset: hides every column then shows only |
| show_or_hide_all_columnsA | Show or hide every column in a view in one call. Use when you want a clean all-visible or all-hidden baseline. Use |
| move_visible_columnsA | Move columns by visible-only index (index 0 = leftmost shown column, hidden columns not counted). Use when you want to position relative to what the user sees. Use |
| 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_fieldB | 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_dashboardB | 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_stateB | Enable or disable an extension installation. |
| rename_extensionC | Rename an installed extension. |
| duplicate_extensionB | Duplicate an installed extension on a dashboard page. |
| remove_extensionB | Remove an installed extension from a dashboard. |
| query_recordsA | Read records from an Airtable table view. Returns resolved field values including lookup fields. Supports optional client-side text search across all field values — unlike the REST API filterByFormula approach, this search works correctly on lookup fields. Fetch up to 1000 records per call. |
| duplicate_recordsA | Duplicate one or more existing records within a table. Creates exact copies of the specified source records in the same table and view. Returns the new record IDs. |
| 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 |
|---|---|
| airtable-fix-formula | Debug and fix an Airtable formula error or unexpected result |
| airtable-create-formula | Create an Airtable formula from a plain-language description |
| airtable-inspect-base | Explore and summarise the schema of an Airtable base |
| airtable-setup-view | Configure an Airtable view — filters, sorts, groups, and column order |
| airtable-manage-select-choices | Add, remove, or replace choices on a singleSelect or multipleSelects field |
| airtable-search-records | Search for records in an Airtable table by text, including lookup field values |
| airtable-setup-rollup-lookup | Create or update a rollup or lookup field with guided field-ID resolution |
| airtable-build-table | Design and create a complete table structure from plain-language requirements |
| airtable-bulk-formula-edit | Download all formula fields from a base, edit them offline, then upload changes |
| airtable-validate-formula | Validate an Airtable formula and show its result type |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/Automations-Project/VSCode-Airtable-Formula'
If you have feedback or need assistance with the MCP directory API, please join our Discord server