DevContainer環境のClaudeCodeでSerenaMCPを使えるようにする
やりたいこと
- みんながすなるSerenaMCPといふものを,自分もしてみむとす
- 先日,開発環境でDevContainerを使うようにしたので,ローカル環境を汚さずにSerenaMCPを使えるようにしたい
Serenaの使い方を確認する
UsageにはuvxとDockerがあるようで,DevContainerはDocker-in-Dockerに対応済なのでDockerで使うほうが楽そうにみえるが,Experimentalとあるのでuvxを使う方針とした.
準備
DevContainerでuvxを使えるようにする
devcontainerのfeatureでuvxを使えるようにするものは見当たらなかったので,postCreateCommandでuvをインストールするようにした.
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "curl -LsSf https://astral.sh/uv/install.sh | sh && echo 'export PATH=\"$HOME/.cargo/bin:$PATH\"' >> ~/.bashrc",
devcontainer.jsonを修正したら,コンテナをリビルドする.
Claude CodeでSerenaをMCPサーバとして追加する
SerenaのドキュメントにClaude Codeの設定方法の記載がある.
現状,MCPはGitHubしか使っておらず,その設定のスコープはユーザーレベルとしていた.
かつ,ホスト(WSL)とdevcontainerのClaudeの設定はボリュームの設定で共有するようにしている.
Serenaも同じような形にしようか迷ったが,ホストに必ずuvxが入っている保証はないし,仮に別端末でこのプロジェクトを開発したくなったときの設定箇所が少しでも減らせるよう,プロジェクトレベルでmcp設定するようにした.
claude mcp add -s project serena -- uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context ide-assistant --project $(pwd)
公式のコマンドに,-s project
を追加してスコープがプロジェクトレベルであることを明記した.
使ってみる
Serenaができることを確認する.
claude
で/mcp
してSerenaを選択し,1. View tools
を確認したところ,以下の20個のツールが存在することがわかった.
- 1.list_dir
- 2.find_file
- 3.replace_regex
- 4.search_for_pattern
- 5.restart_language_server
- 6.get_symbols_overview
- 7.find_symbol
- 8.find_referencing_symbols
- 9.replace_symbol_body
- 10.insert_after_symbol
- 11.insert_before_symbol
- 12.write_memory
- 13.read_memory
- 14.list_memories
- 15.delete_memory
- 16.check_onboarding_performed
- 17.onboarding
- 18.think_about_collected_information
- 19.think_about_task_adherence
- 20.think_about_whether_you_are_done
それぞれのツールの内容については以下で確認できる……と言いたいところだが,どうもこのリストに存在しないツールがある.
ファイルだのdirだのregxだのはツール名から機能が大体想像つくので,詳しいところが気になるものだけドキュメントをちらっと読んでみる.
シンボル系
- 6.get_symbols_overview
- 7.find_symbol
- 8.find_referencing_symbols
- 9.replace_symbol_body
- 10.insert_after_symbol
- 11.insert_before_symbol
このあたり.概ね名前の通りで,コードをただのテキストとしてではなくクラスや関数等の意味のある塊として解釈しするためのツール群,と理解した.
メモリ系
- 12.write_memory
- 13.read_memory
- 14.list_memories
- 15.delete_memory
この辺.
これもよくあるパターンで,プロジェクトの構造や長い会話の要約をメモリとして管理することができる.
オンボーディング系
- 16.check_onboarding_performed
- 17.onboarding
これも文字通りなのだが,上記リンクの通りでオンボーディングでプロジェクトの構造を把握してメモリに格納という流れになる.
タスク系
18~20の3つがあるが,これらはREADME.mdに説明があるのでそれを見ると,
- 18.think_about_collected_information
- 拙訳:収集した情報の完全性を熟考するツール
- 19.think_about_task_adherence
- 拙訳:エージェントが現在のタスクを順調に進めているか(逸脱していないか)判断するツール
- 20.think_about_whether_you_are_done
- 拙訳:タスクが完了したかを判断するツール
とのこと.タスクを推進するにあたっての判断のためのツールと理解.
オンボーディングしてみる
何はともあれオンボーディングしないと話が始まらないと思うので,オンボーディングしてみる.
毎度LLMに特定のMCPのツールを使わせたいときの頼み方に迷う.
オンボーディングのプロセスでシンボル情報の収集を始めてくれる.
その後,Serenaのlist_dirを使いつつ,Read(これはSerenaではない)でpackage.jsonやbiome.jsonの確認が続いた後,.serena
にproject.ymlが,.serena/memories
に6つのmemoryが作成された.
メモリファイルのそれぞれに保存された情報は,概ね以下の通り.
中身を見ると,基本的には既存のCLAUDE.mdや.clinerules,あとは最近docs配下に書き始めたアーキテクチャ構成の考え方やルール,コーディングガイドラインの中身を集約している印象を受けた.
この辺りの情報はAI開発ツールが出るたびに○○.mdが同じような情報で増えていってしまっており,もう少し一般化した仕様として共用できるようになってくれないものか,と正直思ってしまう.
この時点で生成されたファイルを受けての期待感としてはtask_completion_checklist.md
を受けたthink_about_whether_you_are_doneがうまく機能すると嬉しいな,という感じ.Claude Codeはhooksでlintエラーを叩きつけても無視してタスク完了しようとすることが散見されたので,その辺が抑止されたら良いな……という印象.
また,オンボーディングで生成されたファイルの内容からは,.gitignore
に入れずにプロジェクト共用管理しても良さそうに思えたが,ドキュメントによると長い会話の要約をメモリとして管理することができるというようなことも書いてある気がしており,その場合.gitignore
に入れたほうが良いのではないか?とも思うので,この点は使ってみて検討が必要と言える.
Serenaが使われるのか見てみる
さて,ここまででSerenaを導入しオンボーディングまでが完了したので,ClaudeCodeにタスクを任せた時にSerenaをどう使うか?を見てみる.
まずはタスクとして,以下を命令してみる.
@docs/practices/api-response-guidline.md にAPIのレスポンス形式のルールをまとめていますが,これに準拠していないAPIがある気がします.確認して修正が必要なAPIを洗い出してもらえますか.
すると,早速serenaを使ってくれる.
更に,命令の意図を汲んでrouteのシンボルの概要の把握に努めてくれる.この時点ではSerena導入前よりかなり筋の良い調査というか,無駄な回り道をせずにタスクを推進してくれている感じがある.
ファイルの読み取りにはSerenaの活用は見られないが……
読み取った情報の完全性確認にはserenaを使う.
回答はくれたのだが,
2. Create系APIのLocationヘッダー対応
- 実装確認が必要(コントローラー側でLocationヘッダーを設定しているか)
と,実装確認をせずにタスク完了としているところが残念(そこまでわかっているなら実装確認してほしかった)
おわりに
ということで「とりあえず導入して動く」ようにはなったが,コードベースの調査タスクではシンボルの概要把握でタスクがスムーズに進むようになっている感じはあるものの,劇的な作業品質改善に繋がっているという感じはしない.また,タスクの完了判断が甘いのも改善されていない.
他にはreplace_regexやinsert_before_symbol,insert_after_symbolなどがリファクタリングで効果を発揮する可能性があるので,今後リファクタリングタスクがあるときに,これらのツールが効果を発揮するかを確認したい.
Discussion