Fix registering multiple tools/resources/prompts

Request handlers were being re-registered every time a new tool/resource/prompt was added, which would fail since the handlers were already registered. Now we track whether handlers have been initialized and only register them once.

Added tests to verify that multiple registrations work correctly.

Resolves #124.
This commit is contained in:
Justin Spahr-Summers 2025-01-21 09:14:14 +00:00
commit 2590d40e74
No known key found for this signature in database

View file

@ -81,7 +81,13 @@ export class McpServer {
await this.server.close();
}
private _toolHandlersInitialized = false;
private setToolRequestHandlers() {
if (this._toolHandlersInitialized) {
return;
}
this.server.assertCanSetRequestHandler(
ListToolsRequestSchema.shape.method.value,
);
@ -165,6 +171,8 @@ export class McpServer {
}
},
);
this._toolHandlersInitialized = true;
}
private setCompletionRequestHandler() {
@ -249,7 +257,13 @@ export class McpServer {
return createCompletionResult(suggestions);
}
private _resourceHandlersInitialized = false;
private setResourceRequestHandlers() {
if (this._resourceHandlersInitialized) {
return;
}
this.server.assertCanSetRequestHandler(
ListResourcesRequestSchema.shape.method.value,
);
@ -342,9 +356,17 @@ export class McpServer {
);
this.setCompletionRequestHandler();
this._resourceHandlersInitialized = true;
}
private _promptHandlersInitialized = false;
private setPromptRequestHandlers() {
if (this._promptHandlersInitialized) {
return;
}
this.server.assertCanSetRequestHandler(
ListPromptsRequestSchema.shape.method.value,
);
@ -406,6 +428,8 @@ export class McpServer {
);
this.setCompletionRequestHandler();
this._promptHandlersInitialized = true;
}
/**