Google Firestore MCP server

Endpoint: https://firestore.googleapis.com/mcp · Authentication: Sign in with OAuth

Reads and writes Firestore databases and documents in a Google Cloud project. Requires Google Cloud credentials through OAuth.

How do I authenticate?

Add the endpoint in your client, start Connect or Sign in, approve the requested scopes, and return to the client. OAuth discovery finds the authorization server; client registration requirements vary by provider. Follow the provider guidance and client setup below.

Authentication and connection guide

Connection specification

Remote endpoint
https://firestore.googleapis.com/mcp
Browser access
Not yet measured
Declared MCP transport
Streamable HTTP
Live-validated MCP transport
Streamable HTTP — Observed by the latest catalog validation
Declared authentication
OAuth 2.1
Detected authentication
OAuth 2.1 detected or retained from publisher evidence
Protocol lifecycle
Stateful MCP · 2025-11-25
Authorization server
https://accounts.google.com/
Category
Databases

Product documentation · Official listing documentation

Provider guidance

  • Initialization and tool listing succeeded without credentials in the 2026-10-20 audit; tool calls require Google Cloud credentials. Google OAuth clients are pre-registered in a Google Cloud project; the server does not advertise Dynamic Client Registration. The server is in Preview and must be enabled per project.

More Databases MCP servers · Browse all MCP servers · Test this endpoint in the MCP Playground

Authorization setup

Registration requirements not verified

The OAuth authorization and app-registration requirements for this exact endpoint have not been verified. A compatible client will request authorization, but follow the publisher documentation and do not guess client credentials or callbacks.

Publisher evidence reviewed .

Publisher documentation

Connect it

Live-validated endpoint: https://firestore.googleapis.com/mcp · Streamable HTTP. Registration requirements not verified: The OAuth authorization and app-registration requirements for this exact endpoint have not been verified. A compatible client will request authorization, but follow the publisher documentation and do not guess client credentials or callbacks.

Agent prompt for Claude Code or Codex
Add the Google Firestore MCP server to my MCP client configuration and verify that it works.

What it is: Reads and writes Firestore databases and documents in a Google Cloud project. Requires Google Cloud credentials through OAuth.
Server URL: https://firestore.googleapis.com/mcp
Transport: Streamable HTTP (remote MCP server, no local install).
Authentication: OAuth 2.1. Registration requirements not verified: The OAuth authorization and app-registration requirements for this exact endpoint have not been verified. A compatible client will request authorization, but follow the publisher documentation and do not guess client credentials or callbacks.
Tools (23, as last observed by mcptest): add_document, create_backup_schedule, create_database, create_index, delete_backup, delete_backup_schedule, delete_database, delete_document, delete_index, get_backup, get_backup_schedule, get_database, get_document, get_index, list_backup_schedules, list_backups, list_collections, list_databases, list_documents, list_indexes, update_backup_schedule, update_database, update_document.
Reference: https://mcptest.io/servers/google-firestore/

Steps:
1. Work out which MCP client I use (Claude Code, Codex, Cursor, VS Code or another) and add the server under the name "google-firestore" in that client's MCP configuration, user scope unless I ask otherwise.
   Claude Code: claude mcp add --transport http --scope user 'google-firestore' 'https://firestore.googleapis.com/mcp'
   Other clients: use the setup for that client on the reference page.
2. Never write a credential value into a file that could be committed; reference an environment variable or the client's secret store, and ask me for any value you need.
3. Verify: connect to the server and call tools/list. Confirm the tools above are listed, and report any sign-in step I still have to complete.
MCP client

Claude Code setup

Run in a terminal. This user-scoped entry is available across projects.

claude mcp add --transport http --scope user 'google-firestore' 'https://firestore.googleapis.com/mcp'
  • After adding the server, open Claude Code, run /mcp, select the server, and follow the browser flow to authenticate.

Codex CLI setup

Run in a terminal; Codex stores the entry in ~/.codex/config.toml.

codex mcp add 'google-firestore' --url 'https://firestore.googleapis.com/mcp'
codex mcp login 'google-firestore'

