> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the Airtable MCP server

The Airtable MCP connector routes your AI agent's tool calls to Airtable's own MCP server through Scalekit. Each user signs in to Airtable once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 43 tools.

**Authentication:** OAuth 2.1/DCR
**Categories:** Project Management, Databases, Productivity
**Tools:** 43: 22 read, 12 write, 9 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=AIRTABLEMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Airtable MCP connection

   In **AgentKit > Connections**, create an Airtable MCP connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

   Scalekit credentials are available for Airtable, so you don't need to register an OAuth app.

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'airtablemcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Airtable MCP:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'airtablemcp_get_create_automation_instructions',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "airtablemcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Airtable MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="airtablemcp_get_create_automation_instructions",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'airtablemcp_describe_page_element',
  toolInput: {
    elementType: 'kanban',
  },
  connector: 'airtablemcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="airtablemcp_describe_page_element",
    tool_input={
        "elementType": "kanban",
    },
    connection_name="airtablemcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `airtablemcp_describe_page_element`

Get the required configuration for a page element type · Read-only

Returns the JSON schema for a page element of the specified type. Use this before create_page to discover the element config shape required within pageConfiguration.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `elementType` (`string`, required): The page element type to get the config schema for. One of: `kanban`, `list`, `calendar`, `gallery`, `grid`, `timeline`, `number`, `barChart`, `lineChart`, `scatterChart`, `pieChart`, `donutChart`, `pivotTable`.

Example input: `{"elementType":"kanban"}`

### `airtablemcp_describe_page_type`

Get the required configuration for a page type · Read-only

Returns the JSON schema for a page type's configuration. Use this before create_page to discover the required pageConfiguration shape for the chosen page type.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pageType` (`string`, required): The page type to get the config schema for. One of: `visualization`, `dashboard`, `customElement`.

Example input: `{"pageType":"visualization"}`

### `airtablemcp_fetch_automation_input_data`

Fetch input options for an automation action or trigger · Read-only

Fetches dynamic input options for an automation action or trigger's input field (e.g. Slack
channels, Jira projects, calendars). Requires an `externalAccountId` from
list_external_accounts.
Use get_create_automation_instructions to discover which `inputKey`
values each action or trigger type expects.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `externalAccountId` (`string`, required): Must start with "eac" and is 17 characters long.
Example: "eacZfrNIUEip5MazD".
To get externalAccountId, use the list_external_accounts tool.
- `inputKey` (`string`, required): The input field to fetch options for (e.g., "slackConversationId", "msTeamsTeamId").
- `workflowNodeTypeId` (`string`, required): The action or trigger type ID. Use the camelCase type value (e.g., "sendToSlack", "atlassianJiraCreateIssue", "googleCalendarEventCreated").
- `dependentInput` (`object`, optional): Values of prerequisite inputs this field depends on. For example, to fetch MS Teams channels, pass {"msTeamsTeamId": "<team-id>"}.
- `pagingCount` (`number`, optional): Number of results to return. Default 10.
- `pagingStartIndex` (`number`, optional): Start index for pagination. Default 0.
- `searchQuery` (`string`, optional): Filter results by name.

Example input: `{"externalAccountId":"eacZfrNIUEip5MazD","inputKey":"slackConversationId","workflowNodeTypeId":"sendToSlack"}`

### `airtablemcp_get_automation`

Get automation configuration · Read-only

Gets the full configuration of a single automation in an Airtable base, including trigger
configuration, action nodes with their input expressions, and deployment status.
The returned configuration is the draft (the working copy the user edits). Set
includeDeployedVersion to true to also see the most recently published configuration
when it differs from the draft — useful for debugging deployed behavior. Edits always
apply to the draft.
Requires an automationId, which can be obtained from list_automations.
{"baseId": "appZfrNIUEip5MazD", "automationId": "wflGlRtkBNWfYnPOV"}

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `automationId` (`string`, required): The ID of the automation to retrieve.
Must start with "wfl" and is 17 characters long.
Example: "wflGlRtkBNWfYnPOV".
To get an automationId, use the create_automation tool.
- `baseId` (`string`, required): The ID of the base containing the automation.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `includeDeployedVersion` (`boolean`, optional): When true, each returned automation includes a `deployedVersion` field showing the most recently published configuration when it differs from the draft.

Example input: `{"automationId":"wflGlRtkBNWfYnPOV","baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_get_create_automation_instructions`

Get create automation instructions · Read-only

Returns the full spec for create_automation — expression language, wrappers, function catalog, trigger and action input catalogs, pitfalls, and a complete example. Call once per session before building an automation payload.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, optional): The ID of the base you plan to create automations in. Providing this includes features that may be available for this base but not globally. If omitted, only globally available features are returned.

Example input: `{}`

### `airtablemcp_get_form_schema`

Get the schema of a form page · Read-only

Returns the schema of a form page — its structure, not the submitted-record data.

