Claude-skill-registry airtable
Access Airtable bases, tables, and records. Query data, search records, and read structured information.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/airtable" ~/.claude/skills/majiayu000-claude-skill-registry-airtable && rm -rf "$T"
manifest:
skills/data/airtable/SKILL.mdsafety · automated scan (medium risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- dumps environment variables
- makes HTTP requests (curl)
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
Airtable Integration
This skill provides access to Airtable bases and tables via the Airtable REST API.
Setup Required
Create a Personal Access Token:
- Go to https://airtable.com/create/tokens
- Click "Create new token"
- Give it a name (e.g., "Claude Code")
- Add scopes:
- Read recordsdata.records:read
- Read base schemaschema.bases:read
- Add access to the bases you want to query
- Create and copy the token
Set the token as an environment variable:
export AIRTABLE_TOKEN="pat..."
When to Use
Use this skill when the user:
- Asks about data stored in Airtable
- Wants to query or search Airtable records
- Needs to look up information in a base
- Mentions "Airtable" or specific base/table names
API Endpoints
Base URL:
https://api.airtable.com/v0
All requests need:
-H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
List Bases
Get All Bases:
curl -s "https://api.airtable.com/v0/meta/bases" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)" | jq '.bases[] | {name, id}'
Get Base Schema
Get Tables and Fields:
curl -s "https://api.airtable.com/v0/meta/bases/{BASE_ID}/tables" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
List Records
Get Records from Table:
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
With Pagination:
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?pageSize=100" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Filter Records
Using Formula Filter:
curl -s -G "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \ --data-urlencode "filterByFormula={Status}='Active'" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Multiple Conditions:
curl -s -G "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \ --data-urlencode "filterByFormula=AND({Status}='Active', {Priority}='High')" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Sort Records
curl -s -G "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \ --data-urlencode "sort[0][field]=Created" \ --data-urlencode "sort[0][direction]=desc" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Select Specific Fields
curl -s -G "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}" \ --data-urlencode "fields[]=Name" \ --data-urlencode "fields[]=Status" \ --data-urlencode "fields[]=Due Date" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Get Single Record
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}/{RECORD_ID}" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Formula Syntax
Airtable formulas for filtering:
| Formula | Description |
|---|---|
| Exact match |
| Not equal |
| Contains text |
| Numeric comparison |
| Date after |
| Date before |
| Checkbox is checked |
| Field is empty |
| Both conditions |
| Either condition |
| Negation |
Common Workflows
List All Bases
curl -s "https://api.airtable.com/v0/meta/bases" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)" | jq '.bases[] | {name, id}'
Explore a Base's Structure
BASE_ID="appXXXXXXXX" curl -s "https://api.airtable.com/v0/meta/bases/${BASE_ID}/tables" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)" | jq '.tables[] | {name, id, fields: [.fields[].name]}'
Get Recent Records
BASE_ID="appXXXXXXXX" TABLE="Tasks" curl -s -G "https://api.airtable.com/v0/${BASE_ID}/${TABLE}" \ --data-urlencode "sort[0][field]=Created" \ --data-urlencode "sort[0][direction]=desc" \ --data-urlencode "pageSize=10" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)" | jq '.records[] | .fields'
Search for Records
BASE_ID="appXXXXXXXX" TABLE="Contacts" curl -s -G "https://api.airtable.com/v0/${BASE_ID}/${TABLE}" \ --data-urlencode "filterByFormula=FIND('John', {Name})" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Filter by Status
curl -s -G "https://api.airtable.com/v0/${BASE_ID}/${TABLE}" \ --data-urlencode "filterByFormula={Status}='In Progress'" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)" | jq '.records[] | {name: .fields.Name, status: .fields.Status}'
Finding Base and Table IDs
Base ID: Found in the Airtable URL:
https://airtable.com/{BASE_ID}/...
- Starts with
app
Table Name: Use the exact table name from Airtable (URL-encode spaces)
- Or use table ID (starts with
) from the schema endpointtbl
Record ID: Starts with
rec, found in record URLs or API responses
Pagination
Responses are paginated (max 100 records per request). Use the
offset parameter:
# First request curl -s "https://api.airtable.com/v0/${BASE_ID}/${TABLE}?pageSize=100" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)" # If response includes "offset", use it for next page curl -s "https://api.airtable.com/v0/${BASE_ID}/${TABLE}?pageSize=100&offset={OFFSET_FROM_RESPONSE}" \ -H "Authorization: Bearer $(printenv AIRTABLE_TOKEN)"
Notes
- Rate limit: 5 requests/second per base
- Max 100 records per request
- Field names are case-sensitive
- URL-encode table names with spaces
- Linked records return record IDs; fetch separately if needed
- Attachments return URLs that expire