Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions src/server/mcp.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,80 @@ describe('tool()', () => {
]);
});

/***
* Test: Tool disable, enable, and remove via tool instance
*/
test('should manage tool when using tool instance', async () => {
const mcpServer = new McpServer({
name: 'test server',
version: '1.0'
});

// Register initial tool
const tool = mcpServer.tool('test', async () => ({
content: [
{
type: 'text',
text: 'Test response'
}
]
}));

expect(mcpServer['_registeredTools'].test).toBeDefined();

// Now disable the tool
tool.disable();

expect(mcpServer['_registeredTools'].test.enabled).toBe(false);

// Now enable the tool
tool.enable();

expect(mcpServer['_registeredTools'].test.enabled).toBe(true);

// Now delete the tool
tool.remove();

expect(mcpServer['_registeredTools'].test).toBeUndefined();
});

/***
* Test: Tool disable, enable, and remove via server instance
*/
test('should manage tool when using server instance', async () => {
const mcpServer = new McpServer({
name: 'test server',
version: '1.0'
});

// Register initial tool
mcpServer.tool('test', async () => ({
content: [
{
type: 'text',
text: 'Test response'
}
]
}));

expect(mcpServer['_registeredTools'].test).toBeDefined();

// Now disable the tool
mcpServer.disableTool('test');

expect(mcpServer['_registeredTools'].test.enabled).toBe(false);

// Now enable the tool
mcpServer.enableTool('test');

expect(mcpServer['_registeredTools'].test.enabled).toBe(true);

// Now delete the tool
mcpServer.removeTool('test');

expect(mcpServer['_registeredTools'].test).toBeUndefined();
});

/***
* Test: Tool Registration with Parameters
*/
Expand Down
68 changes: 57 additions & 11 deletions src/server/mcp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,50 @@ export class McpServer {
);
}

/**
* Enables a tool from the server by name.
* Does nothing if the tool is not registered.
*/
enableTool(name: string) {
const tool = this._registeredTools[name];
if (tool) {
tool.enable();
}
}

/**
* Disables a tool from the server by name.
* Does nothing if the tool is not registered.
*/
disableTool(name: string) {
const tool = this._registeredTools[name];
if (tool) {
tool.disable();
}
}

/**
* Updates a tool from the server by name.
* Does nothing if the tool is not registered.
*/
updateTool<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape>(name: string, updates: ToolUpdates<InputArgs, OutputArgs>) {
const tool = this._registeredTools[name];
if (tool) {
tool.update(updates);
}
}

/**
* Removes a tool from the server by name.
* Does nothing if the tool is not registered.
*/
removeTool(name: string) {
const tool = this._registeredTools[name];
if (tool) {
tool.update({ name: null });
}
}

/**
* Registers a zero-argument prompt `name`, which will run the given function when the client calls it.
*/
Expand Down Expand Up @@ -1018,6 +1062,18 @@ export type ToolCallback<Args extends undefined | ZodRawShape = undefined> = Arg
) => CallToolResult | Promise<CallToolResult>
: (extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => CallToolResult | Promise<CallToolResult>;

export type ToolUpdates<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape> = {
name?: string | null;
title?: string;
description?: string;
paramsSchema?: InputArgs;
outputSchema?: OutputArgs;
annotations?: ToolAnnotations;
_meta?: Record<string, unknown>;
callback?: ToolCallback<InputArgs>;
enabled?: boolean;
};

export type RegisteredTool = {
title?: string;
description?: string;
Expand All @@ -1029,17 +1085,7 @@ export type RegisteredTool = {
enabled: boolean;
enable(): void;
disable(): void;
update<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape>(updates: {
name?: string | null;
title?: string;
description?: string;
paramsSchema?: InputArgs;
outputSchema?: OutputArgs;
annotations?: ToolAnnotations;
_meta?: Record<string, unknown>;
callback?: ToolCallback<InputArgs>;
enabled?: boolean;
}): void;
update<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape>(updates: ToolUpdates<InputArgs, OutputArgs>): void;
remove(): void;
};

Expand Down