{
 "$schema": "https://agentdrives.com/schemas/tool.schema.json",
 "id": "prd_01m57vgtne6pbyq9kgyx54bqvy",
 "ids": {
  "org": "org_01m57vgtgvezvv25xj7fsh5975",
  "surfaces": {
   "web": "srf_01m5byfwvxh4w9d5nj472mah57",
   "api": "srf_01m5byfwvymbgbz0009wb9d6ew",
   "mcp": "srf_01m5byfwvyta8btq4bpx6g7qtv",
   "cli": "srf_01m5byfwvynq9ja3hp1rbnbj6w",
   "sdk": "srf_01m5byfwvy1n1xpdem7qqedh6e"
  },
  "slugs": [
   "firebase-google"
  ],
  "domain": "firebase.google.com"
 },
 "slug": "firebase-google",
 "name": "Firebase",
 "url": "https://firebase.google.com",
 "domain": "firebase.google.com",
 "category": "databases",
 "category_name": "Databases",
 "tested_at": "2026-10-20",
 "run": "20261020T052808Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261020T052808Z",
   "date": "2026-10-20",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 4,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip"
   },
   "stop": "signup"
  }
 ],
 "level": 3,
 "level_name": "Does the work",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "not_counted": null,
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in without an account (runs locally); can't sign up for one",
   "at": "signup",
   "how": "no-account",
   "way": "local"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "part",
   "text": "Work done: 70% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Not tried yet: our agent worked without an account, so it had none to buy in",
   "value": "not_tried",
   "route": "portal",
   "why": "account"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, made nothing to delete",
   "how": "no-account",
   "left": "nothing_made",
   "delete": {
    "state": "na",
    "text": "Made nothing to delete",
    "why": "No Google or Firebase account was made."
   }
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Learn",
   "state": "no",
   "text": "No docs it can act on",
   "have": [
    "llms_txt",
    "mcp"
   ],
   "docs": "unreachable"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in without an account (runs locally); can't sign up for one",
   "at": "signup",
   "how": "no-account",
   "way": "local",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "part",
   "text": "Work done: 70% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Not tried yet: our agent worked without an account, so it had none to buy in",
   "value": "not_tried",
   "route": "portal",
   "why": "account",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, made nothing to delete",
   "how": "no-account",
   "left": "nothing_made",
   "delete": {
    "state": "na",
    "text": "Made nothing to delete",
    "why": "No Google or Firebase account was made."
   },
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "local",
   "label": "Runs locally",
   "routes": [
    "local"
   ],
   "minutes": 6,
   "core": "7/10"
  }
 ],
 "minutes": 6,
 "next": {
  "to": 4,
  "text": "Next: let an agent sign up for an account on its own (without one it does 70% of the core work)"
 },
 "stop": "signup",
 "core": "7/10",
 "scores": {
  "coverage": 48,
  "reliability": 75,
  "resilience": 69,
  "setup": 75,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": 72,
  "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"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 89,
   "recovery": 50,
   "idempotency": 67
  },
  "summary": {
   "error_legibility": "mixed",
   "recovery": "good",
   "idempotency": "safe",
   "rate_limits": "none-seen",
   "notes": "On the emulators: 404/409/MISSING_PASSWORD/INVALID_ID_TOKEN name the problem, a bad query enum only says 'Payload isn't valid for request.', and a Storage metadata PATCH with an unknown field succeeds silently. Create with an id dedupes (409); hosted rate limits not observed."
  }
 },
 "stress": [
  {
   "capability": "Run a Firestore query with filters",
   "probe": "bad enum value in query op",
   "outcome": "400 {\"error\": {\"code\": 400, \"message\": \"Payload isn't valid for request.\", \"status\": \"INVALID_ARGUMENT\"}}",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create or update a Firestore document",
   "probe": "read a non-existent doc id in own namespace",
   "outcome": "404 {\"error\": {\"code\": 404, \"message\": \"Document (projects/demo-agentdrives/databases/(default)/documents/notes/does-not-exist-xyz) not found.\", \"status\": \"NOT_FOUND\"}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create or update a Firestore document",
   "probe": "repeat a create with the same documentId",
   "outcome": "first 200; second 409 {\"error\": {\"code\": 409, \"message\": \"entity already exists: EntityRef[partitionRef=dev~demo-agentdrives, path=/notes/idem-1]\", \"status\": \"ALREADY_EXISTS\"}}",
   "grade": "clear",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "Create or update a Firestore document",
   "probe": "repeat a create without an id",
   "outcome": "200 hQIRIZayPeS5MXYnFs0C; 200 5JmGw3JVwTUZEfPv1XoI (two docs)",
   "grade": "clear",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Authenticate end-user accounts with Auth providers",
   "probe": "sign-up missing password",
   "outcome": "400 {\"error\": {\"code\": 400, \"message\": \"MISSING_PASSWORD\", \"errors\": [{\"message\": \"MISSING_PASSWORD\", \"reason\": \"invalid\", \"domain\": \"global\"}]}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Authenticate end-user accounts with Auth providers",
   "probe": "bad credential (invalid idToken)",
   "outcome": "400 {\"error\": {\"code\": 400, \"message\": \"INVALID_ID_TOKEN\", \"errors\": [{\"message\": \"INVALID_ID_TOKEN\", \"reason\": \"invalid\", \"domain\": \"global\"}]}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create or update a Firestore document",
   "probe": "burst of 15 reads",
   "outcome": "statuses [200]",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Upload a file to Cloud Storage",
   "probe": "upload with an empty body",
   "outcome": "200 {\"name\": \"x\", \"bucket\": \"demo-agentdrives.appspot.com\", \"generation\": \"1792475475901\", \"metageneration\": \"1\", \"contentType\": \"text/plain\", \"timeCreated\": \"20 Oct 2026\", \"updated\": \"20",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": null,
 "coverage_core": 70,
 "coverage_own": 70,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 4,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "afceb4b82ffd",
  "kb_version": "3+overlay-fb2c175349",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 24,
 "rules_date": "2026-10-20",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 4,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip"
 },
 "same_level_drives": 2,
 "drives": 2,
 "same_stop_drives": 1,
 "works_assisted": null,
 "freshness": "fresh",
 "newer_drives": {
  "count": 1,
  "newest": "2026-10-24"
 },
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": {
  "rung": "signup",
  "vendor": "reCAPTCHA (script on Google sign-up)",
  "signed": true
 },
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-24"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs/llms.txt (7352 lines) and a .md.txt Markdown copy of every docs page read without a browser; Accept: text/markdown still returns HTML."
  },
  "signup": {
   "status": "n/a",
   "cause": "other",
   "note": "Not needed: a documented route works without an account.",
   "way": "local",
   "no_account": true,
   "note_driver": "Firebase accounts are Google Accounts. Google's sign-up (accounts.google.com/lifecycle/steps/signup) asks for a birthday and gender right after the name; our agent has neither, so no account was made. reCAPTCHA loaded but showed nothing.",
   "status_driver": "blocked"
  },
  "verify": {
   "status": "n/a",
   "note": "Not needed: a documented route works without an account.",
   "no_account": true,
   "note_driver": "Not reached: no account was made.",
   "status_driver": "blocked"
  },
  "credentials": {
   "status": "n/a",
   "cause": "other",
   "note": "Not needed: a documented route works without an account.",
   "no_account": true,
   "note_driver": "firebase login, login:ci, login --no-localhost and the MCP firebase_login tool all need a Google sign-in; no project, so no web API key either.",
   "status_driver": "blocked"
  },
  "first_call": {
   "status": "headless",
   "route": "no_account",
   "note": "Documented no-account route: the Emulator Suite with a demo- project (firebase-tools 15.34.0). Firestore REST PATCH/GET on the local emulator returned 200. Hosted calls need an account."
  },
  "first_action": {
   "status": "headless",
   "note": "Created and read back a Firestore document, an Auth user and a Storage file on the local emulators."
  },
  "pay": {
   "status": "",
   "grade": "P2",
   "rails": [
    "card (Google Cloud Billing account)"
   ],
   "rail_ids": [
    "card"
   ],
   "first_party": true,
   "rail_scope": "none",
   "trial_path": "free tier",
   "route": "portal",
   "checkout": {
    "reached": "no",
    "processor": "own",
    "captcha": "none",
    "three_ds": "not_seen",
    "card_form": true,
    "phone_field": "none",
    "wallets": [],
    "rail_offer": "none",
    "price": "",
    "currency": "USD",
    "period": "usage",
    "plan": "Blaze",
    "last_button": ""
   },
   "person": "none",
   "ours": "account",
   "note": "Spark is free with 'No payment information needed'. Blaze (pay as you go) means linking a Cloud Billing account, and 'Cloud Billing accounts require a payment method' (most major credit cards), set up in the console. No x402/MPP/Stripe Projects. Not walked: no account; the door_probe saw the Blaze flow run through console.cloud.google.com/freetrial, which robots.txt disallows for all user agents. We paid nothing (no wallet, no 402 offered); based on the docs, not an observed checkout."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "Nothing to cancel: the drive started no plan. The docs say Blaze is downgraded in the console or by unlinking or closing the Cloud Billing account, and link budget notifications 'to programmatically disable Cloud Billing on a project'.",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "n/a",
   "left": "nothing_made",
   "after_hours": null,
   "note": "No Google or Firebase account was made. Everything was local to the emulators: documents, users and files were deleted through the API (404 after), and the rest was discarded when the emulators stopped.",
   "account": false
  }
 },
 "routes": [
  {
   "route": "local",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": true,
   "minutes": 6,
   "browser": false
  },
  {
   "route": "email_password",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "walled",
   "wall": {
    "type": "idp",
    "owner": "product"
   },
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 2,
   "browser": null
  },
  {
   "route": "sso_google",
   "offered": "seen",
   "tried": false,
   "not_tried": "policy",
   "result": null,
   "wall": null,
   "person": "once",
   "brings": "google_account",
   "fresh": true,
   "minutes": null,
   "browser": null
  },
  {
   "route": "device_login",
   "offered": "documented",
   "tried": false,
   "not_tried": "no_kit",
   "result": null,
   "wall": null,
   "person": "none",
   "brings": "google_account",
   "fresh": true,
   "minutes": null,
   "browser": null
  }
 ],
 "checkout": {
  "reached": "no",
  "rail_offer": "none",
  "period": "usage",
  "plan": "Blaze"
 },
 "docs": {
  "at": "2026-10-20",
  "read": 0,
  "listed": 56,
  "sampled": false,
  "overall": "unreachable",
  "getting_started": "missing",
  "auth": "missing",
  "errors": "missing",
  "examples": "none",
  "freshness": "unknown",
  "newest": null,
  "core_pages": "0 of 10",
  "capabilities": "none"
 },
 "claims": {
  "claimed": 9,
  "tried": 7,
  "held": 6,
  "broken": 1,
  "unclear": 0,
  "not_tried": 2,
  "undocumented_works": 0
 },
 "pay_options": {
  "checked": "2026-10-20",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": null
  },
  "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,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": false,
  "sandbox": true
 },
 "surface_notes": {
  "api": "Google REST APIs (Firestore v1, Identity Toolkit v1, Storage v0), mirrored by the local emulators",
  "mcp": "official, local stdio, in firebase-tools; 25 Nov 2025",
  "cli": "firebase-tools 15.34.0; no firestore:write command",
  "sandbox": "Emulator Suite with demo- projects, no account"
 },
 "can_do": [
  "Run Firestore, Auth, Storage, Realtime Database, Functions, Hosting and SQL Connect locally with no account (Emulator Suite, demo- project)",
  "Write, read, update, query and delete Firestore documents through the REST API on the emulator",
  "Get realtime Firestore snapshots from the JS SDK listener after a write from another client",
  "Create, update, sign in and delete Auth users through the Identity Toolkit REST API on the emulator",
  "Upload, list, change metadata on, download and delete Storage files on the emulator",
  "Run an HTTPS function and a Firestore trigger on the Functions emulator",
  "Enforce Firestore security rules locally (a denied write returns 403 PERMISSION_DENIED)",
  "Sync offline Realtime Database writes on reconnect"
 ],
 "cannot_do": [
  {
   "what": "Create a Firebase (Google) account",
   "why": "Google's sign-up asks a person's birthday and gender; an agent has none"
  },
  {
   "what": "Deploy functions or Hosting, or use any hosted project feature",
   "why": "every hosted route (console, CLI, MCP) needs a Google sign-in"
  },
  {
   "what": "Use the MCP server's Firestore tools against the emulator",
   "why": "they still demand firebase login"
  },
  {
   "what": "Buy Blaze",
   "why": "needs an account and a Cloud Billing account with a card; no agent rail"
  }
 ],
 "blockers": [
  "Google Account sign-up asks birthday and gender"
 ],
 "tips_for_agents": [
  "With no account, use the Emulator Suite: firebase emulators:start --project demo-<name>; Firestore and Database need Java 21.",
  "Call the emulators by REST: Firestore at 127.0.0.1:8080/v1/projects/<p>/databases/(default)/documents, Auth at 127.0.0.1:9099/identitytoolkit.googleapis.com/v1 (Authorization: Bearer owner for admin calls), Storage at 127.0.0.1:9199/v0/b/<bucket>/o.",
  "Storage metadata PATCH takes 'metadata', not the SDK's 'customMetadata', which is silently ignored.",
  "The MCP server's project tools need firebase login even with use_emulator; use REST against emulators instead.",
  "Firestore POST with ?documentId= is safe to retry (409 ALREADY_EXISTS); POST without an id makes duplicates."
 ],
 "selfhost": null,
 "summary": "An agent cannot get into hosted Firebase on its own: accounts are Google Accounts, and Google's sign-up asks for a person's birthday and gender, so the console, CLI deploy and the MCP server's project tools stay closed. With no account, the documented Emulator Suite ran Firestore, Auth, Storage, Functions, Hosting, Database and SQL Connect locally, and 7 of 10 core tasks worked end to end three times out of three over REST and the SDK. Paying (Blaze) needs a Cloud Billing account with a card and offers no agent rail.",
 "wall": "Google sign-up asks birthday and gender",
 "plan_scope": "local Emulator Suite (demo project); the hosted free Spark plan was out of reach without an account",
 "robots_stop": null,
 "robots": null,
 "terms": null,
 "plain": {
  "summary": "Firebase is a backend platform for apps (database, login, file storage, hosting). An agent can run everything locally for free with no account using Firebase's own offline testing tool, but it cannot create a real, live project because Google's account sign-up asks for a birthday and gender that an agent does not have.",
  "can_do": [
   "Run a local practice version of the database, login system, file storage, functions and web hosting with no account at all",
   "Create, read, change, search and delete database records and files, and create and sign in app users, in that local practice version",
   "See live updates appear automatically when data changes",
   "Have offline changes sync back once reconnected",
   "Deny an action that breaks the security rules"
  ],
  "cannot_do": [
   {
    "what": "Create a real Firebase account",
    "why": "Google's sign-up asks for a birthday and gender, which an agent cannot give"
   },
   {
    "what": "Put a website or app live on the internet, or use any real (non-local) feature",
    "why": "every real feature needs that Google sign-in first"
   },
   {
    "what": "Pay for the paid tier",
    "why": "it needs a billing account with a credit card, set up by a person in the console"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "capability": "Create or update a Firestore document",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v1/{document.name}",
    "mcp": null,
    "cli": "firebase firestore:write (console)",
    "ui": "Firebase console > Firestore Database"
   },
   "check": "GET the document path, value reflects the write",
   "capability_id": "cap_m34x9t4v",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/firestore",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-02",
   "capability": "Run a Firestore query with filters",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/{parent}:runQuery",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Firestore Database"
   },
   "check": "Query response returns only documents matching the filter",
   "capability_id": "cap_bsb5z2vr",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/firestore",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-03",
   "capability": "Delete a Firestore document",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /v1/{document.name}",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Firestore Database"
   },
   "check": "Subsequent GET on the document path returns not-found",
   "capability_id": "cap_z5zsc472",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/firestore",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-04",
   "capability": "Subscribe to realtime data changes",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firestore/Realtime Database client SDK listener"
   },
   "check": "A listener callback fires with the new snapshot after a write elsewhere",
   "capability_id": "cap_x20zx7f9",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/firestore; https://firebase.google.com/docs/database",
   "result": "done",
   "via": "sdk"
  },
  {
   "id": "cap-05",
   "capability": "Authenticate end-user accounts with Auth providers",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST identitytoolkit.googleapis.com/v1/accounts:signUp",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Authentication > Sign-in method"
   },
   "check": "A new account appears under Authentication > Users with the chosen provider",
   "capability_id": "cap_hmk55v09",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/auth",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-06",
   "capability": "Configure sign-in providers for an app",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Authentication > Sign-in method"
   },
   "check": "Enabled provider (e.g. Google, email/password) shows as Enabled in the console",
   "capability_id": "cap_ss1c05tf",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/auth",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-07",
   "capability": "Upload a file to Cloud Storage",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v0/b/{bucket}/o",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Storage"
   },
   "check": "File appears in the Storage bucket listing at the given path",
   "capability_id": "cap_facpbh70",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/storage",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-08",
   "capability": "Download a file from Cloud Storage",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v0/b/{bucket}/o/{object}?alt=media",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Storage"
   },
   "check": "Downloaded bytes match the uploaded file content",
   "capability_id": "cap_9xbtt20b",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/storage",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-09",
   "capability": "Deploy a serverless Cloud Function",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase deploy --only functions",
    "ui": "Firebase console > Functions"
   },
   "check": "Function appears in Firebase console > Functions with status Deployed",
   "capability_id": "cap_kdfqww03",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/functions",
   "result": "partial",
   "via": "cli"
  },
  {
   "id": "cap-10",
   "capability": "Deploy a static or dynamic web app",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase deploy",
    "ui": "Firebase console > Hosting / App Hosting"
   },
   "check": "The site's web.app or firebaseapp.com URL serves the deployed content",
   "capability_id": "cap_5q1cx94d",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/hosting; https://firebase.google.com/docs/app-hosting",
   "result": "partial",
   "via": "cli"
  },
  {
   "id": "cap-11",
   "capability": "Sync a local Realtime Database with the cloud while offline",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Realtime Database client SDK offline persistence"
   },
   "check": "Writes made offline reach the server once connectivity returns, and other clients see them",
   "capability_id": "cap_wc68bx3p",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/database",
   "result": "done",
   "via": "sdk"
  },
  {
   "id": "cap-12",
   "capability": "Store and sync relational data in a connected SQL database",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > SQL Connect"
   },
   "check": "A query against the connected Cloud SQL for PostgreSQL instance returns written rows",
   "capability_id": "cap_53z76bgf",
   "unmapped": null,
   "source": "https://firebase.google.com/products-build",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-13",
   "capability": "Set Firestore/Realtime Database/Storage security rules",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase deploy --only firestore:rules",
    "ui": "Firebase console > Rules tab"
   },
   "check": "A request violating the deployed rule is rejected with a permission-denied error",
   "capability_id": "cap_49bc6r5r",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/firestore; https://firebase.google.com/docs/database; https://firebase.google.com/docs/storage",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-14",
   "capability": "Invoke a Cloud Function over HTTPS or from a client call",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "HTTPS trigger URL",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "The HTTPS endpoint returns the function's response and increments its invocation count in logs",
   "capability_id": "cap_fzs8hh2f",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/functions",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-15",
   "capability": "Schedule a Cloud Function on a cron schedule",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase deploy --only functions",
    "ui": "Firebase console > Functions"
   },
   "check": "A Cloud Scheduler job tied to the function appears and fires at the configured time",
   "capability_id": "cap_3cw04j8g",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/functions",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-16",
   "capability": "Read Cloud Functions logs",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase functions:log",
    "ui": "Google Cloud console Logs Explorer"
   },
   "check": "Log entries for a recent function invocation are listed",
   "capability_id": "cap_dacsttk8",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/functions",
   "result": "partial",
   "via": "cli"
  },
  {
   "id": "cap-17",
   "capability": "Preview a Hosting deploy on a temporary URL",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase hosting:channel:deploy",
    "ui": "Firebase console > Hosting"
   },
   "check": "A preview-channel URL serves the new content before production is updated",
   "capability_id": "cap_q868e59w",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/hosting",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-18",
   "capability": "Roll back a Hosting deploy",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Hosting > release history"
   },
   "check": "Hosting release history shows the prior version active and live site matches it",
   "capability_id": "cap_4p5zh730",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/hosting",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-19",
   "capability": "Connect a custom domain to a Hosting site",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase hosting:sites",
    "ui": "Firebase console > Hosting > Add custom domain"
   },
   "check": "Domain status in console shows Connected and serves the site over SSL",
   "capability_id": "cap_dj4n5a69",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/hosting",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-20",
   "capability": "Send a push notification via Cloud Messaging",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/projects/{project}/messages:send",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Messaging > Notifications composer"
   },
   "check": "Target client app receives the message payload",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/docs/cloud-messaging",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-21",
   "capability": "Change app behavior remotely with Remote Config parameters",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/projects/{project}/remoteConfig",
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Remote Config"
   },
   "check": "Client fetch+activate returns the updated parameter value without an app update",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/docs/remote-config",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-22",
   "capability": "Run an A/B test on app variants",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > A/B Testing"
   },
   "check": "Experiment status shows Running with defined variants and a target metric",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/docs/remote-config",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-23",
   "capability": "Track app crashes and errors with Crashlytics",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Crashlytics"
   },
   "check": "A triggered test crash appears in the Crashlytics dashboard as a new issue",
   "capability_id": "cap_wjd5ghth",
   "unmapped": null,
   "source": "https://firebase.google.com/products-build",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-24",
   "capability": "Distribute pre-release app builds to testers",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase appdistribution:distribute",
    "ui": "Firebase console > App Distribution"
   },
   "check": "Uploaded build appears as a release testers can download",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/products-build",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-25",
   "capability": "Protect backend resources from abuse with App Check",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > App Check"
   },
   "check": "Requests without a valid App Check token are rejected once enforcement is on",
   "capability_id": "cap_zyxvz8gv",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/app-check",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-26",
   "capability": "Install a pre-built Extension",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase ext:install",
    "ui": "Firebase console > Extensions"
   },
   "check": "Installed extension is listed with status Active under Extensions",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/products-build",
   "result": "blocked",
   "via": "cli"
  },
  {
   "id": "cap-27",
   "capability": "Call the Gemini API directly from a client app",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase AI Logic SDK"
   },
   "check": "A Gemini API call issued from the client SDK returns a model response",
   "capability_id": "cap_ttac6ph8",
   "unmapped": null,
   "source": "https://firebase.google.com/products/firebase-ai-logic",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-28",
   "capability": "Verify a phone number",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Phone Number Verification SDK"
   },
   "check": "A submitted OTP code for the number returns a verified result",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/products/phone-number-verification",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-29",
   "capability": "Run automated UI tests on virtual/physical devices",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "gcloud firebase test android run",
    "ui": "Firebase console > Test Lab"
   },
   "check": "Test Lab run results show pass/fail status per device matrix entry",
   "capability_id": "cap_h3tyzz5b",
   "unmapped": null,
   "source": "https://firebase.google.com/pricing",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-30",
   "capability": "Monitor app performance traces",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Performance Monitoring"
   },
   "check": "A completed trace from the instrumented app appears with duration metrics",
   "capability_id": "cap_njb0a49e",
   "unmapped": null,
   "source": "https://firebase.google.com/products-build",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-31",
   "capability": "View Google Analytics events for the app",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Analytics"
   },
   "check": "A logged client event shows up in the Analytics DebugView or dashboard",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://firebase.google.com/products/analytics",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-32",
   "capability": "Set environment variables and secrets for a backend",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "firebase functions:secrets:set",
    "ui": "Firebase console > Functions/App Hosting"
   },
   "check": "The deployed function/backend reads the set secret value at runtime",
   "capability_id": "cap_92xmegfv",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/functions; https://firebase.google.com/docs/app-hosting",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-33",
   "capability": "Export Firestore/Realtime Database data to BigQuery",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "gcloud firestore export",
    "ui": "Firebase console / Extensions (Stream to BigQuery)"
   },
   "check": "A BigQuery table reflects exported rows matching the database contents",
   "capability_id": "cap_vg87a3nt",
   "unmapped": null,
   "source": "https://firebase.google.com/pricing",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-34",
   "capability": "Stream database changes to a connected listener or function",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "A Firestore/Realtime Database trigger fires with the changed document payload on write",
   "capability_id": "cap_d7xy2ewe",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/functions",
   "result": "done",
   "via": "sdk"
  },
  {
   "id": "cap-35",
   "capability": "Invite a team member to a Firebase project",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Project settings > Users and permissions"
   },
   "check": "Invited user appears in the project's IAM member list with the assigned role",
   "capability_id": "cap_3w8sjh12",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/projects/iam/overview",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-36",
   "capability": "Set a member's role or permissions",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Project settings > Users and permissions"
   },
   "check": "Member's IAM role in the console matches the role assigned",
   "capability_id": "cap_bs3hvrpm",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/projects/iam/overview",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-37",
   "capability": "Enable multi-factor authentication and SAML/OIDC sign-in",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Authentication Settings (Identity Platform upgrade)"
   },
   "check": "SAML/OIDC provider appears Enabled and an MFA-enrolled user is prompted for a second factor",
   "capability_id": "cap_pz4pecfg",
   "unmapped": null,
   "source": "https://firebase.google.com/docs/auth",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-38",
   "capability": "Read the project's usage and billing quotas",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Firebase console > Usage and billing"
   },
   "check": "Usage dashboard shows current metered consumption against the plan's limits",
   "capability_id": "cap_n0zefvzh",
   "unmapped": null,
   "source": "https://firebase.google.com/pricing",
   "result": "blocked",
   "via": null
  }
 ],
 "stale": false,
 "unreachable_since": null,
 "not_driven_since": null,
 "icon": "/logos/firebase-google.png",
 "agent_kinds": {
  "browser": {
   "who": "An assistant in a browser",
   "passed": [],
   "stop": "signup",
   "why": "Google sign-up asks birthday and gender",
   "tone": "wall",
   "text": "Stops at sign-up: Google sign-up asks birthday and gender."
  },
  "direct": {
   "who": "An agent talking to it directly",
   "passed": [
    "first_call",
    "first_action"
   ],
   "stop": "work",
   "why": null,
   "tone": "warn",
   "text": "Without an account (runs locally) it makes its first API call and does 70% of the core work, then stops."
  }
 },
 "stop_evidence": {
  "at": "signup",
  "date": "2026-10-20",
  "line": "Not needed: a documented route works without an account."
 },
 "stop_shot": null,
 "attempts_count": 124,
 "detail": {
  "public": false,
  "in": [
   "report",
   "api"
  ],
  "since": "2026-10-17"
 },
 "what_it_does": "Firebase is a backend platform for apps, providing a database, authentication, file storage, hosting and serverless functions.",
 "rules_version": "rules-2026-10-20-24",
 "rules_url": "https://agentdrives.com/method/changelog#rules-2026-10-20-24",
 "category_median": {
  "holds_up": {
   "median": 72,
   "n": 7
  }
 },
 "verdict": "Gets in on its own: L3 · Does the work. It never reached hosted Firebase: a Google Account is required, and sign-up asks for a person's birthday and gender, so the console, CLI deploy and the MCP server's project tools stayed closed. Through the documented Emulator Suite, with no account needed, our agent ran Firestore, Auth, Storage, Functions, Hosting, Database and SQL Connect over REST and the SDK, work done end to end, repeatably. Paying means linking a Cloud Billing account with a card in the console, with no agent payment rail. Nothing was created to cancel or delete: emulator data was removed through the API, the rest discarded when the emulators stopped.",
 "changes": {
  "source": "store",
  "drives": [
   {
    "run": "20261020T052808Z",
    "date": "2026-10-20",
    "level": 3,
    "stop": "signup",
    "entry": "self-start",
    "driver": 4,
    "listed": true
   },
   {
    "run": "20261024T004506Z",
    "date": "2026-10-24",
    "level": 3,
    "stop": "signup",
    "entry": "self-start",
    "driver": 4,
    "listed": true
   }
  ],
  "events": [],
  "feed": "https://agentdrives.com/api/tools/firebase-google/changes.json"
 },
 "agreement": {
  "drives": 2,
  "agree": 2
 },
 "method_release": "2026-Q4.9",
 "rank": 5,
 "rank_of": 7,
 "rank_change": 0,
 "rank_since": "2026-10-24",
 "capability_matrix": [
  {
   "id": "cap-01",
   "name": "Create or update a Firestore document",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-02",
   "name": "Run a Firestore query with filters",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-03",
   "name": "Delete a Firestore document",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-04",
   "name": "Subscribe to realtime data changes",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-05",
   "name": "Authenticate end-user accounts with Auth providers",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-06",
   "name": "Configure sign-in providers for an app",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-07",
   "name": "Upload a file to Cloud Storage",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-08",
   "name": "Download a file from Cloud Storage",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-09",
   "name": "Deploy a serverless Cloud Function",
   "core": true,
   "result": "partial",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "partial",
    "ui": "untried"
   }
  },
  {
   "id": "cap-10",
   "name": "Deploy a static or dynamic web app",
   "core": true,
   "result": "partial",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "partial",
    "ui": "untried"
   }
  },
  {
   "id": "cap-11",
   "name": "Sync a local Realtime Database with the cloud while offline",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-12",
   "name": "Store and sync relational data in a connected SQL database",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-13",
   "name": "Set Firestore/Realtime Database/Storage security rules",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-14",
   "name": "Invoke a Cloud Function over HTTPS or from a client call",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "none"
   }
  },
  {
   "id": "cap-15",
   "name": "Schedule a Cloud Function on a cron schedule",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-16",
   "name": "Read Cloud Functions logs",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "partial",
    "ui": "untried"
   }
  },
  {
   "id": "cap-17",
   "name": "Preview a Hosting deploy on a temporary URL",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-18",
   "name": "Roll back a Hosting deploy",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-19",
   "name": "Connect a custom domain to a Hosting site",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-20",
   "name": "Send a push notification via Cloud Messaging",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "untried",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-21",
   "name": "Change app behavior remotely with Remote Config parameters",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "untried",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-22",
   "name": "Run an A/B test on app variants",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-23",
   "name": "Track app crashes and errors with Crashlytics",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-24",
   "name": "Distribute pre-release app builds to testers",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-25",
   "name": "Protect backend resources from abuse with App Check",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-26",
   "name": "Install a pre-built Extension",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "blocked",
    "ui": "untried"
   }
  },
  {
   "id": "cap-27",
   "name": "Call the Gemini API directly from a client app",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-28",
   "name": "Verify a phone number",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-29",
   "name": "Run automated UI tests on virtual/physical devices",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-30",
   "name": "Monitor app performance traces",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-31",
   "name": "View Google Analytics events for the app",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-32",
   "name": "Set environment variables and secrets for a backend",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-33",
   "name": "Export Firestore/Realtime Database data to BigQuery",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "untried",
    "ui": "untried"
   }
  },
  {
   "id": "cap-34",
   "name": "Stream database changes to a connected listener or function",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "none"
   }
  },
  {
   "id": "cap-35",
   "name": "Invite a team member to a Firebase project",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-36",
   "name": "Set a member's role or permissions",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-37",
   "name": "Enable multi-factor authentication and SAML/OIDC sign-in",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-38",
   "name": "Read the project's usage and billing quotas",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  }
 ],
 "category_place": {
  "category": "databases",
  "products": 11,
  "higher": 4,
  "same_level": 1,
  "as_of": "2026-10-22",
  "stop": null,
  "rivals_by": "level",
  "rivals": [
   "neon"
  ]
 },
 "page": "https://agentdrives.com/tools/firebase-google?via=api"
}