client.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { Client } from "@modelcontextprotocol/sdk/client/index.js";
  2. import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
  3. import { MCPClientLogger } from "./logger";
  4. import { ListToolsResponse, McpRequestMessage, ServerConfig } from "./types";
  5. import { z } from "zod";
  6. const logger = new MCPClientLogger();
  7. export async function createClient(
  8. id: string,
  9. config: ServerConfig,
  10. ): Promise<Client> {
  11. logger.info(`Creating client for ${id}...`);
  12. const transport = new StdioClientTransport({
  13. command: config.command,
  14. args: config.args,
  15. env: {
  16. ...Object.fromEntries(
  17. Object.entries(process.env)
  18. .filter(([_, v]) => v !== undefined)
  19. .map(([k, v]) => [k, v as string]),
  20. ),
  21. ...(config.env || {}),
  22. },
  23. });
  24. const client = new Client(
  25. {
  26. name: `nextchat-mcp-client-${id}`,
  27. version: "1.0.0",
  28. },
  29. {
  30. capabilities: {},
  31. },
  32. );
  33. await client.connect(transport);
  34. return client;
  35. }
  36. export async function removeClient(client: Client) {
  37. logger.info(`Removing client...`);
  38. await client.close();
  39. }
  40. export async function listTools(client: Client): Promise<ListToolsResponse> {
  41. return client.listTools();
  42. }
  43. export async function executeRequest(
  44. client: Client,
  45. request: McpRequestMessage,
  46. ) {
  47. return client.request(request, z.any());
  48. }