Files
inspector/server/src/client.ts
2024-10-08 16:49:12 -07:00

128 lines
2.9 KiB
TypeScript

import { Client } from "mcp-typescript/client/index.js";
import { SSEClientTransport } from "mcp-typescript/client/sse.js";
import { StdioClientTransport } from "mcp-typescript/client/stdio.js";
import {
ListResourcesResult,
ReadResourceResult,
ListResourcesResultSchema,
ReadResourceResultSchema,
ListPromptsResult,
ListPromptsResultSchema,
GetPromptResult,
GetPromptResultSchema,
ListToolsResult,
ListToolsResultSchema,
CallToolResult,
CallToolResultSchema,
} from "mcp-typescript/types.js";
export class McpClient {
private client: Client;
private transport?: SSEClientTransport | StdioClientTransport;
constructor(name: string, version: string) {
this.client = new Client({
name,
version,
});
}
async connect(url: string | URL) {
const urlObj = typeof url === "string" ? new URL(url) : url;
if (urlObj.protocol === "http:" || urlObj.protocol === "https:") {
this.transport = new SSEClientTransport();
} else {
throw new Error(`Unsupported protocol: ${urlObj.protocol}`);
}
await this.transport.connect(urlObj);
await this.client.connect(this.transport);
}
async connectStdio(command: string, args: string[] = []) {
this.transport = new StdioClientTransport();
await this.transport.spawn({ command, args });
await this.client.connect(this.transport);
}
async close() {
await this.client.close();
}
// Resource Operations
async listResources(): Promise<ListResourcesResult> {
return await this.client.request(
{
method: "resources/list",
},
ListResourcesResultSchema,
);
}
async readResource(uri: string): Promise<ReadResourceResult> {
return await this.client.request(
{
method: "resources/read",
params: { uri },
},
ReadResourceResultSchema,
);
}
// Prompt Operations
async listPrompts(): Promise<ListPromptsResult> {
return await this.client.request(
{
method: "prompts/list",
},
ListPromptsResultSchema,
);
}
async getPrompt(
name: string,
args?: Record<string, string>,
): Promise<GetPromptResult> {
return await this.client.request(
{
method: "prompts/get",
params: { name, arguments: args },
},
GetPromptResultSchema,
);
}
// Tool Operations
async listTools(): Promise<ListToolsResult> {
return await this.client.request(
{
method: "tools/list",
},
ListToolsResultSchema,
);
}
async callTool(
name: string,
params: Record<string, unknown>,
): Promise<CallToolResult> {
return await this.client.request(
{
method: "tools/call",
params: { name, arguments: params },
},
CallToolResultSchema,
);
}
getServerCapabilities() {
return this.client.getServerCapabilities();
}
getServerVersion() {
return this.client.getServerVersion();
}
}
export default McpClient;