Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add TerminalSkills/skills --skill airtablegit clone --depth 1 https://github.com/TerminalSkills/skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/terminalskills/skills/airtable)<a href="https://agentmods.dev/skills/terminalskills/skills/airtable"><img src="https://agentmods.dev/badge/skills/terminalskills/skills/airtable/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/terminalskills/skills/airtable"><img src="https://agentmods.dev/badge/skills/terminalskills/skills/airtable.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 12 findings, up to high
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- high Privilege Escalation · line 23 Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.Fix: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths.
- high Privilege Escalation · line 63 Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.Fix: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths.
- high Privilege Escalation · line 100 Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.Fix: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths.
- medium Data Exfiltration · line 71 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 89 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 262 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 283 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 308 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 328 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 159 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 282 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
- medium Data Exfiltration · line 307 Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.Fix: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted.
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00091 | $0.04242 |
| Opus 5.5 | $0.00036 | $0.01697 |
| Sonnet 5.5 | $0.00018 | $0.00848 |
| Haiku 4.5 | $0.00009 | $0.00424 |
Grade B, and why
airtable scanned grade B with 2 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 20d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Sends data to an external URLmediumData exfiltration
A POST to an outside endpoint may be telemetry or may be exfiltration; either way the mod talks to somewhere, and you should know where.
return requests.post("https://airtable.com/oauth2/v1/token", data=data, auth=auth, timeout=30).json() Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
curl -s https://api.airtable.com/v0/meta/whoami -H "Authorization: Bearer $AIRTABLE_TOKEN" How it starts
The opening of the file, as written. The whole thing — 299 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Airtable API Integration
Overview
The Airtable Web API is a REST API at https://api.airtable.com/v0. Records live in tables inside a base; IDs are prefixed by type (app… base, tbl… table, fld… field, rec… record, viw… view). Requests authenticate with a bearer token: a personal access token (PAT) for your own scripts, or an OAuth access token when other users connect their accounts. Legacy API keys stopped working on February 1, 2024. Writes are limited to 10 records per request and every base to 5 requests per second.
Instructions
Authentication
Create a personal access token at https://airtable.com/create/tokens, add only the scopes and bases the script needs, and keep it in an environment variable.
export AIRTABLE_TOKEN="pat..." # set from your secret manager; never commit it
curl -s https://api.airtable.com/v0/meta/whoami -H "Authorization: Bearer $AIRTABLE_TOKEN"
# {"id":"usrL2PNC5o3H4lBEi"}
| Scope | Allows |
|---|---|
data.records:read / data.records:write |
Read / create, update and delete records |
schema.bases:read / schema.bases:write |
Read / change tables and fields |
webhook:manage |
Create, list and delete webhooks, fetch payloads; creating a tableData webhook and reading its payloads also need data.records:read |
user.email:read |
Email address in whoami |
Records
"""airtable_client.py — minimal Airtable Web API client."""
import base64, hashlib, hmac, os, time
import requests
API = "https://api.airtable.com/v0"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['AIRTABLE_TOKEN']}"
def call(method: str, url: str, **kwargs) -> dict:
"""One request, throttled to 5 per second; waits 30 s and retries on 429."""
for _ in range(4):
resp = session.request(method, url, timeout=30, **kwargs)
if resp.status_code != 429:
break
time.sleep(30)
if not resp.ok:
raise RuntimeError(f"{method} {url} -> {resp.status_code} {resp.text}")
time.sleep(0.2)
return resp.json()
def batches(items: list, size: int = 10):
for i in range(0, len(items), size):
yield items[i:i + size]
def list_records(base_id, table, formula=None, fields=None, view=None, sort=None) -> list:
"""Every record of a table. POST /listRecords keeps long formulas out of the URL."""
options = {"filterByFormula": formula, "fields": fields, "view": view, "sort": sort}
body = {k: v for k, v in options.items() if v}
records = []
while True:
page = call("POST", f"{API}/{base_id}/{table}/listRecords", json=body)
records += page["records"]
if "offset" not in page:
return records
body["offset"] = page["offset"]
def create_records(base_id, table, rows: list[dict], typecast=False) -> list:
created = []
for batch in batches(rows):
body = {"records": [{"fields": row} for row in batch], "typecast": typecast}
created += call("POST", f"{API}/{base_id}/{table}", json=body)["records"]
return created
def update_records(base_id, table, updates: list[dict]) -> list:
"""updates = [{"id": "rec...", "fields": {...}}]; PATCH leaves other fields untouched."""
updated = []
for batch in batches(updates):
updated += call("PATCH", f"{API}/{base_id}/{table}", json={"records": batch})["records"]
return updated
def upsert_records(base_id, table, rows: list[dict], merge_on: list[str], typecast=False):
"""Update rows that match on the merge_on fields and create the rest."""
created, updated = [], []
for batch in batches(rows):
body = {"performUpsert": {"fieldsToMergeOn": merge_on}, "typecast": typecast,
"records": [{"fields": row} for row in batch]}
data = call("PATCH", f"{API}/{base_id}/{table}", json=body)
created += data["createdRecords"]
updated += data["updatedRecords"]
return created, updated
def delete_records(base_id, table, record_ids: list[str]) -> list:
deleted = []
for batch in batches(record_ids):
params = [("records[]", record_id) for record_id in batch]
deleted += call("DELETE", f"{API}/{base_id}/{table}", params=params)["records"]
return deleted
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 20d ago Changed · -75 lines · +28 tokens per session 9c3c967efbea
- 1mo ago First seen · 374 lines · 63 tokens per session scan B 8a86812fef50
airtable is a skill published in the GitHub repository TerminalSkills/skills (175 stars, last pushed yesterday), licensed Apache-2.0. It adds 91 tokens to every session and 4,242 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it B with 2 findings (sends data to an external url, makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
event-store-design
Design and implement event stores for event-sourced systems. Use when building event sourcing infrastructure, choosing event store technologies, or implementing event persistence patterns.
platform-custom-field-generate
Use when users create, generate, or validate Salesforce Custom Field metadata. Trigger on custom fields, field types, Roll-Up Summary, Master-Detail/Lookup relationships, formula fields, picklists, dependent (controlling) picklists, referencing a value set from a field, or scoping picklist values per record type; also…
field-service-sobject-create-configure
Headless 360 REST API deployment step for creating sObject records. Handles describe-based field discovery, required-field derivation, entity-relationship ordering, and composite graph transactions. Use this skill when a designer skill (or a user directly) needs to create sObject records after design confirmation…
durable-objects
Build, debug, or review Cloudflare Durable Objects code for persistent state and coordination.
nornicdb-grpc
Drive NornicDB over gRPC — the Qdrant-compatible surface (Collections, Points, Snapshots) plus the additive NornicSearch service. Use when ingesting via Qdrant SDKs, migrating from Qdrant, or running hybrid text+vector search from a non-Bolt client. Covers connection, RPC catalog, collection→database mapping…
output-dev-credentials
Store and reference encrypted secrets in Output SDK workflows using @outputai/core/credentials. Use when integrating API keys, database passwords, or third-party tokens.