Returns the form's source table, submission action (create or update), and a hierarchical
breakdown of sections, rows, and field elements. Sections are the visual groups inside the
form (each with an optional title), rows are the columns-of-fields layout within a section,
and elements describe each individual field — its label, helper text, field type,
required/read-only status, any prefilled value, and any conditional visibility filter.
Single-select and multi-select field elements also list their valid choices.

Use this when the user asks how a form is organized, what fields it collects, or which
fields are required. visibilityFilters specifies the conditions under which a field or
section is shown, not a resolved shown/hidden state. Required fields are required only when
visible. Fields inside hidden sections are not visible. Do not call this on non-form pages.

Supports entry-level form pages (in an interface or standalone) and record-creation row
forms, forms embedded in other interface page types.
Do not assume baseId. Obtain it from search_bases or list_bases.
Use list_pages_for_base to find the pageId if needed.
Record-creation row forms appear in that tool's embeddedForms array; pass any one of the
form's interfaceIds as the interfaceId here.
{"baseId": "appZfrNIUEip5MazD", "pageId": "pagXxYyZzAaBbCcDd"}

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the form page.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `pageId` (`string`, required): The ID of the form page whose schema you want to read.
Must start with "pag" and is 17 characters long.
Example: "pagXxYyZzAaBbCcDd".
- `interfaceId` (`string`, optional): The ID of the interface containing the form page, if the form is in an interface.
Must start with "pbd" and is 17 characters long.

Example input: `{"baseId":"appZfrNIUEip5MazD","pageId":"pagXxYyZzAaBbCcDd"}`

### `airtablemcp_get_record_for_page`

Get a record from an interface page · Read-only

Gets a single record's details from an interface page element using a navigation path. Supports traversing linked record relationships by appending edges to the path.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the page. Must start with "app" and is 17 characters long.
- `interfaceId` (`string`, required): The ID of the interface that contains the page. Must start with "pbd" and is 17 characters long.
- `path` (`object`, required): The navigation path from the page where the record was listed.
- `fieldIds` (`array`, optional): Only data for fields whose IDs are in this list will be included in the result.

Example input: `{"baseId":"appZfrNIUEip5MazD","interfaceId":"<interfaceId>","path":{}}`

### `airtablemcp_get_table_schema`

Gets table schema for the given tables, which consist of table IDs and field IDs · Read-only

Gets detailed schema information for specified tables and fields in an Airtable base, returning the field ID, type, and configuration for each specified field. Use this before filtering on singleSelect or multipleSelects fields to retrieve choice IDs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the tables.
- `tables` (`array`, required): An array of table IDs and corresponding field IDs to get schema information for.

Example input: `{"baseId":"appZfrNIUEip5MazD","tables":[]}`

### `airtablemcp_list_automations`

List automations · Read-only

Lists automations in an Airtable base.
Returns metadata about each automation including its ID, name, deployment status, trigger info, and graph nodes.
Use this when the user asks about automations configured in a base.
Optionally filter by trigger type (e.g., 'agentTriggerReceived').
The returned configuration is the draft (the working copy the user edits). Set
includeDeployedVersion to true to also see each automation's most recently published
configuration when it differs from the draft — useful for debugging deployed behavior.
Edits always apply to the draft.
Do not assume baseId. Obtain it from search_bases or list_bases.
{"baseId": "appZfrNIUEip5MazD"}

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base to list automations from.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `includeDeployedVersion` (`boolean`, optional): When true, each returned automation includes a `deployedVersion` field showing the most recently published configuration when it differs from the draft.
- `triggerType` (`string`, optional): Optional trigger type to filter automations by (e.g., "agentTriggerReceived"). One of: `recordEntersView`, `recordCreated`, `recordUpdated`, `recordMatchesConditions`, `googleSheetsRowCreated`, `googleFormsNewResponse`, `googleCalendarEventCreated`, `googleCalendarEventChanged`, `googleCalendarEventCancelled`, `cron`, `microsoftOutlookEventCreated`, `microsoftOutlookEventChanged`, `microsoftOutlookNewEmail`, `genericWebhookReceived`, `emailReceived`, `formSubmitted`, `inputReceivedFromConnection`, `agentTriggerReceived`, `rowCommentCreated`, `testTrigger`.

Example input: `{"baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_list_bases`

List Airtable bases · Read-only

Lists all Airtable bases that you have access to in your account, including favorited and recently viewed bases. If the response includes an offset, pass it in a subsequent call to retrieve the next page of results.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `offset` (`string`, optional): Pagination cursor from a previous list_bases response.

Example input: `{}`

### `airtablemcp_list_external_accounts`

List connected external accounts · Read-only

Lists the external accounts (integrations) accessible to the current user, including accounts they own and accounts shared with them.
Each account includes its type (e.g. Google Sheets, Slack, Salesforce), a human-readable label, and an account configuration ID that can be used to reference the account in other tool calls.
Only user-managed integration accounts are returned.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `airtablemcp_list_pages_for_base`

List interfaces and pages in a base · Read-only

Lists all interfaces and their pages for a base, returning page IDs, names, and page-type-specific metadata. Use this to discover interfaces, dashboards, overview pages, and forms available in a base.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base to list pages from. Must start with "app" and is 17 characters long.

