Airtable MCP服务器

一个强大的Airtable模型上下文协议(MCP)服务器,支持所有字段类型处理、自动类型转换和批量操作,适用于需要与Airtable深度集成的开发场景。

  • by jordan-huffman
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 jordan-huffman/airtable-mcp-server

使用说明

增强型Airtable MCP服务器

Airtable的一个强大的模型上下文协议(MCP)服务器,可以正确处理所有字段类型,包括单选、日期、公式、复选框、数字等。

特性

  • 全字段类型支持:正确处理所有Airtable字段类型:

    • 单选和多选
    • 日期和日期时间
    • 数字、货币、百分比、持续时间、评级
    • 复选框(布尔值)
    • 电子邮件、URL、电话号码
    • 附件
    • 记录链接
    • 公式、汇总、查找(只读)
    • 还有更多!
  • 自动类型转换:根据字段类型自动将值转换为正确的格式

  • 验证:根据模式验证字段值(例如,验证选择选项)

  • 灵活查询:支持过滤、排序、视图和字段选择

  • 模式管理:从Airtable Metadata API自动匹配表架构或手动定义

  • 批量操作:高效地创建、更新或删除每个请求最多10条记录

  • 发现工具:列出所有可访问的基和表以及元数据

安装

npm install
npm run build

配置

认证

此服务器使用 个人访问令牌(PAT) 用于身份验证。Airtable正在弃用传统的API密钥,转而支持PAT。

个人访问令牌:

  • 从开始 pat (例如。, patXXXXXXXXXXXXXXXXXX.XXXXXXXXX...)
  • 可以使用单个令牌访问多个基站
  • 支持细粒度权限
  • 可选设置 AIRTABLE_BASE_ID 作为默认基数

环境变量:

  • AIRTABLE_PAT (必填):您的个人访问令牌
  • AIRTABLE_BASE_ID (可选):如果您主要使用一个基,则默认基ID

创建您的PAT: https://airtable.com/create/tokens

备注:传统API密钥(从 key)此服务器不再支持。

安全最佳实践

⚠️ 重要:永远不要将令牌提交到版本控制中!

  1. 使用环境变量:将凭据存储在 .env 文件(已在 .gitignore)
  2. 定期旋转令牌:每90天刷新一次个人访问令牌
  3. 使用范围权限:创建具有最低所需权限(范围)的PAT
  4. 独立环境:为开发/暂存/生产使用不同的令牌

看 安全.md 获取全面的安全指南。

用法

本地运行

# Development mode with PAT only (access multiple bases)
AIRTABLE_PAT=your_pat npm run dev

# Development mode with default base
AIRTABLE_PAT=your_pat AIRTABLE_BASE_ID=your_base npm run dev

# Production mode
AIRTABLE_PAT=your_pat AIRTABLE_BASE_ID=your_base npm start

与Claude Desktop一起使用

添加到您的Claude Desktop配置文件中:

MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%/Claude/claude_desktop_config.json

选项1:仅PAT(多基站接入)

{
  "mcpServers": {
    "airtable": {
      "command": "node",
      "args": ["/absolute/path/to/airtable-mcp-server/build/index.js"],
      "env": {
        "AIRTABLE_PAT": "patXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
      }
    }
  }
}

通过此设置,服务器可以访问您的PAT有权访问的所有库。

选项2:带默认基数的PAT(推荐)

如果你主要与一个基地合作:

{
  "mcpServers": {
    "airtable": {
      "command": "node",
      "args": ["/absolute/path/to/airtable-mcp-server/build/index.js"],
      "env": {
        "AIRTABLE_PAT": "patXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "AIRTABLE_BASE_ID": "appXXXXXXXXXXXXXX"
      }
    }
  }
}

安全说明:

  • ⚠️ 使用 绝对路径 仅(例如。, /Users/you/projects/... 不 ~/projects/...)
  • 🔒 保护配置文件: chmod 600 ~/Library/Application\ Support/Claude/claude_desktop_config.json
  • 🚫 切勿使用真实凭据提交此配置文件
  • ✅ Claude Desktop配置文件是用户特定的,应保持私有

