話題のMCPサーバー「Serena」をClaude Codeで使ってみた
はじめに
Claude Codeの様子がおかしい。精度が低下したんじゃないか?という声がここ1か月ぐらいよく聞こえてくるようになりました。
どうやらSerenaというMCPサーバーを使うと多少は改善するらしいという話も合わせてちらほらと聞いていました。
Claude Codeを使っていく中で多少は改善の傾向はみられる気はしますが、まだまだ物足りないなと感じる部分があります。そこで話題になっていたSerenaを実際に検証してみることにしました。
serenaとは
Serenaは、従来のコーディングエージェントが「コードを単なるテキスト」として扱う問題を解決するため、Language Server Protocol(LSP)を活用してシンボル検索・編集機能をAIに提供するMCPサーバーです。
関数やクラスといったシンボルレベルでの認識や操作が可能になり、必要な部分だけを抜き出して編集することでコンテキスト効率を改善します
以下の記事に詳細がまとまっています。
触ってみた
準備
今回はClaude Codeで利用するのでREADME.mdに記載されている手順でMCPサーバーの設定をしました。
事前にbrewコマンドなどを使ってuv
をインストールしておきます。
Claude CodeにMCPサーバーを追加するコマンドはこちらです。
claude mcp add serena -- uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context ide-assistant --project $(pwd)
claude
claudeコマンドを実行するとこのような画面がWebブラウザ上に立ち上がります。
--enable-web-dashboard false
オプションを利用すれば画面は表示されないようです。
> /mcp
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Manage MCP servers │
│ │
│ ❯ 1. serena ✔ connected · Enter to view details │
│ │
│ MCP Config locations (by scope): │
│ • User config (available in all your projects): │
│ • /Users/xxxxxx.yyyyyyyy/.claude.json │
│ • Project config (shared via .mcp.json): │
│ • /Users/xxxxxx.yyyyyyyy/dev/task-tool/.mcp.json (file does not exist) │
│ • Local config (private to you in this project): │
│ • /Users/xxxxxx.yyyyyyyy/.claude.json [project: /Users/xxxxxx.yyyyyyyy/dev/task-tool] │
│ │
│ For help configuring MCP servers, see: https://docs.anthropic.com/en/docs/claude-code/mcp │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
このような表示になっていればMCPサーバーの設定は正常に完了しています。
では早速実行していきましょう。
まずはプロジェクトの全体像を把握してもらいます。
Serenaのオンボーディング
今回はこちらの検証用のリポジトリを使ってserenaの検証を行います。
> プロジェクトの全体像を把握してください。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Tool use │
│ │
│ serena - check_onboarding_performed() (MCP) │
│ Checks whether project onboarding was already performed. │
│ You should always call this tool before beginning to actually work on the project/after activating a project, │
│ but after calling the initial instructions tool. │
│ │
│ Do you want to proceed? │
│ ❯ 1. Yes │
│ 2. Yes, and don't ask again for serena - check_onboarding_performed commands in /Users/xxxxxx.yyyyyyyy/dev/task-tool │
│ 3. No, and tell Claude what to do differently (esc) │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
MCPサーバーの check_onboarding_performed()
ツールを実行するようです。
プロジェクトのオンボーディングが既に実行されているかどうかを確認します。
プロジェクトの実際の作業を開始する前/プロジェクトをアクティブ化した後
(ただし初期指示ツールを呼び出した後)に、常にこのツールを呼び出す必要があります。
とのことです。
serenaを最初に利用する際はしっかりとオンボーディングを実行必要があるのですね。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Tool use │
│ │
│ serena - onboarding() (MCP) │
│ Call this tool if onboarding was not performed yet. │
│ You will call this tool at most once per conversation. Returns instructions on how to create the onboarding information. │
│ │
│ Do you want to proceed? │
│ ❯ 1. Yes │
│ 2. Yes, and don't ask again for serena - onboarding commands in /Users/xxxxxx.yyyyyyyy/dev/task-tool │
│ 3. No, and tell Claude what to do differently (esc) │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
当然初回の実行なのでオンボーディングは行っていません。
onboarding()を実行するようです。
オンボーディングがまだ実行されていない場合、このツールを呼び出してください。
このツールは、1回の会話につき最大1回まで呼び出せます。オンボーディング情報の作成手順を返します。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Tool use │
│ │
│ serena - list_dir(relative_path: ".", recursive: false) (MCP) │
│ Lists all non-gitignored files and directories in the given directory (optionally with recursion). Returns a JSON object with the names of directories and files within the given directory. │
│ │
│ Do you want to proceed? │
│ ❯ 1. Yes │
│ 2. Yes, and don't ask again for serena - list_dir commands in /Users/xxxxxx.yyyyyyyy/dev/task-tool │
│ 3. No, and tell Claude what to do differently (esc) │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
list_dir()は
指定されたディレクトリ内のgitで無視されていないすべてのファイルとディレクトリを一覧表示します(再帰的に実行することも可能です)。指定されたディレクトリ内のディレクトリとファイルの名前を含むJSONオブジェクトを返します。
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Tool use │
│ │
│ serena - get_symbols_overview(relative_path: "src/lib/types.ts") (MCP) │
│ Use this tool to get a high-level understanding of the code symbols in a file. │
│ This should be the first tool to call when you want to understand a new file, unless you already know │
│ what you are looking for. Returns a JSON object containing info about top-level symbols in the file. │
│ │
│ Do you want to proceed? │
│ ❯ 1. Yes │
│ 2. Yes, and don't ask again for serena - get_symbols_overview commands in /Users/xxxxxx.yyyyyyyy/dev/task-tool │
│ 3. No, and tell Claude what to do differently (esc) │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
get_symbols_overview()は
このツールを使用して、ファイル内のコードシンボルについて概要を把握してください。
新しいファイルを理解したい場合、探している内容が既に分かっている場合を除き、最初に呼び出すべきツールです。ファイル内の最上位シンボルに関する情報を含むJSONオブジェクトを返します。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Tool use │
│ │
│ serena - write_memory(memory_name: "project_overview.md", content: "# プロジェクト概要\n\n", │
│ hogehogefugafuga") (MCP) │
│ Write some information about this project that can be useful for future tasks to a memory in md format. │
│ The memory name should be meaningful. │
│ │
│ Do you want to proceed? │
│ ❯ 1. Yes │
│ 2. Yes, and don't ask again for serena - write_memory commands in /Users/xxxxxx.yyyyyyyy/dev/task-tool │
│ 3. No, and tell Claude what to do differently (esc) │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
write_memory()は
このプロジェクトに関する情報を、今後の作業に役立つようにmd形式のメモに書き留めてください。
メモの名前は意味のあるものにしてください。
とのことです。
.serena/memories/配下にファイルが作成されるようです。
作成されたファイル例(project_overview.md)
プロジェクト概要
プロジェクトの目的
「タスク管理ツール」は、AI搭載のタスク管理と週間スケジュール作成ツールです。日本語UIで開発されており、個人の生産性向上を目的としています。
主な機能
- タスク管理: CRUD操作、優先度設定(必須/希望)、カテゴリ分類
- AI見積もり機能: OpenAI GPT-4による作業時間自動推定、信頼度スコア、フォールバック機能
- 週間スケジュール: 月〜金の自動タスク割り振り、優先度ベース最適化
- 設定管理: 作業時間設定、カスタムカテゴリ管理、データバックアップ
- レスポンシブデザイン: モバイル・タブレット・デスクトップ対応
技術スタック
フロントエンド
- Next.js 15 (App Router) + TypeScript
- Tailwind CSS + shadcn/ui (Radix UI ベース)
- React Hook Form + Zod (バリデーション)
- React 19 + React DOM 19
- Next Themes (テーマ管理)
- Lucide React (アイコン)
バックエンド・データベース
- SQLite (better-sqlite3) - ローカルファイル保存
-
データベースファイル:
data/tasks.db
(自動作成)
AI統合
- OpenAI GPT-4 API - インテリジェントな作業時間推定
- フォールバック機能 - APIなしでもモック見積もり利用可能
開発・テスト環境
- Jest + React Testing Library (184+ テスト実装)
- MSW (Mock Service Worker) - API テスト
- In-memory SQLite - 高速テスト環境
- GitHub Actions - CI/CD パイプライン
その他のライブラリ
- @dnd-kit: ドラッグ&ドロップ機能
- date-fns: 日付操作
- Zustand: 軽量状態管理
- Sonner: トースト通知
アーキテクチャパターン
3層アーキテクチャを採用:
- プレゼンテーション層: React コンポーネント + App Router
- ビジネスロジック層: TaskService + AIService
- データアクセス層: SQLite + 準備済みステートメント
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Tool use │
│ │
│ serena - think_about_collected_information() (MCP) │
│ Think about the collected information and whether it is sufficient and relevant. │
│ This tool should ALWAYS be called after you have completed a non-trivial sequence of searching steps like │
│ find_symbol, find_referencing_symbols, search_files_for_pattern, read_file, etc. │
│ │
│ Do you want to proceed? │
│ ❯ 1. Yes │
│ 2. Yes, and don't ask again for serena - think_about_collected_information commands in /Users/yusuke.shirakawa/dev/task-tool │
│ 3. No, and tell Claude what to do differently (esc) │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
think_about_collected_information()は
収集した情報が十分かつ適切かどうかを検討してください。
このツールは、find_symbol、find_referencing_symbols、search_files_for_pattern、read_file などといった、
重要な検索ステップのシーケンスを完了した後に必ず呼び出す必要があります。
無事に全容の把握が完了しました。
実行結果
⏺ プロジェクトの全体像を把握しました。このプロジェクトは、AI搭載の日本語タスク管理ツールで、以下の特徴があります:
プロジェクト概要
- 目的: 個人生産性向上のためのAI搭載タスク管理・週間スケジュール作成
- 言語: 日本語UI
- アーキテクチャ: Next.js 15 + TypeScript + SQLite + OpenAI GPT-4
主要機能
- タスクCRUD操作(優先度・カテゴリ管理)
- AI作業時間推定(OpenAI統合 + フォールバック)
- 自動週間スケジュール生成(月〜金)
- 設定管理(作業時間・カスタムカテゴリ・バックアップ)
- レスポンシブデザイン
技術スタック
- フロント: Next.js 15 App Router + React 19 + Tailwind CSS + shadcn/ui
- バック: SQLite (better-sqlite3) + OpenAI API
- テスト: Jest + React Testing Library (184+テスト、93.5%カバレッジ)
- CI/CD: GitHub Actions
重要なパターン
- 3層アーキテクチャ: UI → Service → Database
- 型安全性: TypeScript + Zod バリデーション
- テスト駆動: 包括的テストスイート
- 品質管理: 厳格なプッシュ前チェック
開発ワークフロー
# 開発中
npm run dev
npm run test:watch
# プッシュ前必須 🚨
npm run lint && npm run test:ci && npm run build
メモリファイルに詳細情報を保存しました:
- project_overview.md - プロジェクト概要・技術スタック
- codebase_structure.md - ディレクトリ構造・API設計
- development_commands.md - 開発コマンド・Docker環境
- code_style_conventions.md - コーディング規約・品質基準
- task_completion_checklist.md - タスク完了時チェックリスト
- suggested_commands.md - 推奨コマンド一覧
プロジェクトは高品質な開発プロセスと包括的なテスト環境を持つ、実用的なAI統合タスク管理アプリケーションです。
serenaには今回利用したツール以外も多数のツールが用意されています。
以下のリンクからツール一覧を確認することが可能です。
とはいえClaudeが自分で判断して呼び出してくれるため我々ユーザが意識して利用するケースというのはあまり多くはなさそうです。
Serenaを使った実際の動作はどうなるか?
実際にserenaを使うとclaude codeの動きがどうなるのかというのをみていきます。
> 機能追加案を提案してください。
⏺ プロジェクトの現在の機能と構造を分析し、実用的で価値のある機能追加案を提案します。まず、既存の機能をより詳しく調べて、改善点や拡張可能性を探ります。
⏺ serena - find_symbol (MCP)(name_path: "TaskService", relative_path: "src/lib/services/taskService.ts", depth: 1, include_body: false)
早速senenaのツールが利用されます。
オンボーディングの際に作成したsymbolを検索している模様です。
⏺ serena - search_for_pattern (MCP)(substring_pattern: "export interface.*Status", relative_path: "src/lib/types.ts")
パターン検索もserenaのツール利用して実行している模様です。
結果はこちら
実行結果
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 機能追加案の提案 │
│ │
│ プロジェクトの現状分析を踏まえて、以下の機能追加案を提案します: │
│ │
│ 🚀 優先度:高(即戦力となる機能) │
│ │
│ 1. 実績時間トラッキング機能の実装 │
│ │
│ - 現状: actual_hoursフィールドは存在するが未実装(TODO コメントあり) │
│ - 提案: タスクの時間計測・記録機能 │
│ - タスク開始/停止ボタン │
│ - 自動時間計測 │
│ - 見積もり vs 実績の比較表示 │
│ - 進捗バー表示の有効化 │
│ │
│ 2. タスクフィルタリング・検索機能 │
│ │
│ - 現状: 全タスク一覧表示のみ │
│ - 提案: 高度な絞り込み機能 │
│ - ステータス別フィルター │
│ - カテゴリ別フィルター │
│ - 優先度別フィルター │
│ - キーワード検索 │
│ - 日付範囲検索 │
│ │
│ 📊 優先度:中(生産性向上) │
│ │
│ 3. ダッシュボード・分析機能 │
│ │
│ - 現状: 基本的な表示のみ │
│ - 提案: 生産性分析機能 │
│ - 週間・月間の作業時間統計 │
│ - 見積もり精度の分析 │
│ - カテゴリ別作業分布 │
│ - 完了率・効率性指標 │
│ │
│ 4. テンプレート機能 │
│ │
│ - 現状: 手動でタスク作成 │
│ - 提案: 効率化のためのテンプレート │
│ - よく使うタスクのテンプレート化 │
│ - プロジェクト用タスクセット │
│ - 定期タスクの自動生成 │
│ │
│ 5. 通知・リマインダー機能 │
│ │
│ - 現状: 静的な管理のみ │
│ - 提案: プロアクティブな通知 │
│ - 期限間近の通知 │
│ - ブラウザ通知 │
│ - タスク開始リマインダー │
│ │
│ 🔄 優先度:中(UX改善) │
│ │
│ 6. バックアップ・同期機能の強化 │
│ │
│ - 現状: 基本的なJSON export/import │
│ - 提案: より堅牢なデータ管理 │
│ - 自動バックアップ │
│ - クラウドストレージ連携 │
│ - バックアップ履歴管理 │
│ │
│ 7. キーボードショートカット │
│ │
│ - 現状: マウス操作中心 │
│ - 提案: パワーユーザー向け効率化 │
│ - 新規タスク作成 (Ctrl+N) │
│ - 検索 (Ctrl+F) │
│ - ステータス変更 (数字キー) │
│ │
│ 🎨 優先度:低(将来的拡張) │
│ │
│ 8. プロジェクト管理機能 │
│ │
│ - 現状: 単発タスク管理 │
│ - 提案: 大規模タスク管理 │
│ - プロジェクト階層 │
│ - サブタスク機能 │
│ - 依存関係管理 │
│ - ガントチャート │
│ │
│ 9. コラボレーション機能 │
│ │
│ - 現状: 個人利用のみ │
│ - 提案: チーム利用対応 │
│ - タスク共有 │
│ - コメント機能 │
│ - アサイン機能 │
│ │
│ 🔧 実装の観点 │
│ │
│ 技術的実現性 │
│ │
│ - 既存アーキテクチャとの整合性が高い │
│ - SQLiteスキーマの拡張で対応可能 │
│ - 既存のテスト環境でカバー可能 │
│ │
│ 推奨実装順序 │
│ │
│ 1. 実績時間トラッキング - 既にインフラが存在 │
│ 2. フィルタリング・検索 - UX改善の最大効果 │
│ 3. ダッシュボード分析 - 蓄積データの活用 │
│ 4. テンプレート・通知 - 利便性向上 │
│ │
│ どの機能から始めますか? │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
他の質問もしてみます。
> リファクタリングが必要なプログラムはありますか?
⏺ プロジェクトのコードベースを分析して、リファクタリングが必要な箇所を調査します。
実行結果
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ リファクタリング必要箇所の分析結果 │
│ │
│ プロジェクトのコードベースを詳細に分析した結果、以下のリファクタリング対象を特定しました: │
│ │
│ 🚨 優先度:高(即座に対応すべき問題) │
│ │
│ 1. ログ出力の統一とクリーンアップ │
│ │
│ - 問題: 本番コードに多数のconsole.log/error/warnが散在(40箇所以上) │
│ - 対象ファイル: │
│ - APIルート全体(各ルートで一貫性のないエラーログ) │
│ - コンポーネント内(デバッグ用コメントアウトされたログ多数) │
│ - サービス層(AIService、データベース初期化) │
│ - 提案: 統一されたログ管理システムの導入 │
│ │
│ 2. WeeklyScheduleコンポーネントの巨大化 │
│ │
│ - 問題: 1つのファイルに291行、複数の責務が混在 │
│ - 具体的課題: │
│ - ドラッグ&ドロップロジック │
│ - スケジュール表示ロジック │
│ - API通信処理 │
│ - 4つの異なるサブコンポーネント定義 │
│ - 提案: コンポーネント分割とカスタムフック抽出 │
│ │
│ 3. エラーハンドリングの不統一 │
│ │
│ - 問題: APIルート間でエラーレスポンス形式が不一致 │
│ - 例: │
│ - あるルートは{ error: "message" } │
│ - 別ルートは{ message: "message" } │
│ - 提案: 統一されたエラーレスポンス仕様 │
│ │
│ 📊 優先度:中(保守性改善) │
│ │
│ 4. 重複コードの削減 │
│ │
│ - 問題: API fetching ロジックの重複 │
│ - 対象: Settings.tsx、TaskManager.tsx、WeeklySchedule.tsx │
│ - 提案: カスタムフックによるAPI通信抽象化 │
│ │
│ 5. TODOコメントの解決 │
│ │
│ - 未実装機能: actual_hoursフィールドの進捗バー表示 │
│ - 場所: TaskManager.tsx:246, InfoPanel.tsx:131 │
│ - 提案: 機能実装または適切な技術債務管理 │
│ │
│ 6. 型安全性の向上 │
│ │
│ - 問題: 一部の動的プロパティアクセス │
│ - 具体例: タスクプロパティの動的マッピング処理 │
│ - 提案: より厳密な型定義 │
│ │
│ 🔧 優先度:低(将来的改善) │
│ │
│ 7. パフォーマンス最適化 │
│ │
│ - 問題: WeeklyScheduleでの大量DOM要素生成(24時間×5日) │
│ - 提案: 仮想スクロールまたは表示範囲最適化 │
│ │
│ 8. テストカバレッジの向上 │
│ │
│ - 現状: 優良(93.5%のサービス層カバレッジ) │
│ - 改善点: UIコンポーネントの統合テスト強化 │
│ │
│ 🎯 推奨実装順序 │
│ │
│ 1. ログ管理システム導入 - 開発・本番環境の品質向上 │
│ 2. WeeklySchedule分割 - 最も複雑なコンポーネントの整理 │
│ 3. エラーハンドリング統一 - API一貫性向上 │
│ 4. API通信カスタムフック - 重複削減 │
│ 5. actual_hours機能完成 - 既存TODOの解決 │
│ │
│ 📈 期待される効果 │
│ │
│ - 保守性: コンポーネント分割により理解・修正が容易に │
│ - デバッグ: 統一ログシステムによる問題特定の高速化 │
│ - 型安全: より厳密な型チェックによるバグ予防 │
│ - テスト: 分割されたコンポーネントのテスト容易性向上 │
│ │
│ どの項目から着手しますか? │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
いいですね。
しっかりと現状の分析ができていそうです。
計画や分析だけではなく、プログラミングの性能も検証してみます。
先ほど挙げてくれたリファクタリング候補の中から1つ実際に修正してもらいます。
こちらのissueを対応してもらいました。
⏺ 最高優先度のIssue #94: ログ管理システム導入から始めましょう。まず、軽量で効果的なログライブラリを調査します。
対応中のclaude codeのログを眺めているとsearch_for_pattern (MCP)
が何度か利用されていました。
実際に作成されたPRはこちらです。
まとめ
まだSerenaを利用し始めたばかりなので定量的な評価ではなく、私個人の体感なのですが、少しClaude Codeの振る舞いが良くなっているのではないかなと思います。
特に違うそうじゃない!という手戻りが発生する場面が減ったような気がしています。
これからしっかりと使っていけばよりSerenaの効果を実感していくかもしれません。
設定自体はとても簡単ですので、最近のClaude Codeの振る舞いで困っている場合はSerenaを設定して利用してみるというのは1つのソリューションになるのではないでしょうか?
ぜひ皆さんもSerenaを使ってみて、コーディングをさせるところまで検証してみてください。
SerenaはClaude Codeだけではなく今話題のCodex cliでも利用可能です!
Discussion