in packages/mcp-client/src/McpClient.ts [64:116]
async addMcpServer(server: ServerConfig | StdioServerParameters): Promise<void> {
let transport: Transport;
const asUrl = (url: string | URL): URL => {
return typeof url === "string" ? new URL(url) : url;
};
if (!("type" in server)) {
transport = new StdioClientTransport({
...server,
env: { ...server.env, PATH: process.env.PATH ?? "" },
});
} else {
switch (server.type) {
case "stdio":
transport = new StdioClientTransport({
...server.config,
env: { ...server.config.env, PATH: process.env.PATH ?? "" },
});
break;
case "sse":
transport = new SSEClientTransport(asUrl(server.config.url), server.config.options);
break;
case "http":
transport = new StreamableHTTPClientTransport(asUrl(server.config.url), server.config.options);
break;
}
}
const mcp = new Client({ name: "@huggingface/mcp-client", version: packageVersion });
await mcp.connect(transport);
const toolsResult = await mcp.listTools();
debug(
"Connected to server with tools:",
toolsResult.tools.map(({ name }) => name)
);
for (const tool of toolsResult.tools) {
this.clients.set(tool.name, mcp);
}
this.availableTools.push(
...toolsResult.tools.map((tool) => {
return {
type: "function",
function: {
name: tool.name,
description: tool.description,
parameters: tool.inputSchema,
},
} satisfies ChatCompletionInputTool;
})
);
}