「AIエージェントキャッチアップ #45 - Serena」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #45 - Serena」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

Serena

今回は、コーディングエージェントツールキットの「Serena」をキャッチアップしました。

SerenaのGitHubリポジトリはこちらです。

github.com

今回のポイント

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などあれば教えてください!