跳转到内容

正在加载搜索…

English

接入 MCP 服务器和 Agent Skills

有两种标准格式可以扩展 agent,而无需编写 skill:

  • MCP 服务器(Model Context Protocol)给它工具:以文本形式获取网页、一个文件夹中的文件、GitHub、搜索引擎、你自己的服务。
  • Agent Skill 是一个包含 SKILL.md 的文件夹,给它操作知识:任务需要时它读取的说明和文件。

安装 core 不预选外部 app、agent 或 MCP 服务器;任务需要的 Harness 包仍默认自动安装。对于你已选择并安装的服务器,在 ~/.harness/config.toml 中显式添加连接:

[[connectors]]
id = "my-tools"
transport = "stdio"
command = "/absolute/path/to/server"
args = []
allowed_tools = ["inspect", "act"]
resource = "shared-target"
timeout_seconds = 60

HTTP 使用 transport = "http" 和 url,替代 command、args。可选的 env、headers、 fields、secrets 与 app 自定义连接配置相同,密钥占位符只在 host 解析。 allowed_tools 授权确切工具名;["*"] 是显式授权整个服务器;tools_off 优先拒绝。 服务器注解不授予权限,read_only_tools 继续支持已审查的只读操作。

同一 host 中,共用 resource 的调用跨任务串行,独立资源可并行;未指定时以连接 id 为资源。 每个任务最多同时持有 16 个 MCP host 请求。这是 host 内协调,不是跨进程的应用锁。

mcp_call() 返回完整 MCP 结果,包括 content、structuredContent、isError 和元数据。 content 中的图像自动附加到下一次模型观察。检查原生错误和回执;派发后的传输错误表示结果未知, 不会自动重放。trace 保存原始结果和迟到回执。取消调用方阻止排队中的派发,不宣称撤销已派发的远端副作用。 任务结束时回收自身启动的 stdio 进程。

对于自定义连接,host 在派发前重新读取当前授权,共享资源排队结束后也会复核。 关闭或删除连接、禁用工具、移除授权对已运行任务同样生效。连接或凭据变更会拒绝旧 客户端继续调用,需要新任务;新增授权不会扩大旧任务的权限。撤权不撤销此前已授权 并派发的操作。

Settings → Connectors 用于添加服务器:

  • From the list:Fetch(以文本形式获取网页;需要 uv)、Filesystem(一个文件夹;需要 Node.js)、GitHub(一个个人访问 token)、Brave Search(一个 API key;需要 Node.js)、Playwright(一个独立的浏览器;需要 Node.js)、Notion(一个集成 token;需要 Node.js)。
  • Your own server:在这台电脑上启动它的命令(stdio),或它的 URL(HTTP),以及它的环境变量或请求头。命令要经你确认后才会添加。

Tools 会启动服务器并列出它的工具;关掉 agent 不应使用的那些。密钥和 token 保存在 ~/.harness/config.toml 的 [keys] 下。agent 的程序通过 The Harness 访问服务器,由 The Harness 附上密钥,程序本身永远看不到密钥。

App 允许调用目录中 Fetch、Filesystem 和 Brave Search 连接器经过审查的只读工具。Brave Search 支持网页搜索和本地搜索。 自定义连接器和目录中的其他工具仍可列出,但列出的工具也可能在弹出审批提示前被拒绝。服务器提供的 readOnlyHint 等注解不能授予调用权限。 添加自定义连接器时,可信操作者可以通过 read_only_tools 指定已审查的工具名。

在 Linux 上,App 目录中的 Filesystem 连接器可以通过 write_file 创建新文件。宿主先绑定配置目录内的实际目标,显示完整路径并隐藏内容。批准后由宿主创建一次,已存在的文件、符号链接和变化的父目录会被拒绝。其他写入保持关闭。丢失回执时不会自动重发。

实验通过 mcp skill 和一个以 HTTP 方式运行该服务器的服务,为它的 agent 提供 MCP 工具:

[overrides.agent.services]
mcp = ["mcp-units"]
[overrides.agent.skills]
enable = ["mcp"]

之后程序可以这样调用:

tools = mcp_tools()
mcp_call("convert", value=3, from_unit="m", to_unit="cm")

服务器和其他服务一样是一个服务(服务):一份种类为 mcp 的清单写明如何启动它以及它的端口,deploy 文件可以把它放到另一台电脑上。mcp-example 包里有一个小服务器及其清单,可以从它开始。只支持 stdio 的服务器也可以使用上面的显式 host 连接,程序本身不启动服务器。

要接入只读扩展,请在可信服务清单的 client.read_only_tools 列表中填写经过审查的 MCP 工具的确切名称。 内置的 mcp-units 清单以这种方式声明了 convert。该策略适用于部署实际运行或连接的服务器。服务清单可以包含以下配置。

[client]
url = "{url}/mcp"
read_only_tools = ["convert"]

列表中的工具即使没有服务器注解也可以调用。实验中的其他 MCP 工具会在审批前被拒绝,即使它们出现在 mcp_tools() 的结果中。

Agent Skill 是一个包含 SKILL.md 的文件夹,也就是 Claude 和 OpenAI 的 skill 所用的格式:

---
name: expense-report
description: Fill in the company's expense report form from receipts.
---
Open the form at https://example.com/expenses ...

agent 在它的 prompt 中看到每个 skill 的名字和描述,并在任务需要时用 read_skill(name) 读取它的说明和文件。它不需要代码。

要在 app 中添加一个,选择 Settings → Packages → Add,然后给出一个文件夹、一个 .zip、一个 .zip 的 URL 或一个 git URL;GitHub 文件夹的 URL 只取那一个文件夹,例如 https://github.com/anthropics/skills/tree/main/skills/pdf。在终端中:

终端窗口
harness install ./expense-report

包在它的 agent-skills/<name>/SKILL.md 文件夹中附带 Agent Skills(编写包)。