Example input: `{"baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_list_record_comments`

List comments on an Airtable record · Read-only

Lists comments on a specific Airtable record, ordered from newest to oldest, with support for pagination. Comments may contain user mentions in @[userId] or @[userGroupId] format, and the mentioned field maps these IDs to display names and emails.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base.
- `recordId` (`string`, required): The ID of the record.
- `tableId` (`string`, required): The ID of the table.
- `offset` (`string`, optional): Pass the offset from a previous response to fetch the next page.
- `pageSize` (`integer`, optional): The number of comments to return per page.

Example input: `{"baseId":"appZfrNIUEip5MazD","recordId":"recZOTa3BDHxlJNzf","tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_list_records_for_page`

List Records For Page · Read-only

Lists records from an Airtable interface page. Use this for bases with interface-only access (permissionLevel "none") or when querying interface/page data. Obtain pageId and interfaceId from list_pages_for_base.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the page. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `interfaceId` (`string`, required): The ID of the interface that contains the page. Must start with "pbd" and is 17 characters long.
- `pageId` (`string`, required): The ID of the interface page to read records from. Must start with "pag" and is 17 characters long.
- `elementId` (`string`, optional): The ID of a specific element to query records for. Required for dashboard pages. Obtain element IDs from the dashboardElements array in the list_pages_for_base response. Must start with "pel" and is 17 characters long.
- `fieldIds` (`array`, optional): Only data for fields whose IDs are in this list will be included in the result. If not provided, fields visible in the page element's visualization will be returned.
- `filters` (`object`, optional): Additional filters to apply on top of the page element's built-in filters. These are combined with the element's static filters using AND.
- `pageSize` (`integer`, optional): The maximum number of records to return in the response.

Example input: `{"baseId":"appZfrNIUEip5MazD","interfaceId":"<interfaceId>","pageId":"pagXxYyZzAaBbCcDd"}`

### `airtablemcp_list_records_for_table`

Fetch records for processing or analysis · Read-only

Lists records queried from an Airtable table, with support for field selection, pagination, sorting, record ID filtering, and structured filters. Obtain baseId and tableId from search_bases and list_tables_for_base before calling this tool.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table.
- `tableId` (`string`, required): The table to list records from (table ID or table name).
- `cursor` (`string`, optional): The cursor to start from for paginated requests.
- `fieldIds` (`array`, optional): Only data for fields whose IDs or names are in this list will be included in the result.
- `filters` (`object`, optional): Structured filters to apply to the records.
- `pageSize` (`integer`, optional): The maximum number of records to return in the response.
- `recordIds` (`array`, optional): An array of record IDs to filter by.
- `sort` (`array`, optional): A list of sort objects specifying how records will be ordered.

Example input: `{"baseId":"appZfrNIUEip5MazD","tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_list_tables_for_base`

Returns the summary of the specified base · Read-only

Gets the summary of a specific Airtable base, including the schemas of all its tables with field names and types. If the base is not found or returns a permission error, the user may have interface-only access.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base to get the summary of.

Example input: `{"baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_list_views_for_table`

List views in a table · Read-only

Lists the views in a table, returning each view's ID, name, and type.
Use this to discover viewId values needed by other tools, such as an automation
trigger that fires on records entering a view.
Do not assume baseId. Obtain it from search_bases or list_bases.
{"baseId": "appZfrNIUEip5MazD", "tableId": "Orders"}

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base that contains the table.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `tableId` (`string`, required): The table to list views from.
Accepts either a table ID (e.g., "tblGlReoTNWfYnXIG") or a table name (e.g., "Orders").
Names are resolved case-insensitively within the base.
To discover tables, use the list_tables_for_base tool.

Example input: `{"baseId":"appZfrNIUEip5MazD","tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_list_workspaces`

List Airtable workspaces · Read-only

Lists all Airtable workspaces the current user has access to, along with their permission level in each. This is typically the first tool to call when you need a workspaceId.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `offset` (`string`, optional): Pagination offset from the previous response.

Example input: `{}`

### `airtablemcp_ping`

Ping · Read-only

Pings the Airtable MCP server to check if it is running and reachable. Use this to verify connectivity before performing other operations.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `airtablemcp_search_bases`

Search for an Airtable base · Read-only

Searches for Airtable bases by name using a partial, case-insensitive match. Returns bases sorted by relevance score, along with a recommended base ID and a hint on whether the user needs to explicitly select a base.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `searchQuery` (`string`, required): The query string to search for bases by name (case-insensitive, partial matches supported).

Example input: `{"searchQuery":"<searchQuery>"}`

### `airtablemcp_search_candidate_linked_records`

Search candidate records for a linked-record field · Read-only

Searches for records that are valid candidates for a linked-record (foreign-key) field,
returning each candidate's record ID along with the fields the linked-record field is
configured to display (the same fields shown on the in-product card). Use this to find the
record ID to put in a linked-record field when calling submit_form or
update_records_for_table.
Use list_pages_for_base to find the pageId if needed.
Use get_form_schema (for forms) to discover the linked field's fieldId.
Pass the fieldId of the linked-record field you are filling (not the table it links to —
the foreign table is resolved automatically). The pageId must be a page that surfaces the
linked field: for submit_form this is the form's pageId; for
update_records_for_table pass the interface page that shows the record/field
being edited. Pass interfaceId when the page lives inside an interface; omit it for a
standalone form.

