动作继电器
MCP服务器,将macOS App Intents作为工具公开。将其指向任何发布app Intents的应用程序,它将发现每个意图,解析参数模式,并允许您从任何MCP客户端调用它们。
不需要预先创建快捷方式。每个应用程序都没有手动编码的操作。它读取苹果工具链烘焙到每个应用程序中的意图元数据 .app 捆绑并自动生成工具定义。
运作原理
- 发现 --发现
Metadata.appintents/extract.actionsdata在应用程序包内,将JSON解析为类型化的意图/参数元数据 - 模式生成 --将每个意图转换为具有适当JSON模式的MCP工具(类型、必需/可选、默认值、枚举)
- 执行 --构建一个单动作工作流plist并将其发送到
BackgroundShortcutRunner.xpc通过XPC,Shortcuts.app内部使用的管道相同 - 输出 --从NSKeyedArchiver响应中提取返回值,并将其作为MCP工具内容返回
需求
- macOS(苹果硅)
- Swift 6.0+
- SIP和AMFI已禁用 用于原始工作流执行(选项B)。没有这个,你只能发现意图,而不能执行它们。
- 签名身份
com.apple.shortcuts.background-running权限(构建脚本会自动处理)
构建
./build.sh这运行 swift build 如果AMFI被禁用,则使用正确的权限对二进制文件进行签名。
用法
列出发现的意图
action-relay Notes --list
action-relay UTM --list
action-relay /path/to/SomeApp.app --list接受应用程序名称(在中搜索 /Applications 和 /System/Applications)、捆绑ID或直接路径。
以MCP服务器运行
action-relay Notes启动stdio MCP服务器,将每个发现的意图作为工具公开。
添加到克劳德代码
claude mcp add my-notes-tools -- /path/to/action-relay Notes然后重新启动Claude Code。工具会自动显示。
它是什么样子的
$ action-relay UTM --list
[
{
"name": "UTMStartActionIntent",
"description": "Start Virtual Machine — Start a virtual machine.",
"inputSchema": {
"type": "object",
"properties": {
"vmEntity": { "type": "string" },
"isRecovery": { "type": "boolean" },
"isDisposible": { "type": "boolean" }
},
"required": ["vmEntity", "isRecovery", "isDisposible"]
}
},
...
]Notes为您提供了47种工具。UTM给你9分。任何带有app Intents的应用程序都可以使用。
局限性
- 执行需要禁用SIP+AFMI(这是一个开发/研究工具,不是你会发布的东西)
- 实体参数(如“哪个VM”或“哪个注释”)当前采用字符串ID——目前还没有实体解析,因此您需要知道实体标识符
- 文件参数(
IntentFile)作为路径字符串传递——对于某些应用程序,实际的编码可能需要更多的工作 - 苹果正在将原生MCP支持构建到App Intents中(在macOS Tahoe 26.1测试版中发现),这最终将使这变得没有必要
项目结构
Package.swift
Sources/action-relay/
ActionRelay.swift # CLI entry + MCP server
Discovery.swift # extract.actionsdata parser
SchemaGenerator.swift # metadata → MCP tools
WorkflowBuilder.swift # workflow plist builder
IntentExecutor.swift # async XPC client
OutputExtractor.swift # NSKeyedArchiver → MCP content
build.sh # build + sign
example-app/ # test app with HelloWorldIntent + GreetIntent
research/ # reverse engineering notes, Frida scripts, prototypes