mcp-walichat
Version:
WaliChat WhatsApp MCP connector
99 lines (95 loc) • 3.4 kB
JavaScript
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);
});