ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #45 - Serena」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
Serena
今回は、コーディングエージェントツールキットの「Serena」をキャッチアップしました。
SerenaのGitHubリポジトリはこちらです。
今回のポイント
Serenaとは
Serenaは、LLMをコーディングエージェントにするためのツールキットです。 Serenaでは、コーディングエージェントに必要なツールが一通り提供されています。
Serenaを使うことで、Claude Codeのような既存のコーディングエージェントをより効率的に動かすために使うこともできれば、Claude DesktopなどのLLMアプリをコーディングエージェントにすることもできます。
Serenaが提供するツール
Serenaには、read_file・list_dirといったコーディングエージェントの典型的なツール以外に、以下のようなシンボルベースのツールが提供されています。
- find_symbol: クラスや関数などのシンボルを検索
- find_referencing_symbols: シンボルへの参照を検索
- insert_after_symbol: 指定したシンボルの後方にテキストを挿入
このようなツールにより、通常のコーディングエージェントよりもソースコードを効率的に探索するとされています。
Claude CodeでSerenaを使う
SerenaはMCPサーバーを提供しています。
Claude CodeのMCPサーバーとしてSerenaを使うには、以下のコマンドを実行します。
claude mcp add serena -- uvx --from git+https://github.com/oraios/serena serena start-mcp-server --context ide-assistant --project $(pwd)
Claude Codeに指示をすると、Serenaのlist_dir・get_symbols_overview・search_for_patternsといったツールを使用する様子を確認できました。

SerenaとLangGraphでコーディングエージェントを実装
Serenaはコーディングエージェントのためのツールを一通りそろえているため、Serenaを使用すると任意のAIエージェントのフレームワークで簡単にコーディングエージェントを実装することができます。
MCPをサポートしているフレームワークであればMCPで連携し、MCPをサポートしていないフレームワークでもSerenaのツールをそのフレームワークのツールに変換することで使用できます。
実際にLangGraphのcreate_react_agentでSerenaのMCPサーバーを使用して、コーディングエージェントを実装することを試しました。
完成したコードは以下になります。
import asyncio import uuid from dotenv import load_dotenv from langchain_mcp_adapters.client import MultiServerMCPClient from langgraph.checkpoint.memory import InMemorySaver from langgraph.prebuilt import create_react_agent load_dotenv() async def main() -> None: client = MultiServerMCPClient( { "serena": { "command": "uvx", "args": [ "--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--project", "/workspaces/workspace", ], "transport": "stdio", }, }, ) tools = await client.get_tools() agent = create_react_agent( "anthropic:claude-3-7-sonnet-latest", tools, checkpointer=InMemorySaver(), ) thread_id = uuid.uuid4() while True: user_message = input("Enter your message: ") response = await agent.ainvoke( {"messages": [{"role": "user", "content": user_message}]}, config={"configurable": {"thread_id": thread_id}}, ) print(response) if __name__ == "__main__": asyncio.run(main())
実際に動かした様子は以下のようになります。

たったこれだけのコードでコーディングエージェントが実装できるというのは面白いですね。
LangGraphで実装したので、LangSmithのトレースを確認すると、エージェントの動作やSerenaで提供されているツールなどを分かりやすく確認できました。

次回のご案内
以上、今回は「Serena」をキャッチアップしました。
次回は「AIエージェントキャッチアップ #46 - DSPy v3」ということで、先日v3がリリースされたプロンプト最適化フレームワーク「DSPy」がテーマです!
generative-agents.connpass.com
ご興味・お時間ある方はぜひご参加ください!
また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!