A linked-record field's candidates can be restricted by dynamic filters that reference the
record's OTHER field values, so you must supply those values for the filters to apply:
when filling a NEW record (e.g. for submit_form), always pass fields with
the other values you have so far or plan to submit; when editing an EXISTING record, pass
recordId, plus fields for any other values you are changing in the same update (a value in
fields takes precedence over the record's stored value; anything not in fields falls back
to the stored value). If you pass neither, the filters are evaluated against blank values
and the results may include records that are not actually selectable, or miss ones that
are.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the page and the linked-record field.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `fieldId` (`string`, required): The ID of the linked-record (foreign-key) field whose candidate records you want to
search.
Field IDs must start with "fld" and is 17 characters long.
Example: "fldGlRtkBNWfYnPOV".
Do not substitute user-facing names for IDs.
To get fieldId, use the list_tables_for_base tool.
- `pageId` (`string`, required): The ID of the page that surfaces the linked-record field.
Must start with "pag" and is 17 characters long.
Example: "pagXxYyZzAaBbCcDd".
- `query` (`string`, required): The text to search candidate records by. Matching is case-insensitive against each
record's display name. Pass an empty string to list candidates without filtering.
- `fields` (`string`, optional): The values entered so far (or planned) for the OTHER fields of the record being
filled. The linked field's cross-field dynamic record-selection filters are evaluated
against these values, and omitting them can return records that are not actually
selectable. When searching candidates for a new record (e.g. a
submit_form submission), always pass every other field value you know.
When editing an existing record (recordId provided), pass the values you are changing
in the same update — each value here overrides the record's stored value, and fields
not passed fall back to the stored values.
Field IDs must start with "fld" and is 17 characters long.
Example: "fldGlRtkBNWfYnPOV".
Do not substitute user-facing names for IDs.
To get fieldId, use the list_tables_for_base tool.
- `interfaceId` (`string`, optional): The ID of the interface containing the page, or null/omitted for a standalone form (one
that is not inside an interface).
Must start with "pbd" and is 17 characters long.
- `limit` (`integer`, optional): The maximum number of records to return. The server may return fewer. Defaults to a
small page size when omitted.
- `recordId` (`string`, optional): The ID of the EXISTING record being updated, when searching linked records in the
context of an existing record (e.g. for update_records_for_table). The
record's stored values are used to apply the linked field's cross-field dynamic
record-selection filters, except for values you also pass in fields, which take
precedence — so pass both when the update changes a value those filters depend on.
Must start with "rec" and is 17 characters long.
Example: "recZOTa3BDHxlJNzf".
Do not substitute user-facing names for IDs
To get recordId, use the list_records_for_table tool or display_records_for_table tools.

Example input: `{"baseId":"appZfrNIUEip5MazD","fieldId":"fldGlRtkBNWfYnPOV","pageId":"pagXxYyZzAaBbCcDd","query":"<query>"}`

### `airtablemcp_search_records`

Search records in an Airtable table · Read-only

Searches for records in a table using a free-text query with fuzzy matching and token-based search. Prefer this over list_records_for_table for free-text search on large tables.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long.
- `fields` (`string`, required): The fields to search over. Either pass an array of field IDs/names, or the literal string "ALL_SEARCHABLE_FIELDS" to search across all searchable fields.
- `query` (`string`, required): The search query. Matches are case-insensitive and term-order independent.
- `table` (`string`, required): The table to search. Accepts either a table ID (e.g., "tblGlReoTNWfYnXIG") or a table name (e.g., "Orders"). Names are resolved case-insensitively within the base.

Example input: `{"baseId":"appZfrNIUEip5MazD","fields":"fldGlRtkBNWfYnPOV","query":"<query>","table":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_create_automation`

Create an automation · Write

Creates and validates one automation in a base: a trigger plus ordered nodes —
action nodes, `repeatingGroup` (run inner nodes once per item), and `conditionalGroup`
(if/else-if/else branches). Many trigger and action types are supported;
get_create_automation_instructions has the full catalog. Saves the draft
configuration only — it is off until the user reviews and turns it on in the Airtable UI.
Prefer get_create_automation_instructions once per session for the full catalog.
Before building IDs, call list_tables_for_base(baseId). Call
get_table_schema(baseId, tables) before filtering on select /
multiSelect fields.
Every trigger and node input is an expression (literal, $ref, template, fn, or a plain
object/array) — not raw JSON. Field shapes, typed {obj}/{tuple} wrappers, write modes, and
an error index are in get_create_automation_instructions.

Flow:
1. create_automation(baseId, name, trigger, nodes). If isValid is false,
   nothing was saved: use errors to fix the inputs and call again. After a couple of failed
   attempts, report the errors to the user instead of looping.
