【MCP実践】PythonでつくるMCPサーバー構築入門
前回の記事では、Model Context Protocol (MCP) の概要について解説しました。
今回は、実際に手を動かして Python でMCPサーバーを作ってみましょう。
「サーバー構築」と聞くと難しそうに感じるかもしれませんが、MCPのSDKを使えば驚くほど簡単に実装できます。
ユースケース
今回は、「都市名を指定すると、その天気を返す」 シンプルなMCPサーバーを作成します。
そして、作成したサーバーを OpenAI のモデルから利用する方法も解説します。
環境構築
まずは開発環境を整えましょう。
Python 3.10以上が必要です。
パッケージ管理には、最近話題の高速なツール uv を使うのがおすすめです(もちろん pip でもOKです)。
# プロジェクトディレクトリの作成
mkdir weather-mcp-server
cd weather-mcp-server
# 仮想環境の作成と有効化 (uvの場合)
uv venv
source .venv/bin/activate
# 必要なライブラリのインストール
uv pip install "mcp[cli]" openai
MCPサーバーの実装
MCPサーバーを簡単に構築できる FastMCP というクラスが用意されています。
server.py というファイルを作成し、以下のコードを記述してください。
from mcp.server.fastmcp import FastMCP
# サーバーの初期化
mcp = FastMCP("Weather Server")
# ツールの定義
@mcp.tool()
def get_weather(city: str) -> str:
"""
指定された都市の現在の天気を返します。
実運用では外部APIを呼び出しますが、ここではモックデータを返します。
"""
weather_data = {
"Tokyo": "晴れ, 25℃",
"Osaka": "曇り, 22℃",
"Kyoto": "雨, 20℃",
"Seattle": "雨, 15℃",
}
# データがあれば返す、なければ不明とする
return weather_data.get(city, "不明な都市です")
if __name__ == "__main__":
# サーバーの実行
mcp.run()
たったこれだけです!
@mcp.tool() デコレータを付けるだけで、普通のPython関数がAIから呼び出せる「ツール」になります。
動作確認 (MCP Inspector)
作成したサーバーが正しく動くか、MCP公式のデバッグツール MCP Inspector を使って確認してみましょう。
npx @modelcontextprotocol/inspector python server.py
ブラウザで管理画面が開きます。「Tools」タブに get_weather が表示されているはずです。
引数に "Tokyo" などを入力して「Run Tool」をクリックし、結果が返ってくれば成功です。
OpenAIとの連携
作成したMCPサーバーを、OpenAIのモデル(GPT-4oなど)から使ってみましょう。
MCPクライアントとして振る舞う簡単なスクリプト client.py を作成します。
import asyncio
import os
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from openai import OpenAI
# OpenAI APIキーの設定 (環境変数または直接指定)
# os.environ["OPENAI_API_KEY"] = "sk-..."
async def main():
# 1. MCPサーバーの設定
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
# 2. サーバーに接続
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# サーバーからツール一覧を取得
await session.initialize()
tools = await session.list_tools()
# OpenAI用のツール定義に変換
openai_tools = [{
"type": "function",
"function": {
"name": tool.name,
"description": tool.description,
"parameters": tool.inputSchema
}
} for tool in tools.tools]
# 3. OpenAI APIを呼び出し
client = OpenAI()
messages = [{"role": "user", "content": "東京の天気は?"}]
print("User: 東京の天気は?")
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=openai_tools,
)
# 4. モデルがツール呼び出しを要求した場合
tool_call = response.choices[0].message.tool_calls[0]
if tool_call:
function_name = tool_call.function.name
arguments = eval(tool_call.function.arguments) # 注意: 実運用ではjson.loadsを使用
print(f"AI: ツール '{function_name}' を引数 {arguments} で呼び出します...")
# MCPサーバー経由でツールを実行
result = await session.call_tool(function_name, arguments)
print(f"Tool Output: {result.content[0].text}")
# ツールの結果をAIに返す(省略可能ですが、会話を続けるなら必要)
if __name__ == "__main__":
asyncio.run(main())
このスクリプトを実行すると、以下のような流れで処理が行われます。
- PythonスクリプトがMCPサーバーをバックグラウンドで起動
- サーバーから利用可能なツール(
get_weather)の情報を取得 - その情報をOpenAI APIに渡し、「東京の天気は?」と質問
- GPT-4oが「
get_weatherを "Tokyo" で呼ぶべき」と判断 - スクリプトがMCPサーバーに対してツール実行を要求
- MCPサーバーが結果("晴れ, 25℃")を返す
応用と拡張
今回はシンプルな例でしたが、MCPサーバーはさらに高度なことができます。
-
リソースの実装:
@mcp.resource()を使って、ファイルやデータをAIに提供する -
プロンプトの実装:
@mcp.prompt()を使って、定型的な指示テンプレートを作る -
外部API連携:
requestsライブラリなどで本当の天気予報APIや、Notion、SlackなどのAPIを叩く
まとめ
MCPを使えば、既存のコード資産を簡単にAIのエージェント能力として公開できます。
「AIにこのデータを見せたい」「この操作をさせたい」と思ったら、ぜひMCPサーバーを作ってみてください。
世界中の開発者が作ったMCPサーバーは、GitHubなどで公開されています。それらを参考にしながら、自分だけの最強のAIアシスタントを作り上げましょう!
Discussion