Skip to content

Commit 2223eb7

Browse files
committed
tool management via server instance
1 parent 7ef8b56 commit 2223eb7

File tree

2 files changed

+77
-20
lines changed

2 files changed

+77
-20
lines changed

src/server/mcp.test.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1963,9 +1963,9 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
19631963
});
19641964

19651965
/***
1966-
* Test: Tool self removal
1966+
* Test: Tool disable, enable, and remove via tool instance
19671967
*/
1968-
test("should remove tool when using tool.remove()", async () => {
1968+
test("should manage tool when using tool instance", async () => {
19691969
const mcpServer = new McpServer({
19701970
name: "test server",
19711971
version: "1.0",
@@ -1981,18 +1981,28 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
19811981
],
19821982
}));
19831983

1984-
expect(mcpServer['_registeredTools']['test']).toBeDefined();
1984+
expect(mcpServer['_registeredTools'].test).toBeDefined();
1985+
1986+
// Now disable the tool
1987+
tool.disable();
1988+
1989+
expect(mcpServer['_registeredTools'].test.enabled).toBe(false);
1990+
1991+
// Now enable the tool
1992+
tool.enable();
1993+
1994+
expect(mcpServer['_registeredTools'].test.enabled).toBe(true);
19851995

19861996
// Now delete the tool
19871997
tool.remove();
19881998

1989-
expect(mcpServer['_registeredTools']['test']).toBeUndefined();
1999+
expect(mcpServer['_registeredTools'].test).toBeUndefined();
19902000
});
19912001

19922002
/***
1993-
* Test: Tool server removal
2003+
* Test: Tool disable, enable, and remove via server instance
19942004
*/
1995-
test("should remove tool when using server.removeTool(...)", async () => {
2005+
test("should manage tool when using server instance", async () => {
19962006
const mcpServer = new McpServer({
19972007
name: "test server",
19982008
version: "1.0",
@@ -2008,12 +2018,22 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
20082018
],
20092019
}));
20102020

2011-
expect(mcpServer['_registeredTools']['test']).toBeDefined();
2021+
expect(mcpServer['_registeredTools'].test).toBeDefined();
2022+
2023+
// Now disable the tool
2024+
mcpServer.disableTool("test");
2025+
2026+
expect(mcpServer['_registeredTools'].test.enabled).toBe(false);
2027+
2028+
// Now enable the tool
2029+
mcpServer.enableTool("test");
2030+
2031+
expect(mcpServer['_registeredTools'].test.enabled).toBe(true);
20122032

20132033
// Now delete the tool
20142034
mcpServer.removeTool("test");
20152035

2016-
expect(mcpServer['_registeredTools']['test']).toBeUndefined();
2036+
expect(mcpServer['_registeredTools'].test).toBeUndefined();
20172037
});
20182038
});
20192039

src/server/mcp.ts

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,14 +1061,47 @@ export class McpServer {
10611061
);
10621062
}
10631063

1064+
/**
1065+
* Enables a tool from the server by name.
1066+
* Does nothing if the tool is not registered.
1067+
*/
1068+
enableTool(name: string) {
1069+
const tool = this._registeredTools[name];
1070+
if (tool) {
1071+
tool.enable();
1072+
}
1073+
};
1074+
1075+
/**
1076+
* Disables a tool from the server by name.
1077+
* Does nothing if the tool is not registered.
1078+
*/
1079+
disableTool(name: string) {
1080+
const tool = this._registeredTools[name];
1081+
if (tool) {
1082+
tool.disable();
1083+
}
1084+
};
1085+
1086+
/**
1087+
* Updates a tool from the server by name.
1088+
* Does nothing if the tool is not registered.
1089+
*/
1090+
updateTool<InputArgs extends ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat>(name: string, updates: ToolUpdates<InputArgs, OutputArgs>) {
1091+
const tool = this._registeredTools[name];
1092+
if (tool) {
1093+
tool.update(updates);
1094+
}
1095+
};
1096+
10641097
/**
10651098
* Removes a tool from the server by name.
10661099
* Does nothing if the tool is not registered.
10671100
*/
10681101
removeTool(name: string) {
10691102
const tool = this._registeredTools[name];
10701103
if (tool) {
1071-
tool.update({ name: null });
1104+
tool.update({ name: null });
10721105
}
10731106
};
10741107

@@ -1292,6 +1325,18 @@ export type ToolCallback<Args extends undefined | ZodRawShapeCompat | AnySchema
12921325
*/
12931326
export type AnyToolHandler<Args extends undefined | ZodRawShapeCompat | AnySchema = undefined> = ToolCallback<Args> | ToolTaskHandler<Args>;
12941327

1328+
export type ToolUpdates<InputArgs extends ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat> = {
1329+
name?: string | null;
1330+
title?: string;
1331+
description?: string;
1332+
paramsSchema?: InputArgs;
1333+
outputSchema?: OutputArgs;
1334+
annotations?: ToolAnnotations;
1335+
_meta?: Record<string, unknown>;
1336+
callback?: ToolCallback<InputArgs>;
1337+
enabled?: boolean;
1338+
}
1339+
12951340
export type RegisteredTool = {
12961341
title?: string;
12971342
description?: string;
@@ -1304,17 +1349,9 @@ export type RegisteredTool = {
13041349
enabled: boolean;
13051350
enable(): void;
13061351
disable(): void;
1307-
update<InputArgs extends ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat>(updates: {
1308-
name?: string | null;
1309-
title?: string;
1310-
description?: string;
1311-
paramsSchema?: InputArgs;
1312-
outputSchema?: OutputArgs;
1313-
annotations?: ToolAnnotations;
1314-
_meta?: Record<string, unknown>;
1315-
callback?: ToolCallback<InputArgs>;
1316-
enabled?: boolean;
1317-
}): void;
1352+
update<InputArgs extends ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat>(
1353+
updates: ToolUpdates<InputArgs, OutputArgs>
1354+
): void
13181355
remove(): void;
13191356
};
13201357

0 commit comments

Comments
 (0)