Firebase Firestore
Real-time document database.
Overall score
61.8/100
firebase-firestore-rest-v1
Measured Oct 5, 2026
Status
Ranked
Complete benchmark. `overall` is a weighted average of the applicable criteria, comparable to other surfaces in the same category and the same rubric version.
Coverage
86% of the rubric
Surfaces
evaluated.
We score a surface, not a product. One product often exposes several, and they are not worth the same.
firebase-firestore-rest-v1restprimary
86% coverage
61.8/100
Criterion
by criterion.
Measured on firebase-firestore-rest-v1, rubric v0.2.0. A criterion with no score is not counted as zero: it is excluded and the weights are renormalised.
Offload Valuejudged · weight 15 · Oct 5, 2026
35/100
The documented surface is a REST wrapper over document storage: authenticate with a token, then perform CRUD on documents and manage indexes. Nothing here computes, transforms, or enriches data on the agent's behalf; the agent must formulate every document, query and index itself. There is mild non-CRUD value (server-enforced Security Rules/IAM, transactional conflict semantics via ABORTED, index management), but no proprietary data, no heavy computation, no external side effect beyond persisting what it is sent.
- https://firebase.google.com/docs/firestore/use-rest-api
v1.projects.databases.documents Perform CRUD operations on documents, similar to those outlined in the add data or get data guides.
- https://firebase.google.com/docs/firestore/use-rest-api
v1.projects.databases.documents Perform CRUD operations on documents, similar to those outlined in the add data or get data guides.
- https://firebase.google.com/docs/firestore/use-rest-api
v1.projects.databases.documents Perform CRUD operations on documents, similar to those outlined in the add data or get data guides.
Interaction Costmeasured · weight 15 · Oct 5, 2026
100/100
Median over 2 successful run(s): 7185 tokens, 2 calls. Ratio to the best in "backend-database" (4 surfaces measured, v0.2 scale). Cold, without documentation: 1/1 succeeded.
Error Recoverabilityprobed · weight 15 · Oct 5, 2026
50/100
unknown_endpoint → HTTP 404, clarity 50/100 (field named: yes, allowed values: no, RFC 9457: no) · wrong_type → HTTP 400, clarity 50/100 (field named: no, allowed values: yes, RFC 9457: no) · hallucinated_enum → HTTP 200, clarity 25/100 (field named: no, allowed values: no, RFC 9457: no) · unknown_field → HTTP 400, clarity 75/100 (field named: yes, allowed values: yes, RFC 9457: no)
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe
HTTP 200: { "documents": [ { "name": "projects/agentscoretest/databases/(default)/documents/agentscore_probe/1uUFT2RrJQ7oxJlvk3e3", "fields": { "name": { "stringValue": "prob
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe/nonexistent_resource_xyz
HTTP 404: { "error": { "code": 404, "message": "Document \"projects/agentscoretest/databases/(default)/documents/agentscore_probe/nonexistent_resource_xyz\" not found.", "status": "NOT_FOUND" }
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe?pageSize=not_a_number
HTTP 400: { "error": { "code": 400, "message": "Invalid value at 'page_size' (TYPE_INT32), \"not_a_number\"", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleap
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe?orderBy=nonexistent_field
HTTP 200: {}
Doc Legibilitymeasured · weight 12 · Oct 5, 2026
31/100
text/markup ratio 7.8% (weight 30) · renders without JavaScript: yes (weight 25) · machine-readable spec: none found (weight 25) · llms.txt: absent (weight 10) · 1 runnable example(s) (weight 10). Weighted average over 100 points of available sub-criteria.
Auth Frictionmeasured · weight 10 · Oct 5, 2026
80/100
Key passed as a URL parameter: simple, but exposed in logs and referrers.
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe
HTTP 200: { "documents": [ { "name": "projects/agentscoretest/databases/(default)/documents/agentscore_probe/1uUFT2RrJQ7oxJlvk3e3", "fields": { "name": { "stringValue": "prob
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe/nonexistent_resource_xyz
HTTP 404: { "error": { "code": 404, "message": "Document \"projects/agentscoretest/databases/(default)/documents/agentscore_probe/nonexistent_resource_xyz\" not found.", "status": "NOT_FOUND" }
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe?pageSize=not_a_number
HTTP 400: { "error": { "code": 400, "message": "Invalid value at 'page_size' (TYPE_INT32), \"not_a_number\"", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleap
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe?orderBy=nonexistent_field
HTTP 200: {}
Safety & Reversibilityprobed · weight 10
—/100
If I retry after a timeout, do I charge the customer twice?
Payload Efficiencyprobed · weight 8 · Oct 5, 2026
33/100
No discoverable field selection (tested fields, select, _fields, expand, properties): the agent swallows the whole resource. (weight 35) · 263 bytes per returned object (6 object(s) in the control response). (weight 25) · No cursor pagination marker in the response. (weight 20) · One list envelope, standard. (weight 10) · No ETag. (Compression is not measurable: the runtime decompresses it and strips the header.) (weight 10). Weighted average over 100 points of measured sub-criteria.
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe
HTTP 200: { "documents": [ { "name": "projects/agentscoretest/databases/(default)/documents/agentscore_probe/1uUFT2RrJQ7oxJlvk3e3", "fields": { "name": { "stringValue": "prob
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe/nonexistent_resource_xyz
HTTP 404: { "error": { "code": 404, "message": "Document \"projects/agentscoretest/databases/(default)/documents/agentscore_probe/nonexistent_resource_xyz\" not found.", "status": "NOT_FOUND" }
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe?pageSize=not_a_number
HTTP 400: { "error": { "code": 400, "message": "Invalid value at 'page_size' (TYPE_INT32), \"not_a_number\"", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleap
- https://firestore.googleapis.com/v1/projects/agentscoretest/databases/(default)/documents/agentscore_probe?orderBy=nonexistent_field
HTTP 200: {}
Task Atomicitymeasured · weight 6 · Oct 5, 2026
100/100
Median over 2 successful run(s): 7185 tokens, 2 calls. Ratio to the best in "backend-database" (4 surfaces measured, v0.2 scale). Cold, without documentation: 1/1 succeeded.
Prior Knowledge Coveragemeasured · weight 5 · Oct 5, 2026
100/100
Median over 2 successful run(s): 7185 tokens, 2 calls. Ratio to the best in "backend-database" (4 surfaces measured, v0.2 scale). Cold, without documentation: 1/1 succeeded.
Async Compatibilityprobed · weight 2
—/100
If the operation is asynchronous, can I get the result without hosting a web server?
Tool-Native (MCP)binary · weight 2
—/100
Does the vendor publish an official, maintained MCP server?
Runs, verified
never on the agent’s word.
Every row is a real attempt at the category’s canonical task. Success is verified by reading the created resource back.
| Task | Tokens | Calls | Errors | Docs | Result |
|---|---|---|---|---|---|
| store-and-query-record | 7,131 | 2 | 0 | without | verified |
| store-and-query-record | 7,291 | 2 | 0 | with | verified |
| store-and-query-record | 7,079 | 2 | 0 | with | verified |
The same entry,
without the markup.
You publish this API and dispute a score? The methodology is public and every score above points to the evidence that produced it.