ワンクリックで
airtable
Read or write Airtable records — bases, tbl/rec/fld IDs, filterByFormula, pyairtable. Not for n8n workflows or Google Sheets/Excel.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Read or write Airtable records — bases, tbl/rec/fld IDs, filterByFormula, pyairtable. Not for n8n workflows or Google Sheets/Excel.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Plan non-trivial features, fixes, refactors, UI/workflow changes before coding — clarify, research, get approval (Stop & Think protocol).
Find a past Claude Code session to resume — I closed my session, find the session where we…, which session discussed X, which session talked to the other agent.
Commit and optionally push. MANDATORY before any git write — commit, push, merge, rebase, reset, branch -d. Triggers: ship it, commit, push.
Review or improve an existing agent skill (SKILL.md structure, triggers, permissions, splitting). Not for new skills — use skills-build.
Build a NEW agent skill from a real repeated workflow. Use when the user asks to create a skill, scaffold `SKILL.md`, convert a recurring task into a skill, or decide whether a process deserves a skill. Do NOT use to review or audit an existing skill — use `skill-improver` for that.
Edit Tally forms via MCP tools — add/remove/reorder blocks and questions, change text, configure visibility/required state, and build conditional logic (apply_logic DSL). Use when the user mentions Tally, questionnaires, form building, form blocks, or a Tally form ID/URL, or asks to add a question, hide/show a field, sync Hebrew/English forms, or add logic to a Tally form. Does NOT trigger for writing the actual wording/persuasive copy of form questions or intro text (route that to `microcopy` or `copywriting`) — this skill is for structural/tool-mechanics edits via the Tally MCP, not for drafting prose.
| name | airtable |
| description | Read or write Airtable records — bases, tbl/rec/fld IDs, filterByFormula, pyairtable. Not for n8n workflows or Google Sheets/Excel. |
| allowed-tools | Bash, Read |
You are an Airtable client that helps users access their bases, tables, and records using curl for reads and Python pyairtable for writes.
filterByFormula, pyairtable, or a tbl…/rec…/fld… ID.docs/airtable-schema.md instead of guessing..env file or rotating tokens — out of scope.Before running anything, confirm you have:
AIRTABLE_API_KEY in env (load with source <project-root>/.env). First-time setup guide (Python, pyairtable, token creation) in references/query-patterns.md § First: Check Prerequisites.source ~/.claude/skills/airtable/config.env sets $BASE_ID and the table-ID vars ($CLIENTS_TID, $REPORTS_TID, $DOCUMENTS_TID, $PENDING_TID, $TEMPLATES_TID). Template: config.example.env. Edit config.env only to redeploy on another base — never hardcode raw app…/tbl… IDs.tblXXX) or table name — prefer the ID var.<project-root>/.env (API key) and ~/.claude/skills/airtable/config.env (base + table IDs); verify AIRTABLE_API_KEY and $BASE_ID are set.filterByFormula/sort.references/query-patterns.md and build the request from its templates: curl --data-urlencode for reads; curl PATCH/POST or pyairtable for writes (after the user's permission — privacy rule).references/query-patterns.md § If you get a 422 — do not retry the same query with tweaks.This project's Airtable base is your CRM base (this template was built around a client/reports/documents CRM — adapt table names to yours). Its base + table IDs are externalized to config.env (load $BASE_ID and the table-ID vars with source ~/.claude/skills/airtable/config.env; template config.example.env). The full schema is documented at docs/airtable-schema.md. The API key is stored in .env at the project root — load it with source <project-root>/.env before running any commands.
Do not write a filterByFormula or sort until you have confirmed the actual field names of the target table. Field-name guessing is the #1 cause of 422s in this skill. This gate fires even when the skill is invoked from inside another skill / sub-agent context.
Pick ONE of these to satisfy the gate:
references/schema-quick-reference.md in this conversation and are using ONLY fields listed there.docs/airtable-schema.md for the target table in this conversation.curl -s -G "https://api.airtable.com/v0/$BASE_ID/$TABLE_ID" \
-H "Authorization: Bearer $AIRTABLE_API_KEY" \
--data-urlencode "maxRecords=1" | python3 -m json.tool
If none of the three are true, run the probe FIRST. Do not skip this step to "save a tool call" — every guessed query that 422s costs more than the probe.
Also: lookup / formula / rollup fields cannot be matched with =. Use SEARCH('value', {field}) or FIND('value', ARRAYJOIN({field})). Example: reports.client_id is a lookup array (values like ['CPA-210']) — {client_id}='CPA-210' will not match; use FIND('CPA-210', ARRAYJOIN({client_id})). By contrast pending_classifications.client_id is plain text (so {client_id}='CPA-210' works), and clients.client_id is the formula field. (Verified against the live base via the Meta API.)
Use curl with --data-urlencode for every read (filterByFormula, fields, sort). Do NOT use Python urllib.parse.urlencode for reads — it silently mis-encodes Airtable formula syntax (AND(...), SEARCH(...)) and Hebrew characters, producing 422s that are very hard to diagnose. Python (requests / pyairtable) is fine for write operations only. All templates in references/query-patterns.md.
--data-urlencode. Python urllib silently mis-encodes AND(...), SEARCH(...), and Hebrew characters → 422.= — wrap with SEARCH('val', {field}) or FIND('val', ARRAYJOIN({field})). Example: reports.client_id is a lookup array → use FIND('CPA-210', ARRAYJOIN({client_id})). (pending_classifications.client_id is plain text — = is fine there; clients.client_id is the formula.)FIND(id, ARRAYJOIN({field})) in formulas, or access [0] in code. Bare {linked}=... will not match. Prefer human-readable lookup fields (e.g. report_key_lookup) over raw record-ID linked fields — see the pattern + real 2026-05-02 incident in references/query-patterns.md.created_at, not Created. Confirm sort fields against the schema probe before running. Per-table sort fields listed in references/schema-quick-reference.md.AIRTABLE_API_KEY (not AIRTABLE_PAT)typecast: true on record create insteadfields[] param: Use --data-urlencode "fields[]=name" (not fields=name)config.env — reference the vars ($CLIENTS_TID, $REPORTS_TID, $DOCUMENTS_TID, $PENDING_TID, $TEMPLATES_TID), never raw tbl… literals. Full table→var map in references/schema-quick-reference.md.See privacy.md for complete rules. Key points:
references/schema-quick-reference.md, docs/airtable-schema.md, or a no-filter probe. No guessing.create, update, upsert, or delete without explicit user permission for that operation.references/query-patterns.md) — do not retry the same query with tweaks.curl --data-urlencode. Python urllib for reads is forbidden (silent mis-encoding of AND/SEARCH and Hebrew).AIRTABLE_API_KEY.Format as clean tables:
Good:
Records in Tasks:
┌──────────────────┬──────────┬────────────┐
│ Name │ Status │ Due Date │
├──────────────────┼──────────┼────────────┤
│ Review proposal │ Active │ Jan 20 │
│ Send report │ Done │ Jan 18 │
└──────────────────┴──────────┴────────────┘
Bad:
[{"id":"rec123","fields":{"Name":"Review proposal"...
references/schema-quick-reference.md — verified field names, enum values, and sort fields per table in your CRM base. Read it to satisfy HARD GATE option 1.references/query-patterns.md — all request templates: canonical curl reads, write/delete/Meta-API calls, multi-step linked-field patterns (documents-for-a-client), the 422 recovery sequence, pyairtable patterns, and first-time setup. Load at workflow step 4.Sources: pyAirtable Documentation, GitHub
After running an Airtable operation, confirm:
references/schema-quick-reference.md / docs/airtable-schema.md / no-filter probe) before any filtered read?curl --data-urlencode (not Python urllib)?SEARCH / FIND / ARRAYJOIN instead of bare =?created_at (not Created) used for sort?