工具与行动提供方
MCP 服务和其他行动提供方如何接入,什么算高危,角色什么时候先问你,以及它自己能做什么。
DeskMate 的角色能做的一切都是行动,由行动提供方提供。思考循环看到的是一张扁平的工具列表,每个工具来自哪里,对它没有区别。
| 提供方 | 是什么 |
|---|---|
| MCP 服务 | 你在控制台工具页添加的任何 Model Context Protocol 服务。 |
computer | 内置。通过辅助功能接口读取和操作 Mac 上的应用。见 Helper 协议。 |
| 内置行动 | recall(记忆)、look(看前台窗口)、gesture、set_reminder 等。 |
通过兼容 Neuro SDK 的端点接入游戏,计划作为第四个提供方(ADR-0003);它还没有实现,所以暂时没有对应的指南。
添加 MCP 服务
DeskMate 是 MCP 客户端,支持:
- stdio 服务:一条由 DeskMate 启动、通过 stdin/stdout 通信的命令;
- Streamable HTTP 服务:一个 URL,认证只能靠你填写的 header 值。没有 OAuth 流程。
不支持旧的 SSE 传输,也不支持 MCP 的可选功能 elicitation 和 sampling;需要用户输入的调用会失败,原因会回到任务里。
在工具页粘贴各服务为 Claude Desktop 写的那种 mcpServers JSON。整份文件,或只粘贴 mcpServers 里面的对象,都可以:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/Documents"]
},
"docs": {
"type": "http",
"url": "https://example.com/mcp",
"headers": { "Authorization": "Bearer …" }
}
}
} - 名称是 1 到 40 个字符,可以用字母、数字、
_、.和-。 type可以省略:有command的是 stdio,有url的是 HTTP。- 保存之前 DeskMate 会先连一次;连不上就什么都不保存,并告诉你原因。
env和headers的值和你的 API Key 存在一起,不会再发回控制台。- 从 Finder 启动的应用拿不到你 shell 的
PATH,所以启动 stdio 服务之前,DeskMate 会从你的登录 shell 读一次。 - 添加服务就是授予它权限。每个服务都有开关,工具列表跟随服务发来的
listChanged通知更新。
模型看到的每个工具叫 <server>__<tool>,最长 64 个字符,a-z A-Z 0-9 _ - 之外的字符换成 _。
Schema
工具的输入 schema 在注册时会降到一个通用的 JSON Schema 子集。降不下来的工具不会显示给模型。
什么算高危
满足下面任何一条,一次调用就是高危:
- 提供方说它是。对 MCP 工具来说,就是工具的注解里既没有声明
readOnlyHint: true,也没有声明destructiveHint: false。没有任何注解的工具算高危。 - 你把它标成了高危。
- 仅对
computer提供方:即将按下的控件命中语义规则,比如名为 Send、Delete、Buy、Submit 或 Pay 的按钮(中英文都算)、按回车,或替换已有的文字。MCP 工具不适用这条规则,因为搜索词会造成太多误判。
你的覆盖优先:在工具页,可以把任何工具设为总是询问、从不询问或关闭,也可以把整个服务设为信任。添加服务之后,DeskMate 会立刻列出它的哪些工具算高危,方便你当场调整。
写 MCP 服务的作者
如果你写 MCP 服务,请给工具加上注解。带 readOnlyHint: true 和 openWorldHint: false 的只读工具,运行时不会有任何提示;有破坏性的工具应当声明出来。
确认请求
高危调用会产生一个确认请求:角色身边出现一张卡片,写着任务、服务和工具、原因和参数,带拒绝和批准两个按钮。同样的请求也会列在控制台的任务页。
- 批准只能点击完成。 不接受语音,所以回声或旁人都批准不了任何事。
- 没有超时。取消任务会撤下请求。
- 任务在等批准时,排在后面的任务也跟着等。
- 如果角色窗口是隐藏的,新请求会把它显示出来(不抢焦点)。
防泄露
只读不等于安全:一个网页可以劝模型去读本地文件,再通过一个能联网的“只读”工具把它送出去。所以,对每个任务:
- 一旦任务用过一个不接触外部世界的工具(
openWorldHint: false,比如读本地文件),或者读过某个应用的窗口, - 之后每一次对可能联网的工具(
openWorldHint不是false)的调用都需要确认,请求里会写明原因。
对 computer 来说,单位是场所:一个应用,或浏览器里的每一个网站。在一个场所读、在另一个场所输入,需要确认;在同一个场所读和输入,不需要。这条规则优先于服务的“信任”设置和单个工具的覆盖。
角色自己能发起什么
任务是谁发起的,决定了规则(ADR-0006):
| 发起者 | 允许 | 确认 |
|---|---|---|
| 你(你提出的,或它提议后你答应的) | 任何已授权的非高危工具 | 高危调用和防泄露会来问你 |
| 角色自己,且仅在自主档 | 只有不可能高危的工具;对 computer 只有读取,并且只能在你已授权的应用里 | 从不询问。 高危工具对它不可见;如果防泄露会触发,调用被拒绝,汇报里会告诉你该如何去要 |
| 角色在其他任何档 | 什么都不能做,只能口头提议,你答应后任务就算你发起的 | — |
“从不询问”的理由:角色开口是因为你屏幕上的东西,而网页可能试图引导它。如果这些任务也能弹出批准卡片,外部内容就能制造出一连串卡片,而一连串的卡片会训练人不看就点。
其他限制:同一时间运行一个任务,最多 3 个排队;一个任务最多 40 步工具调用、10 分钟工作时间(等批准的时间不算);每个工具结果在模型读到之前会截到 8,000 个字符;自发的任务距离上一个至少间隔 30 分钟。⌃⌥⌘Esc 是紧急停止:取消任务并停止说话。
给 computer 授权应用
computer 按应用授权,分三级:只读、可操作和信任(按钮名和回车不再询问)。任务第一次碰某个应用时,会弹出一张卡片来问;批准后该应用处于可操作。你可以在工具页修改或撤销。DeskMate 自己、系统设置、终端、脚本编辑器、钥匙串访问和密码管理器永远不能被授权。
最后更新于