Vポイントマーケティング|TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Agentアプリ開発を加速する"MCP(Model Context Protocol)"を調べて触れてみる。

こんにちは、CCCMKホールディングスAIエンジニアの三浦です。気温が高くなってきたので冬服や厚手の布団をしまっていかないと・・・と感じる今日この頃です。

はじめに

"MCP"というAIとデータやツールを効率的に接続する共通ルールが話題になっています。MCPはModel Context Protocolの略で、Claudeを開発したAnthropic社が去年の11月に提唱しました。個人的な印象だと、今年の春ごろからMCPに関する情報を急激に見るようになったように感じています。

私は普段、LLMを活用したアプリケーションをよく作っているのですが、今回MCPを調べていくと今後特にAI Agentアプリの開発の進め方が大きく変わっていくんじゃないか、という印象を受けました。

今回はMCPについて私が調べたことと、Agent開発フレームワークLangGraphとMCPを使った簡単なAgentアプリのコードを通じてAgentアプリの開発が今後どうなっていくのか自分なりに感じたことをまとめたいと思います。

MCPについて

MCP(Model Context Protocol)はLLMとアプリケーションがデータをやり取りするための共通のルールのようなものです。以下がAnthropicのMCPのドキュメントです。

modelcontextprotocol.io

AnthropicのMCPのドキュメントでは、MCPをAIアプリケーションのUSB-Cポートにたとえています。MCPを利用することでたとえば

  • AgentにローカルPCのファイルを操作させる
  • AgentにウェブAPIを利用して最新情報を取得させる

など、LLMを組み込んだAgentと様々なデータやツールを簡単に連携することが出来るようになります。実際、最近Visual Studio Codeに正式に追加されたAgent modeはMCPに対応しており、ローカルファイルを操作したりGithubと連携する機能をMCPを通じて簡単に追加し、自然言語でそれらの操作が出来るようになるようです。

MCPはクライアントとサーバーで構成されます。ドキュメントに掲載されている図を以下に転載します。