2. On success only the draft configuration is saved; the automation is off. Tell the user
   to open the automationUrl in the Airtable UI to review and turn it on.
{"trigger":{"type":"recordCreated","inputs":{"tableId":"tbl..."}},"nodes":[{"key":"node1","type":"updateRecord","inputs":{"tableId":"tbl...","rowId":{"template":[{"$ref":"trigger","path":["id"]}]},"updateRecordMethod":"customFields","fields":{"fldStatus":{"template":["In Progress"]}}}}]}

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base to create the automation in.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `name` (`string`, required): Name for the automation.
- `nodes` (`array`, required): Ordered array of nodes (actions, repeatingGroup, or conditionalGroup). Groups (conditionalGroup/repeatingGroup) may be nested at most 2 levels deep. See create_automation description for semantics and the expression language.
- `trigger` (`object`, required): Trigger configuration.
- `description` (`string`, optional): Optional description for the automation.

Example input: `{"baseId":"appZfrNIUEip5MazD","name":"<name>","nodes":[],"trigger":{}}`

### `airtablemcp_create_base`

Create Base · Write

Creates a new Airtable base with specified tables and fields in a workspace. Use list_workspaces to get the workspaceId first. The first field in each table's fields array becomes the primary field.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name for the new base.
- `workspaceId` (`string`, required): The ID of the workspace to create the base in. Must start with "wsp" and is 17 characters long. Do not substitute user-facing names for workspaceId. To get workspaceId, use the list_workspaces tool.
- `tables` (`array`, optional): Optional. The tables to create in the new base. If omitted, a default table ("Table 1") with a "Name" singleLineText field is created.

Example input: `{"name":"<name>","workspaceId":"<workspaceId>"}`

### `airtablemcp_create_field`

Create Field · Write

Creates a new field in an existing Airtable table. Use search_bases and list_tables_for_base to get baseId and tableId first. Supports all field types including singleSelect, number, formula, date, and more.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `field` (`object`, required): The field definition to create. Must include at minimum 'name' and 'type'. Some field types require an 'options' object (e.g., singleSelect, number, currency, formula). Types without options: singleLineText, email, url, multilineText, phoneNumber, richText, barcode, multipleAttachments, singleCollaborator, multipleCollaborators.
- `tableId` (`string`, required): The ID of the table to create the field in. Must start with "tbl" and is 17 characters long. Do not substitute user-facing names for tableId. To get tableId, use the list_tables_for_base tool.

Example input: `{"baseId":"appZfrNIUEip5MazD","field":{},"tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_create_interface`

Create an interface · Write

Creates a new interface within an Airtable base. After creation, use create_page to add pages and publish_interface to make the interface live for end users.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base in which to create the interface. Must start with "app" and is 17 characters long.
- `name` (`string`, required): The display name for the new interface.

Example input: `{"baseId":"appZfrNIUEip5MazD","name":"<name>"}`

### `airtablemcp_create_page`

Create an interface page · Write

Creates a new page within an existing Airtable interface. Supported page types are visualization, dashboard, and customElement. Use describe_page_type and describe_page_element to discover the correct pageConfiguration shape.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base in which to create the page. Must start with "app" and is 17 characters long.
- `interfaceId` (`string`, required): The ID of the interface in which to create the page. Must start with "pbd" and is 17 characters long.
- `name` (`string`, required): The display name for the new page.
- `pageConfiguration` (`object`, required): Page type-specific configuration. Schema is provided by describe_page_type and describe_page_element.
- `pageType` (`string`, required): The type of page to create. One of: `visualization`, `dashboard`, `customElement`.

Example input: `{"baseId":"appZfrNIUEip5MazD","interfaceId":"<interfaceId>","name":"<name>","pageConfiguration":{},"pageType":"visualization"}`

### `airtablemcp_create_record_comment`

Create a comment on an Airtable record · Write

Creates a comment on a specific Airtable record. Supports user and group mentions using @[userId] or @[userGroupId] tokens in the comment text, and supports threaded replies via the optional parentCommentId parameter.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base.
- `recordId` (`string`, required): The ID of the record to comment on.
- `tableId` (`string`, required): The ID of the table.
- `text` (`string`, required): The text of the comment to create.
- `parentCommentId` (`string`, optional): The ID of the parent comment to reply to, for creating a threaded reply.

Example input: `{"baseId":"appZfrNIUEip5MazD","recordId":"recZOTa3BDHxlJNzf","tableId":"tblGlReoTNWfYnXIG","text":"<text>"}`

### `airtablemcp_create_records_for_table`

Create Records For Table · Write

Creates new records in an Airtable table. Use search_bases and list_tables_for_base to get baseId and tableId before calling this tool. You can create up to 50 records per request.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `records` (`array`, required): An array of record objects to create. Each record must have a "fields" property containing the field values.
- `tableId` (`string`, required): The ID of the table to create records in. Must start with "tbl" and is 17 characters long. Do not substitute user-facing names for tableId. To get tableId, use the list_tables_for_base tool.
- `fieldIds` (`array`, optional): The IDs of the fields to include in each returned record. If omitted, only the fields you wrote are returned. Pass explicit IDs to include fields you did not write (e.g. the primary field or formula/rollup results).
- `typecast` (`boolean`, optional): Whether or not to perform best-effort automatic data conversion from string values. Defaults to false to preserve data integrity.

