m0rvayne/mcp-osascript

GitHub: m0rvayne/mcp-osascript

一个安全优先的 macOS MCP 服务器,让 AI 客户端通过 12 个类型化工具控制 Mac 的窗口、菜单、键盘和剪贴板等系统功能。

Stars: 0 | Forks: 0

# mcp-osascript [![npm 版本](https://img.shields.io/npm/v/mcp-osascript)](https://www.npmjs.com/package/mcp-osascript) [![macOS 13+](https://img.shields.io/badge/macOS-13%2B-blue)](https://support.apple.com/macos) [![Node 18+](https://img.shields.io/badge/node-18%2B-green)](https://nodejs.org) [![许可证: MIT](https://img.shields.io/badge/license-MIT-yellow)](LICENSE) [![测试: 41 通过](https://img.shields.io/badge/tests-41%20passed-brightgreen)](#testing) **让 Claude 控制你的 Mac。** 移动窗口、点击菜单、输入文本、读取剪贴板、管理浏览器标签页 —— 包含 12 个带有类型检查、输入验证和安全防护的工具。 ![演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/0b7347f557155947.gif) ## 快速开始 ``` { "mcpServers": { "osascript": { "command": "npx", "args": ["-y", "mcp-osascript"] } } } ``` 将此内容添加到你的 Claude Desktop 配置中(`设置 → 开发者 → 编辑配置`),重启 Claude,即可开始使用。
其他客户端(Cursor、VS Code、Claude Code)的配置 **Cursor / VS Code (Copilot)** ``` { "mcpServers": { "osascript": { "command": "npx", "args": ["-y", "mcp-osascript"] } } } ``` **Claude Code** ``` claude mcp add osascript -- npx -y mcp-osascript ``` **从源码构建(开发)** ``` git clone https://github.com/m0rvayne/mcp-osascript.git cd mcp-osascript && npm install # 然后使用:"command": "node", "args": ["/path/to/mcp-osascript/server/index.js"] ```
## 尝试这些提示词 安装完成后,向 Claude 提问: | 提示词 | 执行效果 | |--------|-------------| | *"打开 Safari 并显示我现有的标签页"* | 启动 Safari,读取所有标签页的标题和 URL | | *"将 Finder 窗口移至我屏幕的左半部分"* | 调整大小并重新定位窗口 | | *"在 Keynote 中点击 文件 → 导出为 PDF"* | 导航至菜单栏并点击该项 | | *"复制当前 Chrome 活动标签页的 URL"* | 读取浏览器标签页,找到当前活动的标签页 | | *"在当前激活的文本框中输入 'Hello World'"* | 模拟键盘输入 | | *"完成后显示一个通知"* | 弹出原生 macOS 横幅通知 | | *"我现在正在使用什么应用?"* | 返回最前端应用的名称和 Bundle ID | | *"按下 Cmd+Shift+4"* | 触发截图快捷键 | | *"列出 VS Code 中“编辑”菜单下的所有项目"* | 内省并遍历菜单栏 | | *"关闭终端的第二个窗口"* | 按索引指定特定的窗口进行操作 | ## 工具 12 个带有类型检查的工具,每个工具都具备输入验证、错误分类和权限感知的错误提示。 | 工具 | 功能说明 | 所需权限 | |------|-------------|------------| | `run_osascript` | 执行任意 AppleScript 或 JXA 脚本 | 无 | | `get_clipboard` | 以文本形式读取剪贴板 | 无 | | `set_clipboard` | 将文本写入剪贴板 | 无 | | `send_notification` | 显示 macOS 通知横幅 | 无 | | `open_url` | 在浏览器中打开 URL(仅限 http/https/mailto) | 无 | | `open_app` | 启动应用或将其置于最前 | 无 | | `get_frontmost_app` | 获取当前活动应用的名称 + Bundle ID | 自动化 | | `get_browser_tabs` | 列出 Safari、Chrome 或 Arc 中的标签页 | 自动化 | | `type_text` | 在当前激活的应用中输入文本(最多 500 个字符) | 辅助功能 | | `press_key` | 按下带有修饰键的按键(cmd+c, return, f5) | 辅助功能 | | `manage_windows` | 列出 / 移动 / 调整大小 / 最小化 / 全屏 / 关闭 | 辅助功能 | | `app_menu` | 列出或点击任何应用中的菜单项 | 辅助功能 | ## 自我修正菜单 当 Claude 尝试点击一个不存在的菜单项时,服务器会自动返回该层级可用的项列表 —— 以便 Claude 可以使用正确的名称重试。没有其他 MCP 服务器能做到这一点。 ``` User: "Click File → Export as PDF in Preview" Claude: calls app_menu click ["File", "Export as PDF"] Server: "Menu item 'Export as PDF' not found in 'File'. Available: ['New from Clipboard', 'Open...', 'Close', 'Save', 'Duplicate', 'Rename...', 'Export...', 'Export as PDF...']" Claude: calls app_menu click ["File", "Export as PDF..."] Server: "Clicked: File > Export as PDF..." ``` ## 为什么选择 mcp-osascript? | | mcp-osascript | steipete (824★) | peakmojo (463★) | |---|:---:|:---:|:---:| | 带有验证的强类型工具 | **12** | 2(通用型) | 1(通用型) | | URL scheme 白名单 | **http/https/mailto** | 否 | 否 | | 环境变量隔离(子进程) | **仅限 PATH+HOME+LANG** | 完整的 process.env | 完整的 process.env | | 进程组终止(无孤儿进程) | **SIGTERM→SIGKILL** | 否 | 否 | | 错误信息脱敏(路径、token) | **是** | 否 | 否 | | 原型污染防护 | **Object.create(null)** | 否 | 否 | | 自我修正菜单点击 | **是** | 否 | 否 | | 集成测试 | **41** | 0 | 0 | | Stdin 管道传输(无临时文件) | **是** | 临时文件 | 临时文件 | ## 权限 工具分为三个层级运行: - **无需权限** —— 剪贴板、通知、URL、应用。可立即使用。 - **自动化 (Automation)** —— 浏览器标签页、最前端的应用。macOS 会在每个浏览器中提示一次。 - **辅助功能 (Accessibility)** —— 键盘、窗口、菜单。在 **系统设置 → 隐私与安全性 → 辅助功能** 中授权一次即可。 当缺少权限时,服务器会准确告诉你需要做什么: ``` "Accessibility permission required. Grant access to 'osascript' in System Settings > Privacy & Security > Accessibility." ``` ## 测试 ``` npm test ``` 包含 41 个集成测试,覆盖了全部 12 个工具 —— 包括输入验证、安全边界(URL scheme 阻断、原型污染防护、脚本大小限制)、超时强制执行以及权限错误处理。
安全与架构 ### 安全性 - `run_osascript` 会执行任意代码 —— 这是设计使然。MCP 客户端(Claude)即为信任边界。 - 脚本通过 stdin 管道传输至 `/usr/bin/osascript` —— 无临时文件,不存在 TOCTOU 竞态条件。 - 脚本大小:最大 50 KB。输出:最大 5 万字符(超出将截断)。 - 错误信息经过脱敏处理 —— 文件系统路径、token 和密码等敏感信息会被剔除。 - 子进程仅获取最少的环境变量:仅限 `PATH`、`HOME`、`LANG` —— 绝不会泄露 API 密钥或其他敏感信息。 - URL scheme 白名单 —— `file://`、`smb://`、`vnc://`、`javascript:` 均被拦截。 - Handler 分发使用 `Object.create(null)` —— 杜绝原型污染。 ### 可靠性 - 超时时执行进程组终止 —— SIGTERM → 2 秒宽限期 → SIGKILL。确保无孤儿进程残留。 - 并发信号量 —— 最多允许同时运行 5 个 osascript 进程。 - 优雅关闭 —— 执行 `server.close()` 并附带 10 秒强制退出的安全保障。 - 错误分类 —— 将 macOS 错误代码(-1728、-1743、-25211)解析为可操作的提示信息。支持英语和俄语环境。
## 环境要求 - macOS 13+(Ventura 或更高版本) - Node.js 18+ ## 许可证 MIT
标签:AI模型上下文协议, AppleScript, Claude, CVE检测, MITM代理, 暗色界面, 桌面自动化, 自定义脚本