devsoul2026/hermes-one-click/airtable
Claude Code and agent skill by devsoul2026/hermes-one-click
- community
Checking that the SKILL.md file is still in the repository.
Airtable REST API via curl. Records CRUD, filters, upserts.
Install
npx vskill@latest install devsoul2026/hermes-one-click/airtableSKILL.md
Airtable — Bases, Tables & Records
Work with Airtable's REST API directly via curl using the terminal tool. No MCP server, no OAuth flow, no Python SDK — just curl and a personal access token.
Prerequisites
- Create a Personal Access Token (PAT) at https://airtable.com/create/tokens (tokens start with
pat...). - Grant these scopes (minimum):
data.records:read— read rowsdata.records:write— create / update / delete rowsschema.bases:read— list bases and tables
- Important: in the same token UI, add each base you want to access to the token's Access list. PATs are scoped per-base — a valid token on the wrong base returns
403. - Store the token in
~/.hermes/.env(or viahermes setup):
`` AIRTABLE_API_KEY=pat_your_token_here ``
Note: legacykey...API keys were deprecated Feb 2024. Only PATs and OAuth tokens work now.
API Basics
- Endpoint:
https://api.airtable.com/v0 - Auth header:
Authorization: Bearer $AIRTABLE_API_KEY - All requests use JSON (
Content-Type: application/jsonfor any POST/PATCH/PUT body). - Object IDs: bases
app..., tablestbl..., recordsrec..., fieldsfld.... IDs never change; names can. Prefer IDs in automations. - Rate limit: 5 requests/sec/base.
429→ back off. Burst on a single base will be throttled.
Base curl pattern:
-s suppresses curl's progress bar — keep it set for every call so the tool output stays clean for Hermes. Pipe through python3 -m json.tool (always present) or jq (if installed) for readable JSON.
Field Types (request body shapes)
| Field type | Write shape | |
|---|---|---|
| Single line text | "Name": "hello" | |
| Long text | "Notes": "multi\nline" | |
| Number | "Score": 42 | |
| Checkbox | "Done": true | |
| Single select | "Status": "Todo" (name must already exist unless typecast: true) | |
| Multi-select | "Tags": ["urgent", "bug"] | |
| Date | "Due": "2026-04-01" | |
| DateTime (UTC) | "At": "2026-04-01T14:30:00.000Z" | |
| URL / Email / Phone | "Link": "https://…" | |
| Attachment | "Files": [{"url": "https://…"}] (Airtable fetches + rehosts) | |
| Linked record | "Owner": ["recXXXXXXXXXXXXXX"] (array of record IDs) | |
| User | "AssignedTo": {"id": "usrXXXXXXXXXXXXXX"} |
Pass "typecast": true at the top level of a create/update body to let Airtable auto-coerce values (e.g. create a new select option on the fly, convert "42" → 42).
Common Queries
List bases the token can see
List tables + schema for a base
Use this BEFORE mutating — confirms exact field names and IDs, surfaces options.choices for select fields, and shows primary-field names.
List records (first 10)
Get a single record
Filter records (filterByFormula)
Airtable formulas must be URL-encoded. Let Python stdlib do it — never hand-encode:
Useful formula patterns:
- Exact match:
{Email}='user@example.com' - Contains:
FIND('bug', LOWER({Title})) - Multiple conditions:
AND({Status}='Todo', {Priority}='High') - Or:
OR({Owner}='alice', {Owner}='bob') - Not empty:
NOT({Assignee}='') - Date comparison:
IS_AFTER({Due}, TODAY())
Sort + select specific fields
Square brackets in query params MUST be URL-encoded (%5B / %5D).
Use a named view
Views apply their saved filter + sort server-side.
Common Mutations
Create a record
Create up to 10 records in one call
Batch endpoints are capped at 10 records per request. For larger inserts, loop in batches of 10 with a short sleep to respect 5 req/sec/base.
Update a record (PATCH — merges, preserves unchanged fields)
Upsert by a merge field (no ID needed)
performUpsert creates records whose merge-field values are new, patches records whose merge-field values already exist. Great for idempotent syncs.
Delete a record
Delete up to 10 records in one call
Pagination
List endpoints return at most 100 records per page. If the response includes "offset": "...", pass it back on the next call. Loop until the field is absent:
Typical Hermes Workflow
- Confirm auth.
curl -s -o /dev/null -w "%{http_code}\n" https://api.airtable.com/v0/meta/bases -H "Authorization: Bearer $AIRTABLE_API_KEY"— expect200. - Find the base. List bases (step above) OR ask the user for the
app...ID directly if the token lacksschema.bases:read. - Inspect the schema.
GET /v0/meta/bases/$BASE_ID/tables— cache the exact field names and primary-field name locally in the session before mutating anything. - Read before you write. For "update X where Y",
filterByFormulafirst to resolve therec...ID, thenPATCH /v0/$BASE_ID/$TABLE/$RECORD_ID. Never guess record IDs. - Batch writes. Combine related creates into one 10-record POST to stay under the 5 req/sec budget.
- Destructive ops. Deletions can't be undone via API. If the user says "delete all Xs", echo back the filter + record count and confirm before firing.
Pitfalls
- `filterByFormula` MUST be URL-encoded. Field names with spaces or non-ASCII also need encoding (
{My Field}→%7BMy%20Field%7D). Use Python stdlib (pattern above) — never hand-escape. - Empty fields are omitted from responses. A missing
"Assignee"key doesn't mean the field doesn't exist — it means this record's value is empty. Check the schema (step 3) before concluding a field is missing. - PATCH vs PUT.
PATCHmerges supplied fields into the record.PUTreplaces the record entirely and clears any field you didn't include. Default toPATCH. - Single-select options must exist. Writing
"Status": "Shipping"whenShippingisn't in the field's option list errors withINVALID_MULTIPLE_CHOICE_OPTIONSunless you pass"typecast": true(which auto-creates the option). - Per-base token scoping. A
403on one base while another works means the token's Access list doesn't include that base — not a scope or auth issue. Send the user to https://airtable.com/create/tokens to grant it. - Rate limits are per base, not per token. 5 req/sec on
baseAand 5 req/sec onbaseBis fine; 6 req/sec onbaseAalone will throttle. Monitor theRetry-Afterheader on429.
Important Notes for Hermes
- Always use the `terminal` tool with `curl`. Do NOT use
web_extract(it can't send auth headers) orbrowser_navigate(needs UI auth and is slow). - `AIRTABLE_API_KEY` flows from `~/.hermes/.env` into the subprocess automatically when this skill is loaded — no need to re-export it before each
curlcall. - Escape curly braces in formulas carefully. In a heredoc body,
{Status}is literal. In a shell argument,{Status}is safe outside{...}brace-expansion context — but pass dynamic strings throughpython3 urllib.parse.quotebefore splicing into a URL. - Pretty-print with `python3 -m json.tool` (always present) rather than
jq(optional). Only reach forjqwhen you need filtering/projection. - Pagination is per-page, not global. Airtable's 100-record cap is a hard limit; there is no way to bump it. Loop with
offsetuntil the field is absent. - Read the `errors` array on non-2xx responses — Airtable returns structured error codes like
AUTHENTICATION_REQUIRED,INVALID_PERMISSIONS,MODEL_ID_NOT_FOUND,INVALID_MULTIPLE_CHOICE_OPTIONSthat tell you exactly what's wrong.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckinghermes-agent/skills/productivity/airtable/SKILL.md
Popularity
- Repository stars
- 144
- Repository forks
- 27
- 7-day trend score
- 25
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/devsoul2026/hermes-one-click/airtable)