@@ -17,9 +17,11 @@ import {
17
17
ListResourcesResult ,
18
18
ReadResourceRequest ,
19
19
ReadResourceResult ,
20
+ ReadResourceRequestSchema ,
21
+ ListResourceTemplatesRequestSchema ,
22
+ ListResourceTemplatesResult ,
20
23
McpError ,
21
24
ErrorCode ,
22
- ReadResourceRequestSchema ,
23
25
} from "@modelcontextprotocol/sdk/types.js" ;
24
26
import { checkFeatureActive , mcpError } from "./util" ;
25
27
import { ClientConfig , McpContext , SERVER_FEATURES , ServerFeature } from "./types" ;
@@ -42,7 +44,7 @@ import { existsSync } from "node:fs";
42
44
import { LoggingStdioServerTransport } from "./logging-transport" ;
43
45
import { isFirebaseStudio } from "../env" ;
44
46
import { timeoutFallback } from "../timeout" ;
45
- import { resources } from "./resources" ;
47
+ import { resolveResource , resources , resourceTemplates } from "./resources" ;
46
48
47
49
const SERVER_VERSION = "0.3.0" ;
48
50
@@ -115,9 +117,12 @@ export class FirebaseMcpServer {
115
117
this . server . setRequestHandler ( CallToolRequestSchema , this . mcpCallTool . bind ( this ) ) ;
116
118
this . server . setRequestHandler ( ListPromptsRequestSchema , this . mcpListPrompts . bind ( this ) ) ;
117
119
this . server . setRequestHandler ( GetPromptRequestSchema , this . mcpGetPrompt . bind ( this ) ) ;
120
+ this . server . setRequestHandler (
121
+ ListResourceTemplatesRequestSchema ,
122
+ this . mcpListResourceTemplates . bind ( this ) ,
123
+ ) ;
118
124
this . server . setRequestHandler ( ListResourcesRequestSchema , this . mcpListResources . bind ( this ) ) ;
119
125
this . server . setRequestHandler ( ReadResourceRequestSchema , this . mcpReadResource . bind ( this ) ) ;
120
-
121
126
const onInitialized = ( ) : void => {
122
127
const clientInfo = this . server . getClientVersion ( ) ;
123
128
this . clientInfo = clientInfo ;
@@ -424,9 +429,13 @@ export class FirebaseMcpServer {
424
429
} ;
425
430
}
426
431
427
- async mcpReadResource ( req : ReadResourceRequest ) : Promise < ReadResourceResult > {
428
- const resource = resources . find ( ( r ) => r . mcp . uri === req . params . uri ) ;
432
+ async mcpListResourceTemplates ( ) : Promise < ListResourceTemplatesResult > {
433
+ return {
434
+ resourceTemplates : resourceTemplates . map ( ( rt ) => rt . mcp ) ,
435
+ } ;
436
+ }
429
437
438
+ async mcpReadResource ( req : ReadResourceRequest ) : Promise < ReadResourceResult > {
430
439
let projectId = await this . getProjectId ( ) ;
431
440
projectId = projectId || "" ;
432
441
@@ -435,13 +444,14 @@ export class FirebaseMcpServer {
435
444
436
445
const resourceCtx = this . _createMcpContext ( projectId , accountEmail ) ;
437
446
438
- if ( ! resource ) {
447
+ const resolved = await resolveResource ( req . params . uri , resourceCtx ) ;
448
+ if ( ! resolved ) {
439
449
throw new McpError (
440
450
ErrorCode . InvalidParams ,
441
451
`Resource '${ req . params . uri } ' could not be found.` ,
442
452
) ;
443
453
}
444
- return resource . fn ( req . params . uri , resourceCtx ) ;
454
+ return resolved . result ;
445
455
}
446
456
447
457
async start ( ) : Promise < void > {
0 commit comments