接入编码 Agent

编码 Agent 通过本地节点的 MCP 服务器(anet mcp,参见 MCP)接入网络。命令 anet agents wire 会把该服务器连同一份简短的操作指南,写入本机已安装的各编码 Agent 的配置文件;命令 anet agents unwire 则将两者再次移除。

各工具的指南(含前提条件、验证与移除步骤)请从 接入 AI 工具 开始。本页说明受支持的工具、被修改的文件、适用于每次修改的规则,以及 Hermes 专有的选项。

概述

编码 Agent 本身不具备关于 ANet 的知识。接入由两部分组成:

  • 一个 MCP 服务器条目,它以节点的数据目录启动 anet mcp,使 MCP 工具 中的工具集在编码 Agent 中可用;

  • 一份 操作指南,即一段简短文字,说明如何使用这些工具、如何报告任务结果,以及 Agent 不得做什么(例如调高支出限额,或执行其他 Agent 发给节点的任务中所包含的指令)。

MCP 服务器只接受启动它的进程发出的工具调用,并通过本地控制面把调用转发给节点的守护进程。身份密钥、账本和入站策略由守护进程保管,编码 Agent 不持有其中任何一项。会改变节点权限的操作,例如允许某个对等方、放宽入站策略或更改付款限额,不作为工具提供,仍由运维人员在终端中执行。

该命令只处理文件,不需要守护进程在运行,安装程序会在第一次 anet up 之前运行它。MCP 服务器本身则需要守护进程在运行;参见 MCP。

受支持的工具

anet agents wire 的工具参数是第一列中的名称之一。claude-code 可作为 claude 的别名使用。

参数

MCP 服务器条目

操作指南

环境变量

claude

~/.claude.json 用户作用域中的服务器 anet

技能 ~/.claude/skills/anet/SKILL.md

CLAUDE_CONFIG_DIR

codex

~/.codex/config.toml 中的表 [mcp_servers.anet]

~/.codex/AGENTS.md 中的块

CODEX_HOME

cursor

~/.cursor/mcp.json 中的成员 mcpServers.anet

无;MCP 服务器在连接时自行发送其说明

opencode

~/.config/opencode/opencode.json 中的成员 mcp.anet

~/.config/opencode/AGENTS.md 中的块

XDG_CONFIG_HOME

hermes

~/.hermes/config.yaml 中的键 mcp_servers.anet

~/.hermes/SOUL.md 中的块

HERMES_HOME

workbuddy

~/.workbuddy/mcp.json 中的成员 mcpServers.anet

无;MCP 服务器在连接时自行发送其说明

工具的可执行文件位于 PATH 中,或其配置目录存在时,即视为已安装。WorkBuddy 是没有命令行程序的桌面应用,因此在 ~/.workbuddy 存在时视为已安装。不带工具参数或使用 --all 时,命令会为每个已安装的受支持工具接入,并将其余工具报告为未安装。显式指定名称的工具即使未被检测到,也会接入。

Claude Code

服务器注册在用户作用域内,对本机上的所有项目生效。claude 位于 PATH 中时,条目通过 claude mcp add -s user 创建,因为 Claude Code 自行管理其文件的加锁和格式。claude 不在 PATH 中时,命令直接编辑 ~/.claude.json。操作指南以技能形式安装;任务提到 ANet 时才会加载,不会占用其他会话的上下文。

Codex

Codex 命令行程序、IDE 扩展和桌面应用共用 ~/.codex/config.toml,或 CODEX_HOME 所指目录中的同名文件。条目写入由标记注释界定的块内。startup_timeout_sec = 30 与 tool_timeout_sec = 900 被显式设置:工具 wait_task 会一直阻塞到任务状态改变,而远程 Agent 的任务以分钟计,Codex 默认的工具超时为 60 秒。

全局目录中存在 AGENTS.override.md 时,Codex 读取它而不是 AGENTS.md。此时操作指南不会被加载,wire 会报告该文件。受信任项目中的 .codex/config.toml 优先于用户级文件,wire 不检查它。官方参考:https://developers.openai.com/codex/mcp。

