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 @@ -1961,6 +1961,80 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
// Clean up spies
warnSpy.mockRestore();
});

/***
* 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();
});
});

describe('resource()', () => {
Expand Down
71 changes: 60 additions & 11 deletions src/server/mcp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1061,6 +1061,53 @@ 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 ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat>(
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.remove();
}
}

/**
* Registers a zero-argument prompt `name`, which will run the given function when the client calls it.
* @deprecated Use `registerPrompt` instead.
Expand Down Expand Up @@ -1281,6 +1328,18 @@ export type ToolCallback<Args extends undefined | ZodRawShapeCompat | AnySchema
*/
export type AnyToolHandler<Args extends undefined | ZodRawShapeCompat | AnySchema = undefined> = ToolCallback<Args> | ToolTaskHandler<Args>;

export type ToolUpdates<InputArgs extends ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat> = {
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 @@ -1293,17 +1352,7 @@ export type RegisteredTool = {
enabled: boolean;
enable(): void;
disable(): void;
update<InputArgs extends ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat>(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 ZodRawShapeCompat, OutputArgs extends ZodRawShapeCompat>(updates: ToolUpdates<InputArgs, OutputArgs>): void;
remove(): void;
};

Expand Down
Loading