Example input: `{"baseId":"appZfrNIUEip5MazD","records":[],"tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_create_table`

Create Table · Write

Creates a new table in an existing Airtable base. Use search_bases or list_bases to get the baseId first. The first field in the fields array becomes the primary field of the table.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base to create the table in. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `fields` (`array`, required): The first field becomes the primary field and must be one of these types: singleLineText, email, url, multilineText, number, percent, currency, duration, date, dateTime, phoneNumber, barcode. Remaining fields can be any type.
- `name` (`string`, required): Must be unique within the base (case-insensitive).
- `description` (`string`, optional): No description.

Example input: `{"baseId":"appZfrNIUEip5MazD","fields":[],"name":"<name>"}`

### `airtablemcp_publish_interface`

Publish an interface · Write

Publishes an interface, promoting each page's working draft to the live version that end users see. Publishing is idempotent — re-publishing with no new changes is a no-op. Pages with publishing state "disabled" are skipped.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the interface. Must start with "app" and is 17 characters long.
- `interfaceId` (`string`, required): The ID of the interface to publish. Must start with "pbd" and is 17 characters long.

Example input: `{"baseId":"appZfrNIUEip5MazD","interfaceId":"<interfaceId>"}`

### `airtablemcp_submit_form`

Submit a form · Write

Submits a form, creating a new record in the form's source table.
Call get_form_schema first on the form's pageId to discover which fields the
form collects, their fieldIds, types, required/read-only flags, select-field choices,
and any prefilled values and visibility filters — do not assume every column on the
source table is on the form. The schema response includes the interfaceId (null for
standalone forms) to pass back here.
For linked-record fields, use search_candidate_linked_records to find the
record IDs to submit. Always include that tool's fields param with the other values you
plan to submit here, so its results respect the linked field's dynamic record-selection
filters.
Use list_pages_for_base to find the pageId if needed.
Pass the baseId and pageId of the form, the interfaceId if the form lives inside
an interface (otherwise omit it), and a fields object mapping field IDs to cell
values (same shape as the create_records_for_table tool).

For singleSelect and multipleSelects fields, the value must be a choice name from
the field's options.choices in the get_form_schema response, exactly as
written there — do not invent or reword option names.

Supports entry-level form pages and record-creation row forms (forms embedded in other
interface page types).

Respect the visibility filters from get_form_schema: do not submit a value
for any field hidden by its own visibilityFilters or its section's visibilityFilters.

A field is visible only when the submitted values satisfy its filter and the filters of
any fields it depends on. Do not set a field that wasn't requested just to make another
visible. If a hidden field is requested to be filled but the values don't reveal it, confirm
how to proceed before submitting.
{"baseId": "appXxx...", "pageId": "pagXxx...", "interfaceId": "pbdXxx...", "fields": {"fldXxx...": "Hello world"}}

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the form page.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `fields` (`object`, required): An object containing field IDs as keys and field values as values.
Field values should match the field type (e.g., strings for singleLineText fields,
numbers for numeric fields, arrays of strings for multipleSelects fields).
For singleSelect fields, use the option name as a plain string (e.g., "Done").
For multipleSelects fields, use an array of option name strings (e.g., ["Tag1", "Tag2"]).
For multipleRecordLinks (linked-record) fields, use an array of record IDs from the linked table.
Field IDs must start with "fld" and is 17 characters long.
Example: "fldGlRtkBNWfYnPOV".
Do not substitute user-facing names for IDs.
To get fieldId, use the list_tables_for_base tool.
- `pageId` (`string`, required): The ID of the form page to submit.
Must start with "pag" and is 17 characters long.
Example: "pagXxYyZzAaBbCcDd".
- `interfaceId` (`string`, optional): The ID of the interface containing the form page, or null/omitted for a
standalone form. When set, this is required so the agent's interface-level
access permissions are evaluated correctly.
Must start with "pbd" and is 17 characters long.

Example input: `{"baseId":"appZfrNIUEip5MazD","fields":{},"pageId":"pagXxYyZzAaBbCcDd"}`

### `airtablemcp_test_automation_webhook_trigger`

Test an automation webhook trigger · Write

Re-runs the trigger test for a genericWebhookReceived automation and waits briefly for a
newly captured payload schema. This is an automation trigger operation, not an Airtable
Webhooks API operation.
Call get_automation first. The external system must POST a representative
object payload to the returned webhookUrl before this tool can capture its schema.
For a deployed automation, posting the sample also runs the live automation and may cause
side effects. This tool does not send the sample or deploy or undeploy the automation.
{"baseId": "appZfrNIUEip5MazD", "automationId": "wflGlRtkBNWfYnPOV"}

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `automationId` (`string`, required): The ID of the automation whose webhook trigger should be tested.
Must start with "wfl" and is 17 characters long.
Example: "wflGlRtkBNWfYnPOV".
To get an automationId, use the create_automation tool.
- `baseId` (`string`, required): The ID of the base containing the automation.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.

