Firebase Emulator MCP Server
Provides tools to interact with Firebase emulators, including Firestore, Auth, Realtime Database, and logs for local development workflows.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Firebase Emulator MCP Serverlist all users in the auth emulator"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Firebase Emulator MCP Server
A Model Context Protocol server that exposes Firebase emulator data — Firestore, Auth, Logs, and Realtime Database — to AI agents over stdio.
Designed for local development workflows where AI coding assistants (Claude Code, GitHub Copilot, etc.) need to inspect emulator state without leaving the editor.
Created by Laish Glenberg, please drop a star on the repo if this package helped you!
Features
Tool | Description |
| Ping all emulators and report reachability |
| List root-level collection IDs |
| Query documents with optional field filters ( |
| Fetch a single document by path (e.g. |
| Read any path from the Realtime Database emulator |
| List Firebase Auth users |
| Look up a user by email or localId |
| Stream recent log entries from the emulator hub WebSocket |
Related MCP server: Firebase MCP Server
Prerequisites
Node.js 18+ (native
fetchandWebSocket— v21+ recommended)Firebase emulators running locally — start from your project root:
firebase emulators:startThe server connects to the default emulator ports:
Firestore:
8080Auth:
9099Realtime Database:
9000Hub (logs):
4500
Install & Run
Via npm (recommended)
npm install -g firebase-emulator-mcp
firebase-emulator-mcpVS Code / MCP Client Setup
Add to your project's .vscode/mcp.json or VS Code user settings:
{
"servers": {
"firebase-emulator": {
"type": "stdio",
"command": "node",
"args": ["./mcp-server/lib/index.js"],
"env": {
"FIREBASE_PROJECT_ID": "<proj_id>",
"FIREBASE_RTDB_NAMESPACE": "<proj_id>-default-rtdb"
}
}
}
}Or if installed globally:
{
"servers": {
"firebase-emulator": {
"type": "stdio",
"command": "firebase-emulator-mcp",
"env": {
"FIREBASE_PROJECT_ID": "<proj_id>",
"FIREBASE_RTDB_NAMESPACE": "<proj_id>-default-rtdb"
}
}
}
}Optionally can skip install and run directly through npx
{
"servers": {
"firebase-emulator": {
"type": "stdio",
"command": "npx",
"args": ["@lglen/firebase-emulator-mcp"],
"env": {
"FIREBASE_PROJECT_ID": "<proj_id>",
"FIREBASE_RTDB_NAMESPACE": "<proj_id>-default-rtdb"
}
}
}
}For Claude Code or other MCP clients, use the same stdio configuration.
Project structure
mcp-server/
├── src/
│ └── index.ts # TypeScript source (all tools)
├── lib/ # Compiled output (git-ignored)
├── test.mjs # Smoke test runner
├── tsconfig.json
├── package.json
├── .gitignore
├── LICENSE # MIT
└── README.mdConfiguration
Default emulator ports are defined in src/index.ts under the EMULATORS constant.
Edit them to match your firebase.json if you use non-standard ports:
Service | Default Port |
Firestore | 8080 |
Auth | 9099 |
Realtime DB | 9000 |
Storage | 9199 |
Emulator UI | 4000 |
Hub (logs) | 4500 |
License
MIT
Author
Check me out on GitHub
Available Tools
8 toolsauth_get_userA
Get a single Auth user by email or localId
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. 'Get' implies a read-only operation, but the description does not disclose error behavior (e.g., what happens if the identifier is not found), authentication requirements, or return format. It adds no context beyond the minimal implication of a read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, complete sentence that directly states the purpose and key input detail. Every word contributes value, with no filler or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple structure (1 param, no output schema), and the description adequately conveys the basic operation. However, the absence of any return-value description, error semantics, and usage context means the agent gets only a minimal understanding. It is sufficient for a simple getter but leaves clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines 'identifier' as a string with zero description, so the description must compensate. It does so by explicitly stating that the identifier can be an 'email or localId', adding meaningful domain semantics that help the agent construct the parameter correctly. This goes beyond the bare schema but could be improved with format examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get') and resource ('a single Auth user') with a differentiating scope ('by email or localId'). It distinguishes this tool from siblings like auth_list_users (list vs single) and firestore_get/rtdb_get (Auth vs other data stores).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives like auth_list_users or firestore_get. It does not mention any exclusions, prerequisites, or typical use cases, leaving the agent to infer from the name and sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auth_list_usersB
List users from Auth emulator
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry the full burden of behavioral disclosure. It only states the action without revealing details such as pagination through the limit parameter, default behavior, return format, or any required authentication. This is essentially a restatement of the tool's name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no redundant words. It is front-loaded and efficient, delivering the core message without any fluff. While it is brief, conciseness itself is excellent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is too sparse to fully inform an agent. It does not explain the limit parameter's effect, whether the result is a complete list or truncated, or how it differs from auth_get_user. The description is minimally viable but leaves significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema includes a limit parameter with a default of 50, but the description does not mention it. With schema description coverage at 0%, the description fails to add any meaningful context about how the parameter works or when to override the default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('users from Auth emulator'). This distinguishes it from the sibling tool auth_get_user, which implies a single-user lookup. It unambiguously communicates the action and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like auth_get_user. It does not mention use cases, exclusions, or context for choosing list over get operations. The description offers no strategic selection help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emulator_logsB
Stream recent log entries from the Firebase emulator hub WebSocket (ws://127.0.0.1:4500/)
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of recent log entries to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden of behavioral disclosure. It reveals the transport and endpoint, but does not explain whether the stream is continuous or one-shot, what the output format is, or any side effects. The word 'stream' may even conflict with the 'lines' parameter, which suggests a finite return, creating ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the action and resource, and includes the endpoint. Every word provides useful information with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, and the description does not explain what the returned log entries look like or how the streaming behavior terminates. The ambiguity between 'stream' and the 'lines' parameter leaves a completeness gap for an agent invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% because the only parameter, 'lines', has a clear description in the schema. The tool description itself adds no additional parameter meaning beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Stream recent log entries') and resource ('Firebase emulator hub WebSocket') with an explicit endpoint. This distinguishes it from sibling tools like emulator_status, which focuses on status rather than logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for retrieving emulator logs but does not explicitly state when to use this tool vs alternatives or any exclusions. It names the resource and action, giving context, but lacks clear 'when to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emulator_statusB
Check reachability of all Firebase emulators
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It only says 'check reachability' but does not explain what the tool returns, whether it performs network I/O, or how failures are reported. This is too minimal for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that gets to the point immediately. Every word is necessary and there is no redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, yet the description fails to explain what the caller receives (e.g., a list, a boolean, per-emulator statuses). It also lacks information about edge cases, such as whether all emulators must be running. The description is too sparse for a standalone tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. There is no parameter information to add, and the description correctly makes no mention of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'check' and names the resource 'Firebase emulators' with scope 'all', clearly distinguishing this tool from the sibling data-access and log tools. It exactly states what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor any exclusions. While the purpose implies a pre-flight check, no explicit context or alternative references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firestore_getA
Get a single Firestore document by path (e.g. Member/abc123)
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses a read operation ('Get') but does not specify behavior when the document is not found, whether any authentication is needed, or what the return value looks like. The path example adds some context, but significant behavioral details are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that is front-loaded with the core purpose and includes an example. Every word earns its place, with no redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is mostly adequate. However, it lacks any mention of return values or error behavior when the document doesn't exist. Since no output schema exists, the description should have provided a bit more context about what happens on success or failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter 'path' with no description, and description coverage is 0%. The description compensates by explaining that path is the document path and provides a concrete example ('Member/abc123'), adding meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets a single Firestore document by path, using a specific verb ('Get') and resource ('Firestore document'). It also gives a path example, which distinguishes it from sibling tools like firestore_list_collections (list) and firestore_query (query multiple), and rtdb_get (different database).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when you need a single document and know its path. The example 'Member/abc123' clarifies the expected path format. However, it does not explicitly mention alternatives or when not to use it, but the context is sufficient for a simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firestore_list_collectionsA
List root-level collection IDs from Firestore emulator
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. 'List' implies a read-only operation, and 'from Firestore emulator' provides context about the environment. However, it does not disclose return format (e.g., array of strings), potential absence of collections, or any edge cases. This is adequate for a simple read tool but not maximally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and resource, with zero wasted words. It is perfectly sized for the simplicity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (no params, no output schema), the description provides the essential context: it lists root-level collection IDs specifically in the emulator environment. It is complete enough for an agent to understand the tool's purpose, though it could mention the return type explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so the schema coverage is trivially 100%. Per the rubric, 0 params earns a baseline of 4. The description adds no parameter info, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the specific resource 'root-level collection IDs from Firestore emulator', distinguishing it from sibling tools like firestore_query (which queries documents) and firestore_get (which retrieves a specific document). The 'root-level' scope adds precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage in the context of the Firestore emulator (when you want to see available collections), but it does not explicitly mention when NOT to use it or provide alternatives. It provides clear context but lacks exclusions or comparisons to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firestore_queryD
Query documents in a Firestore collection
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| collection | Yes | ||
| whereField | No | ||
| whereValue | No | ||
| whereOperator | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only says 'Query documents,' which is essentially a reuse of the tool name. It does not disclose whether the operation is read-only, whether authentication is needed, what the return format is, or any rate limits or side effects. This is severely lacking behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words, which is structurally concise. However, it is under-specified to the point of being minimally helpful. It is neither overly long nor confusing, but it also lacks the substance expected of a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 5 parameters, no output schema, and no annotations, the description needs to explain how the query works, what input constraints exist, and what results look like. The single sentence covers only the high-level action, leaving out all necessary operational details. This is highly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining the parameters. It mentions none of the five parameters (collection, limit, whereField, whereValue, whereOperator). The description adds no meaning beyond the empty property names in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'Query' and the resource 'documents in a Firestore collection,' making the basic purpose understandable. However, it does not distinguish this from the sibling tool 'firestore_get' (which likely retrieves a single document) or clarify that querying involves filters. It is clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'firestore_get' or 'firestore_list_collections.' There are no context clues, exclusions, or alternative mentions. The description gives the agent no help in tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rtdb_getA
Read data from Realtime Database emulator at a given path
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path in RTDB, e.g. /rateLimits or /tempLLMUsageLimits | / |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description alone establishes that this is a read-only operation targeting the Realtime Database emulator, which are key behavioral traits. However, it omits details on return format, error behavior, or whether the entire subtree is returned, leaving some room for ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, directly front-loaded with the verb and resource. Every word earns its place, with no redundant information or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema and no annotations, the description is largely complete. It names the resource (RTDB emulator), the operation (read), and the input (path). The default path is captured in the schema, and the simplicity of the tool reduces the need for extensive detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage for the single 'path' parameter, including examples and a default value. The description merely repeats 'at a given path' without adding semantic meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), a clear resource ('Realtime Database emulator'), and a scope ('at a given path'), which distinguishes it from sibling tools like firestore_get and auth_get_user. The purpose is unmistakable and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (for reading RTDB emulator data) but does not explicitly contrast it with alternatives such as firestore_get or auth_get_user. No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.0.3- First observed
auth_get_user - First observed
auth_list_users - First observed
emulator_logs - First observed
emulator_status - First observed
firestore_get - First observed
firestore_list_collections - First observed
firestore_query - First observed
rtdb_get
TDQS
Scored across 8 tools
Each tool targets a clear, distinct resource and action: Firestore operations are separate (list collections, query, get document), RTDB has a single get, Auth has list and get, and status/logs are emulator-wide. No two tools overlap in purpose.
Most tools follow a consistent {service}_{action} pattern (firestore_list_collections, firestore_get, auth_list_users), but emulator_status and emulator_logs deviate to a noun-based pattern. Still predictable and easy to navigate.
Eight tools is well-scoped for a Firebase emulator server, covering the core services (Firestore, RTDB, Auth) plus status and logs without unnecessary bloat.
The tool surface is heavily read-only: Firestore only supports list, query, and get, with no create, update, or delete operations. RTDB and Auth similarly lack write operations, making it impossible to fully manage data in the emulator.
Maintenance
Related MCP Connectors
Query application logs, traces, and metrics from your AI coding assistant via Foam's MCP server.
Enable secure connectivity between Sentry issues and debugging data, and LLM clients, using a Model Context Protocol (MCP) server.
Direct access to Cypress tests results and accessibility reports in your AI workflow.
Interact with your Google Cloud Firestore resources using natural language commands.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to work directly with Firebase realtime database17 npm1MIT
- AlicenseBqualityDmaintenanceEnables inspection and querying of Firestore data and Cloud Function logs within the Firebase Emulator environment. It provides tools to navigate collections, retrieve documents, and filter function logs using regex and other criteria.9310 npmMIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that exposes Firebase Firestore and Authentication to AI agents, supporting multi-project configurations and read operations.526 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Firebase services including Authentication, Firestore Database, and Cloud Storage through a standardized MCP protocol.15-