第一篇接上了。现在去问。
两行
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
给人用的客户端拿它做按钮文案和提示。模型则读它来决定调什么。服务端第二篇说的「说明文不是注释,是会跑的代码」,在这里被消费掉。