Example input: `{"automationId":"wflGlRtkBNWfYnPOV","baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_update_records_for_table`

Update Records For Table · Write

Updates records in an Airtable table, leaving all unspecified fields unchanged. Use search_bases and list_tables_for_base to get baseId and tableId first. You can update up to 50 records per request.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `records` (`array`, required): An array of record objects to update. Each record must have a "fields" property. Include "id" to update by record ID, or use performUpsert to match by field values.
- `tableId` (`string`, required): The ID of the table to update records in. Must start with "tbl" and is 17 characters long. Do not substitute user-facing names for tableId. To get tableId, use the list_tables_for_base tool.
- `fieldIds` (`array`, optional): The IDs of the fields to include in each returned record. If omitted, only the fields you wrote are returned.
- `performUpsert` (`object`, optional): Enables upsert behavior. When set, records without a recordId use the fields in fieldIdsToMergeOn to match existing records. If no match, a new record is created. If a match is found, it is updated. If multiple matches, the request fails.
- `typecast` (`boolean`, optional): Whether or not to perform best-effort automatic data conversion from string values. Defaults to false to preserve data integrity.

Example input: `{"baseId":"appZfrNIUEip5MazD","records":[],"tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_delete_automation`

Delete an automation · Destructive

Deletes an existing automation from a base. The automation must be off before it can be deleted.
The target automation must be off. If it is on, the user must turn it off in the
Airtable UI before it can be deleted.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `automationId` (`string`, required): The ID of the automation to delete.
Must start with "wfl" and is 17 characters long.
Example: "wflGlRtkBNWfYnPOV".
To get an automationId, use the create_automation tool.
- `baseId` (`string`, required): The ID of the base containing the automation.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.

Example input: `{"automationId":"wflGlRtkBNWfYnPOV","baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_delete_interface`

Delete an interface · Destructive

Deletes an interface from a base, including all of its pages. The published version, if
any, immediately stops being available to end users.
The agent MUST ask the user for explicit confirmation before calling this tool.
Interface deletion is destructive and should not be performed without the user's go-ahead.
Use list_pages_for_base to find the appropriate interfaceId.
To delete a single page within an interface instead, use delete_page.

On success of delete_interface, the response includes an actionId that can be
passed to revert_action to undo the deletion, restoring the interface with its
pages.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the interface to delete.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `interfaceId` (`string`, required): The ID of the interface to delete.
Must start with "pbd" and is 17 characters long.

Example input: `{"baseId":"appZfrNIUEip5MazD","interfaceId":"<interfaceId>"}`

### `airtablemcp_delete_page`

Delete an interface page · Destructive

Deletes an existing page from an interface. This action is destructive and requires explicit user confirmation before calling. Use publish_interface after deletion to propagate the change to the live interface.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the page to delete. Must start with "app" and is 17 characters long.
- `pageId` (`string`, required): The ID of the page to delete. Must start with "pag" and is 17 characters long.

Example input: `{"baseId":"appZfrNIUEip5MazD","pageId":"pagXxYyZzAaBbCcDd"}`

### `airtablemcp_delete_records_for_table`

Delete Records For Table · Destructive

Permanently deletes records from an Airtable table by record IDs. Use list_records_for_table to get record IDs first. You can delete up to 50 records per request. This action is irreversible.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `recordIds` (`array`, required): An array of record IDs to delete. Must start with "rec" and is 17 characters long. To get record IDs, use the list_records_for_table or search_records tools.
- `tableId` (`string`, required): The ID of the table to delete records from. Must start with "tbl" and is 17 characters long. Do not substitute user-facing names for tableId. To get tableId, use the list_tables_for_base tool.

Example input: `{"baseId":"appZfrNIUEip5MazD","recordIds":[],"tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_delete_table`

Delete a table from an Airtable base · Destructive

Deletes an entire table from a base, including all of its records, fields, and views.
The agent MUST ask the user for explicit confirmation before calling this tool. Table
deletion is destructive and should not be performed without the user's go-ahead.
Use list_tables_for_base to find the appropriate tableId.
A base must always have at least one table, so the last remaining table in a base cannot be
deleted; attempting to do so returns an error.

