skills/integrations/airtable/airtable-connect/SKILL.md
airtable, connect airtable, query [base], add to [table].
npx skillsauth add beam-ai-team/beam-next-skills airtable-connectInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Meta-skill for complete Airtable workspace integration.
Before querying, creating, updating, deleting, importing, or exporting Airtable records/tables/fields, show the token/workspace alias, base, table, filter or payload summary, output path when used, and expected side effects. Require explicit user approval in the current turn before mutating Airtable or writing files. Schema discovery and read-only queries with an approved scope do not require additional approval.
Enable natural language interaction with ANY Airtable base. User says "query my Projects base" or "add a record to CRM" and it just works - no manual API calls, no remembering base IDs, no schema lookups.
This skill uses airtable-master shared library. Load references as needed:
| Resource | When to Load |
|----------|--------------|
| airtable-master/scripts/check_airtable_config.py | Always first (pre-flight) |
| airtable-master/references/setup-guide.md | If config check fails |
| airtable-master/references/error-handling.md | On any API errors |
| airtable-master/references/api-reference.md | For API details |
| airtable-master/references/field-types.md | For field type options |
Use --token NAME to switch between different Airtable workspaces/accounts:
# Default token (AIRTABLE_API_KEY)
uv run python discover_bases.py
# Named token (AIRTABLE_API_KEY_MUTAGENT)
uv run python discover_bases.py --token MUTAGENT
Setup multiple tokens in .env:
AIRTABLE_API_KEY=pat.xxx... # Default token
AIRTABLE_API_KEY_MUTAGENT=pat.yyy... # Named token for Mutagent workspace
AIRTABLE_API_KEY_CLIENT=pat.zzz... # Named token for client workspace
All scripts support --token:
discover_bases.py --token NAMEquery_records.py --token NAMEmanage_records.py --token NAMEmanage_tables.py --token NAMEmanage_fields.py --token NAMEIf user has never used Airtable integration before:
Run config check with JSON to detect setup state:
uv run python skills/integrations/airtable/airtable-master/scripts/check_airtable_config.py --json
Parse the ai_action field in JSON output:
prompt_for_api_key → Guide user to get PAT, add to .envrun_setup_wizard → Run interactive wizardproceed_with_warning → Partial config, warn but continueproceed_with_operation → All good, continueIf setup needed, help user:
data.records:read, data.records:write, schema.bases:read.env when user provides tokenSetup triggers: "setup airtable", "connect airtable", "configure airtable"
Every workflow MUST start with config validation:
uv run python skills/integrations/airtable/airtable-master/scripts/check_airtable_config.py --json
Parse ai_action from JSON:
proceed_with_operation: Fully configured, continueproceed_with_warning: API works but no bases (warn user to add bases to PAT)prompt_for_api_key: Need API key, guide user through setuprun_setup_wizard: Run setup wizardIf not configured:
python skills/integrations/airtable/airtable-master/scripts/setup_airtable.pyTriggers: "connect airtable", "sync airtable", "discover bases", "what bases", "refresh airtable"
Purpose: Find all accessible bases in user's Airtable workspace and cache schemas.
Steps:
uv run python skills/integrations/airtable/airtable-master/scripts/discover_bases.py
02-memory/integrations/airtable-bases.yamlFirst-time flow: If airtable-bases.yaml doesn't exist, discovery runs automatically.
Triggers: "query [base]", "find in [table]", "search [base]", "show [table]", "list records"
Purpose: Query any base/table by name with optional filters.
Steps:
02-memory/integrations/airtable-bases.yaml
uv run python skills/integrations/airtable/airtable-master/scripts/query_records.py \
--base <base_id> --table <table_name> [--filter "..."] [--sort ...] [--limit N]
Filter Syntax:
--filter "Status = Active"--filter "Priority = High"--filter "{Field} contains Design"Triggers: "add to [table]", "create in [base]", "new [item] in [table]"
Purpose: Create a new record in any table with field validation.
Steps:
uv run python skills/integrations/airtable/airtable-master/scripts/manage_records.py create \
--base <base_id> --table <table_name> \
--fields '{"Name": "...", "Status": "..."}'
Triggers: "update [record]", "edit [record]", "change [field] to [value]"
Purpose: Modify fields of an existing record.
Steps:
python query_records.py --filter "Name contains [search]"uv run python skills/integrations/airtable/airtable-master/scripts/manage_records.py update \
--base <base_id> --table <table_name> --record <record_id> \
--fields '{"Status": "Done", "Priority": "High"}'
Triggers: "delete [record]", "remove [record]"
Purpose: Delete a record from a table.
Steps:
uv run python skills/integrations/airtable/airtable-master/scripts/manage_records.py delete \
--base <base_id> --table <table_name> --record <record_id>
Triggers: "bulk update", "update multiple", "batch create"
Purpose: Create, update, or delete multiple records at once (max 10 per batch).
Steps:
uv run python skills/integrations/airtable/airtable-master/scripts/manage_records.py batch-create \
--base <base_id> --table <table_name> \
--records '[{"fields": {...}}, {"fields": {...}}]'
Note: Airtable limits batch operations to 10 records per request.
Triggers: "create table", "new table in [base]", "add table to [base]"
Purpose: Create a new table in an existing Airtable base.
Steps:
uv run python skills/integrations/airtable/airtable-master/scripts/manage_tables.py list \
--base <base_id> [--token NAME]
uv run python skills/integrations/airtable/airtable-master/scripts/manage_tables.py create \
--base <base_id> --name "Table Name" \
--fields '[{"name": "Name", "type": "singleLineText"}, {"name": "Status", "type": "singleSelect", "options": {"choices": [{"name": "Todo"}, {"name": "Done"}]}}]' \
[--token NAME]
Field Definition Format:
[
{"name": "Name", "type": "singleLineText"},
{"name": "Status", "type": "singleSelect", "options": {"choices": [{"name": "Todo"}, {"name": "In Progress"}, {"name": "Done"}]}},
{"name": "Priority", "type": "number", "options": {"precision": 0}},
{"name": "Due Date", "type": "date"}
]
Triggers: "add field", "create field", "update field", "list fields", "show schema"
Purpose: Add, update, or list fields in a table.
uv run python skills/integrations/airtable/airtable-master/scripts/manage_fields.py list \
--base <base_id> --table <table_id_or_name> [--token NAME]
uv run python skills/integrations/airtable/airtable-master/scripts/manage_fields.py create \
--base <base_id> --table <table_id_or_name> \
--name "Field Name" --type singleSelect \
--choices "Option1,Option2,Option3" \
[--token NAME]
uv run python skills/integrations/airtable/airtable-master/scripts/manage_fields.py update \
--base <base_id> --table <table_id_or_name> --field <field_id> \
--name "New Name" --description "Updated description" \
[--token NAME]
uv run python skills/integrations/airtable/airtable-master/scripts/manage_fields.py types
Common Field Types:
| Type | Description | Options |
|------|-------------|---------|
| singleLineText | Short text | - |
| multilineText | Long text/notes | - |
| number | Numeric value | precision (0-8) |
| singleSelect | Dropdown (one) | choices |
| multipleSelects | Multi-select | choices |
| date | Date field | dateFormat |
| checkbox | Boolean toggle | - |
| url | Web link | - |
| email | Email address | - |
| currency | Money value | precision, symbol |
| percent | Percentage | precision |
| rating | Star rating | max, icon |
Location: 02-memory/integrations/airtable-bases.yaml
---
last_synced: 2025-12-11T12:00:00
bases:
- id: "appXXXXXXXXXXXXXX"
name: "Client Projects"
permission_level: "create"
tables:
- id: "tblXXXXXXXXXXXXXX"
name: "Projects"
fields:
- name: "Name"
type: "singleLineText"
- name: "Status"
type: "singleSelect"
options: ["Not Started", "In Progress", "Complete"]
- name: "Priority"
type: "singleSelect"
options: ["Low", "Medium", "High"]
- name: "Due Date"
type: "date"
- id: "appYYYYYYYYYYYYYY"
name: "CRM"
permission_level: "edit"
tables:
- id: "tblYYYYYYYYYYYYYY"
name: "Contacts"
fields: [...]
---
# Airtable Bases Context
Auto-generated by airtable-connect skill.
Run "refresh airtable" to update.
When user says a base/table name:
Disambiguation prompt (if multiple matches):
Found 3 bases matching "Projects":
1. Client Projects
2. Personal Projects
3. Project Templates
Which one? (enter number or be more specific)
| Error | Action | |-------|--------| | No bases found | Check PAT has base access at https://airtable.com/create/tokens | | Base not in context | Run discovery: "refresh airtable" | | Permission denied | Verify PAT has correct scopes | | Rate limited (429) | Wait and retry with exponential backoff | | Invalid field | Show valid options from cached schema |
Load airtable-master/references/error-handling.md for detailed troubleshooting.
First-time setup:
User: "connect to airtable"
AI: [Runs config check, detects no API key]
Airtable integration needs setup. I need your Personal Access Token (PAT).
Get one at: https://airtable.com/create/tokens
Required scopes: data.records:read, data.records:write, schema.bases:read
Paste your PAT here (starts with 'pat.'):
User: pat.xxxxx...
AI: [Writes to .env, re-runs config check]
[OK] Connected! Found 3 bases: Client Projects, CRM, Tasks
What would you like to do?
Query by name:
User: "query my Projects for active items"
AI: Querying "Client Projects" → "Projects" table...
Found 12 active items:
1. Website Redesign (High priority, due Jan 15)
2. Q1 Marketing Plan (Medium priority, due Jan 30)
...
Create record:
User: "add a new task to my Tasks base"
AI: Creating in "Tasks" base → "Tasks" table.
Required fields:
- Task Name: [your input]
- Status: Not Started / In Progress / Complete
- Due Date: [optional, format: YYYY-MM-DD]
What's the task name?
Create table with MUTAGENT token:
User: "create a Projects table in my Mutagent base"
AI: [Uses MUTAGENT token]
Creating table "Projects" in base app1gngDx52VAgjVQ...
uv run python manage_tables.py create --base app1gngDx52VAgjVQ --name "Projects" --token MUTAGENT
[OK] Table created: tbl83yYyFGvFDpv9V
Want to add fields to this table?
Add fields to new table:
User: "yes, add Status and Description fields"
AI: Adding fields to Projects table...
uv run python manage_fields.py create --base app1gngDx52VAgjVQ --table tbl83yYyFGvFDpv9V \
--name "Status" --type singleSelect --choices "Todo,In Progress,Done" --token MUTAGENT
[OK] Created: Status (singleSelect)
uv run python manage_fields.py create --base app1gngDx52VAgjVQ --table tbl83yYyFGvFDpv9V \
--name "Description" --type multilineText --token MUTAGENT
[OK] Created: Description (multilineText)
Full workflow: Create table → Add fields → Add record:
User: "create a Tasks table with Name, Status, Priority, and DueDate fields"
AI: [Creates table, adds fields, confirms schema]
User: "add a task: Review PR, High priority, due tomorrow"
AI: [Uses manage_records.py to create record with proper field mapping]
Airtable Connect v1.1 - Meta-skill for complete Airtable workspace integration with multi-token support
tools
Build a Palantir-shape, PDF-native use-case proposal document for a sophisticated enterprise account: research-grounded use cases (each with description, challenge, impact, value), an operating-graph ontology page, a recommended PoC with a week-by-week plan, and a closing page that asks for one decision. Load when a client asks us to 'propose high-impact use cases', requests a use-case presentation/catalog for a function (finance, HR, ops), or when a technical evaluation team will review candidates to pick a PoC. NOT for single-account cold outreach (use prospect-brief), full process diagnostics (use operating-diagnostic), or priced proposals (use proposal-creation).
development
Convert Beam Figma slide designs into high-fidelity, editable HTML presentation decks. Use when Codex is asked to audit Figma slides, extract slide templates, rebuild Beam slides as HTML decks, decide whether Figma imagery should be exported or rebuilt in HTML/CSS, create Beam/Prism-compatible deck templates, or improve fidelity of existing Beam HTML slide rebuilds.
development
Use the Beam AI reusable slide library: individual HTML slide templates extracted from Beam Figma rebuilds, kept separate from deck themes and full deck templates. Load when the user asks for a slide library, specific Beam slide patterns, reusable Figma-inspired slides, Prism slide-library items, or slide-level HTML templates.
development
Use Beam AI deck and report design packs, HTML templates, and curated examples to create sales decks, customer intro decks, RPO decks, and DIN A4 use-case proposal reports. Load when the user asks for Beam-branded presentation templates, Prism-compatible deck templates, Beam report templates, customer intro decks, commercial proposals, or reusable HTML deck/report examples.