一个 blocklet 公布两类 MCP 工具。通用 AFS 工具始终注册。内容工具只在该 blocklet 声明了内容集合时注册,且它们的输入 schema 会写明它所声明的集合。
两类工具走同一个数据面。内容工具是 AFS search、list、read 的包装 —— 它们背后没有第二套存储。
通用 AFS 工具
| 工具 | 必填 | 其他参数 | 匿名可调 |
|---|---|---|---|
afs_read | — | path、entries、startLine、endLine | 是 |
afs_list | path | depth、pattern、limit | 是 |
afs_search | path、query | pattern、limit、explain | 是 |
afs_stat | path | — | 是 |
afs_explain | path | — | 是 |
afs_write | — | path、content、mode、patches、ifMatch、entries | 否 |
afs_delete | — | path、recursive、ifMatch、entries | 否 |
afs_exec | path | args | 否 |
afs_read、afs_write 和 afs_delete 的必填列是空的,因为它们接受二选一:单个 path,或一个 entries 数组 —— 两者必须给其一。请用数组批量提交,不要循环单次调用;afs_read 每次最多接受 16 条 entry。
afs_exec 执行一个已声明的动作。列出 {path}/.actions 即可发现可用动作及其输入 schema。
这些路径与操作的含义、以及某个 provider 实际实现了哪些操作,见 AFS。
一个工具被列出、可调用,不代表它在某条路径上会成功:blocklet 的路径策略在调用内部检查。见访问分档。
内容工具
| 工具 | 必填 | 其他参数 |
|---|---|---|
search_content | collection、query | filters、locale、limit |
list_content | collection | filters、locale、limit |
get_content | collection、id | locale |
这三个只在 blocklet 声明了集合时出现。没有声明的 blocklet 一个都不注册 —— 这个门是 fail-closed 的,所以不完整或为空的声明不会产生一个集合列表为空的工具。
所声明的集合名会被写进每个工具的描述和 collection 参数,因此客户端在 tools/list 里就能看到,不需要试探。声明了四个集合的 blocklet,其工具描述末尾就是这四个名字的列表。
它们能否被匿名调用,取决于该 blocklet 为集合声明的读取 role。工具名本身在匿名白名单上;工具内部可见哪些集合,在注册时决定。
一个 host 返回哪一组
未声明集合的 blocklet,tools/list 返回八个工具;声明了集合的返回十一个。差别来自 blocklet 自己的声明,而不是调用方的凭证 —— 匿名客户端和已认证客户端看到的是同一份列表。
凭证改变的是这些工具中哪些会响应。见连接客户端。
声明集合
声明写在 blocklet 自己的 manifest 里,和它其余的能力放在一起。那个面随 manifest 一起记录,不在本页;见 Blocklets。