| name | airtable-agent-skill |
| description | Operate Airtable through the public Web API using curl and 1Password-backed token resolution. Use for Airtable schema inspection, record CRUD, fields, tables, comments, and webhooks. |
Airtable Agent Skill
Use scripts/at.sh for Airtable Web API calls. The helper resolves an Airtable personal access token from 1Password and calls Airtable with curl. Do not print or request the token.
Required inputs
Ask the user for:
- 1Password item name in the
Airtable PATs vault, for example Example Airtable PAT
- Airtable base ID, for example
appXXXXXXXXXXXXXX
- Table, field, or record IDs when needed
The token must exist at:
op://Airtable PATs/<item name>/token
Helper command
./scripts/at.sh "<op-item>" <METHOD> <PATH-or-URL> [curl args...]
- Methods:
GET, POST, PATCH, DELETE
- Path may be a full Airtable API URL or a path like
/v0/meta/bases/<base>/tables
- Extra args pass through to
curl
Setup variables
AT=./scripts/at.sh
OP_ITEM="Example Airtable PAT"
BASE="appXXXXXXXXXXXXXX"
TABLE="tblXXXXXXXXXXXXXX"
Schema and structure
| Task | Command |
|---|
| Get base schema | $AT "$OP_ITEM" GET /v0/meta/bases/$BASE/tables |
| Get one table schema | $AT "$OP_ITEM" GET /v0/meta/bases/$BASE/tables | jq '.tables[] | select(.id=="'$TABLE'")' |
| Create table | $AT "$OP_ITEM" POST /v0/meta/bases/$BASE/tables --data '{"name":"Example","fields":[{"name":"Name","type":"singleLineText"}]}' |
| Rename table | $AT "$OP_ITEM" PATCH /v0/meta/bases/$BASE/tables/$TABLE --data '{"name":"New name"}' |
| Create field | $AT "$OP_ITEM" POST /v0/meta/bases/$BASE/tables/$TABLE/fields --data '{"name":"Status","type":"singleSelect","options":{"choices":[{"name":"Todo"},{"name":"Done"}]}}' |
| Rename field | $AT "$OP_ITEM" PATCH /v0/meta/bases/$BASE/tables/$TABLE/fields/fldXXXXXXXXXXXXXX --data '{"name":"New field name"}' |
Records
| Task | Command |
|---|
| List records | $AT "$OP_ITEM" GET /v0/$BASE/$TABLE --get --data-urlencode 'returnFieldsByFieldId=true' |
| List filtered records | $AT "$OP_ITEM" GET /v0/$BASE/$TABLE --get --data-urlencode 'filterByFormula=NOT({Status}="Done")' --data-urlencode 'returnFieldsByFieldId=true' |
| Get one record | $AT "$OP_ITEM" GET /v0/$BASE/$TABLE/recXXXXXXXXXXXXXX --get --data-urlencode 'returnFieldsByFieldId=true' |
| Create one record | $AT "$OP_ITEM" POST /v0/$BASE/$TABLE --data '{"fields":{"Name":"Example"}}' |
| Create batch | $AT "$OP_ITEM" POST /v0/$BASE/$TABLE --data '{"records":[{"fields":{"Name":"Example"}}]}' |
| Update one record | $AT "$OP_ITEM" PATCH /v0/$BASE/$TABLE/recXXXXXXXXXXXXXX --data '{"fields":{"Name":"Updated"}}' |
| Update batch | $AT "$OP_ITEM" PATCH /v0/$BASE/$TABLE --data '{"records":[{"id":"recXXXXXXXXXXXXXX","fields":{"Name":"Updated"}}]}' |
| Delete one record | $AT "$OP_ITEM" DELETE /v0/$BASE/$TABLE/recXXXXXXXXXXXXXX |
| Delete batch | $AT "$OP_ITEM" DELETE /v0/$BASE/$TABLE --get --data-urlencode 'records[]=recXXXXXXXXXXXXXX' |
Batch create, update, and delete are limited to 10 records per request.
Comments
| Task | Command |
|---|
| List comments | $AT "$OP_ITEM" GET /v0/$BASE/$TABLE/recXXXXXXXXXXXXXX/comments |
| Create comment | $AT "$OP_ITEM" POST /v0/$BASE/$TABLE/recXXXXXXXXXXXXXX/comments --data '{"text":"Investigated by agent."}' |
Webhooks
| Task | Command |
|---|
| List webhooks | $AT "$OP_ITEM" GET /v0/bases/$BASE/webhooks |
| Create webhook | $AT "$OP_ITEM" POST /v0/bases/$BASE/webhooks --data '{"notificationUrl":"https://example.com/airtable-webhook","specification":{"options":{"filters":{"dataTypes":["tableData"]}}}}' |
Operating rules
- Never print the PAT.
- Prefer
returnFieldsByFieldId=true during discovery and integration work.
- Use stable field IDs in production code because field names are editable.
- Use
--data-urlencode for formulas and query params.
- Use
jq locally to filter large schemas before sharing output.
- Table IDs look like
tbl..., field IDs like fld..., record IDs like rec....