UNPKG

mcp-walichat

Version:
99 lines (95 loc) 3.4 kB
#!/usr/bin/env node import { NodeOAuthClientProvider, connectToRemoteServer, createLazyAuthCoordinator, getServerUrlHash, log, mcpProxy, parseCommandLineArgs, setupSignalHandlers } from "./chunk-2XBAAR55.js"; // src/proxy.ts import { EventEmitter } from "events"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; async function runProxy(apiKey, callbackPort, headers, transportStrategy = "http-first", host, staticOAuthClientMetadata, staticOAuthClientInfo) { const events = new EventEmitter(); const serverBaseUrl = process.env.WALICHAT_SERVER_URL || "https://api.wali.chat"; const serverUrl = `${serverBaseUrl}/mcp?key=${apiKey}`; const serverUrlHash = getServerUrlHash(serverUrl); const authCoordinator = createLazyAuthCoordinator(serverUrlHash, callbackPort, events); const authProvider = new NodeOAuthClientProvider({ serverUrl, callbackPort, host, clientName: "MCP WaliChat CLI Proxy", staticOAuthClientMetadata, staticOAuthClientInfo }); const localTransport = new StdioServerTransport(); let server = null; const authInitializer = async () => { const authState = await authCoordinator.initializeAuth(); server = authState.server; if (authState.skipBrowserAuth) { log("Authentication was completed by another instance - will use tokens from disk"); await new Promise((res) => setTimeout(res, 1e3)); } return { waitForAuthCode: authState.waitForAuthCode, skipBrowserAuth: authState.skipBrowserAuth }; }; try { const remoteTransport = await connectToRemoteServer(null, serverUrl, authProvider, headers, authInitializer, transportStrategy); mcpProxy({ transportToClient: localTransport, transportToServer: remoteTransport }); await localTransport.start(); log("Local STDIO server running"); log(`Proxy established successfully between local STDIO and remote ${remoteTransport.constructor.name}`); log("Press Ctrl+C to exit"); const cleanup = async () => { await remoteTransport.close(); await localTransport.close(); if (server) { server.close(); } }; setupSignalHandlers(cleanup); } catch (error) { log("Fatal error:", error); if (error instanceof Error && error.message.includes("self-signed certificate in certificate chain")) { log(`You may be behind a VPN! If you are behind a VPN, you can try setting the NODE_EXTRA_CA_CERTS environment variable to point to the CA certificate file. If using claude_desktop_config.json, this might look like: { "mcpServers": { "walichat": { "command": "npx", "args": [ "mcp-walichat", "\${WALICHAT_KEY}" ], "env": { "WALICHAT_KEY": "paste-your-key-here", "NODE_EXTRA_CA_CERTS": "/path/to/your/ca-certificate.crt" } } } } `); } if (server) { server.close(); } process.exit(1); } } parseCommandLineArgs(process.argv.slice(2), "Usage: npx mcp-walichat [api-key] [--debug]").then(({ apiKey, callbackPort, headers, transportStrategy, host, debug, staticOAuthClientMetadata, staticOAuthClientInfo }) => { return runProxy(apiKey, callbackPort, headers, transportStrategy, host, staticOAuthClientMetadata, staticOAuthClientInfo); }).catch((error) => { log("Fatal error:", error); process.exit(1); });