可用工具

1. airtable_list_bases

列出所有可使用您的个人访问令牌访问的Airtable基地。

参数:无

示例响应:

{
  "count": 3,
  "bases": [
    {
      "id": "appXXXXXXXXXXXXXX",
      "name": "My Project",
      "permissionLevel": "create"
    }
  ]
}

2. airtable_list_tables

列出Airtable库中的所有表。

参数:

  • baseId (可选):Airtable基ID。如果未提供,则使用配置中的默认基。

示例响应:

{
  "count": 5,
  "tables": [
    {
      "id": "tblXXXXXXXXXXXXXX",
      "name": "Contacts",
      "description": "Customer contact information",
      "primaryFieldId": "fldXXXXXXXXXXXXXX"
    }
  ]
}

3. airtable_get_table_schema

获取表的完整架构,包括所有字段定义、类型和选项。来自Airtable元数据API的自动提示。

参数:

  • baseId (可选):气垫底座ID
  • table (必填):表名

示例:

{
  "table": "Tasks"
}

4. airtable_list_records

使用可选的筛选和排序从表中列出记录。

参数:

  • table (必填):表名
  • filterByFormula (可选):空气表过滤公式
  • maxRecords (可选):要返回的最大记录数
  • view (可选):要使用的视图名称
  • fields (可选):要返回的字段名数组
  • sort (可选):排序对象数组 [{field: "Name", direction: "asc"}]

示例:

{
  "table": "Contacts",
  "filterByFormula": "{Status} = 'Active'",
  "maxRecords": 10,
  "sort": [{"field": "Created", "direction": "desc"}]
}

5. airtable_get_record

按ID获取特定记录。

参数:

  • table (必填):表名
  • recordId (必填):记录ID

6. airtable_create_record

使用自动字段类型转换创建新记录。

参数:

  • table (必填):表名
  • fields (必填):具有字段值的对象

示例:

{
  "table": "Tasks",
  "fields": {
    "Name": "Complete project",
    "Status": "In Progress",
    "Due Date": "2024-12-31",
    "Priority": 5,
    "Completed": false
  }
}

7. airtable_update_record

更新现有记录。

参数:

  • table (必填):表名
  • recordId (必填):记录ID
  • fields (必需):具有要更新的字段值的对象

8. airtable_delete_record

删除记录。

参数:

  • table (必填):表名
  • recordId (必填):记录ID

9. airtable_set_table_schema

定义表的架构,以实现正确的字段类型处理。这是可选的,但建议用于更好的类型安全和验证。

参数:

  • table (必填):表名
  • fields (必填):字段定义数组

示例:

{
  "table": "Tasks",
  "fields": [
    {
      "name": "Name",
      "type": "singleLineText"
    },
    {
      "name": "Status",
      "type": "singleSelect",
      "options": {
        "choices": [
          {"id": "sel1", "name": "To Do"},
          {"id": "sel2", "name": "In Progress"},
          {"id": "sel3", "name": "Done"}
        ]
      }
    },
    {
      "name": "Due Date",
      "type": "date"
    },
    {
      "name": "Priority",
      "type": "number"
    },
    {
      "name": "Completed",
      "type": "checkbox"
    }
  ]
}

10. airtable_batch_create_records

一次创建多条记录(每个请求最多10条)。比单独创建记录要高效得多。

参数:

  • baseId (可选):气垫底座ID
  • table (必填):表名
  • records (必填):记录对象数组(最多10个)

示例:

{
  "table": "Tasks",
  "records": [
    {
      "Name": "Task 1",
      "Status": "To Do",
      "Priority": 3
    },
    {
      "Name": "Task 2",
      "Status": "In Progress",
      "Priority": 5
    },
    {
      "Name": "Task 3",
      "Status": "To Do",
      "Priority": 1
    }
  ]
}

11. airtable_batch_update_records

一次更新多条记录(每次请求最多10条)。比单独更新记录要高效得多。

参数:

  • baseId (可选):气垫底座ID
  • table (必填):表名
  • updates (必填):更新对象数组 id 和 fields (最多10个)

