From 06bc5073b61ad084d6a4bbdc74d8d6a221c84617 Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Thu, 26 Feb 2026 13:08:47 -0800 Subject: [PATCH 1/2] Fixing bad implementation of isFirebaseMCPP --- src/apiv2.ts | 24 +++++++++++++----------- src/bin/mcp.ts | 3 ++- src/env.ts | 7 ++++++- src/gcp/cloudsql/fbToolsAuthClient.ts | 2 +- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/apiv2.ts b/src/apiv2.ts index c4fb07d9c39..61e657c72f4 100644 --- a/src/apiv2.ts +++ b/src/apiv2.ts @@ -19,16 +19,18 @@ import * as FormData from "form-data"; const pkg = require("../package.json"); const CLI_VERSION: string = pkg.version; -const agent = detectAIAgent(); -const agentStr = agent === "unknown" ? "" : ` agent-name/${agent}`; -const platform = isFirebaseMcp() ? "FirebaseMCP" : "FirebaseCLI"; -const clientVersion = `${platform}/${CLI_VERSION}${agentStr}`; - -export const STANDARD_HEADERS: Record = { - Connection: "keep-alive", - "User-Agent": clientVersion, - "X-Client-Version": clientVersion, -}; + +export const STANDARD_HEADERS: () => Record = () => { + const agent = detectAIAgent(); + const agentStr = agent === "unknown" ? "" : ` agent-name/${agent}`; + const platform = isFirebaseMcp() ? "FirebaseMCP" : "FirebaseCLI"; + const clientVersion = `${platform}/${CLI_VERSION}${agentStr}`; + return { + Connection: "keep-alive", + "User-Agent": clientVersion, + "X-Client-Version": clientVersion, + }; +} // Don't use this one. const GOOG_QUOTA_USER_HEADER = "x-goog-quota-user"; @@ -309,7 +311,7 @@ export class Client { if (!reqOptions.headers) { reqOptions.headers = new Headers(); } - for (const [h, v] of Object.entries(STANDARD_HEADERS)) { + for (const [h, v] of Object.entries(STANDARD_HEADERS())) { if (!reqOptions.headers.has(h)) { reqOptions.headers.set(h, v); } diff --git a/src/bin/mcp.ts b/src/bin/mcp.ts index 6ad168b1a7f..ff48e8cea31 100644 --- a/src/bin/mcp.ts +++ b/src/bin/mcp.ts @@ -4,6 +4,7 @@ import { resolve } from "path"; import { parseArgs } from "util"; import { useFileLogger } from "../logger"; import { FirebaseMcpServer } from "../mcp/index"; +import { setFirebaseMcp } from "../env"; import { markdownDocsOfPrompts } from "../mcp/prompts/index.js"; import { markdownDocsOfResources } from "../mcp/resources/index.js"; import { markdownDocsOfTools } from "../mcp/tools/index.js"; @@ -82,7 +83,7 @@ export async function mcp(): Promise { } if (earlyExit) return; - process.env.IS_FIREBASE_MCP = "true"; + setFirebaseMcp(true); useFileLogger(); const activeFeatures = (values.only || "") .split(",") diff --git a/src/env.ts b/src/env.ts index 70014af79a7..782d1652d05 100644 --- a/src/env.ts +++ b/src/env.ts @@ -8,8 +8,13 @@ export function isFirebaseStudio() { return googleIdxFolderExists; } +let isFirebaseMcpFlag = false; export function isFirebaseMcp() { - return !!process.env.IS_FIREBASE_MCP; + return isFirebaseMcpFlag; +} + +export function setFirebaseMcp(value: boolean) { + isFirebaseMcpFlag = value; } // Detect if the CLI was invoked by a coding agent, based on well-known env vars. diff --git a/src/gcp/cloudsql/fbToolsAuthClient.ts b/src/gcp/cloudsql/fbToolsAuthClient.ts index 53791303fca..b4f0f42d5df 100644 --- a/src/gcp/cloudsql/fbToolsAuthClient.ts +++ b/src/gcp/cloudsql/fbToolsAuthClient.ts @@ -39,7 +39,7 @@ export class FBToolsAuthClient extends AuthClient { public async getRequestHeaders(): Promise> { const token = await this.getAccessToken(); return { - ...apiv2.STANDARD_HEADERS, + ...apiv2.STANDARD_HEADERS(), Authorization: `Bearer ${token.token}`, }; } From 4dca3e843daad2983a22bb022891fd3d482654eb Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Thu, 26 Feb 2026 13:53:44 -0800 Subject: [PATCH 2/2] formats --- src/apiv2.ts | 7 +++---- src/gcp/cloudsql/fbToolsAuthClient.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/apiv2.ts b/src/apiv2.ts index 61e657c72f4..c9b716f9609 100644 --- a/src/apiv2.ts +++ b/src/apiv2.ts @@ -19,8 +19,7 @@ import * as FormData from "form-data"; const pkg = require("../package.json"); const CLI_VERSION: string = pkg.version; - -export const STANDARD_HEADERS: () => Record = () => { +export const standardHeaders: () => Record = () => { const agent = detectAIAgent(); const agentStr = agent === "unknown" ? "" : ` agent-name/${agent}`; const platform = isFirebaseMcp() ? "FirebaseMCP" : "FirebaseCLI"; @@ -30,7 +29,7 @@ export const STANDARD_HEADERS: () => Record = () => { "User-Agent": clientVersion, "X-Client-Version": clientVersion, }; -} +}; // Don't use this one. const GOOG_QUOTA_USER_HEADER = "x-goog-quota-user"; @@ -311,7 +310,7 @@ export class Client { if (!reqOptions.headers) { reqOptions.headers = new Headers(); } - for (const [h, v] of Object.entries(STANDARD_HEADERS())) { + for (const [h, v] of Object.entries(standardHeaders())) { if (!reqOptions.headers.has(h)) { reqOptions.headers.set(h, v); } diff --git a/src/gcp/cloudsql/fbToolsAuthClient.ts b/src/gcp/cloudsql/fbToolsAuthClient.ts index b4f0f42d5df..be6ecc575a5 100644 --- a/src/gcp/cloudsql/fbToolsAuthClient.ts +++ b/src/gcp/cloudsql/fbToolsAuthClient.ts @@ -39,7 +39,7 @@ export class FBToolsAuthClient extends AuthClient { public async getRequestHeaders(): Promise> { const token = await this.getAccessToken(); return { - ...apiv2.STANDARD_HEADERS(), + ...apiv2.standardHeaders(), Authorization: `Bearer ${token.token}`, }; }