DeskMate

工具与行动提供方

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 子集。降不下来的工具不会显示给模型。

什么算高危

满足下面任何一条,一次调用就是高危:

  1. 提供方说它是。对 MCP 工具来说,就是工具的注解里既没有声明 readOnlyHint: true,也没有声明 destructiveHint: false。没有任何注解的工具算高危。
  2. 你把它标成了高危。
  3. 仅对 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 自己、系统设置、终端、脚本编辑器、钥匙串访问和密码管理器永远不能被授权。

最后更新于