5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

Swift Evolutionについて質問応答するModel Context Protocolサーバーを立てた

最近、Model Context Protocol(MCP)驚き屋が世を騒がせている。興味のある技術なので、実際に何かサーバーを立ててみることにした。

いつも技術検証をする際のネタに最適なのが、Swift Evolutionを使うこと。ある程度正規化された自然言語の技術文書が大量に用意されていて、データベースとしてちょうど良い。

今回は、このSwift Evolutionを元に質問応答をしてくれるMCPサーバーを立ててみた。

MCP自体の解説はほかの記事を参照してほしい。たくさんの日本語記事も出てくるし、可能であればAnthropicの公式ドキュメントを読むのが一番良い。

ベクトルデータベースによるRAGの構築

Swift Evolutionのような、大量の自然言語の技術文書を効率よくデータベース化する手法として、ベクトルデータベースの利用に着目した。いろいろ調べてみたところ、ChromaDBというベクトルデータベースが良さそうだったので、これを使ってみることにした。

今回はこれといって特にやることはなく、単にMarkdownをChromaDBのAPIを使ってデータベースに格納するだけだった。クエリしやすいように、プロポーザルIDやタイトル、実装状況などをメタデータとして与えている。

マジで何もしていないが、ソースは以下に置いてある。

MCPサーバーの構築

次にMCPサーバーの構築。今回は自作のMCPサーバーを実装してみようと思っていた*1が、すでにchroma-mcpという既存のものがあったのでこれを使う。

Claude DesktopからのMCPサーバーへの接続は、chroma-mcpのREADMEにあるように、uvx経由でエントリーポイントを起動するだけであとは特にやることがない。

ClaudeにはProjectという概念があり、複数のチャットに共通のプロンプトを与えてまとめて管理できる。今回は以下のような簡単なプロンプトを与えている。

You answer the question about Swift Evolution.

You can use MCP to search all Swift Evolutions using `get_documents` or `query_documents` MCP tools.

Proposal Number `SE-XXXX` is provided as IDs for each document.

The result should be a document rather than a chat response.
Answer must be Japanese.

swift-evolution-mcp

このような手順でswift-evolution-mcpができた。早速動かしてみると、Region based Isolationのような、難しい概念についても日本語で説明してくれた。知識のカットオフもないため、最新のプロポーザルについてもバッチリ。

プロポーザルの要約のみならず、プロポーザルを元に架空の実装を試してもらうということもしてみた。例えば、SE-0450で実装されたPackage Traitsをベースに、テストライブラリをTraitで導入するというユースケース。

なんかそれっぽく動いているのがわかる。まだ試しに触ってみただけなので、今後実用に耐えうるかは試していきたい。

一方で、「Swift 6.1の新機能をまとめて」といったように、広範なプロポーザルを要約してもらうのはあまり精度が良くないようだ。Statusのような定型的な情報をメタデータとして与えてみたが、あまり改善せず。今回はプロポーザルIDをメタデータとして与えているので、「SE-0414について教えて」といった聞き方の方が精度高く回答してくれた印象。

リモートMCPの公開

現在の最大の使いづらさは、ユーザーがローカル環境にMCPサーバーを立てる必要があることだ。たしかに、ファイルシステムやチャットログの参照といった秘匿性の高いデータを扱う場合には適しているが、今回のようなパブリックデータのRAG化には、どこかのサーバーに接続するだけで勝手に使えるようになってほしい。

Anthropicが公開している今後のRoadmapでは、リモートMCPのサポートが予定されている。近い将来、これらの規格について整備されれば、デスクトップクライアントから簡単に複数のリモートMCPを利用できるようになるだろう。

現状で似たようなことをするには、mcp-remoteという、ローカルからリモートサーバーにProxyするだけのサーバーをローカルで動かす必要がある。今回のswift-evolution-mcpを公開するには、永続化したデータとchroma-mcpを動かすだけのコンテナをどっかにおいておいて、mcp-remoteから接続するだけで良さそう。

現状のRemote MCPの構築はCloudflareのブログで紹介されている。

そもそも、MCPをプロジェクトごとに持たせられなかったり、設定の煩雑さなどClaude DesktopなどのMCPクライアント側の使い勝手の悪さも目立つが、これらはそのうち改善していくだろう。

ここ1年の変化が早すぎる

実は、同様のコンセプトのものは2023年の11月頃に開発合宿の機会があったので試してみていた。当時はOpenAI GPT-3.5にLangChainを使ってMarkdownを流し込むだけ、という素朴な作りになっていて、大して実用的なものにはなっていなかった。

ここから、わずか1年半ほどしか経っていないが、GPT-3.5と現行のモデルの間には雲泥の差があるし、とりまく開発ツールも大きく変わったなあと感慨深い。(LangChainなんてもはや一瞬で廃れてしまった)

今回実装したのはトイプロジェクトだけど、ベクトルデータベースを使った自然言語のRAG化は応用の範囲が広そう。

*1:最近公式のSwift SDKも出た