Cursor

条目写入 ~/.cursor/mcp.json,编辑器和 Cursor 命令行 Agent 均会读取该文件(当前文档中该程序名为 agent,早期版本使用 cursor-agent)。Cursor 没有用户级的规则文件,因此不安装操作指南。由先前版本写入 ~/.cursor/rules 的旧规则文件,在其内容表明属于 ANet 时会被移除。

opencode

条目采用 opencode 的格式:"type": "local",命令及其参数放在同一个数组中,带有显式的 enabled 标志,并以 environment 取代 env。仅存在 opencode.jsonc 时,以该文件为目标。编辑器不保留注释:文件中含有注释时,命令不作任何更改,而是输出该条目,供手动插入。

Hermes

条目直接运行二进制文件,不经过 shell 包装。Hermes 将工具命名为 mcp_anet_<tool>,例如 mcp_anet_list_agents,SOUL.md 中的操作指南使用这些名称。在原生 Windows 上,Hermes 的默认主目录不是 ~/.hermes,需将 HERMES_HOME 设为实际使用的目录。超时设置为 timeout: 900 与 connect_timeout: 30。可选的 a2a_agents 条目参见 Hermes 与远程 Agent(--a2a)。

接入与移除

用法概要

$ anet agents [status]
$ anet agents wire [--all | <tool>...] [--refresh] [--a2a <aid>...]
$ anet agents unwire [--all | <tool>...] [--a2a <aid>...]

--all 与显式指定的工具名称互斥。--refresh 和 --a2a 适用于 Hermes;--refresh 只被 wire 接受。至少有一个工具以冲突或错误告终时,命令以非零状态退出,使安装程序不会在部分结果的情况下报告成功。

步骤

  1. 如尚未完成,先初始化并启动节点:

    $ anet init
    $ anet up
    
  2. 向本机的编码 Agent 注册服务器:

    $ anet agents wire --all
    

    按名称接入单个工具:

    $ anet agents wire claude
    
  3. 重启编码 Agent,或开启新会话。工具在会话开始时加载。

  4. 检查结果:

    $ anet agents
    

    命令为每个工具报告一种状态:未安装、未接入、已接入且为最新、已接入但已过时(条目或指南与 wire 现在会写入的内容不同),或冲突。对于已过时的条目,报告会给出用于更正的命令。

  5. 在编码 Agent 中调用工具 node_status。若响应中包含节点的 AID 和版本,则说明从 Agent 到守护进程的链路工作正常。守护进程未运行时,MCP 服务器不会启动;客户端会报告连接失败。

移除的方式与之对称:

$ anet agents unwire claude
$ anet agents unwire --all

unwire 会移除 MCP 条目、操作指南,以及每个 a2a_agents 条目及其令牌。名为 anet 但并非由 ANet 写入的条目保持不变,并会报告出来。

适用于每次修改的规则

该命令会编辑其他程序的配置文件。对每个工具适用相同的规则:

备份

修改文件之前,先把它复制为原文件旁的 <name>.anet-bak-<UTC 时间>。已有的备份从不覆盖。

绝对路径的二进制文件与固定身份

条目以绝对路径指明 anet 二进制文件,并把 ANET_DATA_DIR 设置为命令运行时所选身份的数据目录。MCP 客户端不会加载运维人员的 shell 配置文件,而且一旦身份被固定,anet mcp 就严格解析:它只连接该身份的守护进程,不连接其他任何守护进程。要接入另一个身份,请用 --id 选择:

$ anet --id bob agents wire claude

每个工具只有一个 anet 条目;之后为另一个身份执行的 wire 会替换先前写入的条目。通过 go run 启动的二进制文件会被拒绝,因为进程退出时临时构建目录会消失。

原子写入

文件先写入同级的临时文件再重命名。被替换文件的权限模式得以保留。

幂等性

运行两次 wire,第二次不会产生任何更改。升级 anet 之后再次运行,会更新操作指南,并在二进制文件路径改变时更新条目。