Cursor setup

Add to .cursor/mcp.json for this project, or ~/.cursor/mcp.json for all projects.

{
  "mcpServers": {
    "google-firestore": {
      "url": "https://firestore.googleapis.com/mcp"
    }
  }
}

VS Code setup

Add to .vscode/mcp.json, or run “MCP: Open User Configuration” for a private user-level entry.

{
  "servers": {
    "google-firestore": {
      "type": "http",
      "url": "https://firestore.googleapis.com/mcp"
    }
  }
}

Claude setup

Add the endpoint above in Claude:

  • Customize > Connectors > Add custom connector
  • Team/Enterprise: Organization settings > Connectors > Add > Custom > Web

Claude Desktop setup

Add the endpoint above in Claude Desktop:

  • Remote: Customize > Connectors (same as claude.ai)
  • Local: Settings > Developer > Edit Config, or Settings > Extensions for .mcpb files
  • ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows), local servers only

ChatGPT setup

Add the endpoint above in ChatGPT:

  • ChatGPT web: Plugins > Add custom MCP server, then configure authentication and accept the risk warning

Windsurf setup

Add the endpoint above in Windsurf:

  • ~/.config/devin/mcp_config.json (%APPDATA%\devin\mcp_config.json on Windows), serverUrl or url
  • Cascade panel > ... > MCPs > Open MCP config file

Gemini CLI setup

Add the endpoint above in Gemini CLI:

  • gemini mcp add --transport http <name> <url>
  • ~/.gemini/settings.json (user) or .gemini/settings.json (project), mcpServers

MCP SDK setup

Add the endpoint above in MCP SDK:

  • Programmatic: new Client(...).connect(new StreamableHTTPClientTransport(url))

Notes for every client

  • Publisher evidence (reviewed 2026-10-20): https://docs.cloud.google.com/firestore/native/docs/use-firestore-mcp
  • Provider guidance: Initialization and tool listing succeeded without credentials in the 2026-10-20 audit; tool calls require Google Cloud credentials. Google OAuth clients are pre-registered in a Google Cloud project; the server does not advertise Dynamic Client Registration. The server is in Preview and must be enabled per project.

Client compatibility

ClientStatusWhy
Claude CodeSupportedClaude Code supports Streamable HTTP servers and OAuth sign-in.
CodexSupportedCodex supports Streamable HTTP servers and OAuth sign-in.
CursorSupportedCursor supports Streamable HTTP servers and OAuth sign-in.
VS CodeSupportedVS Code supports Streamable HTTP servers and OAuth sign-in.
ClaudeSupportedClaude supports Streamable HTTP servers and OAuth sign-in.
Claude DesktopSupportedClaude Desktop supports Streamable HTTP servers and OAuth sign-in.
ChatGPTPartialStateful routing needs operational care: ChatGPT can preserve MCP sessions, but the deployment must route a session consistently and retain its state.
WindsurfPartialWindsurf's documentation does not state support for OAuth sign-in.
Gemini CLISupportedGemini CLI supports Streamable HTTP servers and OAuth sign-in.
MCP SDKSupportedMCP SDK supports Streamable HTTP servers and OAuth sign-in.

Computed from this server's validated transport, protocol and authentication against documented client support. Checks the catalog has not observed are not counted.

Similar servers

  • Supabase — Remote MCP server for Supabase projects, Postgres databases, backend tooling, and documentation. OAuth 2.1
  • Neon — Remote MCP server for Neon Postgres projects, branches, SQL, and documentation. OAuth 2.1
  • Prisma — Creates and manages Prisma Postgres databases, connection strings, backups, Prisma Compute apps, and Object Storage buckets in a Prisma workspace. Requires Prisma OAuth. OAuth 2.1
  • PlanetScale — Lists PlanetScale organizations, databases, and branches, reads Insights and schema recommendations, and runs read or write queries with short-lived credentials. Requires PlanetScale OAuth. OAuth 2.1
  • Google BigQuery — Lists BigQuery datasets and tables, reads table schemas, and runs SQL queries in a Google Cloud project. Requires Google Cloud credentials through OAuth. OAuth 2.1
  • InstantDB — Creates and manages Instant apps, including their schema and permission rules. Requires Instant account OAuth. OAuth 2.1

