Airtable Model Context Protocol Server
The `airtable-mcp-server` package provides a Model Context Protocol (MCP) server designed to enable Large Language Models (LLMs) with read and write access to Airtable databases. It exposes a set of tools allowing LLMs to inspect Airtable schemas, then read and write records. The current stable version is 1.13.0, indicating a pre-1.x release cadence focusing on feature additions and minor fixes, with frequent patch and minor updates. Key differentiators include its adherence to the Model Context Protocol, providing structured access to Airtable via LLMs, and its ease of deployment via `npx` or integration with platforms like Claude Desktop, Cursor, and Cline. It handles schema inspection, record manipulation, and attachment uploads, abstracting Airtable's API for AI agents.
Common errors
-
AIRTABLE_API_KEY environment variable is required.
cause The server was started without the necessary Airtable Personal Access Token configured in the environment variables.fixSet the `AIRTABLE_API_KEY` environment variable with a valid Airtable Personal Access Token (e.g., `export AIRTABLE_API_KEY='pat123.abc123'`). Ensure the token has appropriate scopes and access to the desired bases. -
Failed to handle large payload: Request body too large
cause An attempt was made to send a large data payload (e.g., many records or a large attachment) to the server, exceeding the configured `express.json()` body size limit.fixUpgrade to `airtable-mcp-server` v1.13.0 or newer. If running an older version programmatically, you might need to manually configure the `express.json` middleware with a larger `limit` option. -
OAuth metadata startup error
cause An issue occurred during server startup related to the `smithery.yaml` entry point for OAuth metadata.fixThis issue was resolved in v1.10.0. Ensure you are using `airtable-mcp-server` v1.10.0 or newer.
Warnings
- breaking The package underwent a 'Refactor to modern MCP SDK architecture'. Users relying on internal structures or extending the server's previous architecture may experience breaking changes.
- gotcha Previously, the `express.json()` body size limit could cause issues with large payloads, leading to silent failures or unexpected behavior when writing extensive records or attachments.
- gotcha The `createRecord` and `updateRecords` functions now include `typecast: true` by default. This change affects how data types are handled during write operations, potentially coercing values if the provided data does not strictly match Airtable field types.
- deprecated The `server.json` schema was updated to 'MCP registry schema 2025-10-17'. While not directly breaking for the server's runtime, integrators or tools relying on the older schema for metadata may experience issues.
Install
-
npm install airtable-mcp-server -
yarn add airtable-mcp-server -
pnpm add airtable-mcp-server
Imports
- startServer
const { startServer } = require('airtable-mcp-server');import { startServer } from 'airtable-mcp-server'; - ServerConfig
import type { ServerConfig } from 'airtable-mcp-server'; - AirtableOptions
import type { AirtableOptions } from 'airtable-mcp-server';
Quickstart
import { startServer } from 'airtable-mcp-server';
const PORT = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000;
const AIRTABLE_API_KEY = process.env.AIRTABLE_API_KEY ?? '';
const AIRTABLE_BASE_ID = process.env.AIRTABLE_BASE_ID ?? '';
async function main() {
if (!AIRTABLE_API_KEY) {
console.error('AIRTABLE_API_KEY environment variable is required.');
process.exit(1);
}
console.log(`Starting Airtable MCP server on port ${PORT}...`);
try {
const server = await startServer({
port: PORT,
airtableApiKey: AIRTABLE_API_KEY,
airtableBaseIds: AIRTABLE_BASE_ID ? [AIRTABLE_BASE_ID] : [], // Optional: specify base IDs
// Additional configuration options can be added here
});
console.log(`Airtable MCP server listening at http://localhost:${PORT}`);
// Optional: Graceful shutdown
process.on('SIGTERM', () => {
console.log('SIGTERM signal received: closing HTTP server');
server.close(() => {
console.log('HTTP server closed');
});
});
} catch (error) {
console.error('Failed to start server:', error);
process.exit(1);
}
}
main();