import { Server } from '@modelcontextprotocol/sdk/server/index.js' import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js' import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js' import { createBridgeClient } from './bridgeClient.js' import { BROWSER_TOOLS } from './browserTools.js' import { createMcpSocketClient } from './mcpSocketClient.js' import { createMcpSocketPool } from './mcpSocketPool.js' import { handleToolCall } from './toolCalls.js' import type { ClaudeForChromeContext, SocketClient } from './types.js' /** * Create the socket/bridge client for the Chrome extension MCP server. * Exported so Desktop can share a single instance between the registered * MCP server and the InternalMcpServerManager (CCD sessions). */ export function createChromeSocketClient( context: ClaudeForChromeContext, ): SocketClient { return context.bridgeConfig ? createBridgeClient(context) : context.getSocketPaths ? createMcpSocketPool(context) : createMcpSocketClient(context) } export function createClaudeForChromeMcpServer( context: ClaudeForChromeContext, existingSocketClient?: SocketClient, ): Server { const { serverName, logger } = context // Choose transport: bridge (WebSocket) > socket pool (multi-profile) > single socket. const socketClient = existingSocketClient ?? createChromeSocketClient(context) const server = new Server( { name: serverName, version: '1.0.0', }, { capabilities: { tools: {}, logging: {}, }, }, ) server.setRequestHandler(ListToolsRequestSchema, async () => { if (context.isDisabled?.()) { return { tools: [] } } return { tools: context.bridgeConfig ? BROWSER_TOOLS : BROWSER_TOOLS.filter(t => t.name !== 'switch_browser'), } }) server.setRequestHandler( CallToolRequestSchema, async (request): Promise => { logger.info(`[${serverName}] Executing tool: ${request.params.name}`) return handleToolCall( context, socketClient, request.params.name, request.params.arguments || {}, ) }, ) socketClient.setNotificationHandler(notification => { logger.info( `[${serverName}] Forwarding MCP notification: ${notification.method}`, ) server .notification({ method: notification.method, params: notification.params, }) .catch(error => { // Server may not be connected yet (e.g., during startup or after disconnect) logger.info( `[${serverName}] Failed to forward MCP notification: ${error.message}`, ) }) }) return server }