{
 "slug": "airtable",
 "name": "Airtable",
 "url": "https://airtable.com",
 "domain": "airtable.com",
 "category": "databases",
 "category_name": "Databases",
 "tested_at": "2026-10-15",
 "run": "20261015T051712Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T062343Z",
   "date": "2026-10-01",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": false,
    "inbox": [
     "matfy.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261001T190230Z",
   "date": "2026-10-01",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": null,
    "robots": "start"
   },
   "why": "noise",
   "drives": 2
  },
  {
   "run": "20261002T150642Z",
   "date": "2026-10-02",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261015T051712Z",
   "date": "2026-10-15",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 4,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip"
   }
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 3,
  "tries": 3,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: MCP sign-in, sign-up in a browser",
   "way": "email_password"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the $24 a month charge",
   "value": "ready",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes what it made",
   "left": "removed"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: llms.txt and an MCP server",
   "have": [
    "llms_txt",
    "mcp"
   ],
   "docs": "gaps"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: MCP sign-in, sign-up in a browser",
   "way": "email_password",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the $24 a month charge",
   "value": "ready",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes what it made",
   "left": "removed",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "mcp_signin",
   "label": "MCP sign-in",
   "routes": [
    "oauth_consent"
   ],
   "minutes": 3,
   "core": "6/10"
  },
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [
    "email_password"
   ],
   "minutes": 4,
   "core": "10/10"
  }
 ],
 "minutes": 3,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": null,
 "core": "10/10",
 "scores": {
  "coverage": 82,
  "reliability": 79,
  "resilience": 76,
  "setup": 75,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": 78,
  "docs_match": null,
  "setup": 75,
  "security": null,
  "standards": [
   {
    "standard": "MCP",
    "state": "behind",
    "behind": 1,
    "value": "2025-11-25"
   },
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "MCP client registration",
    "state": "current",
    "behind": null,
    "value": "cimd"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 77,
   "recovery": 100,
   "idempotency": 50
  },
  "summary": null
 },
 "stress": [
  {
   "capability": "Create a record in a table",
   "probe": "bad single-select value",
   "outcome": "422 {\"error\": {\"type\": \"INVALID_MULTIPLE_CHOICE_OPTIONS\", \"message\": \"Insufficient permissions to create new select option \\\"\\\"Maybe\\\"\\\"\"}} (says \"insufficient permissions\" rather than naming the vali",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a record in a table",
   "probe": "unknown field name",
   "outcome": "422 {\"error\": {\"type\": \"UNKNOWN_FIELD_NAME\", \"message\": \"Unknown field name: \\\"Nmae\\\"\"}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Update/edit a record's field values",
   "probe": "update a well-formed record id that does not exist",
   "outcome": "422 {\"error\": {\"type\": \"ROW_DOES_NOT_EXIST\", \"message\": \"Record ID recAAAAAAAAAAAAAA does not exist in this table\"}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a record in a table",
   "probe": "batch create with one invalid record (partial failure)",
   "outcome": "422 {\"error\": {\"type\": \"INVALID_MULTIPLE_CHOICE_OPTIONS\", \"message\": \"Insufficient permissions to create new select option \\\"\\\"Maybe\\\"\\\"\"}}; afterwards 0 \"batch ok\" records exist",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a record in a table",
   "probe": "repeat the same create twice (no idempotency key)",
   "outcome": "200 both; 2 records named \"dup test\"",
   "grade": "clear",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Create a record in a table",
   "probe": "repeat a create as upsert (performUpsert fieldsToMergeOn Name) twice",
   "outcome": "200; 1 record(s) named \"upsert test\" (second call: {\"records\": [{\"id\": \"recAKuPAglmphEfnk\", \"createdTime\": \"15 Oct 2026\", \"fields\": {\"Double\": 14, \"Points\": 7)",
   "grade": "clear",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "List/query/filter/sort records",
   "probe": "burst of 15 sequential list calls",
   "outcome": "all 200: ['200', '200', '200', '200', '200', '200', '200', '200', '200', '200', '200', '200', '200', '200', '200']; no RateLimit/X-RateLimit headers",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "List/query/filter/sort records",
   "probe": "wrong token",
   "outcome": "401 application/json {\"error\":{\"type\":\"UNAUTHORIZED\",\"message\":\"Invalid authentication token\"}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Delete a record",
   "probe": "GET a deleted record",
   "outcome": "403 INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND (not 404; does not say the record is gone)",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": null,
 "coverage_core": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 4,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "9f4b18b8d5ad",
  "kb_version": "3+overlay-1353601952",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 4,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip"
 },
 "same_level_drives": 4,
 "drives": 5,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": {
  "rung": "signup",
  "vendor": "HUMAN",
  "signed": true
 },
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "check",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "Agent docs at /developers/agents (llms.txt at /developers/llms.txt, Markdown via .md or Accept: text/markdown), MCP tools reference, CLI page, REST reference; AI Catalog at /.well-known/ai-catalog.json."
  },
  "signup": {
   "status": "browser",
   "note": "Headless GET /signup answers 403 with a PerimeterX cookie; in our agent's browser the email + name + password form went through with no visible challenge.",
   "way": "email_password"
  },
  "verify": {
   "status": "browser",
   "note": "Verification mail arrived within about a minute; we opened the /auth/verifyEmail link in our agent's browser."
  },
  "credentials": {
   "status": "browser",
   "note": "Personal access tokens are made only in Builder Hub (/create/tokens/new, scopes can be preset in the URL); no API or CLI creates one. MCP OAuth: DCR is headless, the consent page is a browser step.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /v0/meta/whoami with the PAT -> 200.",
   "route": "account"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /v0/meta/bases created a base with a 4-field table; a workspace had to be made in the browser first (a new account has none and the API cannot create one)."
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe card form inside airtable.com (Stripe Elements)"
   ],
   "rail_ids": [
    "stripe-elements"
   ],
   "first_party": true,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "route": "card_checkout",
   "checkout": {
    "reached": "card_form",
    "processor": "stripe_elements",
    "captcha": "invisible",
    "three_ds": "loaded",
    "card_form": true,
    "phone_field": "none",
    "wallets": [],
    "rail_offer": "none",
    "price": "24.00",
    "currency": "USD",
    "period": "month",
    "plan": "Team",
    "last_button": "Pay and subscribe"
   },
   "person": null,
   "ours": "no_card",
   "note": "No 402, x402 or MPP anywhere, no billing API or MCP billing tool. Workspace Upgrade > Choose Team opens a Stripe Elements card form on airtable.com: $24/seat/month + est. tax = $28.56, last button Pay and subscribe; hCaptcha and 3-D Secure scripts load, nothing visible. New account got a 14-day Team trial without a card. We stopped at the card field: no card for this drive."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent started no paid plan.",
   "docs_note": "Nothing to cancel: the drive started no paid plan. The checkout terms say \"Cancel anytime in Workspace Settings to avoid further charges\" (web UI); no billing API.",
   "docs_grade": "",
   "nothing": "no_plan"
  },
  "delete": {
   "status": "browser",
   "note": "Account settings > Delete your Airtable user account > sign in again > confirm page > native confirm dialog > POST /account/deleteAccount. Afterwards the OAuth token gets 401 on API and MCP and the email lands on sign-up. No API route. PATs were deleted in Builder Hub first (web only); bases cannot be deleted by API below Enterprise.",
   "left": "removed",
   "after_hours": null,
   "account": true
  }
 },
 "routes": [
  {
   "route": "email_password",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 4
  },
  {
   "route": "oauth_consent",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": false,
   "minutes": 3
  }
 ],
 "checkout": {
  "reached": "card_form",
  "processor": "stripe_elements",
  "captcha": "invisible",
  "three_ds": "loaded",
  "phone_field": "none",
  "rail_offer": "none",
  "period": "month",
  "card_form": true,
  "price": "24.00",
  "currency": "USD",
  "plan": "Team",
  "last_button": "Pay and subscribe"
 },
 "docs": {
  "at": "2026-10-15",
  "read": 229,
  "listed": 241,
  "sampled": false,
  "overall": "gaps",
  "getting_started": "found",
  "auth": "found",
  "errors": "missing",
  "examples": "none",
  "freshness": "fresh",
  "newest": "2026-09-22",
  "core_pages": "9 of 10",
  "capabilities": "most"
 },
 "claims": {
  "claimed": 6,
  "tried": 6,
  "held": 6,
  "broken": 0,
  "unclear": 0,
  "not_tried": 0,
  "undocumented_works": 1
 },
 "pay_options": {
  "checked": "2026-10-15",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": false,
  "cli": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true
 },
 "surface_notes": {
  "api": "REST v0: records, meta (bases, tables, fields), comments, webhooks, attachments upload; collaborators, base delete, SCIM, audit logs are Enterprise",
  "openapi": "no public OpenAPI file found; the AI Catalog points its REST entry at the HTML reference",
  "mcp": "official, 46 tools incl. automations, interfaces, forms; the older 25 Nov 2025 spec",
  "cli": "@airtable/mcp-cli wraps the MCP server, auth by PAT (not installed this drive)"
 },
 "can_do": [
  "Create a base with tables and typed fields, then read and change its schema (REST or MCP)",
  "Create, read, update, filter, sort and delete records, including upserts by a merge field",
  "Add formula, rollup, lookup and linked-record fields and read computed values",
  "Upload a file to an attachment field",
  "Comment on records",
  "Subscribe to table changes with webhooks and fetch the payloads",
  "Create, update and delete automations through MCP (turning one on is UI-only)",
  "Build an interface page and read its records through MCP",
  "Submit a published form through MCP",
  "Ask Omni questions about base data and have Omni build tables from a prompt (browser)",
  "Run a field agent over records (browser)"
 ],
 "cannot_do": [
  {
   "what": "Sign up or get an API token without a browser",
   "why": "Sign-up page answers 403 to headless requests (PerimeterX); PATs and OAuth apps are made only in the web UI; MCP OAuth needs a browser consent page"
  },
  {
   "what": "Turn an automation on or off headless",
   "why": "MCP create_automation saves it off; the docs say the user turns it on in the UI, and delete_automation refuses while it is on"
  },
  {
   "what": "Create a workspace or a view, or run a field agent, through API or MCP",
   "why": "No endpoint or tool for them; UI only"
  },
  {
   "what": "Delete a base, add collaborators, or use SCIM below Enterprise",
   "why": "Docs list these endpoints as Enterprise only"
  },
  {
   "what": "Pay on its own",
   "why": "Only a Stripe card form in the web app; no agent rail, no billing API"
  }
 ],
 "blockers": [
  "Headless sign-up blocked (403, PerimeterX); browser needed",
  "No headless way to make an API token"
 ],
 "tips_for_owner": [
  "Let agents get a token without the web UI",
  "Let signed agents load sign-up headless",
  "Add an MCP tool to turn automations on",
  "Offer a billing API or agent payment rail",
  "Support MCP (the 28 Jul 2026 spec) server/discover",
  "Return 404 for deleted records",
  "Reject attachment URLs that fail to download",
  "Publish rate-limit headers"
 ],
 "tips_for_agents": [
  "Use the official MCP server (https://mcp.airtable.com/mcp) with a PAT as Bearer: it has tools REST lacks (automations, interfaces, forms). Initialize with protocolVersion 2025-11-25.",
  "Make the PAT at /create/tokens/new?scopes=... and check the Access list shows 'All current and future bases' before Create token; a PAT with no workspace access gives 403 INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND on create base.",
  "A new account has no workspace; create one in the UI before POST /v0/meta/bases.",
  "Use performUpsert with fieldsToMergeOn to make creates safe to retry; plain POST duplicates.",
  "Attachment by URL fails silently on a bad URL; use content.airtable.com uploadAttachment and read back.",
  "Interfaces show in list_pages_for_base only after publish_interface.",
  "Account delete uses a native confirm dialog: accept it."
 ],
 "selfhost": null,
 "summary": "An agent can run almost all of Airtable's core once it has a token: REST and the official MCP server (46 tools) covered bases, records, schema, webhooks, automations, interfaces and forms, and Omni and field agents worked in the browser. Getting in needs a browser: sign-up is blocked headless, tokens are made only in the web UI, a workspace must be created in the UI, and automations can only be turned on there. Paying is a Stripe card form in the app; no agent rail or billing API.",
 "wall": "API tokens only made in the browser",
 "plan_scope": "free plan workspace on an account with a no-card 14-day Team trial",
 "robots_stop": null,
 "robots": {
  "rule": "star",
  "step": null,
  "seen": "2026-10-15",
  "held": false
 },
 "plain": {
  "summary": "Airtable is a database and app-building tool. An agent that already has a login token can do almost everything on its own: build databases, add and edit records, set up automations, webhooks, interfaces and forms. But getting that first token, signing up, and turning paid plans on all need a real person using the website.",
  "can_do": [
   "Build a database with tables, fields and formulas, and fill it with records, all through code",
   "Link records between tables and get automatic calculations (totals, lookups)",
   "Attach files and leave comments on records",
   "Get notified automatically whenever data changes (webhooks)",
   "Set up an automation that updates records when something happens",
   "Build a simple dashboard page or a public submission form",
   "Ask the built-in AI assistant questions about the data and have it build tables from a description",
   "Run an AI feature that fills in information across many records automatically"
  ],
  "cannot_do": [
   {
    "what": "Sign up without a browser",
    "why": "the sign-up page refuses requests from code; in a browser the agent signed up on its own"
   },
   {
    "what": "Get an API access key without a browser",
    "why": "keys are made only on a page in the account settings"
   },
   {
    "what": "Turn a new automation on without a browser",
    "why": "it can only be switched on in the app"
   },
   {
    "what": "Pay for a paid plan on its own",
    "why": "paying requires typing a card into a web payment form; the drive had no card to use"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Invite collaborators via API",
   "plan": "Enterprise Scale",
   "evidence": "add-base-collaborator.md: Billing plans: Enterprise (pre-2023.08 legacy plan), Enterprise Scale"
  },
  {
   "capability": "Sync external data",
   "plan": "Team and up",
   "evidence": "plans page: Standard sync integrations in Team, Premium/two-way in Business; our workspace on Free"
  },
  {
   "capability": "Run a script action",
   "plan": "paid",
   "evidence": "MCP create_automation with customScript -> INVALID_PERMISSIONS on our Free workspace"
  },
  {
   "capability": "App Library",
   "plan": "Enterprise Scale",
   "evidence": "plans page lists App Library under Enterprise Scale"
  },
  {
   "capability": "Audit logs",
   "plan": "Enterprise Scale",
   "evidence": "plans page: Audit logs and DLP under Enterprise Scale; docs audit-logs-overview.md"
  },
  {
   "capability": "SCIM",
   "plan": "Enterprise",
   "evidence": "GET /scim/v2/Users -> 403; docs scim-overview.md"
  },
  {
   "capability": "Delete a base via API",
   "plan": "Enterprise",
   "evidence": "delete-base.md: User role: Enterprise admin"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Data model",
   "capability": "Create a base with tables and fields",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/meta/bases",
    "mcp": null,
    "cli": null,
    "ui": "Airtable homepage > Create a base"
   },
   "check": "GET /v0/meta/bases/{baseId}/tables returns the new table",
   "source": "https://airtable.com/developers/web/api/create-base; https://airtable.com/"
  },
  {
   "id": "cap-02",
   "group": "Data model",
   "capability": "Create a record in a table",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/{baseId}/{tableIdOrName}",
    "mcp": null,
    "cli": null,
    "ui": "Grid view > +"
   },
   "check": "GET /v0/{baseId}/{tableIdOrName}/{recordId} returns the created fields",
   "source": "https://airtable.com/developers/web/api/create-records"
  },
  {
   "id": "cap-03",
   "group": "Data model",
   "capability": "Update/edit a record's field values",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v0/{baseId}/{tableIdOrName}",
    "mcp": null,
    "cli": null,
    "ui": "Grid/record detail view"
   },
   "check": "GET /v0/{baseId}/{tableIdOrName}/{recordId} reflects updated fields",
   "source": "https://airtable.com/developers/web/api/update-record"
  },
  {
   "id": "cap-04",
   "group": "Data model",
   "capability": "Delete a record",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /v0/{baseId}/{tableIdOrName}/{recordId}",
    "mcp": null,
    "cli": null,
    "ui": "Right-click row > Delete record"
   },
   "check": "GET /v0/{baseId}/{tableIdOrName}/{recordId} returns 404 afterward",
   "source": "https://airtable.com/developers/web/api/delete-record"
  },
  {
   "id": "cap-05",
   "group": "Data model",
   "capability": "List/query/filter/sort records",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v0/{baseId}/{tableIdOrName}",
    "mcp": null,
    "cli": null,
    "ui": "Grid view filters/sorts"
   },
   "check": "Response records array matches filterByFormula/sort params applied",
   "source": "https://airtable.com/developers/web/api/list-records"
  },
  {
   "id": "cap-06",
   "group": "AI app building",
   "capability": "Build a full app (tables, interfaces, automations) from a plain-language prompt with Omni",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Omni chat builder on airtable.com"
   },
   "check": "Resulting base contains the tables/interfaces/automations Omni created, inspectable via GET /v0/meta/bases/{baseId}/tables",
   "source": "https://www.airtable.com/platform/app-building"
  },
  {
   "id": "cap-07",
   "group": "AI agents",
   "capability": "Run a Field Agent across records to analyze, generate, or research at scale",
   "weight": "core",
   "plan": "trial",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Field Agent configured on a table, run manually or automatically"
   },
   "check": "Target field/record shows agent-generated output after the run completes",
   "source": "https://www.airtable.com/platform/ai-agents"
  },
  {
   "id": "cap-08",
   "group": "AI agents",
   "capability": "Ask Omni questions about base data for analysis/insights",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Omni chat panel inside a base"
   },
   "check": "Omni chat returns an answer; credit balance decreases by 10 credits per response",
   "source": "https://www.airtable.com/platform/app-building"
  },
  {
   "id": "cap-09",
   "group": "Views",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v0/meta/bases/{baseId}/tables (views list)",
    "mcp": null,
    "cli": null,
    "ui": "Add view button in base sidebar"
   },
   "check": "GET /v0/meta/bases/{baseId}/tables lists the new view id/type",
   "source": "https://airtable.com/developers/web/api/get-base-schema; https://airtable.com/"
  },
  {
   "id": "cap-10",
   "group": "Automations",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Automations tab > Create automation"
   },
   "check": "Automation run history shows a successful run after the trigger condition is met",
   "source": "https://support.airtable.com/articles/3669392397-getting-started-with-airtable-automations"
  },
  {
   "id": "cap-11",
   "group": "Collaboration",
   "capability": "Comment on a record",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/{baseId}/{tableIdOrName}/{recordId}/comments",
    "mcp": null,
    "cli": null,
    "ui": "Record detail > Comments panel"
   },
   "check": "GET /v0/{baseId}/{tableIdOrName}/{recordId}/comments includes the new comment",
   "source": "https://airtable.com/developers/web/api/create-comment"
  },
  {
   "id": "cap-12",
   "group": "Collaboration",
   "capability": "Build and publish a form for external record submission",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Form view builder, Share form link"
   },
   "check": "Submitting the public form URL creates a new record, visible via GET /v0/{baseId}/{tableIdOrName}",
   "source": "https://support.airtable.com/docs/when-a-form-is-submitted-trigger"
  },
  {
   "id": "cap-13",
   "group": "Collaboration",
   "capability": "Build an Interface (dashboard/app page) over base data",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /v0/meta/bases/{baseId}/interfaces",
    "mcp": null,
    "cli": null,
    "ui": "Interfaces tab > Build interface"
   },
   "check": "GET /v0/meta/bases/{baseId}/interfaces returns the created interface id",
   "source": "https://airtable.com/developers/web/api/list-interfaces"
  },
  {
   "id": "cap-14",
   "group": "Collaboration",
   "capability": "Share a base/view/record via a public share link",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Share view button"
   },
   "check": "Shared link opens the read-only view without authentication",
   "source": "https://support.airtable.com/docs/airtable-billing-overview"
  },
  {
   "id": "cap-15",
   "group": "Collaboration",
   "capability": "Invite and manage collaborators with roles (owner/creator/editor/commenter/read-only)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/meta/bases/{baseId}/collaborators",
    "mcp": null,
    "cli": null,
    "ui": "Share menu > Invite"
   },
   "check": "GET /v0/meta/bases/{baseId}/collaborators lists invited user with assigned role",
   "source": "https://support.airtable.com/articles/3669392397-getting-started-with-airtable-automations"
  },
  {
   "id": "cap-16",
   "group": "Data model",
   "capability": "Attach files to a record (attachments field)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/{baseId}/{tableIdOrName} (Attachment field value)",
    "mcp": null,
    "cli": null,
    "ui": "Attachment field cell > upload"
   },
   "check": "GET record shows attachment object with url/filename",
   "source": "https://airtable.com/developers/web/api/field-model"
  },
  {
   "id": "cap-17",
   "group": "Data model",
   "capability": "Link records between tables (linked record field)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v0/{baseId}/{tableIdOrName} (Link field value)",
    "mcp": null,
    "cli": null,
    "ui": "Link to another record field"
   },
   "check": "Linked field on source record contains target record id, reciprocal field updates",
   "source": "https://airtable.com/developers/web/api/field-model"
  },
  {
   "id": "cap-18",
   "group": "Data model",
   "capability": "Define formula, rollup, and lookup fields",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/meta/bases/{baseId}/tables/{tableId}/fields",
    "mcp": null,
    "cli": null,
    "ui": "+ Add field > Formula/Rollup/Lookup"
   },
   "check": "GET /v0/meta/bases/{baseId}/tables shows field with type formula/rollup and computed cell value returned",
   "source": "https://airtable.com/developers/web/api/field-model; https://support.airtable.com/docs/formula-field-reference"
  },
  {
   "id": "cap-19",
   "group": "Sync & Integration",
   "capability": "Sync external data sources into a table (Airtable Sync)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Add source table > Sync"
   },
   "check": "Synced table refreshes rows from the external source on schedule; maxSyncedTablesPerApplication enforced per plan",
   "source": "https://airtable.com/pricing"
  },
  {
   "id": "cap-20",
   "group": "Sync & Integration",
   "capability": "Receive data via incoming webhook trigger",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "Webhook automation trigger",
    "mcp": null,
    "cli": null,
    "ui": "Automations > When a webhook is received"
   },
   "check": "Automation run history shows a run fired by the inbound webhook payload",
   "source": "https://support.airtable.com/docs/incoming-webhooks-trigger"
  },
  {
   "id": "cap-21",
   "group": "Sync & Integration",
   "capability": "Subscribe to table/record change webhooks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/bases/{baseId}/webhooks",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v0/bases/{baseId}/webhooks/{webhookId}/payloads returns change payloads after a record edit",
   "source": "https://airtable.com/developers/web/api/webhooks-overview"
  },
  {
   "id": "cap-22",
   "group": "Automations",
   "capability": "Run custom JavaScript via 'Run a script' automation action",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Automations > Add action > Run a script"
   },
   "check": "Script execution log in automation run history shows console output; action unavailable on Free plan",
   "source": "https://support.airtable.com/docs/run-a-script-action"
  },
  {
   "id": "cap-23",
   "group": "Sync & Integration",
   "capability": "Connect third-party app actions/triggers (Slack, Gmail, Jira, Salesforce, Twilio, etc.)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Automations > Add action/trigger > choose integration"
   },
   "check": "Configured integration action (e.g. Send a Slack message) appears as a successful step in run history",
   "source": "https://support.airtable.com/articles/3669392397-getting-started-with-airtable-automations"
  },
  {
   "id": "cap-24",
   "group": "Sync & Integration",
   "capability": "Package and share a reusable app across the org via App Library",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "App Library"
   },
   "check": "Published app appears in org App Library for other workspaces to install",
   "source": "https://support.airtable.com/docs/using-app-library-and-components-in-airtable"
  },
  {
   "id": "cap-25",
   "group": "Data model",
   "capability": "Create a custom view/table schema programmatically (meta API: create/update tables and fields)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/meta/bases/{baseId}/tables",
    "mcp": null,
    "cli": null,
    "ui": "+ Add or import table"
   },
   "check": "GET /v0/meta/bases/{baseId}/tables lists the new table/field definitions",
   "source": "https://airtable.com/developers/web/api/create-table"
  },
  {
   "id": "cap-26",
   "group": "Account/admin",
   "capability": "Choose which AI model (OpenAI, Anthropic, Gemini, Llama) powers AI features",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Admin panel > AI settings"
   },
   "check": "Admin AI settings page shows selected enabled model provider",
   "source": "https://www.airtable.com/platform/ai-agents"
  },
  {
   "id": "cap-27",
   "group": "Account/admin",
   "capability": "Admin-level governance: enable/disable AI per workspace, RBAC, audit logs",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Admin console"
   },
   "check": "Audit log export shows recorded admin actions; AI toggle persists per workspace",
   "source": "https://www.airtable.com/platform"
  },
  {
   "id": "cap-28",
   "group": "Account/admin",
   "capability": "Programmatic user provisioning/de-provisioning and IDP-synced groups",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "SCIM API",
    "mcp": null,
    "cli": null,
    "ui": "Enterprise admin > Identity"
   },
   "check": "SCIM endpoint create/deactivate user call reflected in org member list",
   "source": "https://www.airtable.com/platform"
  },
  {
   "id": "cap-29",
   "group": "Account/admin",
   "capability": "Apply Enterprise Key Management (EKM) and data residency controls",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Enterprise admin > Security"
   },
   "check": "Security settings page shows EKM/data residency region configured",
   "source": "https://www.airtable.com/platform"
  },
  {
   "id": "cap-30",
   "group": "Account/admin",
   "capability": "Upgrade/downgrade workspace between Free, Team, Business, Enterprise Scale plans",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings > Plan upgrades"
   },
   "check": "Workspace billing page shows new plan tier and seat charges",
   "source": "https://airtable.com/pricing"
  }
 ],
 "attempts": [
  {
   "cap": "discovery",
   "capability": "MCP version",
   "task": "POST server/discover to https://mcp.airtable.com/mcp (no credentials)",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "HTTP 401 application/json {\"error\":\"UNAUTHORIZED\"}; WWW-Authenticate: Bearer resource_metadata=\"https://mcp.airtable.com/.well-known/oauth-protected-resource\". Retry with credentials once in.",
   "quality": {
    "error_legibility": "clear"
   },
   "t": "01:19"
  },
  {
   "cap": "discovery",
   "capability": "Cards",
   "task": "MCP server card and AI Catalog",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://airtable.com/.well-known/ai-catalog.json 200 application/json specVersion 1.0, entries: MCP server (type application/mcp-server-card+json, url https://mcp.airtable.com/mcp, capabilities list incl. automations, forms, interfaces), 8 agent skills (github.com/airtable/skills), REST API. https://mcp.airtable.com/mcp/server-card 404 JSON \"MCP proxy endpoint not found\"; /.well-known/mcp/server-card.json 404 html.",
   "t": "01:19"
  },
  {
   "cap": "discovery",
   "capability": "aipref",
   "task": "robots.txt Content-Usage / header",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "robots.txt (21 lines) has only User-agent: * with Allow/Disallow and Sitemap; no Content-Usage or Content-signal line; no Content-Usage response header. Disallows include /auth, /shr*, /app*/shr*, /app*/pag*/form*, /tbl*, /sso/login.",
   "t": "01:19"
  },
  {
   "cap": "discovery",
   "capability": "Markdown docs",
   "task": "Accept: text/markdown and .md URL on /developers/web/api/introduction",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Accept: text/markdown -> content-type text/markdown, vary: Accept, User-Agent, Accept-Encoding; introduction.md -> 200 text/markdown. llms.txt at https://airtable.com/developers/llms.txt (root /llms.txt 404) with sections Agents, Web API, Extensions, Scripting.",
   "t": "01:19"
  },
  {
   "cap": "discovery",
   "capability": "OAuth metadata",
   "task": "PRM and AS metadata",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PRM https://mcp.airtable.com/.well-known/oauth-protected-resource 200 (AS https://airtable.com/oauth2/v1, 7 scopes). AS metadata: registration_endpoint (DCR), client_id_metadata_document_supported: true (CIMD), S256 PKCE, resource_indicators_supported; no device_authorization_endpoint; no agent_auth block. /auth.md disallowed by robots.txt (/auth). /.well-known/ucp 404.",
   "t": "01:19"
  },
  {
   "cap": "discovery",
   "capability": "Docs",
   "task": "Agent docs: MCP tools reference, CLI, PAT",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "airtable.com/developers/agents/mcp/tools.md lists ~45 MCP tools (records, tables, fields, bases, interfaces, forms, automations, workspaces); mcp/cli.md documents @airtable/mcp-cli (npm) with PAT auth; mcp/other.md: DCR default, static OAuth client, PAT bearer header. Server available on all plans.",
   "t": "01:19"
  },
  {
   "cap": "signup",
   "way": "email_password",
   "capability": "Sign up",
   "task": "Sign up with email + name + password at airtable.com/signup",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "headless refused). In browser (pw): email -> Continue -> Full name + Password -> Sign up -> landed on airtable.com home, logged in; no visible challenge; banner \"Upgrade to the Team plan before your trial expires in 14 days\".",
   "notes": "Other doors on the form: Single Sign On, Google, Apple, ChatGPT. No GitHub.",
   "quality": {
    "error_legibility": "n/a"
   },
   "t": "03:03"
  },
  {
   "cap": "verify",
   "way": "email_password",
   "capability": "Verify email",
   "task": "Click verification link from inbox",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Mail \"Please confirm your email\" from noreply@airtable.com arrived within ~1 min; link /auth/verifyEmail/usr... opened in pw (--account; /auth is disallowed for all user agents in robots.txt, a crawler rule) -> \"Your email has been verified!\"",
   "t": "03:03"
  },
  {
   "cap": "login",
   "way": "email_password",
   "capability": "Session",
   "task": "Logged-in session after sign-up",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Sign up landed in a logged-in session on airtable.com home (user avatar, workspaces).",
   "t": "03:03"
  },
  {
   "cap": "credentials",
   "way": "email_password",
   "key": "create",
   "capability": "API credentials",
   "task": "Create a personal access token (PAT) with 9 scopes on all resources",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PAT created in browser at /create/tokens/new?scopes=... (docs link from developers/agents/mcp/cli.md); token shown once in a dialog. Docs offer no API/CLI to create a PAT or an OAuth app (tokens page, OAuth integrations page are web only). Two earlier tokens were created while our script failed to read the dialog; all are revoked at the end.",
   "notes": "No documented headless key route: PATs and OAuth integrations are created in Builder Hub (web).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/guides/personal-access-tokens"
   },
   "t": "07:18"
  },
  {
   "cap": "first_call",
   "way": "email_password",
   "capability": "First API call",
   "task": "GET /v0/meta/whoami with PAT",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 {\"id\":\"usrxPOEU5AzZcqyEU\",\"email\":\"the agent's inbox\"}; GET /v0/meta/bases 200 {\"bases\":[]}; GET /v0/meta/workspaces 403 INVALID_PERMISSIONS (enterprise-only list).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-user-id-scopes",
    "error_legibility": "vague"
   },
   "t": "07:18"
  },
  {
   "cap": "discovery",
   "capability": "MCP version",
   "task": "server/discover with PAT, then initialize fallback",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "server/discover with Bearer PAT -> HTTP 400 {\"error\":\"BAD_REQUEST\",\"message\":\"Bad request\"} (no -32022): legacy. initialize offering 2026-07-28 -> 200 text/event-stream, protocolVersion \"2025-11-25\", serverInfo airtable-mcp-server 0.0.1, capabilities tools+resources listChanged. tools/list: 46 tools.",
   "t": "07:18"
  },
  {
   "cap": "workspace",
   "way": "email_password",
   "capability": "Create workspace",
   "task": "Create a workspace (needed for create base)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "New account had no workspace (MCP list_workspaces -> []); no documented non-enterprise API to create one; created in browser via \"Create a workspace\" -> wspZZwWTGnC9hCm5G (FREE PLAN). MCP list_workspaces then lists it.",
   "t": "10:00"
  },
  {
   "cap": "first_action",
   "way": "email_password",
   "capability": "First real action",
   "task": "Create a base with a Tasks table via POST /v0/meta/bases",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 id appL7NPyyz2SfvtaC, table tblqUgvixZQQeYSvj with 4 fields and a Grid view. Needed a second PAT: the first one had no workspace access because our \"Add all resources\" click had not registered.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-base"
   },
   "t": "11:44"
  },
  {
   "cap": "cap-01",
   "way": "email_password",
   "step": "create",
   "capability": "Create a base with tables and fields",
   "task": "POST /v0/meta/bases \"AD Drive Base 1\" with Tasks table (text, single select, number, long text)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 appL7NPyyz2SfvtaC tables[0] tblqUgvixZQQeYSvj",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-base",
    "verify_route": "yes"
   },
   "t": "11:44"
  },
  {
   "cap": "cap-01",
   "way": "email_password",
   "step": "read",
   "capability": "Create a base with tables and fields",
   "task": "GET /v0/meta/bases/{id}/tables",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 tables [('Tasks', 4)]",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-base-schema",
    "verify_route": "yes"
   },
   "t": "11:45"
  },
  {
   "cap": "cap-01",
   "way": "email_password",
   "step": "update",
   "capability": "Create a base with tables and fields",
   "task": "PATCH table name/description, read back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PATCH 200; GET tables -> name \"Tasks v2\"",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/update-table",
    "verify_route": "yes"
   },
   "t": "11:47"
  },
  {
   "cap": "cap-02",
   "way": "email_password",
   "step": "create",
   "capability": "Create a record in a table",
   "task": "POST /v0/{base}/{table} 2 records",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200 ids ['recGnFdh1CoBFIf6T', 'recMKCl6fN5kxZ3Uk']",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-records",
    "verify_route": "yes"
   },
   "t": "12:04"
  },
  {
   "cap": "cap-02",
   "way": "email_password",
   "step": "read",
   "capability": "Create a record in a table",
   "task": "GET record back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 fields {'Status': 'Todo', 'Points': 3, 'Name': 'Task A t1', 'Notes': 'hello'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes"
   },
   "t": "12:04"
  },
  {
   "cap": "cap-03",
   "way": "email_password",
   "step": "update",
   "capability": "Update a record's field values",
   "task": "PATCH /v0/{base}/{table} Status->Done, Points->5",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/update-multiple-records",
    "verify_route": "yes"
   },
   "t": "12:06"
  },
  {
   "cap": "cap-03",
   "way": "email_password",
   "step": "read",
   "capability": "Update a record's field values",
   "task": "GET record after PATCH (other fields kept)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 fields {'Status': 'Done', 'Points': 5, 'Name': 'Task A t1', 'Notes': 'hello'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes"
   },
   "t": "12:07"
  },
  {
   "cap": "cap-05",
   "way": "email_password",
   "step": "use",
   "capability": "List/query/filter/sort records",
   "task": "GET with filterByFormula Status='Done' and sort Points desc",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 [('Task B t1', 8), ('Task A t1', 5)]",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/list-records",
    "verify_route": "yes"
   },
   "t": "12:07"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "delete",
   "capability": "Delete a record",
   "task": "DELETE /v0/{base}/{table}/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200 {'deleted': True, 'id': 'recMKCl6fN5kxZ3Uk'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/delete-record",
    "verify_route": "yes"
   },
   "t": "12:09"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "read",
   "capability": "Delete a record",
   "task": "GET deleted record",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "403 {'error': {'type': 'INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND', 'message': 'Invalid permissions, or the requested model was not found. Check that both your user and your token have the required permissions, and that the model names and/or ids are correct.'}}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes",
    "error_legibility": "clear"
   },
   "t": "12:10"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "read",
   "capability": "Delete a record",
   "task": "List records: deleted id absent",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 list ids ['recGnFdh1CoBFIf6T']; recMKCl6fN5kxZ3Uk absent=True. GET on the deleted id answers 403 INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND, not 404.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes",
    "error_legibility": "vague"
   },
   "t": "12:18"
  },
  {
   "cap": "cap-02",
   "way": "email_password",
   "step": "create",
   "trial": 2,
   "capability": "Create a record in a table",
   "task": "POST /v0/{base}/{table} 2 records",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200 ids ['recbnprzoD8wbu7BM', 'recsuykCuGD5KbZZU']",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-records",
    "verify_route": "yes"
   },
   "t": "12:19"
  },
  {
   "cap": "cap-02",
   "way": "email_password",
   "step": "read",
   "trial": 2,
   "capability": "Create a record in a table",
   "task": "GET record back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 fields {'Status': 'Todo', 'Points': 3, 'Name': 'Task A t2', 'Notes': 'hello'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes"
   },
   "t": "12:19"
  },
  {
   "cap": "cap-03",
   "way": "email_password",
   "step": "update",
   "trial": 2,
   "capability": "Update a record's field values",
   "task": "PATCH /v0/{base}/{table} Status->Done, Points->5",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/update-multiple-records",
    "verify_route": "yes"
   },
   "t": "12:21"
  },
  {
   "cap": "cap-03",
   "way": "email_password",
   "step": "read",
   "trial": 2,
   "capability": "Update a record's field values",
   "task": "GET record after PATCH (other fields kept)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 fields {'Status': 'Done', 'Points': 5, 'Name': 'Task A t2', 'Notes': 'hello'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes"
   },
   "t": "12:21"
  },
  {
   "cap": "cap-05",
   "way": "email_password",
   "step": "use",
   "trial": 2,
   "capability": "List/query/filter/sort records",
   "task": "GET with filterByFormula Status='Done' and sort Points desc",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 [('Task B t2', 8), ('Task A t2', 5)]",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/list-records",
    "verify_route": "yes"
   },
   "t": "12:22"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "delete",
   "trial": 2,
   "capability": "Delete a record",
   "task": "DELETE /v0/{base}/{table}/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200 {'deleted': True, 'id': 'recsuykCuGD5KbZZU'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/delete-record",
    "verify_route": "yes"
   },
   "t": "12:24"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "read",
   "trial": 2,
   "capability": "Delete a record",
   "task": "GET deleted record",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "403 {'error': {'type': 'INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND', 'message': 'Invalid permissions, or the requested model was not found. Check that both your user and your token have the required permissions, and that the model names and/or ids are correct.'}}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes",
    "error_legibility": "clear"
   },
   "t": "12:24"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "read",
   "trial": 2,
   "capability": "Delete a record",
   "task": "List records: deleted id absent",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 list ids ['recGnFdh1CoBFIf6T', 'recbnprzoD8wbu7BM']; recsuykCuGD5KbZZU absent=True. GET on the deleted id answers 403 INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND, not 404.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes",
    "error_legibility": "vague"
   },
   "t": "12:25"
  },
  {
   "cap": "cap-02",
   "way": "email_password",
   "step": "create",
   "trial": 3,
   "capability": "Create a record in a table",
   "task": "POST /v0/{base}/{table} 2 records",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200 ids ['recDg5TsbI9byxYWL', 'recN3fTJZcAPJgwmq']",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-records",
    "verify_route": "yes"
   },
   "t": "12:27"
  },
  {
   "cap": "cap-02",
   "way": "email_password",
   "step": "read",
   "trial": 3,
   "capability": "Create a record in a table",
   "task": "GET record back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 fields {'Status': 'Todo', 'Points': 3, 'Name': 'Task A t3', 'Notes': 'hello'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes"
   },
   "t": "12:28"
  },
  {
   "cap": "cap-03",
   "way": "email_password",
   "step": "update",
   "trial": 3,
   "capability": "Update a record's field values",
   "task": "PATCH /v0/{base}/{table} Status->Done, Points->5",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/update-multiple-records",
    "verify_route": "yes"
   },
   "t": "12:28"
  },
  {
   "cap": "cap-03",
   "way": "email_password",
   "step": "read",
   "trial": 3,
   "capability": "Update a record's field values",
   "task": "GET record after PATCH (other fields kept)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 fields {'Status': 'Done', 'Points': 5, 'Name': 'Task A t3', 'Notes': 'hello'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes"
   },
   "t": "12:30"
  },
  {
   "cap": "cap-05",
   "way": "email_password",
   "step": "use",
   "trial": 3,
   "capability": "List/query/filter/sort records",
   "task": "GET with filterByFormula Status='Done' and sort Points desc",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 [('Task B t3', 8), ('Task A t3', 5)]",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/list-records",
    "verify_route": "yes"
   },
   "t": "12:30"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "delete",
   "trial": 3,
   "capability": "Delete a record",
   "task": "DELETE /v0/{base}/{table}/{id}",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "200 {'deleted': True, 'id': 'recN3fTJZcAPJgwmq'}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/delete-record",
    "verify_route": "yes"
   },
   "t": "12:31"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "read",
   "trial": 3,
   "capability": "Delete a record",
   "task": "GET deleted record",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "403 {'error': {'type': 'INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND', 'message': 'Invalid permissions, or the requested model was not found. Check that both your user and your token have the required permissions, and that the model names and/or ids are correct.'}}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes",
    "error_legibility": "clear"
   },
   "t": "12:33"
  },
  {
   "cap": "cap-04",
   "way": "email_password",
   "step": "read",
   "trial": 3,
   "capability": "Delete a record",
   "task": "List records: deleted id absent",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 list ids ['recDg5TsbI9byxYWL', 'recGnFdh1CoBFIf6T', 'recbnprzoD8wbu7BM']; recN3fTJZcAPJgwmq absent=True. GET on the deleted id answers 403 INVALID_PERMISSIONS_OR_MODEL_NOT_FOUND, not 404.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://airtable.com/developers/web/api/get-record",
    "verify_route": "yes",
    "error_legibility": "vague"
   },
   "t": "12:33"
  },
  {
   "cap": "cap-25",
   "way": "email_password",
   "capability": "Create a custom view/table schema programmatically (meta API: create/update tables and fields)",
   "task": "Create Projects table + add email field, read back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST tables 200 tblwSgtEhoXX0dB46; POST fields 200; GET tables shows fields ['Project:singleLineText', 'Budget:currency', 'Owner email:email']",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-table"
   },
   "step": "create",
   "t": "12:58"
  },
  {
   "cap": "cap-17",
   "way": "email_password",
   "capability": "Link records between tables (linked record field)",
   "task": "Link a task to a project, read back reciprocal",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "link field fldZm7Tem6JOju0q1 created; PATCH Tasks record recGnFdh1CoBFIf6T Project=[rec4UHG4TKzc9ofA6]; GET project record shows reciprocal field {'Tasks v2': ['recGnFdh1CoBFIf6T'], 'Project': 'Apollo', 'Budget': 1200.5}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/field-model"
   },
   "t": "13:02"
  },
  {
   "cap": "cap-18",
   "way": "email_password",
   "capability": "Define formula, rollup, and lookup fields",
   "task": "Create formula, rollup and lookup fields, read computed values",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST fields formula {Points}*2 -> 200 (record shows Double=10 for Points 5); rollup SUM(values) over link -> 200, project shows Total points=5; lookup multipleLookupValues -> 200, shows Task names [\"Task A t1\"]. First rollup try without options -> 422 naming the 3 missing options (clear).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/field-model",
    "error_legibility": "clear"
   },
   "t": "13:22"
  },
  {
   "cap": "cap-11",
   "way": "email_password",
   "capability": "Comment on a record",
   "task": "Comment on a record and list comments",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST comments 200 comQuMQzDBANzIlOF; GET comments lists it: True",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-comment"
   },
   "t": "13:31"
  },
  {
   "cap": "cap-16",
   "way": "email_password",
   "capability": "Attach files to a record (attachments field)",
   "task": "Attach a file by URL (our URL was a 404)",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "Attachment by URL: PATCH Files=[{url:\"https://agentdrives.com/favicon.ico\"}] answered 200 and echoed the attachment, but our URL was a 404 and the attachment silently vanished (GET after 14 s: no Files). Our URL was wrong; the 200 hid it.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/field-model",
    "error_legibility": "silent",
    "recoverable": "yes"
   },
   "t": "14:09"
  },
  {
   "cap": "cap-16",
   "way": "email_password",
   "capability": "Attach files to a record (attachments field)",
   "task": "Upload an attachment (base64) to a record, read back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST content.airtable.com/v0/{base}/{record}/{field}/uploadAttachment (base64 note.txt) -> 200; GET record shows Files [(\"note.txt\", 23 bytes)] with airtableusercontent URL",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/upload-attachment"
   },
   "t": "14:09"
  },
  {
   "cap": "cap-21",
   "way": "email_password",
   "capability": "Subscribe to table/record change webhooks",
   "task": "Subscribe to table changes and fetch payloads",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST webhooks 200 achIN5DTyN2Klj9T6 (no notificationUrl); edit record; GET payloads 200: 1 payload(s)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/webhooks-overview"
   },
   "t": "14:21"
  },
  {
   "cap": "cap-15",
   "way": "email_password",
   "capability": "Invite and manage collaborators with roles (owner/creator/editor/commenter/read-only)",
   "task": "Add a read-only collaborator via API",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "POST /v0/meta/bases/{id}/collaborators -> 422 INVALID_REQUEST_UNKNOWN (we sent an email; the docs want a user id). Docs: \"Billing plans: Enterprise (pre-2023.08 legacy plan), Enterprise Scale\" and scope workspacesAndBases:write (not offered to our PAT).",
   "quality": {},
   "t": "14:35"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Create automation via MCP",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP create_automation (recordCreated -> updateRecord Notes) -> automationId wflOnsFMU8HXFuU0C, isValid true, saved OFF (tool doc: \"off until the user reviews and turns it on in the Airtable UI\")",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "step": "create",
   "t": "16:01"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Read automation back",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP get_automation -> trigger recordCreated, node updateRecord, deploymentStatus undeployed, configurationStatus valid",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "step": "read",
   "t": "16:01"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Turn the automation on",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Turned ON in the browser (automation editor OFF/ON toggle); get_automation -> deploymentStatus deployed. No MCP/API tool turns an automation on.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "step": "update",
   "t": "16:01"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Use: record created fires the automation",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST record recPtw2pp2mmn6fFA via API; 15 s later GET shows Notes \"auto-noted by automation\"; MCP list_automation_runs -> run wfxTRS4XP8a50GRZP status success",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "step": "use",
   "t": "16:01"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Update automation via MCP",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP update_automation name -> \"AD auto note v2\"; get_automation shows new name",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "step": "update",
   "t": "16:08"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Delete automation",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Turned OFF in browser (MCP delete_automation refused while on: \"Cannot delete this automation because it is currently on. Turn it off in the Airtable UI first.\"); then MCP delete_automation ok; list_automations no longer lists it: True",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md",
    "error_legibility": "clear"
   },
   "step": "delete",
   "t": "16:59"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Create, read back, delete an automation (repeat)",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP create_automation -> wflJ0M195RXrHsROe; get_automation ok; delete_automation ok (not turned on: turning on is UI-only)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "trial": 2,
   "step": "create",
   "t": "17:09"
  },
  {
   "cap": "cap-10",
   "way": "email_password",
   "capability": "Create a trigger-and-action automation (e.g. record created -> send email/update record)",
   "task": "Create, read back, delete an automation (repeat)",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP create_automation -> wfluq75EvF1tJNCm0; get_automation ok; delete_automation ok (not turned on: turning on is UI-only)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "trial": 3,
   "step": "create",
   "t": "17:10"
  },
  {
   "cap": "cap-13",
   "way": "email_password",
   "capability": "Build an Interface (dashboard/app page) over base data",
   "task": "Build an interface with a grid page over Tasks, publish, read, delete",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP create_interface -> pbdUv2oAAUaeHI9Tn; create_page grid on Tasks (first try: \"grid element is invalid: fieldIds: Required\", clear) -> pag0WCoeelnBSnOGd; list_pages_for_base empty until publish_interface, then lists it; list_records_for_page -> 0 records; delete_interface ok, gone from list: True. Map claim GET /v0/meta/bases/{id}/interfaces -> 404 NOT_FOUND.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md",
    "error_legibility": "clear"
   },
   "t": "17:41"
  },
  {
   "kind": "claim",
   "cap": "cap-13",
   "surface": "api",
   "claim": "GET /v0/meta/bases/{baseId}/interfaces",
   "doc_url": "https://airtable.com/developers/web/api/list-interfaces",
   "result": "failed",
   "verified": false,
   "documented": true,
   "notes": "404 {\"error\":\"NOT_FOUND\"} on our free-plan base",
   "t": "17:41",
   "capability": "Docs claim: Build an Interface (dashboard/app page) over base data",
   "task": "GET /v0/meta/bases/{baseId}/interfaces",
   "route": "api",
   "evidence": "404 {\"error\":\"NOT_FOUND\"} on our free-plan base"
  },
  {
   "cap": "cap-08",
   "way": "email_password",
   "capability": "Ask Omni questions about base data for analysis/insights",
   "task": "Ask Omni a question about base data",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "In the base, Omni panel prompt \"how many records have Status Done, and the sum of Points\" -> \"Count: 3 Sum of Points: 15\" after ~15 s, with result tables. Matches API: 3 Done records with Points 5 each (filterByFormula read).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/app-building"
   },
   "t": "19:07"
  },
  {
   "cap": "cap-06",
   "way": "email_password",
   "capability": "Build a full app (tables, interfaces, automations) from a plain-language prompt with Omni",
   "task": "Build an app from a plain-language prompt with Omni",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Omni (in-base chat) prompt to build a book loans tracker -> \"Built a table Books\", \"Built a table Loans\", \"Created interface / Set up the page Current loans\" in ~20 s. API GET tables: Books (Title, Author, Status singleSelect, Loans link), Loans (Borrower, Book link, Loan date, Due date, Returned checkbox). Omni asked \"OK to publish this interface?\"; our Approve click did not register before the page reloaded, so the interface stayed a draft (list_pages_for_base lists published ones only). The home-page \"Start with Omni\" onboarding input did not take our typing.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/app-building"
   },
   "t": "23:29"
  },
  {
   "cap": "cap-07",
   "way": "email_password",
   "capability": "Run a Field Agent across records to analyze, generate, or research at scale",
   "task": "Add a field agent and run it over records",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Omni added AI field \"Genre\" (field agent) to Books but said it cannot run it (\"I can't trigger AI field generation from here\"). Ran it in the browser: Genre header > Run field agent > \"2 of 2 cells in view ~2 credits\". API GET Books: Genre {state: generated, value: \"Romance\"} for Pride and Prejudice, \"Adventure\" for Moby-Dick.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/ai-agents"
   },
   "t": "29:55"
  },
  {
   "cap": "cap-09",
   "way": "email_password",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "Create a kanban view",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Browser: Create new... > Kanban > Create new view -> viwkyegl0pnbLl3PJ. MCP list_views_for_table and API GET /v0/meta/bases/{id}/tables list it (type kanban). No API or MCP tool creates a view.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-base-schema"
   },
   "step": "create",
   "t": "30:47"
  },
  {
   "cap": "cap-09",
   "way": "email_password",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "Read views back",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "API GET tables views: [{'id': 'viwZRbGmfFvt0PcBF', 'name': 'Grid view', 'type': 'grid'}, {'id': 'viwkyegl0pnbLl3PJ', 'name': 'Kanban', 'type': 'kanban'}]",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-base-schema"
   },
   "step": "read",
   "t": "30:48"
  },
  {
   "cap": "cap-09",
   "way": "email_password",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "Use the view to list records",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET records ?view=viwkyegl0pnbLl3PJ -> 200, 4 records",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/list-records"
   },
   "step": "use",
   "t": "30:49"
  },
  {
   "cap": "cap-09",
   "way": "email_password",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "Delete the view, read back",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Browser: view menu > Delete view; MCP list_views_for_table -> only Grid view left (viwkyegl0pnbLl3PJ gone)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-base-schema"
   },
   "step": "delete",
   "t": "31:13"
  },
  {
   "cap": "cap-12",
   "way": "email_password",
   "capability": "Build and publish a form for external record submission",
   "task": "Build and publish a form, submit to it, read the record back",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Browser: Create new... > Form > Try form builder -> form page pagJpUdgsfyYSZJZY, Publish (share dialog: Anyone on the web / domain / Team / base users). MCP get_form_schema lists sections and fields; MCP submit_form -> record recS1twhaqagSI7tD; API filterByFormula read shows Name \"Form submission test\", Status Todo, Points 2. Public form URLs (/app*/pag*/form*) are disallowed for all user agents in robots.txt, so we did not open the public link.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "t": "32:45"
  },
  {
   "cap": "cap-14",
   "way": "email_password",
   "capability": "Share a base/view/record via a public share link",
   "task": "Create a public share link for a view",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "Browser: Share > Create link to view -> share link /appL7NPyyz2SfvtaC/shr... created (Link settings, Copy link). Not opened without auth: robots.txt disallows /shr* and /app*/shr* for all user agents, so the unauthenticated read-back was not done.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://support.airtable.com/docs/airtable-billing-overview"
   },
   "t": "34:07"
  },
  {
   "cap": "cap-01",
   "way": "email_password",
   "capability": "Create a base with tables and fields",
   "task": "Create a base, read, rename table (repeat)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST bases 200 appAn2GCbAMe1jmmL; GET tables 200; PATCH table name 200; read back \"Tasks t2\". Base delete is not in the API for non-enterprise plans (removed in browser at the end).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-base"
   },
   "trial": 2,
   "step": "create",
   "t": "34:13"
  },
  {
   "cap": "cap-01",
   "way": "email_password",
   "capability": "Create a base with tables and fields",
   "task": "Create a base, read, rename table (repeat)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST bases 200 apprn2RTDuLD9qBxa; GET tables 200; PATCH table name 200; read back \"Tasks t3\". Base delete is not in the API for non-enterprise plans (removed in browser at the end).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/create-base"
   },
   "trial": 3,
   "step": "create",
   "t": "34:18"
  },
  {
   "kind": "claim",
   "cap": "cap-01",
   "surface": "api",
   "claim": "POST /v0/meta/bases",
   "doc_url": "https://airtable.com/developers/web/api/create-base",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "worked as documented in the core chain (see the cap lines)",
   "t": "34:18",
   "capability": "Docs claim: Create a base with tables and fields",
   "task": "POST /v0/meta/bases",
   "route": "api",
   "evidence": "worked as documented in the core chain (see the cap lines)"
  },
  {
   "kind": "claim",
   "cap": "cap-02",
   "surface": "api",
   "claim": "POST /v0/{baseId}/{tableIdOrName}",
   "doc_url": "https://airtable.com/developers/web/api/create-records",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "worked as documented in the core chain (see the cap lines)",
   "t": "34:18",
   "capability": "Docs claim: Create a record in a table",
   "task": "POST /v0/{baseId}/{tableIdOrName}",
   "route": "api",
   "evidence": "worked as documented in the core chain (see the cap lines)"
  },
  {
   "kind": "claim",
   "cap": "cap-03",
   "surface": "api",
   "claim": "PATCH /v0/{baseId}/{tableIdOrName}",
   "doc_url": "https://airtable.com/developers/web/api/update-multiple-records",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "worked as documented in the core chain (see the cap lines)",
   "t": "34:19",
   "capability": "Docs claim: Update/edit a record's field values",
   "task": "PATCH /v0/{baseId}/{tableIdOrName}",
   "route": "api",
   "evidence": "worked as documented in the core chain (see the cap lines)"
  },
  {
   "kind": "claim",
   "cap": "cap-04",
   "surface": "api",
   "claim": "DELETE /v0/{baseId}/{tableIdOrName}/{recordId}",
   "doc_url": "https://airtable.com/developers/web/api/delete-record",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "worked as documented in the core chain (see the cap lines)",
   "t": "34:19",
   "capability": "Docs claim: Delete a record",
   "task": "DELETE /v0/{baseId}/{tableIdOrName}/{recordId}",
   "route": "api",
   "evidence": "worked as documented in the core chain (see the cap lines)"
  },
  {
   "kind": "claim",
   "cap": "cap-05",
   "surface": "api",
   "claim": "GET /v0/{baseId}/{tableIdOrName}",
   "doc_url": "https://airtable.com/developers/web/api/list-records",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "worked as documented in the core chain (see the cap lines)",
   "t": "34:19",
   "capability": "Docs claim: List/query/filter/sort records",
   "task": "GET /v0/{baseId}/{tableIdOrName}",
   "route": "api",
   "evidence": "worked as documented in the core chain (see the cap lines)"
  },
  {
   "kind": "claim",
   "cap": "cap-09",
   "surface": "api",
   "claim": "GET /v0/meta/bases/{baseId}/tables (views list)",
   "doc_url": "https://airtable.com/developers/web/api/get-base-schema",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "lists views with id/name/type (read only; no API creates a view)",
   "t": "34:19",
   "capability": "Docs claim: Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "GET /v0/meta/bases/{baseId}/tables (views list)",
   "route": "api",
   "evidence": "lists views with id/name/type (read only; no API creates a view)"
  },
  {
   "kind": "claim",
   "cap": "cap-02",
   "surface": "mcp",
   "claim": "create_records_for_table",
   "doc_url": "https://airtable.com/developers/agents/mcp/tools.md",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "created recbH5sJUlQEfQnp6",
   "t": "34:34",
   "capability": "Docs claim: Create a record in a table",
   "task": "create_records_for_table",
   "route": "mcp",
   "evidence": "created recbH5sJUlQEfQnp6"
  },
  {
   "kind": "claim",
   "cap": "cap-03",
   "surface": "mcp",
   "claim": "update_records_for_table",
   "doc_url": "https://airtable.com/developers/agents/mcp/tools.md",
   "result": "failed",
   "verified": false,
   "documented": true,
   "notes": "Points -> 9",
   "t": "34:34",
   "capability": "Docs claim: Update/edit a record's field values",
   "task": "update_records_for_table",
   "route": "mcp",
   "evidence": "Points -> 9"
  },
  {
   "kind": "claim",
   "cap": "cap-05",
   "surface": "mcp",
   "claim": "list_records_for_table",
   "doc_url": "https://airtable.com/developers/agents/mcp/tools.md",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "lists it",
   "t": "34:34",
   "capability": "Docs claim: List/query/filter/sort records",
   "task": "list_records_for_table",
   "route": "mcp",
   "evidence": "lists it"
  },
  {
   "kind": "claim",
   "cap": "cap-04",
   "surface": "mcp",
   "claim": "delete_records_for_table",
   "doc_url": "https://airtable.com/developers/agents/mcp/tools.md",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "API list: gone",
   "t": "34:34",
   "capability": "Docs claim: Delete a record",
   "task": "delete_records_for_table",
   "route": "mcp",
   "evidence": "API list: gone"
  },
  {
   "kind": "claim",
   "cap": "cap-01",
   "surface": "mcp",
   "claim": "create_base",
   "doc_url": "https://airtable.com/developers/agents/mcp/tools.md",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "MCP create_base -> appDNG16OE4OgPYGx; list_bases shows it",
   "t": "34:34",
   "capability": "Docs claim: Create a base with tables and fields",
   "task": "create_base",
   "route": "mcp",
   "evidence": "MCP create_base -> appDNG16OE4OgPYGx; list_bases shows it"
  },
  {
   "cap": "cap-20",
   "way": "email_password",
   "capability": "Receive data via incoming webhook trigger",
   "task": "Receive data via an incoming webhook trigger",
   "route": "mcp",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "MCP create_automation with genericWebhookReceived trigger -> wfltqkkphUCSa5yJI; get_automation gives webhookUrl (hooks.airtable.com/workflows/v1/genericWebhook/...); our POST {\"title\":...} -> {\"success\":true}; test_automation_webhook_trigger -> status captured, schema body.title string. Running the nodes needs the automation turned on (UI only), not done for this one.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/agents/mcp/tools.md"
   },
   "t": "36:12"
  },
  {
   "cap": "cap-19",
   "way": "email_password",
   "capability": "Sync external data sources into a table (Airtable Sync)",
   "task": "Sync external data into a table",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Map plan: paid. Sync source setup is UI-only (no API/MCP tool); pricing page lists cross-base/external sync under paid plans (feature flags crossBaseSyncPricingPage, externalTableSync*). Our workspace is on FREE PLAN. Not attempted.",
   "quality": {},
   "t": "36:47"
  },
  {
   "cap": "cap-22",
   "way": "email_password",
   "capability": "Run custom JavaScript via 'Run a script' automation action",
   "task": "Add a Run a script action",
   "route": "mcp",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "MCP create_automation with a customScript action node -> isError \"{\\\"upstreamCode\\\":\\\"INVALID_PERMISSIONS\\\",\\\"message\\\":\\\"You are not permitted to perform this operation\\\"}\" on our free-plan workspace; map: \"action unavailable on Free plan\".",
   "quality": {},
   "t": "36:47"
  },
  {
   "cap": "cap-23",
   "way": "email_password",
   "capability": "Connect third-party app actions/triggers (Slack, Gmail, Jira, Salesforce, Twilio, etc.)",
   "task": "Connect a third-party action",
   "route": "mcp",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "MCP list_external_accounts -> [] (no Slack/Gmail/Jira connected). Connecting one needs our own account at that third party, which this drive does not have; the MCP instructions document sendToSlack, gmailSendEmail, microsoftOutlookSendEmail actions with fetch_automation_input_data.",
   "quality": {},
   "t": "36:47"
  },
  {
   "cap": "cap-24",
   "way": "email_password",
   "capability": "Package and share a reusable app across the org via App Library",
   "task": "Publish an app to App Library",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "App Library is an Enterprise/org feature (map plan: paid); no API or MCP tool; our workspace is on the Free plan. Not attempted.",
   "quality": {},
   "t": "36:47"
  },
  {
   "cap": "cap-15",
   "way": "email_password",
   "capability": "Invite and manage collaborators with roles (owner/creator/editor/commenter/read-only)",
   "task": "Invite a collaborator in the UI",
   "route": "browser",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "UI invite would send an invite email; API route is Enterprise-only (see the paid-only line). Not done in the UI for time.",
   "quality": {},
   "t": "36:48"
  },
  {
   "cap": "cap-26",
   "way": "email_password",
   "capability": "Choose which AI model (OpenAI, Anthropic, Gemini, Llama) powers AI features",
   "task": "Check AI model choice in docs",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Docs check: web/llms.txt and agents docs have no page on choosing the AI model; map plan paid (admin panel, Enterprise). Not callable.",
   "quality": {},
   "t": "36:48"
  },
  {
   "cap": "cap-27",
   "way": "email_password",
   "capability": "Admin-level governance: enable/disable AI per workspace, RBAC, audit logs",
   "task": "Check governance/audit logs in docs",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Docs: Audit log API documented (web/api/audit-logs-overview.md: \"Monitor audit log events in your organization\"); Enterprise admin feature. Not callable on our plan.",
   "quality": {},
   "t": "36:48"
  },
  {
   "cap": "cap-28",
   "way": "email_password",
   "capability": "Programmatic user provisioning/de-provisioning and IDP-synced groups",
   "task": "Check SCIM provisioning",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Docs: SCIM 2.0 documented (web/api/scim-overview.md, create-scim-user, create-scim-group). GET https://airtable.com/scim/v2/Users with our PAT -> 403 {'schemas': ['urn:ietf:params:scim:api:messages:2.0:Error'], 'detail': 'authed user is unclaimed but administrating mult",
   "quality": {},
   "t": "36:48"
  },
  {
   "cap": "cap-29",
   "way": "email_password",
   "capability": "Apply Enterprise Key Management (EKM) and data residency controls",
   "task": "Check EKM/data residency in docs",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Docs: no EKM or data residency page in web/llms.txt; Enterprise security feature (map plan paid).",
   "quality": {},
   "t": "36:48"
  },
  {
   "cap": "cap-30",
   "way": "email_password",
   "capability": "Upgrade/downgrade workspace between Free, Team, Business, Enterprise Scale plans",
   "task": "Check plan upgrade path",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Docs/UI: pricing page \"Team plan is available for $20/user/month when billed annually\", Business $45/user/month annually, payments \"via credit card for Team workspaces\"; app shows Upgrade / Compare plans. No billing API. Checkout walk logged under pay.",
   "quality": {},
   "t": "36:48"
  },
  {
   "cap": "pay",
   "step": "probe",
   "capability": "Pay probes",
   "task": "402/x402/MPP, registries, well-known, docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pay_probe.json: no 402 challenge on site, API or x402./mpp. subdomains; not in mpp.dev, Stripe Projects or x402 Bazaar; /.well-known/ucp 404; no docs mentions of x402/MPP; MCP has no payment tools (tools/list: 46 tools, none billing). pay_tx.json: refused, no 402 on the product's endpoint. Pricing: Team $20/user/month annually, payments by credit card; no billing API in docs. New account got a 14-day Team trial without a card (\"Upgrade to the Team plan before your trial expires in 14 days\").",
   "t": "36:54"
  },
  {
   "cap": "pay",
   "step": "checkout",
   "capability": "Checkout walk",
   "task": "Workspace UPGRADE > Choose Team (monthly) > checkout",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Plans page /{wsp}/workspace/plans: Team $24/seat/month billed monthly ($20 annually). Checkout /{wsp}/workspace/checkout/plnVy1fpEER1b9fqH on airtable.com with Stripe Elements card iframe (js.stripe.com), promo code, optional VAT business name/tax ID; summary $24 + est. tax $4.56 = $28.56 per month; last button \"Pay and subscribe\". hCaptcha and 3-D Secure strings present in the page (nothing visible). No phone field. Stopped before entering a card: we have none.",
   "t": "38:42"
  },
  {
   "cap": "signup",
   "way": "oauth_consent",
   "step": "credentials",
   "capability": "MCP OAuth sign-in",
   "task": "DCR register + browser consent + PKCE token exchange, then MCP call",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /oauth2/v1/register (DCR, headless) -> client_id; /oauth2/v1/authorize in browser shows consent \"[redacted]s drive is requesting Airtable access\" with Everything / Custom access; Grant access -> redirect with code; POST /oauth2/v1/token (PKCE S256, resource=https://mcp.airtable.com) -> Bearer, expires_in 3600, refresh token; MCP tools/call list_bases with it -> our 4 bases. AS also advertises CIMD (client_id_metadata_document_supported: true); we used DCR because we host no client metadata document.",
   "notes": "scopes asked: read-only (data.records:read schema.bases:read workspacesAndBases:read)",
   "t": "39:32"
  },
  {
   "cap": "signup",
   "way": "keyless",
   "result": "skipped",
   "not_tried": "no_kit",
   "capability": "Way in",
   "task": "No key needed",
   "route": "none",
   "documented": false,
   "verified": false,
   "evidence": "No documented no-account route: every API/MCP call needs a PAT or OAuth token (MCP 401 without Authorization).",
   "t": "39:32"
  },
  {
   "cap": "signup",
   "way": "api_signup",
   "result": "skipped",
   "not_tried": "no_kit",
   "capability": "Way in",
   "task": "Sign-up by API",
   "route": "none",
   "documented": false,
   "verified": false,
   "evidence": "Not offered: no sign-up API in the docs; /auth.md is disallowed by robots.txt (/auth) and the AS metadata has no agent_auth block.",
   "t": "39:32"
  },
  {
   "cap": "signup",
   "way": "sso_github",
   "result": "skipped",
   "not_tried": "no_kit",
   "capability": "Way in",
   "task": "Continue with GitHub",
   "route": "none",
   "documented": false,
   "verified": false,
   "evidence": "Not offered: the sign-up page offers Single Sign On, Google, Apple and ChatGPT, no GitHub.",
   "t": "39:33"
  },
  {
   "cap": "signup",
   "way": "sso_google",
   "result": "skipped",
   "not_tried": "no_kit",
   "capability": "Way in",
   "task": "Continue with Google",
   "route": "none",
   "documented": false,
   "verified": false,
   "evidence": "Offered (\"Continue with Google\") but we holds no Google account for this drive (drive sso: github only).",
   "t": "39:33"
  },
  {
   "cap": "signup",
   "way": "magic_link",
   "result": "skipped",
   "not_tried": "same_as",
   "capability": "Way in",
   "task": "Email link",
   "route": "none",
   "documented": false,
   "verified": false,
   "evidence": "The email route asks for a password after the email (email_password); no code or link sign-in seen.",
   "t": "39:33"
  },
  {
   "cap": "signup",
   "way": "other",
   "result": "skipped",
   "not_tried": "no_kit",
   "capability": "Way in",
   "task": "Continue with Apple / ChatGPT / Single Sign On",
   "route": "none",
   "documented": false,
   "verified": false,
   "evidence": "Offered on /signup; our agent has no Apple, ChatGPT or company SSO account.",
   "t": "39:33"
  },
  {
   "cap": "credentials",
   "way": "email_password",
   "key": "create",
   "capability": "Scoped key headless",
   "task": "Create a PAT or OAuth app through a documented API/CLI",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Docs (personal-access-tokens guide, mcp/cli.md, mcp/other.md) send you to /create/tokens/new and /create/oauth in the web UI; the CLI (@airtable/mcp-cli) takes a PAT you made there. No API creates a PAT. Closest headless route: OAuth DCR (POST /oauth2/v1/register, headless) but the consent step is a browser page.",
   "t": "39:33"
  },
  {
   "cap": "cap-08",
   "way": "email_password",
   "capability": "Ask Omni questions about base data for analysis/insights",
   "task": "Ask Omni a count (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "New Omni chat \"how many records in Tasks v2\" -> 8; API list: 8 records",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/app-building"
   },
   "trial": 2,
   "t": "42:25"
  },
  {
   "cap": "cap-08",
   "way": "email_password",
   "capability": "Ask Omni questions about base data for analysis/insights",
   "task": "Ask Omni a sum (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "New Omni chat \"sum of Points across Tasks v2\" -> 24; API sum: 24",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/app-building"
   },
   "trial": 3,
   "t": "42:25"
  },
  {
   "cap": "cap-09",
   "way": "email_password",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "Create, read back, delete a view (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Browser: Create new... > Gallery -> viwU8cp2FsUfZr6iq; MCP list_views_for_table lists it as gallery; deleted in UI, gone from list: True",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-base-schema"
   },
   "trial": 2,
   "step": "create",
   "t": "43:00"
  },
  {
   "cap": "cap-09",
   "way": "email_password",
   "capability": "Create and configure views (grid, kanban, calendar, gallery, etc.)",
   "task": "Create, read back, delete a view (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Browser: Create new... > Calendar -> viwEWrHI3ahpg4vCK; MCP list_views_for_table lists it as calendar; deleted in UI, gone from list: True",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://airtable.com/developers/web/api/get-base-schema"
   },
   "trial": 3,
   "step": "create",
   "t": "43:34"
  },
  {
   "cap": "cap-07",
   "way": "email_password",
   "capability": "Run a Field Agent across records to analyze, generate, or research at scale",
   "task": "Run the field agent on a new record (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "API create book \"Dracula\" recjAxe0fhlD26ILT; browser Genre > Run field agent; API GET -> Genre {'state': 'generated', 'value': 'Horror', 'isStale': False}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/ai-agents"
   },
   "trial": 2,
   "t": "44:51"
  },
  {
   "cap": "cap-07",
   "way": "email_password",
   "capability": "Run a Field Agent across records to analyze, generate, or research at scale",
   "task": "Run the field agent on a new record (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "API create book \"Dune\" recdXsnQJ7MTC1KN9; browser Genre > Run field agent; API GET -> Genre {'state': 'generated', 'value': 'Science-fiction', 'isStale': False}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/ai-agents"
   },
   "trial": 3,
   "t": "45:48"
  },
  {
   "cap": "cap-06",
   "way": "email_password",
   "capability": "Build a full app (tables, interfaces, automations) from a plain-language prompt with Omni",
   "task": "Build an app from a prompt with Omni (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Omni prompt in base appAn2GCbAMe1jmmL; API GET tables -> ['Tasks t2', 'Equipment', 'Checkouts']",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/app-building"
   },
   "trial": 2,
   "t": "47:51"
  },
  {
   "cap": "cap-06",
   "way": "email_password",
   "capability": "Build a full app (tables, interfaces, automations) from a plain-language prompt with Omni",
   "task": "Build an app from a prompt with Omni (repeat)",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Omni prompt in base apprn2RTDuLD9qBxa; API GET tables -> ['Tasks t3', 'Meetings', 'Action items']",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://www.airtable.com/platform/app-building"
   },
   "trial": 3,
   "t": "49:45"
  },
  {
   "cap": "cancel",
   "capability": "Cancel",
   "task": "Cancel plan",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Nothing to cancel: the drive started no paid plan; the account came with a 14-day Team trial that needed no card, and our workspace shows FREE PLAN. Checkout terms say \"Cancel anytime in Workspace Settings to avoid further charges\" (web UI); no billing API in the docs.",
   "notes": "n/a",
   "t": "49:56"
  },
  {
   "cap": "credentials",
   "way": "email_password",
   "key": "use",
   "capability": "Use key",
   "task": "Use the PAT",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PAT used for all REST and MCP calls this drive (whoami 200, bases, records, webhooks).",
   "t": "50:41"
  },
  {
   "cap": "credentials",
   "way": "email_password",
   "key": "revoke",
   "capability": "Revoke key",
   "task": "Delete all 4 PATs",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Builder Hub > Personal access tokens > overflow > Delete token x4 (web only; no API to revoke a PAT). GET /v0/meta/whoami with the PAT afterwards -> 401 {\"error\":{\"type\":\"UNAUTHORIZED\",\"message\":\"Invalid authentication token\"}}.",
   "t": "50:41"
  },
  {
   "cap": "cap-01",
   "way": "email_password",
   "capability": "Create a base with tables and fields",
   "task": "Delete the base",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Docs delete-base.md: DELETE /v0/meta/bases/{id} needs scope workspacesAndBases:manage and \"User role: Enterprise admin\". No MCP delete_base tool. Bases were removed with the account delete.",
   "quality": {},
   "step": "delete",
   "t": "51:42"
  },
  {
   "cap": "delete",
   "way": "email_password",
   "capability": "Delete account",
   "task": "Delete the account in the browser",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "/account > \"Delete your Airtable user account\" -> re-sign-in (email + password) -> /account/confirmDeleteAccount -> \"Yes, confirm deletion of my account\" -> native confirm \"Please read the notice above carefully...\" -> OK -> POST /account/deleteAccount, redirect to www.airtable.com. Afterwards: OAuth token GET /v0/meta/whoami 401, MCP 401, login with the email lands on sign-up \"Create your profile\". No API to delete an account. Our first clicks did nothing because our agent's browser dismissed the native confirm dialog by default.",
   "left": "deleted",
   "quality": {
    "error_legibility": "silent"
   },
   "t": "56:02"
  },
  {
   "cap": "delete",
   "way": "oauth_consent",
   "capability": "Revoke OAuth grant",
   "task": "Revoke the MCP OAuth grant",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Integrations pane listed \"[redacted]s drive, Connected 13 minutes ago\"; our click on it did not open its settings; the grant went with the account delete: OAuth access token -> 401 on API and MCP afterwards.",
   "t": "56:02"
  }
 ],
 "stale": false,
 "icon": "/logos/airtable.png",
 "monitored": false,
 "verdict": "Gets in on its own today, L4 · Runs on its own. Sign-up blocks headless requests, but our agent reached the browser form with no visible challenge and confirmed its email there. Personal access tokens, the first workspace and turning on automations all still need that browser UI. Once past those steps, the API and the official MCP server ran almost all of Airtable's core work: bases, records, schema, webhooks, automations, interfaces and forms. Upgrading opens a Stripe card form inside the app; our agent found no agent payment rail and stopped before paying. It started no plan, so there was nothing to cancel, and it deleted its account through account settings.",
 "page": "https://agentdrives.com/tools/airtable?via=api"
}