import { buildComputerUseTools } from '@ant/computer-use-mcp' import { join } from 'path' import { fileURLToPath } from 'url' import { buildMcpToolName } from '../../services/mcp/mcpStringUtils.js' import type { ScopedMcpServerConfig } from '../../services/mcp/types.js' import { isInBundledMode } from '../bundledMode.js' import { CLI_CU_CAPABILITIES, COMPUTER_USE_MCP_SERVER_NAME } from './common.js' import { getChicagoCoordinateMode } from './gates.js' /** * Build the dynamic MCP config + allowed tool names. Mirror of * `setupClaudeInChrome`. The `mcp__computer-use__*` tools are added to * `allowedTools` so they bypass the normal permission prompt — the package's * `request_access` handles approval for the whole session. * * The MCP layer isn't ceremony: the API backend detects `mcp__computer-use__*` * tool names and emits a CU availability hint into the system prompt * (COMPUTER_USE_MCP_AVAILABILITY_HINT in the anthropic repo). Built-in tools * with different names wouldn't trigger it. Cowork uses the same names for the * same reason (apps/desktop/src/main/local-agent-mode/systemPrompt.ts:314). */ export function setupComputerUseMCP(): { mcpConfig: Record allowedTools: string[] } { const allowedTools = buildComputerUseTools( CLI_CU_CAPABILITIES, getChicagoCoordinateMode(), ).map(t => buildMcpToolName(COMPUTER_USE_MCP_SERVER_NAME, t.name)) // command/args are never spawned — client.ts intercepts by name and // uses the in-process server. The config just needs to exist with // type 'stdio' to hit the right branch. Mirrors Chrome's setup. const args = isInBundledMode() ? ['--computer-use-mcp'] : [ join(fileURLToPath(import.meta.url), '..', 'cli.js'), '--computer-use-mcp', ] return { mcpConfig: { [COMPUTER_USE_MCP_SERVER_NAME]: { type: 'stdio', command: process.execPath, args, scope: 'dynamic', } as const, }, allowedTools, } }