repo_description: ✨ Light and Fast AI Assistant. Support: Web | iOS | MacOS | Android |  Linux | Windows
repo_topics: calclaude chatgpt claude cross-platform desktop fe gemini gemini-pro gemini-server gemini-ultra gpt-4o groq nextjs ollama react tauri tauri-app vercel webui
code: import { Client } from "@modelcontextprotocol/sdk/client/index.js";
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
  import { MCPClientLogger } from "./logger";
  import { ListToolsResponse, McpRequestMessage, ServerConfig } from "./types";
  import { z } from "zod";
  
  const logger = new MCPClientLogger();
  
  export async function createClient(
    id: string,
    config: ServerConfig,
  ): Promise<Client> {
    logger.info(`Creating client for ${id}...`);
  
    const transport = new StdioClientTransport({
      command: config.command,
      args: config.args,
      env: {
        ...Object.fromEntries(
          Object.entries(process.env)
            .filter(([_, v]) => v !== undefined)
            .map(([k, v]) => [k, v as string]),
        ),
        ...(config.env || {}),
      },
    });
  
    const client = new Client(
      {
        name: `nextchat-mcp-client-${id}`,
        version: "1.0.0",
      },
      {
        capabilities: {},
      },
    );
    await client.connect(transport);
    return client;
  }
  
  export async function removeClient(client: Client) {
    logger.info(`Removing client...`);
    await client.close();
  }
  
  export async function listTools(client: Client): Promise<ListToolsResponse> {
    return client.listTools();
  }
  
  export async function executeRequest(
    client: Client,
    request: McpRequestMessage,
  ) {
    return client.request(request, z.any());
  }
  