React Router v7でコードを書いてくれSonnet

Claude 3.7 Sonnetに代表される現在の主力なコーディングモデルやソフトウェア開発タスクの自動化に利用されるLLMは、知識のカットオフにより2024年後半頃までにネット上に存在する情報をもとにしたソースコードしか書くことができない。例えばAnthropicのAPIを直接利用して確認すると、「React Routerの最新バージョンはv6です」と返答が来る。しかし、最新版はv7だ。v7.0.0はちょうどこの時期にリリースされたため境界にあり、つまりv7の実践的な知識はない。これに限らず、LLMの世界ではNext.jsはv14、Flaskはv2、Railsはv7と一世代遅れたバージョンを認識していることになっている。

これらのアップデートによって入った変更は、既存のソースコードに記述していればLLMが空気を読んで従う。加えて、ユーザーがカスタムルールとしてエディタ側で追加情報を設定したり、外部ドキュメントをその場で参照して補正することもできる。エージェントのfetchツールでWeb検索できる範囲の情報は適切に処理されるが、完全ではないので、我々は都度最新ドキュメントを読んで差分を理解する必要がある。特にリファレンス詳細を当たるレベルのものは、エディタでライブラリ内部のソースコードを参照してからLLMを導く必要があると思う。

これに対する解決策はいくつかある。

CursorはWebページのドキュメントをユーザーが追加して独自にインデックスし、@Docで参照する機能を持つ。これはユーザーがチャットで明示的に検索を指示すると、マッチした範囲が会話のコンテキストに統合されて返答になるが、内部検索によって質問に沿った情報が抽出できるかはケースバイケースだ。

Cursor – @Docs
Learn how to use, add, and manage custom documentation as context in Cursor using @Docs

LLMs.Txtという仕様はドキュメントをまるごとMarkdownでダウンロード可能にする。ただ、すべてのテキストをコンテキストウィンドウに収めるには、今のLLMでは限界がある。

The /llms.txt file – llms-txt
A proposal to standardise on using an /llms.txt file to provide information to help LLMs use a website at inference time.

UpstashはContext7という名前で、独自にレジストリを作成し、最新バージョンの各ライブラリのスニペットを登録するサービスを構築して、それをMCPで提供しようとしている。これはCursorと似ているが、より必要なパーツのみ参照できるようにする方針のようで、大規模なRedisクラスタのインフラを持つUpstashならではのアプローチだ。

Introducing Context7: Up-to-Date Docs for LLMs and AI Code Editors
Articles and tutorials on serverless technologies from Upstash and community

Mastraのような、LLM以降に登場したフレームワークは、ドキュメント検索MCPをコアに内蔵している。これはより直接的なアプローチで、リポジトリ内にあるテキストファイルをかき集め、目次からコンテンツを検索できるMCPサーバーを発見できるもので、人間が公式ドキュメントを読むときと近いアプローチになる。

Introducing Mastra MCP Documentation Server
We built a Mastra MCP documentation server that provides AI assistants and IDE’s with direct access to Mastra.ai’s complete knowledge base.

筆者がMastraのMCPドキュメントツールを使ってみたところ、この方式はそれなりに有効だとわかったので、他のOSSのドキュメントも手軽に検索できるようにしたいと思い、MCPサーバーを自作した。

MDS(MPC Documents Server) Server
MDS(MPC Documents Server) Server. GitHub Gist: instantly share code, notes, and snippets.

このスクリプトはGitHubのURLをキーに、特定のドキュメントディレクトリのみをローカル(~/.mds/)にダウンロードしてくる。MCPサーバーの起動時にダウンロードとローカルの展開を行い、それをMastraと同じくディレクトリ以下を地道にLLMの指定したキーワードで再帰検索していく。URLをキーにしているので、GitHubでホストしているライブラリならどれでもこのMCPサーバーの引数に与えることができる。

試しにReact Router v7.5.0とHonoの最新版ドキュメントにポインタを置いてみた例が以下になる。最新のVSCodeでは、ワークスペースごとにMCPサーバーを接続できるようになったので、それを利用した。

この MCPサーバーがうまく呼び出される時は以下のようにディレクトリを検索し、運良くヒットすると最新の情報をもとにコードを書いてくれた。

「createBrowserRouterに移行する利点を教えてください」

「honoのtimingでメトリクスを記録してください」

試しにMCP を無効にして同じメッセージを送信したところドキュメントにあるコードとは違う編集をしていた

ただしこのMCPサーバーは実験的で、修正すべき点がいくつかある。まず、そもそもVSCodeのMCP呼び出しが安定していないし実験中にも何度か再起動した。それにチェックアウトしたドキュメントの更新と削除もしていない。だから配布する段階ではないが、問題に対する意見を読者にも求める目的でこの記事を書いた。何か他にいい方法はあるだろうか。

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe