| 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<string, ScopedMcpServerConfig> | |
| 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, | |
| } | |
| } | |