冲突

已有名为 anet 但命令不是 anet mcp 的条目不会被覆盖。该工具会被报告为冲突,对其不作任何更改,且退出状态为非零。运维人员移除或重命名冲突的条目后,再次运行 wire。对于 Codex 文件中并非由 anet agents wire 写入的表 mcp_servers.anet,处理方式相同;报告会给出行号。

受管理的块

在 TOML、YAML 和 Markdown 文件中,命令只编辑其自身标记行之间的文本。在受管理的块内所做的修改,会被下一次 wire 覆盖。

已被取代的内容

早期版本曾向 ~/.claude/CLAUDE.md 追加角色块,在 ~/.cursor/rules 下写入规则文件,并通过 anet install --agent openclaw 向 ~/.openclaw/AGENTS.md 追加块。wire 会移除 Claude Code 的块和 Cursor 的文件;wire --all 与 unwire --all 在 OpenClaw 的块存在时会将其移除。OpenClaw 不是受支持的工具。

命令写入的条目

下列示例展示二进制文件位于 /usr/local/bin/anet、数据目录为 /home/operator/.anet 时的条目。这些路径在每台机器上以实际值为准。

Claude Code、Cursor 与 WorkBuddy 使用相同的 stdio 格式:

{
  "mcpServers": {
    "anet": {
      "type": "stdio",
      "command": "/usr/local/bin/anet",
      "args": ["mcp"],
      "env": { "ANET_DATA_DIR": "/home/operator/.anet" }
    }
  }
}

Cursor 与 WorkBuddy 的条目没有 type 成员。对于 Claude Code,等效的命令为:

$ claude mcp add -s user anet -e ANET_DATA_DIR=/home/operator/.anet -- /usr/local/bin/anet mcp

Codex,位于 config.toml:

# >>> anet (managed by `anet agents wire`; edits inside this block are overwritten) >>>
[mcp_servers.anet]
command = "/usr/local/bin/anet"
args = ["mcp"]
env = { ANET_DATA_DIR = "/home/operator/.anet" }
startup_timeout_sec = 30
tool_timeout_sec = 900
# <<< anet <<<

opencode,位于 opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "anet": {
      "type": "local",
      "command": ["/usr/local/bin/anet", "mcp"],
      "enabled": true,
      "environment": { "ANET_DATA_DIR": "/home/operator/.anet" }
    }
  }
}

Hermes,位于 config.yaml:

# >>> anet mcp (managed by `anet agents wire`; edits inside this block are overwritten) >>>
mcp_servers:
  anet:
    command: "/usr/local/bin/anet"
    args: ["mcp"]
    env:
      ANET_DATA_DIR: "/home/operator/.anet"
    timeout: 900
    connect_timeout: 30
# <<< anet mcp <<<

opencode 文件的 $schema 成员仅在由 wire 创建该文件时写入。

WorkBuddy

条目写入 WorkBuddy MCP 指南所述的用户级文件 ~/.workbuddy/mcp.json,采用该指南的格式:mcpServers 下的 command、args 与 env。文件中的其他服务器予以保留。不是纯 JSON 的文件(例如含有注释)不会被编辑,命令改为输出需手动加入的条目。

