Skip to content

Commit 72c2065

Browse files
committed
tool management via server instance
1 parent 734850b commit 72c2065

File tree

2 files changed

+75
-19
lines changed

2 files changed

+75
-19
lines changed

src/server/mcp.test.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,9 @@ describe("tool()", () => {
529529
});
530530

531531
/***
532-
* Test: Tool self removal
532+
* Test: Tool disable, enable, and remove via tool instance
533533
*/
534-
test("should remove tool when using tool.remove()", async () => {
534+
test("should manage tool when using tool instance", async () => {
535535
const mcpServer = new McpServer({
536536
name: "test server",
537537
version: "1.0",
@@ -547,18 +547,28 @@ describe("tool()", () => {
547547
],
548548
}));
549549

550-
expect(mcpServer['_registeredTools']['test']).toBeDefined();
550+
expect(mcpServer['_registeredTools'].test).toBeDefined();
551+
552+
// Now disable the tool
553+
tool.disable();
554+
555+
expect(mcpServer['_registeredTools'].test.enabled).toBe(false);
556+
557+
// Now enable the tool
558+
tool.enable();
559+
560+
expect(mcpServer['_registeredTools'].test.enabled).toBe(true);
551561

552562
// Now delete the tool
553563
tool.remove();
554564

555-
expect(mcpServer['_registeredTools']['test']).toBeUndefined();
565+
expect(mcpServer['_registeredTools'].test).toBeUndefined();
556566
});
557567

558568
/***
559-
* Test: Tool server removal
569+
* Test: Tool disable, enable, and remove via server instance
560570
*/
561-
test("should remove tool when using server.removeTool(...)", async () => {
571+
test("should manage tool when using server instance", async () => {
562572
const mcpServer = new McpServer({
563573
name: "test server",
564574
version: "1.0",
@@ -574,12 +584,22 @@ describe("tool()", () => {
574584
],
575585
}));
576586

577-
expect(mcpServer['_registeredTools']['test']).toBeDefined();
587+
expect(mcpServer['_registeredTools'].test).toBeDefined();
588+
589+
// Now disable the tool
590+
mcpServer.disableTool("test");
591+
592+
expect(mcpServer['_registeredTools'].test.enabled).toBe(false);
593+
594+
// Now enable the tool
595+
mcpServer.enableTool("test");
596+
597+
expect(mcpServer['_registeredTools'].test.enabled).toBe(true);
578598

579599
// Now delete the tool
580600
mcpServer.removeTool("test");
581601

582-
expect(mcpServer['_registeredTools']['test']).toBeUndefined();
602+
expect(mcpServer['_registeredTools'].test).toBeUndefined();
583603
});
584604

585605
/***

src/server/mcp.ts

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,39 @@ export class McpServer {
955955
);
956956
}
957957

958+
/**
959+
* Enables a tool from the server by name.
960+
* Does nothing if the tool is not registered.
961+
*/
962+
enableTool(name: string) {
963+
const tool = this._registeredTools[name];
964+
if (tool) {
965+
tool.enable();
966+
}
967+
};
968+
969+
/**
970+
* Disables a tool from the server by name.
971+
* Does nothing if the tool is not registered.
972+
*/
973+
disableTool(name: string) {
974+
const tool = this._registeredTools[name];
975+
if (tool) {
976+
tool.disable();
977+
}
978+
};
979+
980+
/**
981+
* Updates a tool from the server by name.
982+
* Does nothing if the tool is not registered.
983+
*/
984+
updateTool<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape>(name: string, updates: ToolUpdates<InputArgs, OutputArgs>) {
985+
const tool = this._registeredTools[name];
986+
if (tool) {
987+
tool.update(updates);
988+
}
989+
};
990+
958991
/**
959992
* Removes a tool from the server by name.
960993
* Does nothing if the tool is not registered.
@@ -1184,6 +1217,18 @@ export type ToolCallback<Args extends undefined | ZodRawShape = undefined> =
11841217
) => CallToolResult | Promise<CallToolResult>
11851218
: (extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => CallToolResult | Promise<CallToolResult>;
11861219

1220+
export type ToolUpdates<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape> = {
1221+
name?: string | null,
1222+
title?: string,
1223+
description?: string,
1224+
paramsSchema?: InputArgs,
1225+
outputSchema?: OutputArgs,
1226+
annotations?: ToolAnnotations,
1227+
_meta?: Record<string, unknown>,
1228+
callback?: ToolCallback<InputArgs>,
1229+
enabled?: boolean
1230+
}
1231+
11871232
export type RegisteredTool = {
11881233
title?: string;
11891234
description?: string;
@@ -1196,17 +1241,8 @@ export type RegisteredTool = {
11961241
enable(): void;
11971242
disable(): void;
11981243
update<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape>(
1199-
updates: {
1200-
name?: string | null,
1201-
title?: string,
1202-
description?: string,
1203-
paramsSchema?: InputArgs,
1204-
outputSchema?: OutputArgs,
1205-
annotations?: ToolAnnotations,
1206-
_meta?: Record<string, unknown>,
1207-
callback?: ToolCallback<InputArgs>,
1208-
enabled?: boolean
1209-
}): void
1244+
updates: ToolUpdates<InputArgs, OutputArgs>
1245+
): void
12101246
remove(): void
12111247
};
12121248

0 commit comments

Comments
 (0)