Skip to content

Commit 4725f2e

Browse files
authored
Instrument read_resource with what resource was read (#9239)
* Instrument read_resource with what resource was read * PR suggestions * PR fixes pt 2 * format
1 parent f2610d4 commit 4725f2e

File tree

4 files changed

+10
-2
lines changed

4 files changed

+10
-2
lines changed

src/mcp/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ export class FirebaseMcpServer {
424424
}
425425

426426
async mcpListResources(): Promise<ListResourcesResult> {
427+
await trackGA4("mcp_read_resource", { resource_name: "__list__" });
427428
return {
428429
resources: resources.map((r) => r.mcp),
429430
};

src/mcp/resources/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { init_firestore_rules } from "./guides/init_firestore_rules";
1010
import { init_hosting } from "./guides/init_hosting";
1111
import { init_rtdb } from "./guides/init_rtdb";
1212
import { ServerResource, ServerResourceTemplate } from "../resource";
13+
import { trackGA4 } from "../../track";
1314

1415
export const resources = [
1516
init_backend,
@@ -27,6 +28,7 @@ export const resourceTemplates = [docs];
2728
export async function resolveResource(
2829
uri: string,
2930
ctx: McpContext,
31+
track: boolean = true,
3032
): Promise<
3133
| ({
3234
result: ReadResourceResult;
@@ -39,16 +41,18 @@ export async function resolveResource(
3941
// check if an exact resource name matches first
4042
const resource = resources.find((r) => r.mcp.uri === uri);
4143
if (resource) {
44+
if (track) void trackGA4("mcp_read_resource", { resource_name: uri });
4245
const result = await resource.fn(uri, ctx);
4346
return { type: "resource", mcp: resource.mcp, result };
4447
}
4548

4649
// then check if any templates match
4750
const template = resourceTemplates.find((rt) => rt.match(uri));
4851
if (template) {
52+
if (track) void trackGA4("mcp_read_resource", { resource_name: uri });
4953
const result = await template.fn(uri, ctx);
5054
return { type: "template", mcp: template.mcp, result };
5155
}
52-
56+
if (track) void trackGA4("mcp_read_resource", { resource_name: uri, not_found: "true" });
5357
return null;
5458
}

src/mcp/tools/core/read_resources.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { z } from "zod";
22
import { tool } from "../../tool";
33
import { resolveResource, resources } from "../../resources";
44
import { toContent } from "../../util";
5+
import { trackGA4 } from "../../../track";
56

67
export const read_resources = tool(
78
{
@@ -24,6 +25,7 @@ export const read_resources = tool(
2425
},
2526
async ({ uris }, ctx) => {
2627
if (!uris?.length) {
28+
void trackGA4("mcp_read_resource", { resource_name: "__list__" });
2729
return toContent(
2830
resources
2931
.map(

src/track.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ type cliEventNames =
3737
| "mcp_list_tools"
3838
| "mcp_client_connected"
3939
| "mcp_list_prompts"
40-
| "mcp_get_prompt";
40+
| "mcp_get_prompt"
41+
| "mcp_read_resource";
4142
type GA4Property = "cli" | "emulator" | "vscode";
4243
interface GA4Info {
4344
measurementId: string;

0 commit comments

Comments
 (0)