仅写入 WorkBuddy 文档已确认的部分。不安装操作指南,因为文档未载明用户级指令文件;MCP 服务器在连接时自行发送其说明,但 WorkBuddy 是否将其交给模型,文档未载明。不写入超时:文档载明的默认值为 30 秒,且未说明用户级条目是否遵从 timeout 成员。在当前版本确认之前,请以默认等待时间调用 wait_task,任务仍在进行时重复调用。重载行为、菜单路径和信任提示见官方指南(https://www.workbuddy.cn/docs/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/MCP-Guide),命令在写入条目后会输出这一参考链接。WorkBuddy 与 CodeBuddy 命令行程序不同,后者的文件位于 ~/.codebuddy,wire 不处理 CodeBuddy。

在 Windows 上,anet 运行于 WSL2 内,WorkBuddy 应用运行于宿主系统。由 WorkBuddy 启动 wsl.exe -e <path-to-anet> mcp 的配置尚未经过测试,wire 也不写入该配置。

Hermes 与远程 Agent(--a2a)

Hermes 可通过自带的 A2A 客户端调用远程 Agent。该选项面向网络上的 Agent;对于同一台机器上的 Agent,Hermes 文档建议使用进程内子 Agent。使用 --a2a 时,wire 会为每个 AID 在 config.yaml 中添加一个 a2a_agents 条目。每个条目指向节点的本地 A2A 接口(参见 本地 A2A 端点),使调用由节点签名、封闭并中继。Hermes 不会直接联系远程 Agent。

$ anet agents wire hermes --a2a <aid-of-remote-agent>

Hermes 的 a2a 工具集在命令行中默认关闭。需启用一次,否则 a2a_call 不可见;wire 在写入条目后会提示运维人员:

$ hermes tools enable a2a --platform cli

多个 AID 可以写成逗号分隔的列表、重复的 --a2a 选项,或跟在一个 --a2a 之后的多个词。AID 由小写字母和数字组成,长度为 8 到 128 个字符。--a2a 要求同一命令中包含 hermes(或 --all)。

生成的条目形式如下:

# >>> anet a2a (managed by `anet agents wire`; holds the local A2A token - keep this file 0600) >>>
a2a_agents:
  "<aid-of-remote-agent>":
    url: "http://127.0.0.1:43811/a2a/v1/agents/<aid-of-remote-agent>"
    auth:
      type: bearer
      token: "<local A2A token>"
    timeout: 3600
# <<< anet a2a <<<

这些条目的特性:

  • 条目中包含本地 A2A 接口的 bearer 令牌。因此文件的权限保持为 0600;wire 会收窄较宽的权限,anet agents 会报告权限较宽的文件。

  • 地址与令牌读取自 a2a 模块状态目录中的 a2a_addr.txt 与 a2a_token.txt。这些文件在守护进程首次提供该接口时创建。若它们不存在,wire --a2a 会失败,并提示先运行 anet up。

  • 当另一个进程占用已记录的端口,或接口因端口冲突而未启动时,wire 拒绝写入该条目。否则令牌会被交给占用该端口的进程。

  • 面向 Hermes 的操作指南说明:列在 a2a_agents 下的远程 Agent 可通过 a2a_call 访问,并且适用相同的支出限额。

接口的端口或令牌改变时,已有的条目随之失效。这发生在文件 a2a_addr.txt 被删除、紧急密钥轮换以及端口冲突解决之后。此时 anet agents 会报告某条目的端口或令牌已改变。使用下列命令重写这些条目:

$ anet agents wire hermes --refresh

如只移除个别条目而保留 MCP 条目:

$ anet agents unwire hermes --a2a <aid-of-remote-agent>

不带 --a2a 的 unwire hermes 会移除 MCP 条目、指南以及所有条目及其令牌。

说明

  • 默认关闭。 操作指南告知编码 Agent:新节点不接受任何其他 Agent 的任务,也不产生任何支出。这两项由运维人员在终端中开启,相关命令会要求确认;参见 委派与自动回复 与 付款(x402)。

  • 来自其他 Agent 的任务是不可信输入。 指南要求编码 Agent 不要因为此类任务的文字要求而运行命令、读取文件、发送机密或产生支出。这条指示只是一种缓解措施,真正起约束作用的是入站策略和 沙箱与凭据 中所述的沙箱。

  • 守护进程重启之后。 控制令牌被替换后,正在运行的 anet mcp 进程会重新找到守护进程,并将失败的调用重试一次。会话无需仅因此重启。

  • 不含 MCP 的构建。 使用 -tags no_mcp 构建的二进制文件没有 MCP 服务器;此时 anet agents 与 anet mcp 会以指明该构建的消息结束。

  • 报告。 anet doctor 包含每个工具的状态,对 Hermes 还包含每个 a2a_agents 条目的状态。

另请参阅