WebMCP

by jasonjmcghee
Verified
  • src
import * as path from 'path'; import * as dotenv from 'dotenv'; import * as os from 'os'; import * as fs from 'fs/promises'; import envPaths from 'env-paths'; // Create config directory in user's home folder const HOME_DIR = os.homedir(); const CONFIG_DIR = path.join(HOME_DIR, '.webmcp'); // Ensure config directory exists const ensureConfigDir = async () => { try { await fs.mkdir(CONFIG_DIR, {recursive: true}); } catch (error) { console.error(`Error creating config directory at ${CONFIG_DIR}:`, error); } }; // Process ID file path const PID_FILE = path.join(CONFIG_DIR, '.webmcp-server.pid'); // Environment file path const ENV_FILE = path.join(CONFIG_DIR, '.env'); // Tokens file path const TOKENS_FILE = path.join(CONFIG_DIR, '.webmcp-tokens.json'); // Load environment variables dotenv.config({path: ENV_FILE}); // Server token for MCP authentication const SERVER_TOKEN = process.env.WEBMCP_SERVER_TOKEN || ''; const HOST = "localhost"; const CONFIG = {}; function setConfig(args) { Object.entries(args).forEach(([key, value]) => { CONFIG[key] = value; }); } function formatChannel(channel) { return `/${channel.replace(/[.:]/g, '_')}` } async function exists(somePath) { try { await fs.access(somePath); return true; } catch (e) { return false; } } async function configureMcpClientWithPath(clientConfigPath) { const directory = path.dirname(clientConfigPath); if (!await exists(directory)) { await fs.mkdir(directory, { recursive: true }); } const webmcpConfig = { "webmcp": { "command": "npx", "args": [ "-y", "@jason.today/webmcp@latest", "--mcp" ] } }; let json = { mcpServers: {} }; // If one already exists, we'll want to update it if (await exists(clientConfigPath)) { const rawJSON = await fs.readFile(clientConfigPath); try { json = JSON.parse(rawJSON); } catch (e) { throw new Error(`Failed to update MCP client configuration: ${e}`); } } json.mcpServers = { ...json.mcpServers, ...webmcpConfig}; await fs.writeFile(clientConfigPath, JSON.stringify(json, null, 2)); } const availableClientConfigs = { "claude": [envPaths("Claude", { suffix: "" }).data, "claude_desktop_config.json"], "cline": [envPaths("Code", { suffix: "" }).data, "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json"], "cursor": [HOME_DIR, ".cursor", "mcp.json"], "windsurf": [HOME_DIR, ".codeium", "windsurf", "mcp_config.json"] }; async function configureMcpClient(clientType) { let clientConfigPath = availableClientConfigs[clientType]; if (clientConfigPath) { } else { console.error("Unsupported client - treating it like a path...") await configureMcpClientWithPath(clientType); } } export { CONFIG, HOST, PID_FILE, ENV_FILE, TOKENS_FILE, SERVER_TOKEN, ensureConfigDir, formatChannel, setConfig, configureMcpClientWithPath, configureMcpClient, };