airtable
Skill2 starsChanged 3 months agoMITView on GitHub
Read or write Airtable data — bases, tables, `tbl…`/`rec…`/`fld…` IDs, `filterByFormula` syntax, field types and their coercion rules, batch limits, and the Meta API's boundaries. Covers the MCP tools, the REST API, and pyairtable. Triggers: 'read the Airtable records', 'update this base', 'what is the filterByFormula for…', 'add a field', 'why did my typecast not create the option', 'list the tables in this base'. Do NOT use for n8n workflows that happen to contain Airtable nodes, or for Google Sheets or Excel.
- Reads credentials
20 other projects use a version of this.
Adopted by
Most recently taken up by
- thensls/nsls-builder-toolkittheir own version, first seen Nov 8, 2026
- delorenj/skillstheir own version, first seen Nov 7, 2026
- Stuko0/alice-agenttheir own version, first seen Oct 13, 2026
- HybridAIOne/hybridclawtheir own version, first seen Oct 13, 2026
- nobodyohm-web/Thottheir own version, first seen Oct 13, 2026
- jholhewres/devclaw-skillstheir own version, first seen Oct 9, 2026
Other versions20 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 20
- aivrar/portable-hermes-agent★ 239same name
- refly-ai/refly-skills★ 204same name
- HybridAIOne/hybridclaw★ 159same name
- wundercorp/loki★ 28same name
- delorenj/skills★ 17same name
- Samin12/skills★ 8same name
- jholhewres/devclaw-skills★ 4same name
- qhkm/zeptoclaw-skills★ 4same name
- D1DX/airtable-skill★ 3same name
- john-data-chen/hermes-agent-backup★ 2same name
10 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository8 other files it gives its agents.
- design-logSkill
- find-sessionSkill
- git-shipSkill
- skill-improverSkill
- skills-buildSkill
- tallySkill
- tech-researcherSkill
- visualizeSkill
The file
We split this skill into the rules it gives an agent
9 rules. 0 are common, 6 are distinctive, and 3 are very specific to this project.
0
Common
Most of the 20 edited versions we read keep these.
6
Distinctive
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 27
Before running anything, confirm you have:
- Distinctive: line 63
If none of the three are true, run the probe FIRST.
- Very specific: line 78
fields[]param: Use --data-urlencode "fields[]=name" (not fields=name) - Distinctive: line 86
Read-only by default: - Never create, update, or delete without explicit permission
- Distinctive: line 87
Minimal data: - Only fetch what's needed
- Distinctive: line 88
No token display: - NEVER echo or display the API key
- Very specific: line 94
Write gate: never create, update, upsert, or delete without explicit user permission for that operation.
- Very specific: line 98
Token-display gate: never echo, log, or print AIRTABLE_API_KEY.
- Distinctive: line 131
After running an Airtable operation, confirm:
“Common” is measured: kept by at least 6 in 10 of the 20 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Airtable Client
You are an Airtable client that helps users access their bases, tables, and records using curl for reads and Python pyairtable for writes.
When this triggers
- User mentions Airtable, a base, table, record,
filterByFormula,pyairtable, or atbl…/rec…/fld…ID. - User asks to query, list, find, count, create, update, upsert, or delete records.
- User asks about schema/fields of an Airtable table.
- A 422 came back from an Airtable request and the user wants help debugging.
When this does not trigger
- n8n Airtable nodes inside a workflow JSON — use the n8n skill (this skill is for direct API access only).
- Google Sheets, Excel, CSV, or any non-Airtable tabular data.
- Designing/altering long-term schema in this project — append a note to
docs/airtable-schema.mdinstead of guessing. - Editing the
.envfile or rotating tokens — out of scope.
Required inputs
Before running anything, confirm you have:
AIRTABLE_API_KEYin env (load withsource <project-root>/.env). First-time setup guide (Python, pyairtable, token creation) inreferences/query-patterns.md§ First: Check Prerequisites.- Base + table IDs loaded from config:
source ~/.claude/skills/airtable/config.envsets$BASE_IDand the table-ID vars ($CLIENTS_TID,$REPORTS_TID,$DOCUMENTS_TID,$PENDING_TID,$TEMPLATES_TID). Template:config.example.env. Editconfig.envonly to redeploy on another base — never hardcode rawapp…/tbl…IDs. - The table ID (
tblXXX) or table name — prefer the ID var. - For writes/deletes: the user's explicit go-ahead and the exact record IDs or filter.
- For filtered reads: confirmed field names (satisfy the HARD GATE below).
Workflow
- Source
<project-root>/.env(API key) and~/.claude/skills/airtable/config.env(base + table IDs); verifyAIRTABLE_API_KEYand$BASE_IDare set. - Identify the operation type — read, write, delete, schema introspect.
- Satisfy the HARD GATE (below) — confirm field names before any
filterByFormula/sort. - Load
references/query-patterns.mdand build the request from its templates: curl--data-urlencodefor reads; curl PATCH/POST orpyairtablefor writes (after the user's permission — privacy rule). - On 422: STOP, run the recovery sequence in
references/query-patterns.md§ If you get a 422 — do not retry the same query with tweaks. - Format results as a clean table or summary, never as raw JSON dumps.
Project Context
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.
HARD GATE — Schema check before ANY query
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:
- You have just read
references/schema-quick-reference.mdin this conversation and are using ONLY fields listed there. - You have just read
docs/airtable-schema.mdfor the target table in this conversation. - You ran a no-filter probe and saw the actual field names:
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.)
Encoding rule — curl only for reads
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.
Gotchas
- Never use Python urllib for Airtable formula queries — use curl with
--data-urlencode. Python urllib silently mis-encodesAND(...),SEARCH(...), and Hebrew characters → 422. - Lookup/formula/rollup fields cannot use
=— wrap withSEARCH('val', {field})orFIND('val', ARRAYJOIN({field})). Example:reports.client_idis a lookup array → useFIND('CPA-210', ARRAYJOIN({client_id})). (pending_classifications.client_idis plain text —=is fine there;clients.client_idis the formula.) - Linked record fields return arrays — use
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 inreferences/query-patterns.md. - Sort field name in this base is
created_at, notCreated. Confirm sort fields against the schema probe before running. Per-table sort fields listed inreferences/schema-quick-reference.md. - Env var name:
AIRTABLE_API_KEY(notAIRTABLE_PAT) - Single select fields: Can't create new options via Meta API easily — use
typecast: trueon record create instead fields[]param: Use--data-urlencode "fields[]=name"(notfields=name)- Delete max 10 per request — batch larger deletes
- Table IDs live in
config.env— reference the vars ($CLIENTS_TID,$REPORTS_TID,$DOCUMENTS_TID,$PENDING_TID,$TEMPLATES_TID), never rawtbl…literals. Full table→var map inreferences/schema-quick-reference.md.
Privacy Rules (ALWAYS FOLLOW)
See privacy.md for complete rules. Key points:
- Read-only by default - Never create, update, or delete without explicit permission
- Minimal data - Only fetch what's needed
- No token display - NEVER echo or display the API key
- Summarize, don't dump - Format responses cleanly
Decision gates
- Schema gate (before any filtered read): confirm field names via
references/schema-quick-reference.md,docs/airtable-schema.md, or a no-filter probe. No guessing. - Write gate: never
create,update,upsert, ordeletewithout explicit user permission for that operation. - 422 gate: on a 422, STOP and run the recovery sequence (
references/query-patterns.md) — do not retry the same query with tweaks. - Encoding gate: filtered reads go through
curl --data-urlencode. Pythonurllibfor reads is forbidden (silent mis-encoding ofAND/SEARCHand Hebrew). - Delete batch gate: Airtable rejects >10 record IDs per DELETE — chunk into 10s.
- Token-display gate: never echo, log, or print
AIRTABLE_API_KEY.
Output format
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
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.- api-reference.md - All Python patterns
- Privacy Rules - Data handling guidelines
Sources: pyAirtable Documentation, GitHub
Evaluation checklist
After running an Airtable operation, confirm:
- Was the schema gate satisfied (
references/schema-quick-reference.md/docs/airtable-schema.md/ no-filter probe) before any filtered read? - Did filtered reads use
curl --data-urlencode(not Pythonurllib)? - Were formula/rollup/linked fields wrapped in
SEARCH/FIND/ARRAYJOINinstead of bare=? - Was
created_at(notCreated) used for sort? - For writes/deletes: did the user explicitly approve the operation?
- Were deletes chunked into batches of ≤10 IDs?
- Was the API key kept out of all output (no echo, no logs, no error dumps)?
- Was the result rendered as a clean table/summary, not a raw JSON dump?
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

