关于 mcp-osascript
mcp-osascript 是用于自动化 macOS 应用和系统界面的 MCP 服务。它提供类型化工具来控制常见界面,并包含输入校验、权限提示和脚本执行防护。
主要功能
- 01控制窗口、菜单和键盘
- 02读取和写入剪贴板文本
- 03查看 Safari、Chrome 和 Arc 标签页
- 04截取屏幕、区域或应用窗口
- 05管理应用、文件和 Shortcuts
- 06检查权限并运行 AppleScript 或 JXA
适用场景
- 01移动或调整应用窗口大小
- 02查看浏览器标签页或复制当前网址
- 03浏览应用菜单并选择菜单项
- 04截图或运行 Apple Shortcut
MCP 相关
向 MCP 客户端提供 18 个类型化的 macOS 自动化工具,涵盖应用、窗口、菜单、键盘、剪贴板、浏览器标签页、截图和 Shortcuts 操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
让 Claude 控制你的 Mac。 移动窗口、点击菜单、输入文本、读取剪贴板、管理浏览器标签页、截屏、运行快捷指令——18 个带类型的工具,并提供输入验证和安全防护。
已作为 io.github.m0rvayne/mcp-osascript 收录于 官方 MCP Registry

快速开始
Claude Desktop — 一键安装。 从最新版本下载 mcp-osascript-1.1.3.mcpb,然后双击。Claude Desktop 会自行安装扩展。
或者手动将其添加到配置中:
{
"mcpServers": {
"osascript": {
"command": "npx",
"args": ["-y", "mcp-osascript"]
}
}
}
将其添加到 Claude Desktop 配置中(Settings → Developer → Edit Config),重启 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
# then use: "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‘编辑’菜单中的所有项目” | 检查菜单栏内容 |
| “关闭 Terminal 的第二个窗口” | 根据索引定位指定窗口 |
| “截取 Safari 窗口的屏幕截图并保存到桌面” | 仅截取该窗口,而非整个屏幕 |
| “我的 Slack 窗口在哪个显示器上?” | 读取显示器几何信息和窗口位置 |
| “隐藏除编辑器之外的所有内容” | 隐藏应用,但不退出它们 |
| “运行我的‘Daily Standup’快捷指令” | 按名称调用 Apple 快捷指令 |
工具
18 个类型化工具,每个工具都具备输入验证、错误分类和基于权限的错误消息。
| 工具 | 功能 | 权限 |
|---|---|---|
check_permissions | 报告已授予的权限及每项权限解锁的功能 | 无 |
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 | 列出、移动、调整大小、最小化、全屏显示或关闭窗口 | 辅助功能 |
get_displays | 列出显示器,包括位置、尺寸及主显示器 | 无 |
app_menu | 列出或点击任意应用中的菜单项 | 辅助功能 |
screenshot | 截取整个屏幕、某个区域或应用窗口 | 屏幕录制 |
app_visibility | 隐藏、取消隐藏或退出应用 | 辅助功能 |
file_open | 打开文件或文件夹,可选择指定应用 | 无 |
run_shortcut | 列出或运行 Apple Shortcuts | 无 |
自动纠正菜单
当 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(880★) | peakmojo(464★) | |
|---|---|---|---|
| 经过验证的类型化工具 | 18 | 2(通用) | 1(通用) |
| URL 方案允许列表 | http/https/mailto | 无 | 无 |
| 环境变量隔离(子进程) | 仅 PATH+HOME+LANG | 完整的 process.env | 完整的 process.env |
| 进程组终止(无孤儿进程) | SIGTERM→SIGKILL | 无 | 无 |
| 错误信息清理(路径、令牌) | 是 | 否 | 否 |
| 原型污染防护 | Object.create(null) | 否 | 否 |
| 自动纠正菜单点击 | 是 | 否 | 否 |
| 集成测试 | 84 | 0 | 0 |
| 在 CI 中运行测试 | 是 | 否 | 否 |
| 通过红队审计 | 4 | 0 | 0 |
| 不可信输出隔离 | 是 | 否 | 否 |
| 标准输入管道传递(无需临时文件) | 是 | 临时文件 | 临时文件 |
星标数量衡量的是受欢迎程度,而非质量——这两个替代项目都比本项目早数月出现。上表列出的是实际使用中存在差异的方面。
安全审计
已通过四轮红队审计(由作者委托对抗性 Agent 针对源代码进行测试,并非第三方认证)。最近一轮审计针对 v1.1.2,由三个并行 Agent 分别检查 Shell 相关接口、AppleScript 转义和信息泄露。审计发现了六个实际缺陷,包括一个会悄悄使另一个工具的方案允许列表失效的工具,以及一个可能泄漏并导致服务死锁的并发槽位。所有问题均已修复,并附有回归测试。escapeAS 已通过真实的 osascript 针对 13 个字符串逃逸候选项进行验证,没有任何一个能够逃逸。
权限
工具分为三个权限级别:
- 无需权限 — 剪贴板、通知、URL、应用、文件、显示器、快捷指令。可立即使用。
- 自动化 — 浏览器标签页、最前台应用。macOS 会针对每个浏览器提示一次。
- 辅助功能 — 键盘、窗口、菜单、隐藏/取消隐藏。只需在 系统设置 → 隐私与安全性 → 辅助功能 中授权一次。
- 屏幕录制 — 仅用于截图。在 系统设置 → 隐私与安全性 → 屏幕录制 中授权。
让 Claude 运行 check_permissions,它会告诉你上述权限中哪些已获授权、每项权限会解锁哪些工具,以及剩余权限应打开哪个设置面板。权限探测为只读操作,绝不会触发权限提示。
缺少权限时,服务会明确告知你该怎么做:
"Accessibility permission required. Grant access to 'osascript'
in System Settings > Privacy & Security > Accessibility."
测试
npm test
84 项集成测试覆盖全部 18 个工具,包括输入验证、安全边界(URL 方案拦截、原型污染、脚本大小限制)、超时强制执行、权限错误处理,以及针对安全审计中每项发现的回归测试。
安全与架构
安全
run_osascript可执行任意代码——这是有意为之。MCP 客户端(Claude)是信任边界。- 脚本通过标准输入传递给
/usr/bin/osascript执行——不创建临时文件,不存在 TOCTOU 竞态条件。 - 脚本大小上限:50 KB。输出上限:50K 个字符;在 UTF-8 字符边界处截断(非拉丁字符输出不会出现乱码)。
- 错误消息经过清理——会移除文件系统路径、令牌和密码。
- 子进程仅获得最小环境变量:
PATH、HOME、LANG——不会泄露 API 密钥或机密信息。 - URL 方案允许列表——
file://、smb://、vnc://、javascript:均会被拦截。 - 处理程序分派使用
Object.create(null)——防止原型污染。 - 外部来源的文本(浏览器标签页标题、窗口标题、菜单项、剪贴板内容)会放在明确的
<untrusted-data>封装中返回,因此网页即使更改自身标题,也无法将指令偷偷带入模型上下文。 file_open会拒绝任何解析为 URL 的内容——open(1)既会解析 URL,也会解析路径,因此如果没有这项检查,它会悄无声息地绕过open_url的方案允许列表。screenshot不会覆盖现有文件,除非设置overwrite: true;文件扩展名必须与格式匹配。- 所有构建列表的工具都会移除应用提供名称中的
|、CR 和 LF,因此经过构造的窗口或标签页标题无法伪造记录。
可靠性
- 超时时终止进程组——SIGTERM → 等待 2s → SIGKILL。不会留下孤儿进程。
- 并发信号量——最多同时运行 5 个 osascript 进程。
- 优雅关闭——使用
server.close(),并设有 10s 后强制退出的安全机制。 - 错误分类——将 macOS 错误代码(-1728、-1743、-25211)解析为可执行的提示。支持英语和俄语区域设置。
要求
- macOS 13+(Ventura 或更高版本)
- Node.js 18+
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。