Lists bases, reads and writes records, manages tables and fields, filters and searches data in Airtable via the `airtable-mcp` CLI. Use when the task involves Airtable data or the user mentions airtable-mcp, bases, tables, records, or fields.
2 stars
0 votes
0 copies
0 views
Added October 14, 2026
ai-agentsgoshellapisecurity
Works with
cli
api
mcp
Security analysis
A96/100
mediumInstalls packages at runtime which could introduce malicious dependencies
Installs into .claude/skills of the current project.
Are you the author of X Openai Airtable Cli 1f32d06?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/geruyang-x-openai-airtable-cli-1f32d06)
---
name: x-openai-airtable-cli-1f32d06
description: Lists bases, reads and writes records, manages tables and fields, filters and searches data in Airtable via the `airtable-mcp` CLI. Use when the task involves Airtable data or the user mentions airtable-mcp, bases, tables, records, or fields.
---
### 导出副本边界与技能别名
迁移、安装、修复和经验回写只作用于当前加载的目标宿主技能副本。原 Codex 技能/MCP、下载的源码和 `original-skills` 均为来源材料,不因执行本副本而写入;只有用户另行明确要求配置 Codex 产品本身时,才按该产品流程处理指定目标。脚本需要安装目录或状态目录时,显式提供目标路径;不得从 `CODEX_HOME` 隐式推断写入位置。
跨技能名称可能沿用源库别名。先查 [技能别名表](../../skill-aliases.json),优先选择同来源、同插件的条目,再使用其 `id` 调用或读取对应入口;不得假定旧 `$skill`、`superpowers:skill` 名称在新宿主直接注册。不能确定目标时先核对,不替换真实产品命令或 Shell 环境变量。
## 跨宿主使用约定
本副本供支持 Agent Skills 的客户端使用。先检查当前宿主实际提供的工具、权限和已连接服务,再执行正文工作流。原文中的宿主工具标识是能力参考;只有实际发现该工具时才可调用,其他宿主应使用经核验的等价 MCP、CLI 或 API。没有等价能力的步骤必须报告不可用,不能虚构调用或完成状态。
技能资源以本技能目录为基准;输出写入当前项目中用户指定的位置。通过技能名称或自然语言触发,具体快捷命令由宿主决定。涉及真实产品、模型 API、协议字段和官方网址的名称保持原意。授权、审批、隐私和工具范围限制在迁移后仍然有效;不得为兼容而扩大权限。具体依赖与迁移说明见同目录 `PORTABILITY.md`。
# airtable-mcp
## Self-discovery
Tools are fetched from the MCP server at runtime, so the CLI never has a hardcoded command list. Discover what's available:
```sh
airtable-mcp tools # human-readable list
airtable-mcp tools --json # machine-parseable list
airtable-mcp <tool> --help # show flags and descriptions for a tool
```
Run `airtable-mcp tools` before assuming a tool exists. Tool names, arguments, and output shapes can change between server releases without a CLI update.
## Install
```sh
npm install -g @airtable/mcp-cli
```
## Auth
The CLI needs an Airtable personal access token (PAT). Two paths:
**Environment variable (preferred for scripts/agents):**
```sh
export AIRTABLE_TOKEN=pat_xxx
```
**Interactive configure (stores token in `~/.airtable/cli.json` with 0600 permissions):**
```sh
airtable-mcp configure
```
Create tokens at https://airtable.com/create/tokens. Ensure the token has the scopes required by the tools being called.
`AIRTABLE_TOKEN` takes precedence over saved profiles when no `--profile` flag is set. Never log or echo tokens.
## Quick reference
| Task | Command |
| ---------------------- | ------------------------------------------------------- |
| Set up credentials | `airtable-mcp configure` |
| Add a named profile | `airtable-mcp configure --profile work` |
| Check auth status | `airtable-mcp whoami` |
| Remove credentials | `airtable-mcp logout` |
| Remove all profiles | `airtable-mcp logout --all` |
| List available tools | `airtable-mcp tools` |
| Run a tool | `airtable-mcp <tool> --flagName value` |
| Get tool help | `airtable-mcp <tool> --help` |
| Pass args via stdin | `echo '{"key":"val"}' \| airtable-mcp <tool> --input -` |
| Bypass tool cache | `airtable-mcp <tool> --refresh` |
| Suppress status msgs | `airtable-mcp <tool> -q` |
| Raw text output | `airtable-mcp <tool> --output raw` |
| Use a specific profile | `airtable-mcp <tool> --profile work` |
Tool names use hyphens on the CLI (`list-records`) but underscores in MCP (`list_records`). The CLI translates automatically.
## Workflow
1. **Auth** — set `AIRTABLE_TOKEN` or run `airtable-mcp configure`
2. **Discover** — run `airtable-mcp tools` to see available tools
3. **Inspect** — run `airtable-mcp <tool> --help` for flags and descriptions
4. **Check access** — in `tools --json` output, check the `access` field: `read-only`, `write`, or `destructive`. Confirm with the user before running `destructive` tools.
5. **Execute** — run `airtable-mcp <tool> --flagName value`
## Output & automation
- Default output is formatted JSON to stdout. Status messages go to stderr.
- `--json` on `tools` gives a JSON array of `{name, title, access}`.
- `-q` / `--quiet` suppresses stderr status messages (cache warnings, etc).
- `--output raw` returns the raw server response text instead of parsed JSON.
- `--input -` reads tool arguments as a JSON object from stdin, bypassing flag parsing.
- Exit codes: `0` success, `1` error (auth, tool failure, not found), `2` usage error (bad flags, bad input).
## Common tasks
**Find a base and list its tables:**
```sh
airtable-mcp search-bases --searchQuery "Project Tracker" -q
airtable-mcp list-tables-for-base --baseId appK9MtBqFw3o5jGN -q
```
**List records with specific fields:**
```sh
airtable-mcp list-records-for-table \
--baseId appK9MtBqFw3o5jGN --tableId tblL4GpTfEz8byRsW \
--fieldIds '["Name","Status"]' --pageSize 10 -q
```
**Filter records** — filters use structured JSON, not formula strings. Wrap conditions in an `operands` array; the top-level `operator` defaults to `and` if omitted:
```sh
airtable-mcp list-records-for-table \
--baseId appK9MtBqFw3o5jGN --tableId tblL4GpTfEz8byRsW \
--filters '{"operator":"and","operands":[{"operator":"=","operands":["Status","Done"]}]}' -q
```
For select fields, filter by choice ID (from `get-table-schema`), not the display name. The `airtable-filters` skill covers compound filters, date filters, and operator-by-field-type details.
**Search records** — use `search-records` for free-text/fuzzy queries on large tables. Use `list-records-for-table` with `--filters` when filtering by exact field values:
```sh
airtable-mcp search-records \
--baseId appK9MtBqFw3o5jGN --table tblL4GpTfEz8byRsW \
--query "acme" --fields '["Name","Notes"]' -q
```
Pass `--fields ALL_SEARCHABLE_FIELDS` to search across every indexed field. Date, rating, checkbox, and button fields are not searchable.
**Update records** — complex args are easier via `--input -`:
```sh
echo '{"baseId":"appK9MtBqFw3o5jGN","tableId":"tblL4GpTfEz8byRsW","records":[{"id":"recVnR3xPq8sD2yLk","fields":{"fld8WsrpLHHevsnW8":"Done"}}]}' \
| airtable-mcp update-records-for-table --input - -q
```
Select field values are returned as objects (`{"id":"sel...","name":"Done"}`) but must be written as plain strings (`"Done"`). Record field keys in create/update currently require field IDs (`fldXXX`) — use `get-table-schema` to resolve names to IDs before writing. Note that `fieldIds`, `sort`, and `filters` accept both names and IDs.
## Gotchas
| Problem | Cause | Fix |
| -------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------ |
| `Unknown tool: X` | Tool name doesn't exist on the server or cache is stale | Run `airtable-mcp tools --refresh` to refresh, then retry |
| `Authentication failed` | Token expired, revoked, or wrong | Run `airtable-mcp configure` or check `AIRTABLE_TOKEN` |
| `Access denied` | Token missing required scopes | Add scopes at https://airtable.com/create/tokens |
| `Connection timed out` | Server unreachable (10s timeout) | Check network; CLI falls back to stale cache if available |
| Boolean flags take no value | `--dryRun true` passes `"true"` as next arg | Use `--dryRun` alone (booleans are presence-based) |
| Array/object args fail | Value isn't valid JSON | Pass as JSON string: `--fieldMappings '{"a":"b"}'` |
| Filter rejected at top level | Single condition passed without `operands` wrapper | Wrap in `{"operands":[...]}` (`operator` defaults to `and`) |
| Sort key is `fieldId` not `field` | `--sort '[{"field":"Name"}]'` silently ignored | Use `{"fieldId":"Name","direction":"asc"}` — accepts field IDs or names |
| Select filter returns no matches | Filtering by display name instead of choice ID | Run `get-table-schema` first to get `sel...` choice IDs |
| `INVALID_RECORDS` on batch write | Batch limit is 10 records per request (default; varies by account) | Split into chunks of ≤10 and check `<tool> --help` for the current limit |
| Permission error on `list-records-for-table` | User has interface-only access to the base | Use `list-records-for-page` / `get-record-for-page` instead |
| Endpoints restricted | CLI only allows HTTPS on `*.airtable.com` | Cannot point at arbitrary servers (security constraint) |