Anthropic, Model Context Protocol, Intruductionより(https://modelcontextprotocol.io/introduction)

この図の"Host with MCP Client"がLLMを呼び出すアプリケーションを指しています。先ほど触れたVisual Studio Codeもそうですし、LangGraphなどで独自に開発したAgentアプリケーションの中でMCP Clientを呼び出してMCP Serverに問い合わせる処理を組み込んだものが該当します。一方"MCP Server"はClientの要求に対し自身に紐づけられたデータソース、たとえばデータベースやファイルなどからデータを取得して応答する、外部APIを実行して情報を取得してClientに渡す役割を担当します。

先の図に"Your Computer"と書いてありますが、現在のMCPではアプリケーションもClientもServerも同一のマシンで動かすことが主流のようです。しかし今後、MCP Serverをインターネットを通じてアクセス出来るようにし、有益なデータや機能をMCPを通じて利用できるようなサービスがどんどん生まれていくのかもしれません。

実装してみる

ここからは具体的にMCPを活用してAgentアプリを実装しながらMCP便利だ!と思ったことをお伝えしたいと思います。今回のアプリはこんな構成です。

アプリの構成

Agentアプリは、LangGraphを使って構築します。またMCP Serverと接続し、MCP Serverで提供されているToolをLangGraphのToolに変換してくれる"LangChain MCP Adapters"という、LangChainが公開しているライブラリを利用しました。

また、実装については"LangChain MCP Adapters"のGithubリポジトリのREADMEで紹介されている内容に基づいています。

github.com

必要なライブラリをpipインストールします。

pip install langchain-mcp-adapters langgraph langchain-openai

Serverの実装

最初にMCP Serverの実装をします。langchain-mcp-adaptersをインストールすると、依存ライブラリとしてmcpというAnthropicが提供しているMCPのPython SDKがインストールされます。このSDKを使用するととてもシンプルにMCP Serverの処理を作ることが出来ます。

以下の内容はLangChain MCP AdaptersのREADMEの実装をそのまま使用しています。@mcp.tool()デコレータが付与された関数がこのMCP Serverが提供する機能(Tool)で、足し算と掛け算を実行する機能を提供します。

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Math")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b

@mcp.tool()
def multiply(a: int, b: int) -> int:
    """Multiply two numbers"""
    return a * b

if __name__ == "__main__":
    mcp.run(transport="stdio")

この内容を"server.py"という名前で保存しておきます。

Clientの実装

"server.py"と同階層に新しいファイルを作成し、MCP Clientの処理を書きます。 以下のコードで動作はしたのですが、まだlangchain-mcp-adaptersに関する情報が少なく、これがベストな書き方ではないかもしれません。

import asyncio

from dotenv import load_dotenv
from langchain_mcp_adapters.tools import load_mcp_tools
from langchain_openai import AzureChatOpenAI
from langgraph.prebuilt import create_react_agent
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# 設定ファイルからAzure OpenAI接続情報を取得
load_dotenv()
model = AzureChatOpenAI(model="gpt-4o",api_version="2025-01-01-preview")

server_params = StdioServerParameters(
    # 接続するMCP Serverの情報
    command="python",
    args=["server.py"],
)
async def chat(query):
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            # Initialize the connection
            await session.initialize()

            # Get tools
            tools = await load_mcp_tools(session)

            # Create and run the agent
            agent = create_react_agent(model, tools)
            agent_response = await agent.ainvoke({"messages": query})
            return agent_response

if __name__ =="__main__":
    try:
        while True:
            query = input("クエリ入力: ")
            print(asyncio.run(chat(query)))
    except KeyboardInterrupt:
        print("終了しました。")

StdioServerParametersに接続するServerの情報を指定します。先ほど作成した"server.py"と起動コマンドを指定することで、MCPのHostであるこのアプリ起動時にServerを起動することが出来ます。

Serverとセッションを確立した後、load_mcp_tools(session)を実行することでMCP Serverで提供されている機能をLangGraphで読むことが出来るToolの形式に変換します。あとはLangGraphのcreate_react_agentを呼び出してこれらのToolをAgentから利用できるようにしています。

ターミナルで以下のコマンドを実行してアプリを起動します。

python host_app.py

足し算と掛け算を組み合わせた計算式を解かせてみます。

クエリ入力: (1 + 2 + 3) * (3 - 1 + 3)

実行すると途中呼び出されたToolの実行結果などがたくさん出力されますが、最終的に

The result of the expression \\((1 + 2 + 3) * (3 - 1 + 3)\\) is 30.

というように、正しい答えにたどり着くことが出来ていることが確認できました。

Agentの機能を拡張する

MCPについて私が感じているメリットは、MCPがAgentアプリからToolの実装を切り離してくれる点です。今作った基本的なAgentアプリの機能を拡張する、というケースを通じてこのメリットをお伝えしていきたいと思います。

Serverの強化

たとえば先ほどのAgentアプリに現在日時を取得する機能を追加しようとします。これまでのAgentアプリの開発では、呼び出すToolをAgetアプリ側で定義していたので、新しい機能を追加したい場合はアプリの改修が必要になります。しかしMCPを利用するとAgentアプリに手を入れなくともMCPサーバーに新しい機能を追加するだけでAgentアプリに新しい機能を追加することが出来ます。

先ほど作ったMCP Serverのコード"server.py"に次の関数を追加します。

server.py
...
@mcp.tool()
def get_current_time() -> str:
    """Get current time"""
    dt_now = datetime.datetime.now()
    return dt_now.strftime('%Y/%m/%d %H:%M:%S.%f')

if __name__ == "__main__":
    mcp.run(transport="stdio")

これでAgentアプリは現在日時を取得する機能を利用できるようになります。アプリ側のコードはそのまま手を入れずにAgentアプリを起動し、動作するか確認してみます。

  • アプリの起動
python host_app.py
  • クエリ入力
クエリ入力:現在の時刻は?

実行結果は"現在の時刻は2025年4月21日19時38分18秒です。"となり、端末のシステム時刻と一致した結果を得ることが出来ました。

Serverの追加

MCPでは1つのHostに複数のServerを連携することが出来ます。ですので先ほどのように1つのServerの機能を強化するだけでなく、別の機能を提供するServerを追加する方法でもAgentアプリに機能を追加することが出来ます。

たとえば問い合わせると次のスケジュールを教えてくれる機能を提供する新しいMCP Serverを実装してみます(今回は常に決まったスケジュールを返すだけの機能です)。

 from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Schedule")

@mcp.tool()
def get_next_schedule() -> str:
    """Return Next Schedule"""
    return "スーパーに買い物に行く。"

if __name__ == "__main__":
    mcp.run(transport="stdio")

このコードを"schedule_server.py"という名前で保存します。また、先ほどの足し算、掛け算を提供するServerのファイルは"math_server.py"という名前に変更しました。

アプリの実装は以下のようにしました。langchain_mcp_adaptersMultiServerMCPClientを使うと複数のMCP Serverに接続することが出来ます。ちなみにServer起動時になんらかのエラーが発生すると、アプリがそこで応答しなくなる現象が発生しました。python schedule_server.pyのように一度各Serverを個別に実行してエラーが発生しないか確認してからHostと接続する必要があると感じました。

import asyncio

from dotenv import load_dotenv
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
from langchain_openai import AzureChatOpenAI

load_dotenv()
model = AzureChatOpenAI(model="gpt-4o",api_version="2025-01-01-preview")

# 接続するMCP Server
server_params =  {
    "math": {
        "command": "python",
        "args": ["math_server.py"],
        "transport": "stdio",
    },
    "schedule": {
        "command": "python",
        "args": ["schedule_server.py"],
        "transport": "stdio",
    }
}
async def chat(query):
    async with MultiServerMCPClient(server_params) as client:
        agent = create_react_agent(model, client.get_tools())
        agent_response = await agent.ainvoke({"messages": query})
        return agent_response

if __name__ =="__main__":
    try:
        while True:
            query = input("クエリ入力: ")
            print(asyncio.run(chat(query)))
    except KeyboardInterrupt:
        print("終了しました。")

アプリを起動して、次の入力を試してみます。

クエリ入力: 次の予定は

回答は"次の予定は「スーパーに買い物に行く」です。"になりました。MCP ServerのToolが呼び出されていることが確認できました。




計算機能も利用することが出来ます。

クエリ入力: (234+8748) * 288を計算して。

途中でToolが実行され、最終的に"計算結果は2,586,816です。"という回答を得ることが出来ました。

このように新しいServerをアプリに追加することでアプリに機能を追加することが出来ます。MCP Serverは色々なものが公開されていて、それらをこのようにAgentアプリに追加していくことで、比較的簡単に多機能なAgentアプリを実現することが出来ます。

MCPによるAgentアプリ開発の今後

ここまでMCPを活用したAgentアプリの開発について簡単にまとめてみました。これらを通じて私が感じたことは、MCPが浸透するとAgentアプリの開発方法が変わっていきそうだな、ということです。

これまでのAgentアプリ開発では、アプリ側でAgentに渡すToolを実装する必要がありました。Toolを実装し、それらをAgentにどのように提示し、利用させるかを考える必要がありましたが、MCPが浸透するとToolの実装はAgentアプリ開発から切り離され、MCP Serverが担うようになります。またAgentの試行プロセスは"ReAct"フレームワークをはじめ、様々な手法が提案され公開されています。Agentアプリ開発者は、要件に応じてアプリをどのMCP Serverと接続させ、どの試行プロセスを選択するか、といったことを考えることが主な役割になっていくのかもしれません。

また今後、世界中のデータや技術を持つ企業がそれらをMCP Server化しサービスとして提供する、といったことが起こっていくのかもしれません。MCPによってAI Agentがより利用しやすいToolを提供するMCP Serverをどのように構築するのか、といった観点が今後重要になってくるのかも、と感じました。

まとめ

ということで今話題のMCPについてまとめ、Agentアプリの開発の観点でどのようなインパクトがあるのかについて感じたことをまとめてみました。MCP Serverを利用したAgentアプリを開発する、という観点も面白いですし、有益なMCP Serverをどうやって開発するのか、ということも今後盛り上がりそうなトピックです。引き続き関連情報に注目していきたいと思います!