【Godot】Godot Docs MCP - Godotのドキュメント検索を行うMCPサーバー
最近はGodotを学び始めているんですが、Unity畑の人間には設計思想が新鮮で、試行錯誤しながら色々と作ってみています。ただ、右も左もわからない状態なので、毎回検索するのはめんどくさい...全部AIに投げたい...
というわけで、Godotのドキュメントを検索可能なMCPサーバーを作りました。
以前にもdocs.rs MCPというMCPサーバーを作ったりしましたが、要するにこれがGodotのドキュメントに変わっただけです。
使い方
こちらもREADMEのセットアップ手順に沿って追加してもらえれば動きます。VSCode、Cursor、Claude Codeだけでなく、MCPに対応したツールであればなんでもOKです。
また、詳細は後ほど触れますが、今回はnpm/jsrのデュアルパッケージとして配布しています。Nodeの場合はnpx @nuskey8/docs-rs-mcp -y、Denoの場合はdeno run jsr:@nuskey8/godot-docs-mcpから起動できます。
機能
Godot Docs MCPは以下のツールを提供しています。
| 名前 | 説明 |
|---|---|
godot_docs_search |
Godotドキュメントからクラス、チュートリアル、ガイドなどのページを検索します。 |
godot_docs_get_page |
特定のページの内容を取得します。 |
godot_docs_get_class |
特定のGodotクラスに関する詳細な情報を取得します。 |
現状godot_docs_searchの精度があまり高くない(複数単語だと引っかからないことがある)ので、もう少し検索の処理は改善できたらいいなーという感じです。型名まで特定できている状況であれば、ほぼ確実に該当するページの情報を取ってきてくれます。
内部実装
当然ですが、静的サイトであるGodotのドキュメントに検索用のAPIなんてものは存在しません。そのため、上手いこと解析を行ってあげる必要があります。
GodotのドキュメントはSphinxという静的サイトジェネレータで構築されています。Sphinxは全文検索の機能を持っていますが、これはドキュメント構築時に分割されたトークンをあらかじめsearchindex.jsに置いておき、検索時にJavaScriptでこれを参照することで実現しています。
そこでGodot Docs MCPではsearchindex.jsを取得し、そのソースコードを直接解析することで検索を実装しています。ただし、現在の実装は雑に各トークンで部分一致の検索をかけて引っかかったものを羅列するだけなので、もう少しちゃんとした実装を用意したいところです。(Sphinx本家の実装はスコアリングによる順位付けなど、もっと複雑なアルゴリズムで動いている、らしいです)
dntによるnpm互換パッケージの作成
Godot Docs MCP自体はTypeScriptで実装されていますが、今回は開発環境にDenoを採用しています。DenoのいいところはとにかくTypeScriptファーストな開発環境が整っているところで、npmの開発につきものなtsconfigやLinterの構成ファイルなどが全てdeno.jsonに集約されるため、環境の管理が非常にやりやすいです。また、フォーマッタも近年のgofmtやRustと同様の強制力が強い方向性で記法のブレが生じにくく、とても良い感じです。
唯一の問題は、npmと比較して普及が進んでいないところでしょう。開発に使うならともかく、わざわざMCPサーバーを導入するためにDenoのインストールが必要なのは少々面倒です。
そこでDenoはdntというnpm互換のパッケージを作成するためのツールを配布しています。
これを用いることで、jsrとnpmの両方に同じパッケージを配布することができるようになります。ビルド周りも素直なTypeScriptで書けて非常に楽です。
なお、npmではnpxでツールの実行が可能ですが、Denoも同様にdeno run jsr:@scope/pkgnameのような形で利用できます。Denoはデフォルトの権限が非常に厳しいため、明示的に許可しない限り勝手に危険なコードを実行することはできません。そのため、よくわからないパッケージでも安全に実行できて安心です。
まとめ
最近はわからないことをまずAIに聞く、という機会が増えてきたので、こういう特定の領域の検索に特化したMCPサーバーがあると学習の際に便利なんじゃないかなーと。単純なスクレイピングではどうしても無駄な情報が多くなってしまうので、構造化されたテキストに加工して渡してあげることが大切かなーと。
後半は半分くらいDenoの話になってましたが、とにかくDenoはいいぞ、ということで。
Discussion