1 編目で繋がった。今度は問う。
二行
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
人が使うクライアントならこれでボタンのラベルとツールチップを作る。モデルならこれを読んで何を呼ぶかを決める。サーバー 2 編目で「説明文は注釈ではなく動くコードだ」と言ったものが、ここで消費される。