示例:

{
  "table": "Tasks",
  "updates": [
    {
      "id": "recXXXXXXXXXXXXXX",
      "fields": {
        "Status": "Completed",
        "Completed": true
      }
    },
    {
      "id": "recYYYYYYYYYYYYYY",
      "fields": {
        "Status": "In Progress",
        "Priority": 5
      }
    }
  ]
}

12. airtable_batch_delete_records

一次删除多条记录(每次请求最多10条)。比单独删除记录更有效。

参数:

  • baseId (可选):气垫底座ID
  • table (必填):表名
  • recordIds (必填):要删除的记录ID数组(最多10个)

示例:

{
  "table": "Tasks",
  "recordIds": [
    "recXXXXXXXXXXXXXX",
    "recYYYYYYYYYYYYYY",
    "recZZZZZZZZZZZZZZ"
  ]
}

现场类型处理

服务器根据字段类型自动转换值:

字段类型 输入格式 注释
singleSelect "Option Name" 根据可用选项进行验证
多选 ["Option1", "Option2"] 选项名称数组
日期/日期时间 "2024-12-31" 或ISO字符串 转换为ISO格式
数量/货币/百分比 42 或 "42" 转换为数字
复选框 true, false, "true", "1" 转换为布尔值
电子邮件 "user@example.com" 验证电子邮件格式
url "https://example.com" 验证URL格式
多条记录链接 ["recXXX", "recYYY"] 记录ID数组
附件 [{url: "https://..."}] 附件对象数组
公式/汇总等。 N/A 只读字段

发展

# Install dependencies
npm install

# Run in development mode with auto-reload
npm run dev

# Build TypeScript
npm run build

# Watch mode for development
npm run watch

项目结构

.
├── src/
│   ├── index.ts                 # Main MCP server
│   ├── types/
│   │   └── airtable.ts         # Type definitions
│   ├── utils/
│   │   ├── airtable-client.ts  # Airtable client wrapper
│   │   └── field-converter.ts  # Field type conversion utilities
│   └── handlers/                # Future: tool handlers
├── build/                       # Compiled JavaScript
├── package.json
├── tsconfig.json
└── README.md

为什么选择此服务器?

现有的Airtable MCP服务器只能处理简单的文本字段。此服务器:

  • 正确处理 单选 字段(验证选项)
  • 正确格式化 日期 和 日期时间 字段
  • 转换 数字, 货币, 百分比 适当的字段
  • 手柄 复选框 (布尔)字段
  • 支持 多选, 附件, 记录链接
  • 根据架构验证字段值
  • 提供有用的错误消息

安全

此MCP服务器实施了全面的安全措施:

✅ 输入验证:所有输入均已Zod模式验证 ✅ 配方注射剂保护:山宁泰字段名和转义值 ✅ 错误清理:从错误消息中编辑敏感数据 ✅ 字段过滤:自动排除大/敏感字段 ✅ 速率限制意识:遵守API Airtable限制 ✅ 依赖关系扫描:常规 npm audit 检查(目前0个漏洞)

关于安全问题:请审阅 安全.md 并私下向维护人员报告漏洞(而不是通过公开问题)。

Claude Desktop的最佳实践

始终使用字段过滤来防止超时并保护敏感数据:

{
  "table": "Users",
  "excludeAttachments": true,  // ⭐ ALWAYS use this with Claude Desktop
  "maxRecords": 100
}

或者在常见场景中使用预设:

{
  "table": "Contacts",
  "preset": "contact",  // Safe preset (no attachments/long text)
  "maxRecords": 50
}

监控API使用情况

气垫床限制:

  • 每个基站每秒5个请求
  • 每个工作区每天100000个电话

在 Airtable帐户仪表板.

许可证

麻省理工学院

贡献

欢迎投稿!拜托:

  1. 审查 安全.md 安全指南
  2. 跑 npm audit 提交前
  3. 为新功能添加测试
  4. 遵循现有代码样式

对于安全漏洞,请遵循 安全.md.