构建

它能做什么 — 把清单写下来,客户端就只属于那一个服务端

作者: makemind · 2026年3月27日

第一篇接上了。现在去问。

两行

final tools = await client.listTools();
stdout.writeln('tools: ${tools.map((t) => t.name).join(", ")}');
for (final t in tools) {
  stdout.writeln('  ${t.name}${t.description}');
}

final resources = await client.listResources();
stdout.writeln('resources: ${resources.map((r) => r.uri).join(", ")}');
tools: desk.admit
  desk.admit — Admit a number of people from the queue
resources: ui://desk, desk://waiting

写下来,它就成了专用的

也可以这么写:

// 这台服务端有 desk.admit
await client.callTool('desk.admit', {'count': 1});

能跑。而 就在那一刻,这个客户端成了那台服务端专用的。 只要有一个工具名嵌进代码,它就没法站到别的服务端面前。

问来的就不一样。清单是运行时到的,所以客户端 不需要知道自己接的是什么。 接开发板就来 led.set,接柜台就来 desk.admit。同一份代码。

说明文在这里被用上

listTools() 给的不只是名字。说明文和输入模式会一起来。

desk.admit — Admit a number of people from the queue

给人用的客户端拿它做按钮文案和提示。模型则读它来决定调什么。服务端第二篇说的「说明文不是注释,是会跑的代码」,在这里被消费掉。

此内容需要开发者或更高等级

登录并升级您的方案即可继续阅读。

查看方案
Twitter