MCP Server Implementation について
外部ツールを使うLLMチャットサービスの構築を目的とした、FlaskベースのMCP実装例です。モデルのテキストからツール呼び出しを解析して実行し、結果を会話に戻します。
主な機能
- 01テキスト形式のツール呼び出しを解析・実行
- 02天気と計算機のサンプルツール
- 03複数ターンの会話コンテキストを維持
- 04正規表現による呼び出しの検出
- 05FlaskのチャットAPI
活用シーン
- 01会話中に天気情報を取得
- 02会話中に計算を実行
- 03パラメーターと実行処理を備えたツールの追加
- 04REST API経由でチャットアプリに接続
MCP 対応
テキスト解析によるツール呼び出しのフローを実装し、Flask APIを提供します。LLMにツール定義を渡し、呼び出しを解析して実行した結果を会話に挿入します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP サーバーの実装
外部ツールを使用して大規模言語モデルの機能を拡張する、Model Context Protocol(MCP)の Flask ベースの完全な実装です。
概要
このリポジトリでは、Model Context Protocol(MCP)を処理するサーバーの構築方法を紹介します。MCP は、モデルのテキスト出力内でツールを直接呼び出し、LLM の機能を拡張する方法です。関数呼び出しとは異なり、MCP ではツールの定義をコンテキストウィンドウに直接配置し、モデルの自然言語による応答を解析して、ツールの使用を特定します。
機能
- 🔧 MCP の完全な実装:解析、実行、応答処理をすべて実装
- 🌤️ サンプルツール:パラメーター検証機能付きの天気および計算ツール
- 🔄 会話フロー:複数回のやり取りでコンテキストを維持
- 🧩 正規表現ベースの解析:ツール呼び出しに対応する柔軟なテキスト解析
- 🚀 Flask API:チャット連携用の REST API エンドポイント
プロジェクト構成
mcp_server/
├── app.py # Main Flask application
├── mcp_handler.py # MCP parsing and execution
├── mcp_example.py # Standalone MCP example
├── requirements.txt # Dependencies
├── tools/ # Tool implementations
│ ├── __init__.py
│ ├── weather.py # Weather API tool
│ └── calculator.py # Calculator tool
└── README.md # This file
インストール
-
リポジトリをクローンします:
git clone https://github.com/yourusername/mcp-server.git cd mcp-server -
仮想環境を作成します:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate -
依存関係をインストールします:
pip install -r requirements.txt -
環境変数を設定します:
# Create a .env file with: LLM_API_KEY=your_llm_api_key_here WEATHER_API_KEY=your_weather_api_key_here FLASK_APP=app.py FLASK_ENV=development
使い方
サーバーの起動
Flask の開発サーバーを起動します:
flask run
本番環境の場合:
gunicorn app:app
API エンドポイント
- POST /chat:MCP を使用してチャットメッセージを処理します
curl -X POST http://localhost:5000/chat \ -H "Content-Type: application/json" \ -d '{ "messages": [ { "role": "user", "content": "What's the weather like in Boston?" } ] }'
単独実行の例
サンプルスクリプトを実行して、MCP の動作を確認します:
python mcp_example.py
動作の仕組み
- ツールの登録:ツールをパラメーターおよび実行ロジックとともに登録します
- ツール定義の挿入:XML 形式のツール説明をプロンプトに追加します
- LLM 応答の処理:正規表現パターンを使って、LLM のテキスト出力内のツール呼び出しを特定します
- ツールの実行:パラメーターを解析し、適切なツールハンドラーに渡します
- 結果の挿入:ツールの実行結果を応答に挿入します
MCP と関数呼び出しの比較
| 機能 | MCP | 関数呼び出し |
|---|---|---|
| 定義の場所 | プロンプトテキスト内 | API パラメーター内 |
| 呼び出し形式 | 自然言語 | 構造化された JSON |
| 実装 | テキスト解析 | API 連携 |
| 可視性 | 応答内に表示 | 非表示の場合あり |
| プラットフォームのサポート | テキストベースのあらゆる LLM | API によるサポートが必要 |
会話の例
ユーザー:ボストンの天気はどうですか?
LLM:
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
処理後:
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
Result from get_weather:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "Partly Cloudy",
"humidity": 68,
"wind_speed": 5.8
}
独自のツールを追加する
Toolを継承する新しいクラスを作成します- パラメーターと実行ロジックを定義します
- MCP ハンドラーに登録します
例:
class MyTool(Tool):
def __init__(self):
parameters = [
{
"name": "param1",
"type": "string",
"description": "Description of param1",
"required": True
}
]
super().__init__(
name="my_tool",
description="Description of my tool",
parameters=parameters
)
def execute(self, param1):
# Tool logic here
return {"result": "Processed " + param1}
MCP の設定と呼び出しフロー
-
ツールの登録:
- MCP ツールをハンドラーに登録します
- 各ツールは、名前、説明、パラメーターの定義を提供します
-
ツール定義の挿入:
- ツールの定義をシステムメッセージに追加します
- MCP の XML 構造に従った形式を使用します
-
LLM 応答の処理:
- LLM はツール呼び出しを含む場合がある応答を生成します
- パターンマッチングを使って、テキスト内のツール呼び出しを特定します
- ツールのパラメーターを解析し、ツールの実行メソッドに渡します
-
ツールの実行:
- 指定されたパラメーターを使ってツールを実行します
- 結果を会話に挿入します
-
会話の管理:
- ツールの結果を含む処理済みの応答を会話履歴に追加します
- 以降の LLM リクエストでは、コンテキストとしてこの履歴を含めます
会話の例
会話の例は次のようになります。
ユーザー: ボストンの天気はどうですか?
システム: MCP ツールの定義を含むプロンプトを LLM に送信します
LLM の応答:
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
MCP ハンドラー: 応答を解析し、ツール呼び出しを見つけて、天気ツールを実行します
ツール実行結果:
Result from get_weather:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "Partly Cloudy",
"humidity": 68,
"wind_speed": 5.8
}
処理済みの応答(ユーザーに返送):
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
Result from get_weather:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "Partly Cloudy",
"humidity": 68,
"wind_speed": 5.8
}
ユーザー: 144 の平方根を計算できますか?
LLM の応答:
I can calculate that for you.
calculator(expression="sqrt(144)")
MCP ハンドラー: 応答を解析し、計算ツールを実行します
ツール実行結果:
Result from calculator:
{
"expression": "sqrt(144)",
"result": 12.0
}
処理済みの応答(ユーザーに返送):
I can calculate that for you.
calculator(expression="sqrt(144)")
Result from calculator:
{
"expression": "sqrt(144)",
"result": 12.0
}
The square root of 144 is 12.
これは、LLM によるテキストベースの呼び出しから実行、応答の処理まで、MCP ツールの使用における一連の流れを示しています。
ライセンス
MIT
コントリビューション
コントリビューションを歓迎します!お気軽にプルリクエストを送信してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。