$git clone https://github.com/domdomegg/airtable-mcp-serverA Model Context Protocol server that provides read and write access to Airtable databases. This server enables LLMs to inspect database schemas, then read and write records.
| 1 | # airtable-mcp-server |
| 2 | |
| 3 | A Model Context Protocol server that provides read and write access to Airtable databases. This server enables LLMs to inspect database schemas, then read and write records. |
| 4 | |
| 5 | https://github.com/user-attachments/assets/c8285e76-d0ed-4018-94c7-20535db6c944 |
| 6 | |
| 7 | ## Installation |
| 8 | |
| 9 | Follow the instructions on [install-mcp](https://adamjones.me/install-mcp/?config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImFpcnRhYmxlLW1jcC1zZXJ2ZXIiXSwibmFtZSI6ImFpcnRhYmxlIiwiZW52Ijp7IkFJUlRBQkxFX0FQSV9LRVkiOiJwYXQxMjMuYWJjMTIzIn19), which generates the right config for your MCP client (Claude Code, Claude Desktop, Cursor, Cline, VS Code, and more). |
| 10 | |
| 11 | You'll need an Airtable personal access token — [create one here](https://airtable.com/create/tokens/new) with scopes `schema.bases:read` and `data.records:read` (and optionally `schema.bases:write`, `data.records:write`, `data.recordComments:read`, `data.recordComments:write`), and access to the bases you want to use. It looks something like `pat123.abc123` (but longer). Set it as `AIRTABLE_API_KEY` (replacing the placeholder in the generated config). |
| 12 | |
| 13 | ## Components |
| 14 | |
| 15 | ### Tools |
| 16 | |
| 17 | - **list_records** |
| 18 | - Lists records from a specified Airtable table |
| 19 | - Input parameters: |
| 20 | - `baseId` (string, required): The ID of the Airtable base |
| 21 | - `tableId` (string, required): The ID of the table to query |
| 22 | - `maxRecords` (number, optional): Maximum number of records to return. Defaults to 100. |
| 23 | - `filterByFormula` (string, optional): Airtable formula to filter records |
| 24 | |
| 25 | - **search_records** |
| 26 | - Search for records containing specific text |
| 27 | - Input parameters: |
| 28 | - `baseId` (string, required): The ID of the Airtable base |
| 29 | - `tableId` (string, required): The ID of the table to query |
| 30 | - `searchTerm` (string, required): Text to search for in records |
| 31 | - `fieldIds` (array, optional): Specific field IDs to search in. If not provided, searches all text-based fields. |
| 32 | - `maxRecords` (number, optional): Maximum number of records to return. Defaults to 100. |
| 33 | |
| 34 | - **list_bases** |
| 35 | - Lists all accessible Airtable bases |
| 36 | - No input parameters required |
| 37 | - Returns base ID, name, and permission level |
| 38 | |
| 39 | - **list_tables** |
| 40 | - Lists all tables in a specific base |
| 41 | - Input parameters: |
| 42 | - `baseId` (string, required): The ID of the Airtable base |
| 43 | - `detailLevel` (string, optional): The amount of detail to get about the tables (`tableIdentifiersOnly`, `identifiersOnly`, or `full`) |
| 44 | - Returns table ID, name, description, fields, and views (to the given `detailLevel`) |
| 45 | |
| 46 | - **describe_table** |
| 47 | - Gets detailed information about a specific table |
| 48 | - Input parameters: |
| 49 | - `baseId` (string, required): The ID of the Airtable base |
| 50 | - `tableId` (string, required): The ID of the table to describe |
| 51 | - `detailLevel` (string, optional): The amount of detail to get about the table (`tableIdentifiersOnly`, `identifiersOnly`, or `full`) |
| 52 | - Returns the same format as list_tables but for a single table |
| 53 | - Useful for getting details about a specific table without fetching information about all tables in the base |
| 54 | |
| 55 | - **get_record** |
| 56 | - Gets a specific record by ID |
| 57 | - Input parameters: |
| 58 | - `baseId` (string, required): The ID of the Airtable base |
| 59 | - `tableId` (string, required): The ID of the table |
| 60 | - `recordId` (string, required): The ID of the record to retrieve |
| 61 | |
| 62 | - **create_record** |
| 63 | - Creates a new record in a table |
| 64 | - Input parameters: |
| 65 | - `baseId` (string, required): The ID of the Airtable base |
| 66 | - `tableId` (string, required): The ID of the table |
| 67 | - `fields` (object, required): The fields and values for the new record |
| 68 | |
| 69 | - **update_records** |
| 70 | - Updates one or more records in a table |
| 71 | - Input parameters: |
| 72 | - `baseId` (string, required): The ID of the Airtable base |
| 73 | - `tableId` (string, required): The ID of the table |
| 74 | - `records` (array, required): Array of objects containing record ID and fields to update |
| 75 | |
| 76 | - **delete_records** |
| 77 | - Deletes one or more records from a table |
| 78 | - Input para |