把 host URL 加上 /mcp 交给 MCP 客户端即可连接。
<host> 就是该 blocklet 对外服务的域名 —— 和你在浏览器里打开的那个一样。不确定拿对没有,就 GET https://<host>/.well-known/mcp.json 看它的 url 字段:那是运行时认为自己正在服务的端点。
claude mcp add --transport http arc https://<host>/mcp连接不需要 header,也不需要 client id。端点接受匿名请求并响应读工具;只有在调用写工具时才需要凭证。
Claude Code 与 Codex CLI 各自的确切命令,见接入你的工具。
不用客户端也能确认
端点就是普通 HTTP,所以在接入 agent 之前,用 curl 就能检查一个 host。
curl -s -X POST https://<host>/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'未声明内容集合的 blocklet 返回八个工具:
afs_read afs_list afs_write afs_delete afs_search afs_exec afs_stat afs_explain声明了内容集合的 blocklet 在这八个之外再返回三个:
search_content list_content get_content拿到哪一组,取决于该 blocklet 自己的声明,与你的凭证无关。见工具。
不需要先 initialize
上面的请求直接发 tools/list,前面没有 initialize,返回 200。
端点是无状态的。它不下发 mcp-session-id,因此客户端没有 session 需要保存、丢失或重新同步。客户端发送一个失效的 session id,请求仍然成功;运行时重启不会让客户端一侧的任何东西失效。
这一点对长期运行的 agent 有影响:没有需要实现的重连握手。
匿名访问能做什么
握手、三个 list 方法,以及读工具。写、删除、执行返回 401 并附挑战;不在清单上的任何方法同样如此 —— 规则是 fail-closed。
一个被允许的读是否真的返回数据,是另一个问题,由 blocklet 声明了什么决定。两条规则都写在访问分档。
需要写入时
不带凭证调用写工具,会返回那个启动授权的挑战:
curl -s -i -X POST https://<host>/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"afs_write","arguments":{"path":"/tmp/x","content":"x"}}}'HTTP/1.1 401 Unauthorized
www-authenticate: Bearer resource_metadata="https://<host>/.well-known/oauth-protected-resource"
{"error":"Unauthorized"}沿这个 URL 继续 —— 见授权客户端。
连接仅支持 stdio 的客户端
只会用 stdio 说 MCP、无法打开 HTTP 传输的客户端需要一个桥接。用 arc mcp,它把 stdio 桥接到本地运行中的 daemon。
桥接是给这类客户端的兼容路径。如果你的客户端支持 streamable HTTP,直接连 /mcp,跳过它。
本地运行时
对本地 Node 运行时来说,来自同一台机器的请求是经校验的 socket peer,会被授予 operator 访问权,因此写工具不带凭证也会响应。那是 loopback 档;它不通过网络存在,也不是已部署 blocklet 的行为。要验证匿名档和认证档,请使用远端 host。