
リモートMCPサーバーのセキュリティテスト用HTTPプロキシブリッジ。標準的なHTTPツールでJSON-RPCメッセージを送信し、セッションを管理できます。
このプロジェクトは、mcp Pythonライブラリ(GitHub)を使用して、HTTP/1.1リクエストとリモートMCPサーバー間のブリッジとして機能するHTTPサーバーを実装しています。
この取り組みの主な目的は、リモート転送メカニズム(HTTP+SSEまたはStreamable HTTP)を使用して、HTTPセキュリティツールでリモートMCPサーバーをテストできるようにすることです。
同じidを持つJSON-RPC-V2メッセージを並行スレッドで送信すると、応答がマージされる可能性があることが確認されています。アセスメントでこのツールを使用する際は、その点に注意してください。この問題を修正するまでの間は、シングルスレッドでテストするようにしてください。
開始するには、リポジトリをクローンし、必要な依存関係をインストールします:
git clone <repository-url>
cd http-mcp-bridge
pip install -r requirements.txt
HTTPサーバーを実行するには、次のコマンドを実行します:
python3 main.py --remote-url="http://127.0.0.1:8787/mcp"
HTTPサーバーはデフォルトのインターフェースとポート(http://127.0.0.1:8000)で待ち受けし、MCP接続は指定されたリモートURLに対して確立されます。指定されたURLには、サポートされている転送メカニズムを実装したリモートMCPサーバーが存在している必要があります。以前はHTTPサーバーがStreamable HTTPまたはHTTP+SSEの適切な転送メカニズムを自動検出していましたが、一部の本番環境で問題が発生したため、現在は無効になっています。デフォルトではStreamable HTTP転送メカニズムが使用されていました。HTTP+SSEの使用を強制するフラグを作成する予定ですが、それまでの間はコードを編集してその転送メカニズムを有効にすることができます。
その後、サーバーにHTTPリクエストを送信できます。サーバーはそれらをSSE/Streamable HTTPクライアントに中継します。
python SDKに実装されているメカニズムは、対応する転送メカニズムを使用してエンドポイントと通信するための読み取りチャネルと書き込みチャネルを確立します。このHTTP to MCP Bridgeは、HTTPリクエストを書き込みチャネルに転送し、読み取りチャネルで応答を待機します(該当する場合)。応答を受信すると、その応答はHTTPリクエストの応答として転送されます。
HTTPリクエストはtimeoutパラメータをサポートしており、ブリッジがエラーメッセージを返す前に読み取りチャネルで応答を待機する最大秒数を制限します。timeoutがゼロの場合、HTTP to MCP Bridgeはまったく待機しません。
HTTP to MCP BridgeはMCPサーバーとの複数セッションをサポートしているため、最初のステップはセッションIDを取得することです。このセッションIDは以降のリクエストで使用されます。
リクエスト:
GET /mcp/messages HTTP/1.1
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Content-Type: application/json
Cache-Control: no-store
Content-Length: 0
レスポンス:
HTTP/1.1 400 Bad Request
date: Fri, 02 May 2025 15:40:32 GMT
server: uvicorn
content-length: 87
content-type: application/json
{"detail":"Invalid session id. Try /mcp/messages/7fc2cce5-3b0b-4d63-9df6-e703c1df091c"}
このセッションIDは、MCPクライアントとサーバー間で確立されるセッションIDとは異なり、独立しています。後者はmcpライブラリによって内部で処理されます。
MCPサービスが存在し、選択した転送メカニズムが正しいことを確認するために呼び出せるpingメソッドがあります。
リクエスト:
POST /mcp/messages/7fc2cce5-3b0b-4d63-9df6-e703c1df091c HTTP/1.1
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Content-Type: application/json
Cache-Control: no-store
Authorization: Bearer [REDACTED]
Content-Length: 40
{"method":"ping","jsonrpc":"2.0","id":2}
レスポンス:
[{"jsonrpc":"2.0","id":2,"result":{}}]
MCP通信の最初のステップは初期化ハンドシェイクで、両方のピアが利用可能な機能を共有します。
リクエスト:
POST /mcp/messages/7fc2cce5-3b0b-4d63-9df6-e703c1df091c HTTP/1.1
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Content-Type: application/json
Cache-Control: no-store
Authorization: Bearer [REDACTED]
Content-Length: 213
{"method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {"sampling": {}, "roots": {"listChanged": true}}, "clientInfo": {"name": "mcp", "version": "0.1.0"}}, "jsonrpc": "2.0", "id": 0}
レスポンス:
[{"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"Demo","version":"1.0.0"}}}]
ハンドシェイクはこのメッセージを使用して閉じる必要があります。このメッセージには応答がないため、この時点ではtimeout=0を使用できます。タイムアウトエラーメッセージを受け取りますが、これは想定どおりです。
リクエスト:
POST /mcp/messages/7fc2cce5-3b0b-4d63-9df6-e703c1df091c?timeout=0 HTTP/1.1
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Content-Type: application/json
Cache-Control: no-store
Authorization: Bearer [REDACTED]
Content-Length: 54
{"method":"notifications/initialized","jsonrpc":"2.0"}
レスポンス:
{"message":"Timeout waiting for messages"}
ハンドシェイクが完了すると、tools/list(ツールの一覧表示)などの利用可能なメソッドを呼び出すことができます。
リクエスト:
POST /mcp/messages/7fc2cce5-3b0b-4d63-9df6-e703c1df091c HTTP/1.1
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Content-Type: application/json
Cache-Control: no-store
Content-Length: 46
{"method":"tools/list","jsonrpc":"2.0","id":1}
レスポンス:
[{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"add","inputSchema":{"type":"object","properties":{"a":{"type":"number"},"b":{"type":"number"}},"required":["a","b"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}]}}]
最後に、ツールを呼び出したり、他の機能を利用したりできます。
リクエスト:
POST /mcp/messages/7fc2cce5-3b0b-4d63-9df6-e703c1df091c HTTP/1.1
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Content-Type: application/json
Cache-Control: no-store
Content-Length: 100
{"method":"tools/call","params":{"name":"add","arguments":{"a":1, "b":2 }},"jsonrpc":"2.0","id":2}
レスポンス:
[{"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"3"}]}}]
コントリビューションを歓迎します!機能強化やバグ修正については、issueを開くか、プルリクエストを送信してください。
このプロジェクトはMITライセンスの下でライセンスされています。詳細については、LICENSEファイルを参照してください。