-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathmcp-test-utils.ts
More file actions
47 lines (38 loc) · 1.57 KB
/
mcp-test-utils.ts
File metadata and controls
47 lines (38 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import type {
McpServer,
RegisteredResource,
RegisteredResourceTemplate,
RegisteredTool,
} from "@modelcontextprotocol/sdk/server/mcp.js";
type ServerInternals = {
_registeredResources: Record<string, RegisteredResource>;
_registeredResourceTemplates: Record<string, RegisteredResourceTemplate>;
_registeredTools: Record<string, RegisteredTool>;
validateToolInput(tool: RegisteredTool, args: unknown, toolName: string): Promise<unknown>;
executeToolHandler(tool: RegisteredTool, args: unknown, extra: Record<string, never>): Promise<unknown>;
};
export function getRegisteredTools(server: McpServer) {
return (server as unknown as ServerInternals)._registeredTools;
}
export function getRegisteredResources(server: McpServer) {
return (server as unknown as ServerInternals)._registeredResources;
}
export function getRegisteredResourceTemplates(server: McpServer) {
return (server as unknown as ServerInternals)._registeredResourceTemplates;
}
export async function invokeTool(server: McpServer, name: string, args: unknown) {
const internals = server as unknown as ServerInternals;
const tool = internals._registeredTools[name];
if (!tool) {
throw new Error(`Tool ${name} is not registered`);
}
const parsedArgs = await internals.validateToolInput(tool, args, name);
return internals.executeToolHandler(tool, parsedArgs, {});
}
export function stubMethod<T extends object, K extends keyof T>(target: T, key: K, replacement: T[K]) {
const original = target[key];
(target as T)[key] = replacement;
return () => {
(target as T)[key] = original;
};
}