跳到主要内容

ARC 开发者文档

连接客户端

用 streamable HTTP 把 MCP 客户端指向一个 blocklet host,再用一次不需要握手的匿名 tools/list 确认连接。

把 host URL 加上 /mcp 交给 MCP 客户端即可连接。

<host> 就是该 blocklet 对外服务的域名 —— 和你在浏览器里打开的那个一样。不确定拿对没有,就 GET https://<host>/.well-known/mcp.json 看它的 url 字段:那是运行时认为自己正在服务的端点。

bash
claude mcp add --transport http arc https://<host>/mcp

连接不需要 header,也不需要 client id。端点接受匿名请求并响应读工具;只有在调用写工具时才需要凭证。

Claude Code 与 Codex CLI 各自的确切命令,见接入你的工具

不用客户端也能确认

端点就是普通 HTTP,所以在接入 agent 之前,用 curl 就能检查一个 host。

bash
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 返回八个工具:

text
afs_read  afs_list  afs_write  afs_delete  afs_search  afs_exec  afs_stat  afs_explain

声明了内容集合的 blocklet 在这八个之外再返回三个:

text
search_content  list_content  get_content

拿到哪一组,取决于该 blocklet 自己的声明,与你的凭证无关。见工具

不需要先 initialize

上面的请求直接发 tools/list,前面没有 initialize,返回 200

端点是无状态的。它不下发 mcp-session-id,因此客户端没有 session 需要保存、丢失或重新同步。客户端发送一个失效的 session id,请求仍然成功;运行时重启不会让客户端一侧的任何东西失效。

这一点对长期运行的 agent 有影响:没有需要实现的重连握手。

匿名访问能做什么

握手、三个 list 方法,以及读工具。写、删除、执行返回 401 并附挑战;不在清单上的任何方法同样如此 —— 规则是 fail-closed。

一个被允许的读是否真的返回数据,是另一个问题,由 blocklet 声明了什么决定。两条规则都写在访问分档

需要写入时

不带凭证调用写工具,会返回那个启动授权的挑战:

bash
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"}}}'
text
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。