
1. 项目概述一个为macOS设计的本地计算机控制MCP服务器最近在折腾AI助手与本地环境的深度集成特别是想让Claude、Cursor这类工具能“看见”并“操作”我的Mac桌面。市面上虽然有一些方案但要么依赖复杂的云端服务要么权限管理过于宽松总感觉不够优雅和安全。直到我发现了这个trevor-nichols/computer-use-mcp-server项目它是一个专门为macOS设计的、本地的“计算机使用”模型上下文协议服务器。简单来说它能让你的AI助手通过一个标准化的协议安全、可控地执行截图、移动鼠标、点击、打字、打开应用等一系列桌面操作而这一切都运行在你的本地机器上数据不出门。这个项目的核心价值在于它解决了AI原生工作流中的一个关键痛点如何让AI不仅理解你的指令还能在真实的图形界面环境中替你执行任务。想象一下你可以对AI说“帮我把桌面上的截图文件夹整理到文档里”然后AI就能像真人一样操作Finder完成这个任务。computer-use-mcp-server就是实现这个愿景的底层桥梁。它非常适合开发者、自动化爱好者以及任何希望探索下一代人机交互方式的极客。无论你是想构建一个智能的桌面自动化助手还是单纯想研究MCP协议在本地控制领域的应用这个项目都提供了一个非常扎实的起点。2. 核心架构与设计哲学解析2.1 什么是MCP以及为什么它很重要在深入代码之前有必要先理解MCP。MCP全称是Model Context Protocol你可以把它想象成AI世界里的“USB协议”。不同的AI模型和应用如Claude Desktop、Cursor是“设备”而各种提供数据或能力的服务如文件系统、数据库、乃至这里的桌面控制是“外设”。MCP定义了一套标准的“插口”和“通信语言”让“设备”能即插即用地发现和使用“外设”的功能。computer-use-mcp-server就是一个实现了MCP Server标准的“桌面控制外设”。它通过stdio或HTTP与MCP Client如配置了该Server的Claude Desktop通信。Client向Server发送标准的JSON-RPC请求例如调用screenshot工具Server执行相应的本地操作截图并返回结果。这种协议化的设计带来了巨大的灵活性AI前端应用无需为每一种能力重写集成代码只需支持MCP协议能力提供者也无需适配每一个AI应用只需遵循MCP实现Server。这极大地促进了生态的繁荣。2.2 分层架构清晰的责任边界这个项目的架构设计体现了清晰的工程思维将复杂功能分解为多个职责分明的层次确保了可维护性和可扩展性。最上层是TypeScript MCP服务器层。它位于packages/computer-use-mcp/目录下是整个系统的“大脑”和“调度中心”。它的核心职责包括协议通信实现MCP Server规范通过stdio或HTTP传输层接收和响应JSON-RPC请求。工具注册与管理对外暴露screenshot、mouse_move、type等二十多个工具并处理它们的调用。会话与状态管理维护会话session级别的状态例如当前选中的显示器、临时的截图ID等确保多轮对话中上下文连贯。协调与仲裁这是最关键的部分。它集成了“桌面锁”机制防止多个AI会话同时操作桌面导致冲突它还负责权限和应用程序批准的协调流程当AI尝试访问屏幕或控制输入时会触发系统或自定义的授权提示。中间层是原生桥接层。TypeScript服务器自身并不直接调用macOS的底层API而是通过子进程或本地模块与原生代码交互。这里主要有两个分支Swift桥接可执行文件这是主力军。项目编译出一个名为ComputerUseBridge的独立Swift可执行文件。它承担了最广泛的原生操作屏幕捕获使用macOS最新的ScreenCaptureKit框架进行高效、安全的截图这是获得系统截屏权限后的推荐方式。权限检查与引导通过TCC框架检查辅助功能、录屏等权限状态并能在需要时生成深链引导用户跳转到系统设置页面进行授权。应用管理使用NSWorkspace查询、启动应用程序。剪贴板访问通过NSPasteboard读写系统剪贴板。传统输入注入作为备选方案使用CGEvent相关API模拟鼠标键盘事件。Rust输入后端包这是一个可选的、专注于输入性能的替代方案。当设置环境变量COMPUTER_USE_INPUT_BACKENDrust时系统会使用这个用Rust编写并通过N-API封装的Node本地模块来处理所有鼠标、键盘、滚动和打字输入事件。选择Rust通常是出于对更低延迟、更高性能输入模拟的需求。最下层是macOS系统框架。最终无论是Swift还是Rust后端它们都通过调用Apple提供的原生框架来实现功能ScreenCaptureKit用于截图CoreGraphics用于输入模拟和光标查询AppKit用于应用和剪贴板操作TCC用于权限管理。这种架构的优势非常明显高内聚低耦合。TypeScript层专注于业务逻辑和协议原生层专注于与操作系统的高效、安全交互。你可以单独升级或替换其中一层比如尝试用另一种语言重写输入后端而不会影响整体协议和功能。2.3 安全与权限设计的核心考量让AI控制你的桌面安全无疑是头等大事。这个项目在设计上做了多重考量显式权限请求request_access工具是入口。调用它会触发一个本地的授权提示界面由ApprovalUIBridge提供明确告知用户AI正在请求哪些权限如录屏、辅助功能。用户必须手动批准AI才能进行后续操作。这模仿了macOS应用自身的权限申请流程符合用户认知。桌面锁这是一个文件锁机制。当任何一个AI会话开始操作桌面时服务器会在指定路径默认为~/.computer-use/desktop.lock创建一个锁文件。其他会话尝试操作时会被阻止直到当前会话释放锁。这防止了多个AI“同时抢夺鼠标键盘”的混乱场面。会话隔离每个MCP客户端连接对应一个独立的会话拥有自己的状态存储。这意味着为Claude配置的Server会话和为Cursor配置的会话是隔离的它们的操作不会相互干扰除了共享桌面锁这样的全局资源。“假模式”项目贴心地提供了COMPUTER_USE_FAKE1模式。在此模式下所有原生操作都会被模拟不会真正调用系统API。这对于在非macOS平台如Linux CI环境上进行功能测试、协议调试至关重要开发者可以在完全安全的环境下验证逻辑。注意尽管有这些设计但本质上一旦用户授予了权限AI就能执行工具集中的任何操作。因此只在你完全信任的AI助手和本地环境中使用它。切勿将配置了此Server的MCP客户端暴露给不受控的网络或不可信的模型。3. 核心工具详解与使用流程3.1 截图与查看全新的“捕获契约”项目的截图机制设计了一套精巧的“捕获契约”兼顾了不同MCP客户端的兼容性和效率。理解这个契约是正确使用它的关键。在早期版本中截图可能只返回一个文件路径或一堆Base64编码的数据。现在screenshot和zoom工具同时做两件事内联图片附件它们直接在MCP响应的content数组中附加一个image类型的内容项。支持内联图片渲染的客户端如最新版的Claude Desktop可以直接显示这张图片无需额外请求。返回捕获ID在响应的文本内容中会返回一个captureId...的字符串。这个ID是本次截图操作的唯一标识符。那么如果你需要知道这张截图的具体信息比如它的几何坐标对于zoom放大区域或者它在本地文件系统的保存路径该怎么办这就需要用到capture_metadata工具。你传入之前得到的captureId它会返回一个结构化的数据其中包含imagePath等元信息。因此推荐的消费流程是AI客户端调用screenshot()。客户端检查响应如果支持内联图片就直接渲染content里的图像。如果AI需要分析图片的某个区域位置或者用户要求保存图片到特定地方客户端再调用capture_metadata(captureId)获取文件路径等详细信息。对于偏好文件路径的客户端备用流程是调用screenshot()。从文本响应中解析出captureId。调用capture_metadata(captureId)获取structuredContent.imagePath。如果需要打开图片查看再调用view_image(imagePath)。实操心得这种设计非常巧妙。内联附件让支持它的客户端获得了“零额外请求”的最佳体验而captureId和元数据查询的分离又为所有客户端提供了获取完整信息的能力避免了在单个响应中塞入过多数据如巨大的Base64字符串导致的性能问题。在实现自己的客户端时应优先检查并利用内联图像。3.2 输入模拟工具集从光标到键盘这是让AI“动手操作”的核心。工具集设计得非常全面几乎覆盖了所有常见的桌面交互光标控制cursor_position: 获取当前光标在屏幕上的坐标。mouse_move(x, y): 将光标移动到指定的绝对坐标。坐标原点(0,0)在屏幕左上角。left_click,right_click,middle_click: 在光标当前位置执行单击。double_click,triple_click: 双击和三连击。left_click_drag(startX, startY, endX, endY): 模拟按下左键、拖动、释放的过程常用于框选或移动文件。scroll(deltaX, deltaY): 滚动鼠标滚轮。deltaY正数向上滚负数向下滚deltaX控制水平滚动。键盘控制key(keyCode, modifiers?): 模拟按下并释放一个键。keyCode是字符串如a,enter,escapemodifiers是数组可包含shift,control,option,command。hold_key(keyCode, modifiers?): 模拟按下键但不释放。通常需要配合后续的key或type使用。type(text): 模拟输入一串文本。这是最常用的工具AI可以将思考结果直接“打”到输入框里。其内部可能会分解为一系列key事件。实用工具read_clipboard,write_clipboard: 读写系统剪贴板。AI可以读取你复制的内容也可以将生成的内容复制进去。search_applications(name),open_application(bundleId或路径): 查找和启动应用程序。list_granted_applications(): 列出已获得辅助功能权限的应用有助于调试。wait(ms): 让AI操作暂停指定的毫秒数。在连续操作中插入等待可以确保界面有足够时间响应避免操作过快导致失败。computer_batch(commands):批量执行命令。这是提高效率的关键。你可以将一个操作序列如[mouse_move, left_click, type]打包成一个请求发送减少了网络往返延迟使操作更连贯。3.3 显示管理与批量操作list_displays(): 列出所有连接的显示器信息包括ID、名称、分辨率等。在多显示器环境下这是必须的第一步。select_display(displayId): 选择后续截图操作的目标显示器。如果不选择默认可能是主显示器。关于computer_batch的深度使用 这个工具极大地提升了复杂任务的执行效率。假设AI需要完成“在Finder中新建文件夹”这个任务不使用批量模式可能需要4-5个独立的请求移动光标到菜单栏、点击“文件”、点击“新建文件夹”、移动光标到命名框、点击、输入名称。每个请求都有网络和进程间通信的开销。使用computer_batch可以将这系列操作编码成一个命令数组一次性发送。服务器会按顺序执行期间几乎没有延迟。这不仅更快也更可靠因为它减少了操作执行期间桌面状态可能发生变化的风险。// 一个computer_batch请求的示例结构 { commands: [ {tool: mouse_move, args: {x: 100, y: 50}}, {tool: left_click, args: {}}, {tool: wait, args: {ms: 200}}, {tool: key, args: {keyCode: n, modifiers: [command, shift]}}, {tool: wait, args: {ms: 500}}, {tool: type, args: {text: 我的新项目}}, {tool: key, args: {keyCode: return}} ] }4. 从零开始构建、配置与运行指南4.1 环境准备与项目构建首先你需要一个macOS开发环境并确保安装了以下基础工具Node.js(建议18.x或更高版本) 和 npm用于运行TypeScript服务器。Xcode Command Line Tools这是必须的它提供了Swift编译器和macOS SDK。在终端运行xcode-select --install即可安装。Rust工具链(可选)如果你计划使用或编译Rust输入后端。可以通过rustup安装。第一步获取代码git clone https://github.com/trevor-nichols/computer-use-mcp-server.git cd computer-use-mcp-server第二步构建TypeScript MCP服务器这是核心部分所有包都通过workspace管理。# 安装所有依赖包括各个子package npm install # 编译TypeScript代码 npm run build # 运行单元测试确保基础功能正常 npm test第三步构建Swift原生桥接器这是实现在macOS上真正运行的关键。# 构建主桥接器 swift build --package-path packages/native-swift -c release # 构建授权提示UI助手 swift build --package-path packages/approval-ui-macos -c release构建成功后可执行文件会生成在各自包的.build/release/目录下。通常服务器会自动发现它们但你也可以通过环境变量指定自定义路径。第四步可选构建Rust输入后端如果你对输入性能有极致要求或者想研究Rust实现可以构建这个后端。cd packages/native-input npm run build # 这会调用cargo编译并生成.node文件 npm test # 测试Rust模块 cd ../..4.2 配置MCP客户端以Claude Desktop为例构建好的服务器需要被MCP客户端加载。这里以Anthropic的Claude Desktop为例。找到Claude的配置目录。通常在~/Library/Application Support/Claude/。编辑或创建MCP配置文件。创建一个名为mcp_config.json的文件如果不存在或编辑已有的。添加computer-use服务器配置。配置内容需要指向你构建好的服务器入口文件。{ mcpServers: { computer-use: { command: node, args: [ /ABSOLUTE/PATH/TO/YOUR/computer-use-mcp-server/dist/computer-use-mcp/src/main.js ], env: { // 除非你在开发测试否则不要设置FAKE模式 // COMPUTER_USE_FAKE: 1, // 可选指定输入后端默认是swift // COMPUTER_USE_INPUT_BACKEND: rust, // 可选自定义锁文件或截图存储路径 // COMPUTER_USE_LOCK_PATH: /tmp/my-desktop.lock, // COMPUTER_USE_CAPTURE_ASSET_ROOT: ~/Pictures/ai_captures } } } }关键点command和args必须能正确启动你的Node服务器。确保路径是绝对路径。env部分是可选的。首次运行千万不要加COMPUTER_USE_FAKE1否则无法申请真实权限。如果你把Swift桥接器编译到了非标准位置可能需要通过COMPUTER_USE_SWIFT_BRIDGE_PATH等环境变量指定。重启Claude Desktop。重启后Claude应该会加载新的MCP配置。你可以在Claude的输入框里尝试说“列出可用的工具”或“请求桌面访问权限”来测试。4.3 首次运行与权限授予当你第一次通过Claude调用request_access或screenshot等需要权限的工具时系统会触发授权流程。本地UI提示ApprovalUIBridge会弹出一个原生macOS风格的对话框说明AI正在请求“屏幕录制”和“辅助功能”权限并询问你是否批准。跳转系统设置点击批准后如果相关权限尚未授予它会尝试通过深链打开“系统设置” - “隐私与安全性” - “屏幕录制/辅助功能”页面。注意它只能帮你打开页面无法自动点击复选框。手动勾选在系统设置页面你需要找到对应的应用可能是node也可能是ComputerUseBridge取决于实现细节并手动勾选允许。权限生效授予权限后通常需要完全重启MCP服务器进程甚至Claude Desktop权限才会被系统识别并生效。踩坑实录权限问题是新手最大的障碍。常见问题包括弹窗不出现检查ApprovalUIBridge是否构建成功、打开系统设置后找不到对应应用尝试重启应用或电脑、授权后仍然报错确保重启了服务器进程。一个可靠的检查方法是运行screenshot工具如果返回权限错误就再走一遍request_access流程。4.4 运行模式与环境变量详解服务器提供了多种运行模式通过环境变量控制环境变量可选值默认值作用COMPUTER_USE_FAKE1(未设置)开发测试神器。设置为1时所有操作被模拟不调用真实系统API。可在非macOS上运行。COMPUTER_USE_INPUT_BACKENDswift,rust,fakeswift选择输入事件鼠标、键盘的模拟后端。swift使用CGEventrust使用专用addonfake用于模拟。COMPUTER_USE_LOCK_PATH文件路径~/.computer-use/desktop.lock桌面锁文件的存放路径。用于防止并发操作冲突。COMPUTER_USE_CAPTURE_ASSET_ROOT目录路径~/.computer-use/captures截图文件的存储根目录。每次截图都会在此目录下生成文件。COMPUTER_USE_SWIFT_BRIDGE_PATH可执行文件路径(自动发现)手动指定ComputerUseBridge可执行文件的绝对路径。COMPUTER_USE_APPROVAL_UI_PATH可执行文件路径(自动发现)手动指定ApprovalUIBridge可执行文件的绝对路径。COMPUTER_USE_RUST_INPUT_PATH.node文件路径(自动发现)手动指定Rust输入后端.node模块文件的绝对路径。开发工作流建议日常开发/调试可以先在FAKE模式下运行测试工具调用逻辑和协议通信完全安全。功能集成测试在真实模式下但可以结合日志输出进行。服务器本身应该有日志机制可能需要查看源码或增加日志配置。性能测试可以对比swift和rust两种输入后端看哪种在连续快速输入时延迟更低、更稳定。5. 高级应用场景与开发实践5.1 构建自定义的AI自动化工作流仅仅让AI截图和点击只是开始。结合MCP协议和AI的逻辑能力可以构建出强大的自动化工作流。场景一每日数据抓取与归档假设你每天需要打开某个内部仪表盘网站截图保存然后归档到指定文件夹。AI通过open_application打开浏览器或使用type输入网址。使用wait等待页面加载。调用screenshot截取全屏或zoom截取特定区域。通过capture_metadata获取截图文件路径。AI可以分析截图内容结合其视觉能力提取关键数据。使用key和type操作将数据粘贴到笔记软件或表格中并按照日期重命名文件。整个过程可以通过一个复杂的computer_batch或由AI自主规划的一系列工具调用来完成。场景二GUI应用程序的自动化测试你可以用这个服务器作为测试驱动。编写测试脚本可以是另一个AI或传统脚本通过MCP协议驱动应用程序执行一系列操作然后在关键节点截图通过视觉对比或OCR判断测试是否通过。这比基于像素坐标的传统UI自动化更灵活。场景三辅助残障人士结合语音输入和AI可以为行动不便的用户提供一个完全通过语音控制电脑的界面。用户说“打开邮件回复张三说会议改到明天”AI就能理解并执行一系列精确的桌面操作。5.2 扩展与二次开发指南这个项目本身是一个优秀的MCP Server范本你也可以基于它进行扩展。1. 添加新的工具如果你想让它控制更多东西比如调节系统音量、获取窗口列表等你需要在TypeScript服务器的工具注册处通常在src/tools/目录下定义新的工具函数包括名称、参数schema和实现。如果该操作需要新的原生能力你需要在Swift桥接器packages/native-swift/中添加相应的实现并通过进程间通信IPC协议暴露给Node层。最后更新MCP Server的tools列表使其对外提供这个新工具。2. 支持其他操作系统目前它深度绑定macOS的API。要支持Windows或Linux思路是保持TypeScript层的协议、会话、锁逻辑基本不变。为每个目标操作系统实现一套独立的“原生桥接层”替代现有的Swift包。例如Windows下可能需要用C#或Rust调用User32.dll和GDI。在Node层通过环境变量或动态检测来加载正确的原生后端。3. 开发自己的MCP客户端如果你有自己的AI应用可以参照MCP协议文档实现一个MCP Client来连接这个Server。核心就是建立传输层stdio或HTTP然后发送/接收JSON-RPC格式的请求和响应。这让你能快速为自己的应用赋予强大的桌面控制能力。5.3 性能优化与调试技巧输入延迟如果感觉鼠标移动或打字有延迟首先确认是否使用了computer_batch来合并操作。其次可以尝试切换到COMPUTER_USE_INPUT_BACKENDrust看Rust后端是否有更好的性能。此外确保没有其他高CPU占用的进程干扰。截图速度与质量截图速度取决于ScreenCaptureKit的配置。在Swift桥接器中可以调整截图的尺寸、缩放因子和帧率。对于不需要高清的AI识别场景降低分辨率可以显著提升速度。资源清理截图文件默认存储在~/.computer-use/captures/下长期运行可能会积累大量文件。可以考虑在客户端逻辑中在不再需要时调用系统命令删除文件或修改服务器配置定期清理。调试日志服务器本身的日志可能有限。一个有效的调试方法是运行Claude Desktop时查看其控制台输出如果提供或者直接使用stdio模式手动启动服务器进行调试COMPUTER_USE_FAKE1 node dist/computer-use-mcp/src/main.js然后手动输入JSON-RPC请求如{jsonrpc:2.0,id:1,method:tools/list}来观察响应。6. 常见问题与故障排除实录在实际部署和使用过程中你几乎一定会遇到下面这些问题。这里是我踩过坑后总结的排查清单。6.1 权限问题排查表问题现象可能原因解决方案调用screenshot返回权限错误1. 从未授予过录屏权限。2. 权限被用户手动移除。3. 服务器进程路径变更系统认为是一个新应用。1. 确保已通过request_access触发授权流程并已在系统设置-隐私与安全性-屏幕录制中勾选对应应用node或终端。2. 完全退出Claude Desktop和所有Node进程重新启动。3. 如果修改了服务器启动脚本的路径需要重新授权。调用mouse_move或type返回权限错误辅助功能权限未授予。1. 确保已在系统设置-隐私与安全性-辅助功能中勾选对应应用。2.重要辅助功能权限要求应用位于/Applications、/usr/local/bin等特定目录或通过Apple签名的应用启动。从命令行直接启动node可能无法获得权限。尝试将你的启动命令包装成一个.app应用或者通过Claude Desktop这样的已签名应用来间接启动Server。request_access弹窗不出现1.ApprovalUIBridge未正确构建或路径错误。2. 环境变量COMPUTER_USE_FAKE1被设置。1. 检查packages/approval-ui-macos/.build/release/下是否有可执行文件并通过环境变量指定正确路径。2. 检查MCP配置移除COMPUTER_USE_FAKE环境变量。授权后操作仍然失败权限缓存问题。macOS有时不会立即将新权限应用到已运行的进程。最有效的办法彻底重启整个链条。关闭Claude Desktop在活动监视器中杀掉所有相关的node进程然后重新启动Claude。6.2 构建与运行问题问题现象可能原因解决方案swift build失败提示找不到PackageSwift工具链未安装或版本不匹配。运行xcode-select --install安装命令行工具并确保Xcode版本较新。npm run build时TypeScript报错Node.js版本过低或依赖包损坏。确保Node.js版本 18。删除node_modules和package-lock.json重新运行npm install。运行服务器时提示“Cannot find module”1. 未构建。2. 运行路径不对。1. 确保已执行npm run build。2. 在项目根目录运行或使用构建产物的绝对路径。Claude Desktop加载MCP服务器失败1. JSON配置文件语法错误。2.command路径错误。3. 服务器启动即崩溃。1. 使用JSON验证器检查mcp_config.json。2. 确保args中的JS文件路径是绝对路径。3. 尝试在终端手动运行配置中的命令查看具体报错信息。6.3 功能与行为异常问题现象可能原因解决方案截图是全黑或空白1. 录屏权限未真正生效常见于多显示器或某些应用。2. 在虚拟机中运行图形驱动问题。1. 尝试重启电脑这是解决macOS权限玄学问题的终极方法。2. 虚拟机中可能需要额外的Guest Additions或设置。物理机更可靠。鼠标点击位置不准确坐标系统理解有误。AI可能误解了屏幕坐标。坐标原点(0,0)在屏幕左上角。x向右增加y向下增加。确保AI给出的坐标是基于正确的显示器分辨率和缩放因子计算得出的。可以先用cursor_position获取当前实际坐标作为参考。type工具输入了乱码或错误字符键盘布局或输入法问题。模拟的键码可能不对应当前输入法。1. 尝试在操作前先用key工具发送切换到英文输入法的快捷键如ctrlspace。2. 对于复杂文本考虑让AI使用write_clipboard然后模拟cmdv粘贴这通常更可靠。computer_batch中的某个命令失败导致后续停止默认情况下批量操作中一个失败可能会停止整个批次。查看服务器日志确定是哪个命令失败。在客户端实现错误处理逻辑例如将长批次拆分成多个短批次或在失败后尝试恢复。6.4 安全使用建议最小权限原则只在需要时才启用这个MCP服务器。不使用时可以从Claude Desktop的配置中移除或注释掉。隔离环境考虑在专用的用户账户或虚拟机中运行特别是当你用它来测试未知的AI提示或自动化脚本时。审计日志关注服务器和Claude Desktop的日志输出了解AI正在执行哪些操作。未来可以扩展服务器让它将所有操作记录到审计日志文件中。理解风险授予辅助功能权限意味着拥有该权限的进程可以模拟你的一切输入。请确保你信任加载此服务器的AI客户端和所使用的AI模型。这个项目打开了一扇通往未来人机协作的大门。它不再是一个遥不可及的研究概念而是一个可以在今天就用起来的、相对成熟的基础设施。从我个人的使用体验来看最大的挑战往往不在技术本身而在于如何设计出安全、可靠、符合直觉的交互流程让AI的“手”能精准地执行人类“大脑”的意图。这需要我们在工具层之上投入更多精力去设计提示词、规划任务步骤、处理异常情况。但无论如何computer-use-mcp-server已经为我们铺好了最关键的第一块基石。