The Airtable MCP Server provides read and write access to Airtable databases through the Model Context Protocol, enabling LLMs to inspect database schemas and perform CRUD operations on records. It exposes tools for querying and modifying Airtable bases after authenticating with a personal access token, solving the problem of integrating Airtable data directly into AI workflows without manual data transfer. The server supports multiple client implementations including Claude Desktop, Cursor, and Cline, with flexible installation options ranging from browser extensions to manual configuration.
Public tool metadata for what this MCP can expose to an agent.
airtable_list_recordsList records from an Airtable table. Supports filtering with formulas, sorting, field selection, views, and pagination (max 100 per page). Use the offset token from the response to get the next page.9 paramsList records from an Airtable table. Supports filtering with formulas, sorting, field selection, views, and pagination (max 100 per page). Use the offset token from the response to get the next page.
sortarrayviewstringfieldsarrayoffsetstringbase_idstringpage_sizenumbermax_recordsnumbertable_id_or_namestringfilter_by_formulastringairtable_get_recordGet a single record by its ID. Returns the record with all fields.3 paramsGet a single record by its ID. Returns the record with all fields.
base_idstringrecord_idstringtable_id_or_namestringairtable_create_recordsCreate one or more records in a table (max 10 per request). Each record needs a "fields" object with field name-value pairs. Enable typecast to auto-convert values to the correct field type.4 paramsCreate one or more records in a table (max 10 per request). Each record needs a "fields" object with field name-value pairs. Enable typecast to auto-convert values to the correct field type.
base_idstringrecordsarraytypecastbooleantable_id_or_namestringairtable_update_recordsUpdate specific fields in one or more records (PATCH — partial update, max 10 per request). Only specified fields are changed; other fields remain untouched.4 paramsUpdate specific fields in one or more records (PATCH — partial update, max 10 per request). Only specified fields are changed; other fields remain untouched.
base_idstringrecordsarraytypecastbooleantable_id_or_namestringairtable_delete_recordsDelete one or more records by their IDs (max 10 per request). This action is irreversible.3 paramsDelete one or more records by their IDs (max 10 per request). This action is irreversible.
base_idstringrecord_idsarraytable_id_or_namestringairtable_upsert_recordsUpdate existing records or create new ones based on matching fields. Specify fields_to_merge_on to match existing records — matched records are updated, unmatched are created.5 paramsUpdate existing records or create new ones based on matching fields. Specify fields_to_merge_on to match existing records — matched records are updated, unmatched are created.
base_idstringrecordsarraytypecastbooleantable_id_or_namestringfields_to_merge_onarrayairtable_list_basesList all bases accessible to the authenticated user. Returns base ID, name, and permission level.1 paramsList all bases accessible to the authenticated user. Returns base ID, name, and permission level.
offsetstringairtable_get_base_schemaGet the complete schema of a base — all tables with their fields (name, type, options) and views. Essential for understanding the data structure before querying.1 paramsGet the complete schema of a base — all tables with their fields (name, type, options) and views. Essential for understanding the data structure before querying.
base_idstringairtable_create_baseCreate a new base in a workspace. Requires at least one table with at least one field.3 paramsCreate a new base in a workspace. Requires at least one table with at least one field.
namestringtablesarrayworkspace_idstringairtable_create_tableCreate a new table in a base. Requires at least one field. Field types: singleLineText, multilineText, number, singleSelect, multipleSelects, date, checkbox, email, url, etc.4 paramsCreate a new table in a base. Requires at least one field. Field types: singleLineText, multilineText, number, singleSelect, multipleSelects, date, checkbox, email, url, etc.
namestringfieldsarraybase_idstringdescriptionstringairtable_update_tableUpdate a table name or description.4 paramsUpdate a table name or description.
namestringbase_idstringtable_idstringdescriptionstringairtable_create_fieldAdd a new field to a table. Common types: singleLineText, multilineText, number, singleSelect, multipleSelects, date, dateTime, checkbox, email, url, multipleAttachments, multipleRecordLinks.6 paramsAdd a new field to a table. Common types: singleLineText, multilineText, number, singleSelect, multipleSelects, date, dateTime, checkbox, email, url, multipleAttachments, multipleRecordLinks.
namestringtypestringbase_idstringoptionsobjecttable_idstringdescriptionstringairtable_update_fieldUpdate a field name or description. Cannot change field type.5 paramsUpdate a field name or description. Cannot change field type.
namestringbase_idstringfield_idstringtable_idstringdescriptionstringairtable_create_webhookCreate a webhook to receive notifications when data changes in a base. Webhooks expire after 7 days — use airtable_refresh_webhook to extend. Returns a MAC secret for verifying payloads.3 paramsCreate a webhook to receive notifications when data changes in a base. Webhooks expire after 7 days — use airtable_refresh_webhook to extend. Returns a MAC secret for verifying payloads.
base_idstringspecificationobjectnotification_urlstringairtable_list_webhooksList all webhooks for a base. Shows webhook IDs, enabled status, notification URLs, and expiration times.1 paramsList all webhooks for a base. Shows webhook IDs, enabled status, notification URLs, and expiration times.
base_idstringairtable_refresh_webhookExtend a webhook expiration time by 7 days from now. Webhooks expire after 7 days — call this periodically to keep them active.2 paramsExtend a webhook expiration time by 7 days from now. Webhooks expire after 7 days — call this periodically to keep them active.
base_idstringwebhook_idstringairtable_list_webhook_payloadsGet pending webhook notification payloads. Returns changed records, fields, and tables since the last cursor position.4 paramsGet pending webhook notification payloads. Returns changed records, fields, and tables since the last cursor position.
limitnumbercursornumberbase_idstringwebhook_idstringairtable_delete_webhookDelete a webhook. Stops all notifications for this webhook.2 paramsDelete a webhook. Stops all notifications for this webhook.
base_idstringwebhook_idstringA 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.
https://github.com/user-attachments/assets/c8285e76-d0ed-4018-94c7-20535db6c944
Step 1: Create an Airtable personal access token by clicking here. Details:
schema.bases:read, data.records:read, and optionally schema.bases:write, data.records:write, data.recordComments:read, and data.recordComments:write.Keep the token handy, you'll need it in the next step. It should look something like pat123.abc123 (but longer).
Step 2: Follow the instructions below for your preferred client:
airtable-mcp-server-mcpb file.zip file to .mcpb.mcpb file to open with Claude Desktopclaude_desktop_config.json filepat123.abc123 with your API key:{
"mcpServers": {
"airtable": {
"command": "npx",
"args": [
"-y",
"airtable-mcp-server"
],
"env": {
"AIRTABLE_API_KEY": "pat123.abc123"
}
}
}
}
Create either a global (~/.cursor/mcp.json) or project-specific (.cursor/mcp.json) configuration file, replacing pat123.abc123 with your API key:
{
"mcpServers": {
"airtable": {
"command": "npx",
"args": ["-y", "airtable-mcp-server"],
"env": {
"AIRTABLE_API_KEY": "pat123.abc123"
}
}
}
}
pat123.abc123 with your API key:{
"mcpServers": {
"airtable": {
"type": "stdio",
"command": "npx",
"args": ["-y", "airtable-mcp-server"],
"env": {
"AIRTABLE_API_KEY": "pat123.abc123"
}
}
}
}
list_records
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the table to querymaxRecords (number, optional): Maximum number of records to return. Defaults to 100.filterByFormula (string, optional): Airtable formula to filter recordssearch_records
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the table to querysearchTerm (string, required): Text to search for in recordsfieldIds (array, optional): Specific field IDs to search in. If not provided, searches all text-based fields.maxRecords (number, optional): Maximum number of records to return. Defaults to 100.list_bases
list_tables
baseId (string, required): The ID of the Airtable basedetailLevel (string, optional): The amount of detail to get about the tables (tableIdentifiersOnly, identifiersOnly, or full)detailLevel)describe_table
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the table to describedetailLevel (string, optional): The amount of detail to get about the table (tableIdentifiersOnly, identifiersOnly, or full)get_record
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablerecordId (string, required): The ID of the record to retrievecreate_record
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablefields (object, required): The fields and values for the new recordupdate_records
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablerecords (array, required): Array of objects containing record ID and fields to updatedelete_records
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablerecordIds (array, required): Array of record IDs to deletecreate_table
baseId (string, required): The ID of the Airtable basename (string, required): Name of the new tabledescription (string, optional): Description of the tablefields (array, required): Array of field definitions (name, type, description, options)update_table
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablename (string, optional): New name for the tabledescription (string, optional): New description for the tablecreate_field
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablename (string, required): Name of the new fieldtype (string, required): Type of the fielddescription (string, optional): Description of the fieldoptions (object, optional): Field-specific optionsupdate_field
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablefieldId (string, required): The ID of the fieldname (string, optional): New name for the fielddescription (string, optional): New description for the fieldcreate_comment
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablerecordId (string, required): The ID of the recordtext (string, required): The comment textparentCommentId (string, optional): Parent comment ID for threaded replieslist_comments
baseId (string, required): The ID of the Airtable basetableId (string, required): The ID of the tablerecordId (string, required): The ID of the recordpageSize (number, optional): Number of comments to return (max 100, default 100)offset (string, optional): Pagination offset for retrieving additional commentsThe server can also run in HTTP mode for use with remote MCP clients:
MCP_TRANSPORT=http PORT=3000 npx airtable-mcp-server
This starts a stateless HTTP server at http://localhost:3000/mcp. Note: HTTP transport has no built-in authentication - only use behind a reverse proxy or in a secured environment.
Pull requests are welcomed on GitHub! To get started:
npm installnpm run test to run testsnpm run buildnpm run build:watch to automatically build after editing src/index.ts. This means you can hit save, reload Claude Desktop (with Ctrl/Cmd+R), and the changes apply.Versions follow the semantic versioning spec.
To release:
npm version <major | minor | patch> to bump the versiongit push --follow-tags to push with tagsAIRTABLE_API_KEY*secretAirtable personal access token (e.g., pat123.abc123). Create at https://airtable.com/create/tokens/new with scopes: schema.bases:read, data.records:read, and optionally schema.bases:write and data.records:write.
hovecapital/read-only-local-postgres-mcp-server
cocaxcode/database-mcp
io.github.infoinlet-marketplace/mcp-mysql
io.github.cybeleri/database-admin
io.github.yash-0620/postgres-mcp-secured