MCPクライアント入門: PythonとReActエージェントでMCPサーバーに接続する
はじめに#
前回はMCPサーバーを構築する方法について説明しました。今回はMCPサーバーに接続する方法を説明します。
一般的には、ChatGPTのようなWebサービスやアプリケーションからMCPサーバーのURLを指定しますが、本記事ではPythonから直接MCPサーバーに接続し、その動作を試す方法を説明します。
PythonからMCPを利用する準備: ローカルでのツール呼び出し#
LLMクライアントを定義します。2025年5月現在、無料で使えるGOOGLEのLLMを使ってみます。
まずはLLMがMCPを使わず、ローカルで定義された関数(ツールと呼ばれるもの)を使って、基本的な仕組みを見ていきます。この理解が、後にMCPサーバーを利用する際の基礎となります。
実は、最近ReActエージェントという重要な概念が基本となっています。MCPサーバーというネットワーク越しの要素から切り離して、純粋な形で説明するほうが良いかと思います。
この基礎を固めた上で、実際にMCPサーバーに接続するステップに進むことで、よりスムーズに学習を進められます。
必要なライブラリのインストール#
installは、
uv add langgraph langchain-google-genai geopy requests fastmcp`
GeminiのAPIキーを取得#
GEMINIのAPIKeyを取得します。 https://aistudio.google.com/apikey
取得したAPIキーは、プログラム内で直接指定するか、環境変数(例: GOOGLE_API_KEY)として設定してください。
ローカルでの実行例#
それでは、Pythonコードを実行します。
from langchain_core.tools import tool
from langchain_google_genai import ChatGoogleGenerativeAI
from langgraph.prebuilt import create_react_agent
# Read your API key from the environment variable or set it manually
api_key = "..." # os.getenv("GEMINI_API_KEY")
@tool
def magic_function(input: int) -> int:
"""Applies a magic function to an input."""
return input + 2
def main():
print("Hello from mcpc!")
# Create LLM class
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
temperature=1.0,
max_retries=2,
google_api_key=api_key,
)
tools = [magic_function]
query = "what is the value of magic_function(3)?. use tools"
agent = create_react_agent(llm, tools)
messages = agent.invoke({"messages": [("human", query)]})
print(messages)
if __name__ == "__main__":
main()
toolデコレーターの関数をLLMが参照するようになります。
これはtool calling といわれていますが、こういう関数を定義すれば、LLMが参照できるようになります。mcpサーバーでもtool
というデコレーターが出てきました。実はこうした名前はtool callingの名前が倣って踏襲されています。
create_react_agent とは#
最近ではReActエージェントを使う手法が主流ですが、それを作る関数になります。簡単に言うとReActエージェントは思考する、というプロセスが入っているものです。参考
簡単には、ReActエージェントの特徴は次のようになります。
- より複雑なタスクへの対応: 複数ステップの推論や、外部ツールとの連携が必要な複雑なタスクを、段階的に解決していく
- 柔軟な問題解決: 途中で予期せぬ結果が得られても、それを「観察」として次の「思考」に活かし、計画を修正しながら目標達成を目指。
- 透明性の向上: 「思考」のプロセスがログとして残ることが多いため、エージェントがなぜそのような判断をしたのかを理解しやすくなる。
独自のcreate_react_agent的な関数を作ることも出来ます。ここが参考になります。
MCPサーバーに接続する#
さて、いよいよ前回構築したようなMCPサーバー(または公開されている他のMCPサーバー)に接続し、そのツールをLLMエージェントから利用してみましょう。
import asyncio
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
async def main2():
# Connect via SSE
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
temperature=1.0,
max_retries=2,
google_api_key=api_key,
)
async with MultiServerMCPClient(
{
"magic_function": {
# make sure you start your weather server on port 8000
"url": "http://localhost:8000/sse",
"transport": "sse",
}
}
) as client:
agent = create_react_agent(llm, client.get_tools())
query = "what is the value of magic_function(3)?. use tools"
weather_response = await agent.ainvoke({"messages": query})
print(weather_response)
if __name__ == "__main__":
asyncio.run(main2())
MultiServerMCPClient
を使ってClientを作って接続していたところが変更点です。
ローカルでツールを呼び出す場合と殆ど一緒でLLM、ツール(今回はMCPサーバー経由)、そしてエージェント作成という流れは共通です。
わかってしまえば、これだけでMCPサーバーを利用できるクライアントを作成することができました。
最後に#
今回は、Pythonを使ってMCPサーバーに接続し、そのツールをLLMエージェントから利用する方法について解説しました。ローカルでツールを定義する場合と、MCPサーバー上のツールを利用する場合で、ReActエージェントの基本的な考え方やLangChain/LangGraphの使い方が共通していることをご理解いただけたかと思います。
FastMCPとLangChainのようなライブラリを組み合わせることで、LLMに外部の機能や情報源へのアクセス能力を付与し、より高度で実用的なアプリケーションを比較的簡単に構築できます。
ぜひ、ご自身でも様々なツールを持つMCPサーバーを構築し、LLMエージェントから連携させて、その可能性を探求してみてください。
参照#
https://github.com/langchain-ai/langchain-mcp-adapters/tree/langchain-mcp-adapters%3D%3D0.0.9?tab=readme-ov-file#client-1 https://gofastmcp.com/getting-started/installation https://python.langchain.com/docs/how_to/migrate_agent/#memory