airi/services/computer-use-mcp/src/server.ts
刘梓恒 2e9020a06f
fix(computer-use-mcp): route target clicks through action executor (#1727)
---------

Co-authored-by-agent: Antigravity <antigravity@gemini.com>
2026-04-26 05:53:15 +08:00

85 lines
3 KiB
TypeScript

import type { ComputerUseServerOptions } from './server/runtime'
import process, { env } from 'node:process'
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { resolveComputerUseConfig } from './config'
import { createExecuteAction } from './server/action-executor'
import { registerAccessibilityTools } from './server/register-accessibility'
import { registerCdpTools } from './server/register-cdp'
import { registerChromeSessionTools } from './server/register-chrome-session'
import { registerDesktopGroundingTools } from './server/register-desktop-grounding'
import { registerDisplayTools } from './server/register-display'
import { destroyAllPtySessions, registerPtyTools } from './server/register-pty'
import { registerTaskMemoryTools } from './server/register-task-memory'
import { registerComputerUseTools } from './server/register-tools'
import { registerVscodeTools } from './server/register-vscode'
import { createRuntime } from './server/runtime'
const packageVersion = '0.1.0'
const enableTestTools = ['1', 'true', 'yes', 'on'].includes((env.COMPUTER_USE_ENABLE_TEST_TOOLS || '').trim().toLowerCase())
export { type ComputerUseServerOptions } from './server/runtime'
export async function createComputerUseMcpServer(config = resolveComputerUseConfig(), options: ComputerUseServerOptions = {}) {
const runtime = await createRuntime(config, options)
const executeAction = createExecuteAction(runtime)
const server = new McpServer({
name: 'AIRI Computer Use',
version: packageVersion,
})
registerComputerUseTools({
server,
runtime,
executeAction,
enableTestTools,
})
registerTaskMemoryTools(server, runtime)
registerAccessibilityTools({ server, runtime })
registerDisplayTools({ server, runtime })
registerPtyTools({ server, runtime })
registerVscodeTools({
server,
runtime,
executeTerminalCommand: async (input, toolName) => {
return await executeAction({ kind: 'terminal_exec', input }, toolName)
},
})
const cdpCleanup = registerCdpTools({ server, runtime })
registerDesktopGroundingTools({ server, runtime, executeAction })
registerChromeSessionTools({ server, runtime })
return {
server,
runtime,
cdpCleanup,
}
}
export async function startComputerUseMcpServer(config = resolveComputerUseConfig(), options: ComputerUseServerOptions = {}) {
const { server, runtime, cdpCleanup } = await createComputerUseMcpServer(config, options)
const transport = new StdioServerTransport()
await server.connect(transport)
const shutdown = async () => {
destroyAllPtySessions()
await cdpCleanup.close().catch(() => {})
await runtime.cdpBridgeManager.close().catch(() => {})
await runtime.browserDomBridge.close().catch(() => {})
await runtime.executor.close?.().catch(() => {})
}
process.once('SIGINT', () => {
void shutdown()
})
process.once('SIGTERM', () => {
void shutdown()
})
return { server, transport, runtime }
}