Guides for this server

Watch this server for breaking changes

Share and embed

Maintain Google Firestore? Embed this badge in your README. It follows the latest catalog validation result and links to this server profile.

mcptest.io: ready

Latest validation evidence

Validation status
Online when last tested
Validation checked at
Oct 26, 2026 at 11:06 AM
Validation detail
Negotiated stateful MCP 2025-11-25 at https://firestore.googleapis.com/mcp; detected transport streamable-http; authentication oauth

Tool inventory

What the catalog validator observed on at https://firestore.googleapis.com/mcp without credentials. The live server may have changed since; connect in the Playground for the current list.

Tools provided by Google Firestore 23

  • add_documentoutputSchema declared

    Create a document from a Firestore database.

    Input collectionId: string, document: any, documentId?: string, mask?: any, parent: string, requestOptions?: any
    • collectionId: stringrequired

      Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`.

    • document: anyrequired

      Required. The document to create. `name` must not be set.

    • documentId?: stringoptional

      The client-assigned document ID to use for this document. Optional. If not specified, an ID will be assigned by the service.

    • mask?: anyoptional

      The fields to return. If not set, returns all fields. If the document has a field that is not present in this mask, that field will not be returned in the response.

    • parent: stringrequired

      Required. The parent resource. For example: `projects/{project_id}/databases/{database_id}/documents` or `projects/{project_id}/databases/{database_id}/documents/chatrooms/{chatroom_id}`

    • requestOptions?: anyoptional

      Optional. The request options for this request.

  • create_backup_scheduleoutputSchema declared

    Create a Firestore backup schedule.

    Input backupSchedule: any, parent: string
    • backupSchedule: anyrequired

      Required. The backup schedule to create.

    • parent: stringrequired

      Required. The parent database. Format `projects/{project}/databases/{database}`

  • create_databaseoutputSchema declared

    Create a Firestore database.

    Input database: any, databaseId: string, parent: string
    • database: anyrequired

      Required. The Database to create.

    • databaseId: stringrequired

      Required. The ID to use for the database, which will become the final component of the database's resource name. This value should be 4-63 characters. Valid characters are /a-z-/ with first character a letter and the last a letter or a number. Must not be UUID-like /[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}/. "(default)" database ID is also valid if the database is Standard edition.

    • parent: stringrequired

      Required. A parent name of the form `projects/{project_id}`

  • create_indexoutputSchema declared

    Create a composite index.

    Input index: any, parent: string
    • index: anyrequired

      Required. The composite index to create.

    • parent: stringrequired

      Required. A parent name of the form `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`

  • delete_backupoutputSchema declared

    Delete a Firestore backup.

    Input name: string
    • name: stringrequired

      Required. Name of the backup to delete. format is `projects/{project}/locations/{location}/backups/{backup}`.

  • delete_backup_scheduleoutputSchema declared

    Delete a Firestore backup schedule.

    Input name: string
    • name: stringrequired

      Required. The name of the backup schedule. Format `projects/{project}/databases/{database}/backupSchedules/{backup_schedule}`

  • delete_databaseoutputSchema declared

    Delete a Firestore database.

    Input etag?: string, name: string
    • etag?: stringoptional

      The current etag of the Database. If an etag is provided and does not match the current etag of the database, deletion will be blocked and a FAILED_PRECONDITION error will be returned.

    • name: stringrequired

      Required. A name of the form `projects/{project_id}/databases/{database_id}`

  • delete_documentoutputSchema declared

    Delete a document from a Firestore database.

    Input currentDocument?: any, name: string, requestOptions?: any
    • currentDocument?: anyoptional

      An optional precondition on the document. The request will fail if this is set and not met by the target document.

    • name: stringrequired

      Required. The resource name of the Document to delete. In the format: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.

    • requestOptions?: anyoptional

      Optional. The request options for this request.

  • delete_indexoutputSchema declared

    Delete a Firestore index.

    Input name: string
    • name: stringrequired

      Required. A name of the form `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/indexes/{index_id}`

  • get_backupoutputSchema declared

    Get a Firestore backup.

    Input name: string
    • name: stringrequired

      Required. Name of the backup to fetch. Format is `projects/{project}/locations/{location}/backups/{backup}`.

  • get_backup_scheduleoutputSchema declared

    Get a Firestore backup schedule.

    Input name: string
    • name: stringrequired

      Required. The name of the backup schedule. Format `projects/{project}/databases/{database}/backupSchedules/{backup_schedule}`

  • get_databaseoutputSchema declared

    Get a Firestore database.

    Input name: string
    • name: stringrequired

      Required. A name of the form `projects/{project_id}/databases/{database_id}`

  • get_documentoutputSchema declared

    Get a document from a Firestore database.

    Input mask?: any, name: string, readTime?: string, requestOptions?: any, transaction?: string
    • mask?: anyoptional

      The fields to return. If not set, returns all fields. If the document has a field that is not present in this mask, that field will not be returned in the response.

    • name: stringrequired

      Required. The resource name of the Document to get. In the format: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.

    • readTime?: stringoptional

      Reads the version of the document at the given time. This must be a microsecond precision timestamp within the past one hour, or if Point-in-Time Recovery is enabled, can additionally be a whole minute timestamp within the past 7 days.

    • requestOptions?: anyoptional

      Optional. The request options for this request.

    • transaction?: stringoptional

      Reads the document in a transaction.

  • get_indexoutputSchema declared

    Get a Firestore index.

    Input name: string
    • name: stringrequired

      Required. A name of the form `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/indexes/{index_id}`

  • list_backup_schedulesoutputSchema declared

    List Firestore backup schedules.

    Input parent: string
    • parent: stringrequired

      Required. The parent database. Format is `projects/{project}/databases/{database}`.

  • list_backupsoutputSchema declared

    List Firestore backups.

    Input filter?: string, parent: string
    • filter?: stringoptional

      An expression that filters the list of returned backups. A filter expression consists of a field name, a comparison operator, and a value for filtering. The value must be a string, a number, or a boolean. The comparison operator must be one of: `<`, `>`, `<=`, `>=`, `!=`, `=`, or `:`. Colon `:` is the contains operator. Filter rules are not case sensitive. The following fields in the Backup are eligible for filtering: * `database_uid` (supports `=` only)

    • parent: stringrequired

      Required. The location to list backups from. Format is `projects/{project}/locations/{location}`. Use `{location} = '-'` to list backups from all locations for the given project. This allows listing backups from a single location or from all locations.

  • list_collectionsoutputSchema declared

    List all the collection IDs underneath a document.

    Input pageSize?: integer, pageToken?: string, parent: string, readTime?: string, requestOptions?: any
    • pageSize?: integeroptional

      The maximum number of results to return.

    • pageToken?: stringoptional

      A page token. Must be a value from ListCollectionIdsResponse.

    • parent: stringrequired

      Required. The parent document. In the format: `projects/{project_id}/databases/{database_id}/documents/{document_path}`. For example: `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom` Use `projects/{project_id}/databases/{database_id}/documents` to list top-level collections.

    • readTime?: stringoptional

      Reads documents as they were at the given time. This must be a microsecond precision timestamp within the past one hour, or if Point-in-Time Recovery is enabled, can additionally be a whole minute timestamp within the past 7 days.

    • requestOptions?: anyoptional

      Optional. The request options for this request.

  • list_databasesoutputSchema declared

    List Firestore databases.

    Input parent: string, showDeleted?: boolean
    • parent: stringrequired

      Required. A parent name of the form `projects/{project_id}`

    • showDeleted?: booleanoptional

      If true, also returns deleted resources.

  • list_documentsoutputSchema declared

    List documents from a Firestore database.

    Input collectionId?: string, mask?: any, orderBy?: string, pageSize?: integer, pageToken?: string, parent: string, readTime?: string, recursive?: boolean, requestOptions?: any, showMissing?: boolean, transaction?: string
    • collectionId?: stringoptional

      Optional. The collection ID, relative to `parent`, to list. For example: `chatrooms` or `messages`. This is optional, and when not provided, Firestore will list documents from all collections under the provided `parent`.

    • mask?: anyoptional

      Optional. The fields to return. If not set, returns all fields. If a document has a field that is not present in this mask, that field will not be returned in the response.

    • orderBy?: stringoptional

      Optional. The optional ordering of the documents to return. For example: `priority desc, __name__ desc`. This mirrors the `ORDER BY` used in Firestore queries but in a string representation. When absent, documents are ordered based on `__name__ ASC`.

    • pageSize?: integeroptional

      Optional. The maximum number of documents to return in a single response. Firestore may return fewer than this value.

    • pageToken?: stringoptional

      Optional. A page token, received from a previous `ListDocuments` response. Provide this to retrieve the subsequent page. When paginating, all other parameters (with the exception of `page_size`) must match the values set in the request that generated the page token.

    • parent: stringrequired

      Required. The parent resource name. In the format: `projects/{project_id}/databases/{database_id}/documents` or `projects/{project_id}/databases/{database_id}/documents/{document_path}`. For example: `projects/my-project/databases/my-database/documents` or `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`

    • readTime?: stringoptional

      Perform the read at the provided time. This must be a microsecond precision timestamp within the past one hour, or if Point-in-Time Recovery is enabled, can additionally be a whole minute timestamp within the past 7 days.

    • recursive?: booleanoptional

      Optional. If the list should recursively include all documents nested under the parent at any level. If the request specifies a `collection_id`, then the list will include all nested documents in the collection under the parent. This is optional, and when not provided, Firestore will only list documents nested immediately under the parent. Requests with `recursive` may not specify `show_missing`.

    • requestOptions?: anyoptional

      Optional. The request options for this request.

    • showMissing?: booleanoptional

      If the list should show missing documents. A document is missing if it does not exist, but there are sub-documents nested underneath it. When true, such missing documents will be returned with a key but will not have fields, `create_time`, or `update_time` set. Requests with `show_missing` may not specify `where` or `order_by`.

    • transaction?: stringoptional

      Perform the read as part of an already active transaction.

  • list_indexesoutputSchema declared

    List Firestore indexes.

    Input filter?: string, pageSize?: integer, pageToken?: string, parent: string
    • filter?: stringoptional

      The filter to apply to list results.

    • pageSize?: integeroptional

      The number of results to return.

    • pageToken?: stringoptional

      A page token, returned from a previous call to FirestoreAdmin.ListIndexes, that may be used to get the next page of results.

    • parent: stringrequired

      Required. A parent name of the form `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`

  • update_backup_scheduleoutputSchema declared

    Update a Firestore backup schedule.

    Input backupSchedule: any, updateMask?: string
    • backupSchedule: anyrequired

      Required. The backup schedule to update.

    • updateMask?: stringoptional

      The list of fields to be updated.

  • update_databaseoutputSchema declared

    Update a Firestore database.

    Input database: any, updateMask?: string
    • database: anyrequired

      Required. The database to update.

    • updateMask?: stringoptional

      The list of fields to be updated.

  • update_documentoutputSchema declared

    Update a document from a Firestore database.

    Input currentDocument?: any, document: any, mask?: any, requestOptions?: any, updateMask?: any
    • currentDocument?: anyoptional

      An optional precondition on the document. The request will fail if this is set and not met by the target document.

    • document: anyrequired

      Required. The updated document. Creates the document if it does not already exist.

    • mask?: anyoptional

      The fields to return. If not set, returns all fields. If the document has a field that is not present in this mask, that field will not be returned in the response.

    • requestOptions?: anyoptional

      Optional. The request options for this request.

    • updateMask?: anyoptional

      The fields to update. None of the field paths in the mask may contain a reserved name. If the document exists on the server and has fields not referenced in the mask, they are left unchanged. Fields referenced in the mask, but not present in the input document, are deleted from the document on the server.