Closed3

Model Context ProtocolのクライアントをSwiftで作る

Fumito ItoFumito Ito

概要とか必要なリンクまとめ

Anthropicが最初に公開したドキュメント

https://www.anthropic.com/news/model-context-protocol

GitHubのOrg

https://github.com/modelcontextprotocol

ドキュメント

https://modelcontextprotocol.io/introduction

ドキュメントは概要・概念の説明やコンセプトの紹介、具体的なexampleに終始している。
概念や用語に関する知識を得るためにサラッと通読しておく必要はあるが、実際に開発するにあたってはあまり意味はない(特にClientは)。

MCPの用途を拡大するという意味ではClientよりもServerの方がはるかに重要なので、この扱いは不当ではないと思う。

Specification

https://spec.modelcontextprotocol.io/specification/2024-11-05/

基本的にこれを見ながら開発していくことになる。Schemaがjson schemaやschema.tsで公開されているが、悲しいことにリンク切れになっている。正しいリンク先は以下である。
https://github.com/modelcontextprotocol/specification/tree/main/schema

ちなみに、この schema.jsonquicktype.ioのweb ui に突っ込んでもSwiftのstructを生成することはできなかった。悲しい。なんで?

Base Protocol のしたにlifecycleなど基本的な内容が列挙されているので、最初にここを見ておくと概要が掴みやすかった。

MCPは双方向通信的なアーキテクチャなのでClient / Serverでそれぞれ実装するべきFeatureが存在する。Specificationでは、それぞれ Server Features, Client Features に記載されている。

Clientを開発する場合、以下の3つを主に開発していくことになるだろう。

  • Client <-> Server間の通信レイヤーを指定ないし外部から挿入する機構
  • ClientからServer Featuresを呼び出すための機構
  • Client Featuresが呼び出された時に必要な情報を取得するための機構
Fumito ItoFumito Ito

おおよその機能リスト

  • 通信方法を指定してサーバーに接続することができる
    • 送信と受信で別々の通信手段が用いられる可能性がある(HTTPS + SSE)
  • 通信方法に準拠した手段でサーバーからの通知(Notification)を受け取ることができる
  • サーバーからの通知(Notification)をパースしてSwiftのオブジェクトに変換することができる
  • Swiftのオブジェクトに変換したサーバーからの通知をClientの利用者に通知することができる
  • Specificationに定義されたMCPのサーバーが提供する機能をSwiftのオブジェクトを通じて呼び出すことができる
    • Prompts
    • Resources
    • Tools
    • Utilities
      • Completion
      • Logging
      • (Pagenation)
    • Capabilityなどの初期化処理
  • MCPサーバーの機能を呼び出した結果をパースしてSwiftのオブジェクトに変換することができる
  • MCPサーバーからの呼び出しに応答してClientの提供する機能の情報を返信することができる
    • Roots
    • Sampling
  • Clientが実装するべき情報を取得することができる
    • Roots
    • Sampling
Fumito ItoFumito Ito

Specificationに記載されているspecとGitHubリポジトリにホストされているspecにはかなり乖離がある点に注意が必要。

具体的には spec.modelcontext.protocol.io では2024-11-05が最新のspecとして表示されるが、GitHub Releasesの最新は 2024-10-07、そしてGitHub Repositoryのmainブランチはどちらのバージョンともかなり異なるspecになっている。

はっきり言って分かりにくすぎるし、spec自体が安定していないので準拠するspecのバージョンを持った方が良さそう。分かりにくいのはどうにかしたいので GitHub Releases が正となるようにしてほしい旨をIssueにした。

https://github.com/modelcontextprotocol/specification/issues/143

このスクラップは3ヶ月前にクローズされました