marchi-lau/mcp-airtable
If you are the rightful owner of mcp-airtable and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
An MCP (Model Context Protocol) server that provides tools for interacting with Airtable databases, enabling AI assistants to perform CRUD operations on Airtable bases and tables.
list_bases
List all available Airtable bases.
list_tables
List all tables in a specific base.
get_records
Retrieve records from a table with optional filtering and sorting.
create_record
Create a new record in a table.
update_record
Update an existing record.
delete_record
Delete a record from a table.
get_schema
Get the schema information for a base.
upload_attachment
Upload a file to S3 and get a URL formatted for Airtable attachment fields.
MCP Airtable Server
An MCP (Model Context Protocol) server that provides tools for interacting with Airtable databases. This server allows AI assistants to perform CRUD operations on Airtable bases and tables.
Features
- List available Airtable bases
- List tables within a base
- Get records with filtering, sorting, and field selection
- Create new records
- Update existing records
- Delete records
- Get base schema information
Installation
-
Clone this repository
-
Install dependencies:
npm install
-
Build the TypeScript code:
npm run build
Configuration
-
Copy
.env.example
to.env
:cp .env.example .env
-
Add your Airtable API key to
.env
:AIRTABLE_API_KEY=your_api_key_here
-
(Optional) Add a default base ID:
AIRTABLE_BASE_ID=appXXXXXXXXXXXXXX
Getting your Airtable API Key
- Go to Airtable account settings
- Navigate to the "API" section
- Generate a personal access token with the following scopes:
data.records:read
data.records:write
schema.bases:read
Usage
Running the Server
For development with hot reload:
npm run dev
For production:
npm start
Using with Claude Desktop
Option 1: Local Installation (Recommended)
Add the following to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"airtable": {
"command": "node",
"args": ["/path/to/mcp-airtable/dist/index.js"],
"env": {
"AIRTABLE_API_KEY": "your_api_key_here",
"AIRTABLE_BASE_ID": "optional_default_base_id",
"AWS_REGION": "us-east-1",
"AWS_S3_BUCKET": "your-bucket-name",
"AWS_ACCESS_KEY_ID": "your-access-key",
"AWS_SECRET_ACCESS_KEY": "your-secret-key"
}
}
}
}
Option 2: Remote Deployment (Zeabur)
-
Deploy to Zeabur:
- Fork this repository
- Connect your GitHub account to Zeabur
- Create a new service and select this repository
- Zeabur will automatically detect the Dockerfile
-
Configure Environment Variables in Zeabur:
MCP_AUTH_TOKEN=your-secret-token AIRTABLE_API_KEY=your-airtable-api-key AIRTABLE_BASE_ID=your-default-base-id (optional) AWS_REGION=us-east-1 (optional) AWS_S3_BUCKET=your-bucket-name (optional) AWS_ACCESS_KEY_ID=your-key (optional) AWS_SECRET_ACCESS_KEY=your-secret (optional)
-
Configure Claude Desktop for Remote MCP:
{ "mcpServers": { "airtable-remote": { "transport": "sse", "url": "https://your-app.zeabur.app/mcp", "headers": { "Authorization": "Bearer your-secret-token" } } } }
Security Note: When using remote deployment, always:
- Set a strong
MCP_AUTH_TOKEN
- Use HTTPS only
- Keep your API keys secure in Zeabur's environment variables
- Never commit secrets to your repository
Available Tools
list_bases
List all available Airtable bases.
list_tables
List all tables in a specific base.
Parameters:
baseId
(optional): The base ID. Uses default if not specified.
get_records
Retrieve records from a table with optional filtering and sorting.
Parameters:
tableName
(required): The name of the tablebaseId
(optional): The base IDview
(optional): View name or IDmaxRecords
(optional): Maximum number of records to returnfilterByFormula
(optional): Airtable formula for filteringsort
(optional): Array of sort configurationsfields
(optional): Array of field names to return
create_record
Create a new record in a table.
Parameters:
tableName
(required): The name of the tablefields
(required): Object containing field valuesbaseId
(optional): The base ID
update_record
Update an existing record.
Parameters:
tableName
(required): The name of the tablerecordId
(required): The ID of the record to updatefields
(required): Object containing fields to updatebaseId
(optional): The base ID
delete_record
Delete a record from a table.
Parameters:
tableName
(required): The name of the tablerecordId
(required): The ID of the record to deletebaseId
(optional): The base ID
get_schema
Get the schema information for a base.
Parameters:
baseId
(optional): The base ID
upload_attachment
Upload a file to S3 and get a URL formatted for Airtable attachment fields. Requires AWS S3 configuration.
Parameters:
filePath
(optional): Local file path to uploadbase64Data
(optional): Base64 encoded file datafilename
(required with base64Data): Filename for the attachmentcontentType
(optional): MIME type of the file
Returns:
url
: Public URL of the uploaded filefilename
: Name of the filesize
: File size in bytestype
: MIME type
Example usage with create_record:
// First upload the file
const attachment = await upload_attachment({ filePath: '/path/to/image.jpg' });
// Then create/update record with attachment field
await create_record({
tableName: 'Products',
fields: {
'Name': 'Product Name',
'Images': [{ url: attachment.url, filename: attachment.filename }]
}
});
Development
Running Tests
npm test
Type Checking
npm run type-check
Linting
npm run lint
Examples
Getting Records with Filtering
{
"tool": "get_records",
"arguments": {
"tableName": "Contacts",
"filterByFormula": "AND({Status} = 'Active', {Age} > 25)",
"sort": [{ "field": "Name", "direction": "asc" }],
"maxRecords": 50
}
}
Creating a Record
{
"tool": "create_record",
"arguments": {
"tableName": "Contacts",
"fields": {
"Name": "John Doe",
"Email": "john@example.com",
"Status": "Active"
}
}
}
License
MIT