On success, the response includes an actionId that can be passed to
revert_action to undo the deletion, restoring the table with its records,
fields, and views. Reverting is best-effort: it may fail if the base's schema changed after
the deletion (for example, another table took the deleted table's former position), so treat
the deletion as permanent unless a revert succeeds.
Example: delete the table tblABCDEFGHIJKLMN in base appZfrNIUEip5MazD:
{"baseId": "appZfrNIUEip5MazD", "tableId": "tblABCDEFGHIJKLMN"}

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table to delete.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `tableId` (`string`, required): The ID of the table to delete.
Must start with "tbl" and is 17 characters long.
Example: "tblGlReoTNWfYnXIG".
Do not substitute user-facing names for tableId.
To get tableId, use the list_tables_for_base tool.

Example input: `{"baseId":"appZfrNIUEip5MazD","tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_revert_action`

Reverts a previous Airtable mutation · Destructive

Reverts a previous eligible Airtable mutation by performing the inverse write, using the actionId it returned. Record updates are not revertible.
Use the actionId returned by an eligible mutating tool result. A tool result is eligible only if it explicitly returns an actionId. Examples include create_records_for_table or delete_records_for_table.
Reverts one actionId per call (a multi-action revert is not atomic). To revert several, call once per actionId in reverse completion order, stopping on the first error.
Example: revert an eligible mutation:
{"baseId": "appZfrNIUEip5MazD", "actionId": "actZOTa3BDHxlJNzf"}

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `actionId` (`string`, required): The ID of the action to revert, from a prior eligible tool result in this session.
Must start with "act" and is 17 characters long.
Example: "actZOTa3BDHxlJNzf".
- `baseId` (`string`, required): The ID of the base the action ran in — the same baseId you used for the mutation that returned this actionId.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.

Example input: `{"actionId":"actZOTa3BDHxlJNzf","baseId":"appZfrNIUEip5MazD"}`

### `airtablemcp_update_automation`

Update an automation · Destructive

Replaces the entire draft configuration (trigger, graph, name, description) of an existing
automation. If the automation is on, live behavior is unchanged until unpublished changes
are applied with Update in the Airtable UI.
Use list_automations to find the automationId, then call
get_automation to retrieve the current trigger, nodes, and description
before updating — list_automations returns node summaries without their inputs. Call
get_create_automation_instructions once per session for the full catalog
of trigger types, action types, and expression shapes.
This is a full replacement — all fields (trigger, nodes, name, description) must be
provided, even if only one changed. The previous configuration is discarded entirely.

On success, the response includes an actionId that can be passed to
revert_action to undo the update and restore the previous configuration.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `automationId` (`string`, required): The ID of the automation to update.
Must start with "wfl" and is 17 characters long.
Example: "wflGlRtkBNWfYnPOV".
To get an automationId, use the create_automation tool.
- `baseId` (`string`, required): The ID of the base containing the automation.
Must start with "app" and is 17 characters long.
Example: "appZfrNIUEip5MazD".
Do not substitute user-facing names for baseId.
To get baseId, use the search_bases or list_bases tool.
- `name` (`string`, required): Name for the automation.
- `nodes` (`array`, required): Ordered array of nodes (actions, repeatingGroup, or conditionalGroup). Groups (conditionalGroup/repeatingGroup) may be nested at most 2 levels deep. See create_automation description for semantics and the expression language.
- `trigger` (`object`, required): Trigger configuration.
- `description` (`string`, optional): Optional description for the automation.

Example input: `{"automationId":"wflGlRtkBNWfYnPOV","baseId":"appZfrNIUEip5MazD","name":"<name>","nodes":[],"trigger":{}}`

### `airtablemcp_update_field`

Update Field · Destructive

Updates the name, description, and/or options of a field in an existing Airtable table. At least one of name, description, or options must be specified. Use list_tables_for_base to get fieldId.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `fieldId` (`string`, required): The ID of the field to update. Field IDs must start with "fld" and is 17 characters long. Do not substitute user-facing names for IDs. To get fieldId, use the list_tables_for_base tool.
- `tableId` (`string`, required): The ID of the table containing the field. Must start with "tbl" and is 17 characters long. Do not substitute user-facing names for tableId. To get tableId, use the list_tables_for_base tool.
- `description` (`string`, optional): No description.
- `name` (`string`, optional): The new name for the field. Must be unique within the table (case-insensitive).
- `options` (`object`, optional): Type-specific field options. Currently supports updating formula expressions for formula fields.

Example input: `{"baseId":"appZfrNIUEip5MazD","fieldId":"fldGlRtkBNWfYnPOV","tableId":"tblGlReoTNWfYnXIG"}`

### `airtablemcp_update_table`

Update Table · Destructive

Updates an existing table's name and/or description in an Airtable base. At least one of name or description must be provided. Use search_bases and list_tables_for_base to get baseId and tableId first.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `baseId` (`string`, required): The ID of the base containing the table. Must start with "app" and is 17 characters long. Do not substitute user-facing names for baseId. To get baseId, use the search_bases or list_bases tool.
- `tableId` (`string`, required): The ID of the table to update. Must start with "tbl" and is 17 characters long. Do not substitute user-facing names for tableId. To get tableId, use the list_tables_for_base tool.
- `description` (`string`, optional): No description.
- `name` (`string`, optional): The new name for the table. Must be unique within the base (case-insensitive).

Example input: `{"baseId":"appZfrNIUEip5MazD","tableId":"tblGlReoTNWfYnXIG"}`

## Related

Other ways to connect Airtable:

- [OAuth](/agentkit/connectors/airtable/): Scalekit connector, OAuth, 26 tools

Other Project Management connectors ([all 31](/agentkit/connectors/?category=project-management)):

- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools
- [Linear](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools
- [Jira](/agentkit/connectors/jira/): Scalekit connector, OAuth, 374 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
