この記事を読んでまず思ったのは、MCPって派手な機能よりも、地味なメタ情報の積み重ねでかなり賢く見えるようになるんだな、ということだった。ツールを公開する仕組みとして見ると、名前と説明と入力スキーマがあれば最低限は足りそうに見える。でも実際には、クライアントが安心して使えるかどうかは、その先の「このツールは壊すのか、繰り返しても平気か、結果はどんな形で返るのか」といった周辺情報でかなり変わる。そこを丁寧に書けるのが面白い。
特に印象に残ったのは、tool annotations の考え方だ。readOnlyHint や destructiveHint みたいな値は、機能そのものを増やすわけではない。でも、クライアント側の振る舞いをかなり変えられる。たとえば、確認ダイアログを出すタイミングや、ユーザーに見せる並び順まで変わるかもしれない。ここで大事なのは、著者もはっきり書いているように、これはあくまで hint であって安全装置ではないことだと思う。AI 系の仕組みって、つい「賢く振る舞わせる」話に寄りがちだけど、最終的には認可や検証を別で持たないと危ない。その線引きを曖昧にしない姿勢には好感が持てた。
もうひとつ引っかかりつつ面白かったのは、structuredContent と outputSchema の関係だ。人間向けには文章で返せば十分でも、クライアントや別の自動処理に渡すなら、JSON の形で受け取れるほうがずっと扱いやすい。しかも outputSchema は「返ってきたものの説明」ではなく、「返る前から期待値を持てる」点がいい。ここは地味だけど、実装者にとってはかなり実用的だと思う。AI クライアントって、つい会話の上手さばかり気にしてしまうけれど、実際に安定して動くかは構造化された入出力で決まる場面が多い。
Progress reporting と Tasks の話も、単なる UX の改善以上のものとして読めた。待ち時間に進捗が見えるだけで安心感はかなり違うし、さらに Tasks になると、長時間処理をいったん手放して後で戻れる。これは便利な反面、コメント欄にもあったように、認可の境界が難しくなる気がする。永続的な task ID が、そのまま「結果を見られる権利」になってしまうからだ。便利さが増えるほど、ID の扱いを雑にできなくなる。このあたりは、仕様のきれいさより実運用の怖さが先に立った。
この記事の面白さは、MCP を「ツールを公開するためのプロトコル」ではなく、「クライアントにどう理解させるか」の仕組みとして見直しているところにあると思う。派手ではないけれど、こういう層をちゃんと詰めると、AI クライアントはかなり人間っぽい安心感を持てる。逆に言うと、ここを飛ばして見た目だけ整えても、使っていて怖いままなんじゃないかとも感じた。




