mcproxy について
mcproxyは、MCPクライアントとサーバーの間に置く実験的なプロキシ層で、両者間のワークフローの変更を試す開発者向けです。メッセージを転送し、機能の制限や名称変更、コンテンツ更新などを行う内部機能と外部モジュールの基盤を備えます。
主な機能
- 01複数のMCPサーバーに接続
- 02リクエスト、レスポンス、エラー、通知を転送
- 03サーバー機能の集約またはブロック
- 04識別子の衝突を避ける機能名の変更
- 05テキストコンテンツのフィルタリングや補完
活用シーン
- 01プロキシ経由で複数のサーバーを公開
- 02クライアントが利用できるサーバー機能を制限
- 03重複するツール名やリソース名を区別
- 04転送中のメッセージコンテンツを処理
MCP 対応
クライアント側からはMCPサーバーとして、接続先サーバー側からはMCPクライアントとして動作します。MCPメッセージを転送し、内部機能を適用したり設定済みの外部モジュールを呼び出したりできます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
はじめに
これは非常に実験的なもので、まったく役に立たない可能性もあります 😁。フィードバックをいただけると大変ありがたいので、こちらのディスカッションにぜひご参加ください。
注:これはこちらの「サーバー間のやり取りはホストが制御する」という原則に反する可能性があります。あるいは、そうではないかもしれません……
概要
このプロジェクトは、Anthropic の Model Context Protocol(MCP。詳細はドキュメントと仕様をご覧ください)に関連しています。
MCProxy は MCP クライアントと MCP サーバーの間に位置するプロキシであり、両者間のワークフローに新たな機能を追加できます(以下にいくつかの例を示します)。
MCProxy は、このようなプロキシアーキテクチャを構築するための基本要素と、いくつかの基本機能を提供します(要対応:基本機能の一覧)。
ユーザーのニーズに応じて、プラグインモジュールを使って新機能を追加できます(要対応:プラグインの仕組み)。
全体アーキテクチャ
MCP クライアントから見ると、MCProxy は MCP サーバーとして動作します。MCP サーバーから見ると、MCProxy は MCP クライアントとして動作します。
最もシンプルな構成は次のとおりです。
flowchart LR
client1[MCP Client]
subgraph "MCProxy"
server1[MCP Server]
client2[MCP Client]
end
server2[MCP Server]
client1 <--MCP--> server1
client2 <--MCP--> server2
server1 <--> client2
MCProxy は複数のサーバーに接続できます。
flowchart LR
client1[MCP Client]
subgraph "MCProxy"
server1[MCP Server]
client2[MCP Client A]
client3[MCP Client B]
end
server2[MCP Server A]
server3[MCP Server B]
client1 <--MCP--> server1
client2 <--MCP--> server2
client3 <--MCP--> server3
server1 <--> client2
server1 <--> client3
MCP ホストは、構成が大きく異なる複数の MCProxy に接続できます。
flowchart LR
subgraph "Host"
clientH1[MCP Client]
clientH2[MCP Client]
end
subgraph "MCProxy A"
serverPA[MCP Server]
clientPA[MCP Client]
end
serverA[MCP Server A]
subgraph "MCProxy B"
serverPB[MCP Server]
clientPB[MCP Client]
end
serverB[MCP Server B]
clientH1 <--MCP--> serverPA
clientH2 <--MCP--> serverPB
clientPA <--MCP--> serverA
clientPB <--MCP--> serverB
serverPA <--> clientPA
serverPB <--> clientPB
必要であれば、MCProxy を連結することもできます。
flowchart LR
client1[MCP Client]
subgraph "MCProxy A"
server1[MCP Server]
client2[MCP Client]
end
subgraph "MCProxy B"
server2[MCP Server]
client3[MCP Client]
end
server3[MCP Server]
client1 <--MCP--> server1
client2 <--MCP--> server2
client3 <--MCP--> server3
server1 <--> client2
server2 <--> client3
内部アーキテクチャ
基本コンポーネントは次のとおりです。
- サーバーマネージャー:MCP クライアントとの通信(リクエストだけでなく、レスポンス/エラー/通知も含む)を処理します。
- クライアントマネージャー:接続された MCP サーバーの一覧を管理し、それらとの通信(リクエストだけでなく、レスポンス/エラー/通知も含む)を処理します。
内部機能コンポーネントは、常に利用できる基本機能の一覧を提供します。
モジュールマネージャーは、追加機能を提供する外部モジュールの一覧を管理し、それらと連携します。
中核となるコンポーネントはディスパッチャーで、次の処理を行います。
- MCP クライアントと MCP サーバー間でメッセージを双方向に転送します。
- 該当する場合、内部機能を適用します。
- 該当する場合、外部モジュールを呼び出します。
flowchart LR
subgraph MCProxy
subgraph servermanager[Server manager]
server[MCP Server]
end
dispatcher[Dispatcher]
internalfeatures[Internal features]
modulesmanager[Modules manager]
subgraph clientsmanager[Clients manager]
direction TB
clientA[MCP Client A]
clientB[MCP Client B]
end
end
moduleA[External module A]
moduleB[External module B]
servermanager <--> dispatcher
dispatcher <--> clientsmanager
dispatcher <--> internalfeatures
dispatcher <--> modulesmanager
modulesmanager <--> moduleA
modulesmanager <--> moduleB
識別子
デフォルトでは、MCProxy は接続先の MCP サーバーが提供するすべてのリソース/プロンプト/ツールを、同じ識別子(名前、URI など)で公開します。これらの識別子は名前を変更できます(以下の「機能」をご覧ください)。
設定
MCP サーバーに接続するため、MCProxy は MCP ドキュメントのクイックスタートのセクションで定義されているものと同じ設定ファイル形式を使用します。
MCProxy 自体には、さらに内部設定があります。
最後に、各モジュールは設定ディレクティブを提供します。例を以下に示します。
注:Claude Dekstop のような MCP ホストでは、設定ファイルの接続先は MCProxy であり、その背後にある個々のサーバーではありません。
機能
以下は、MCProxy が内部または外部モジュールを通じて実装できる機能の例です。
ログ記録
MCProxy は、MCP クライアントと MCP サーバー間を行き来するすべてのメッセージを記録できます。
設定項目:
- 記録する内容
- 記録先
ケイパビリティの集約
MCProxy は、複数の MCP サーバーのケイパビリティを集約し、意味のあるパッケージにまとめることができます。
ケイパビリティのブロック
MCProxy は、接続先の MCP サーバーが提供するケイパビリティの一部のみを公開できます。
設定項目:
- ブロックするケイパビリティ
ケイパビリティの曖昧さ解消
MCP サーバーの数が急速に増加するにつれて、名前の衝突が発生する可能性があります。MCProxy はケイパビリティの名前を変更して MCP クライアントから一意に見えるようにし、適切な MCP サーバーへのルーティングを処理できます。
設定項目:
- サーバー/識別子 => 新しい識別子の一覧
コンテンツの更新
MCProxy を通過するテキストコンテンツは、フィルタリングしたり、情報を追加したりできます。
オンザフライの国際化(i18n)
現在の MCP 仕様では、i18n は提供されていません(この件に関する私の課題を参照してください)。
MCProxy は、翻訳 API または LLM を使用して、一部のフィールドをオンザフライで翻訳できます。
設定:
- 優先言語
- 翻訳ツールへの接続パラメーター
外部モジュール
外部モジュールは、MCProxy 自体が提供する基本機能に追加機能を提供します。
これらは、MCProxy に接続する独立したプロジェクトです。
現在、MCP クライアント/サーバーのリストが作成されているのと同様に、このようなモジュールのリストを維持できます(たとえば、こちら、こちら、こちらを参照してください)。
ホスティング
ローカルまたはサービスとしてリモートでホストできます。
機能
モジュールは、自身の「機能」、つまり関心のある MCP メッセージの種類を宣言します。
設定ファイルで宣言された順序で呼び出されます。
プロトコル
MCProxy と外部モジュール間のプロトコルは、MCP 仕様から強い影響を受けています。
ただし、ワークフローはかなり異なります。通常、応答は送信されたメッセージと同じ型です。
たとえば、次のようになります。
- モジュールに送信された
GetPromptRequestメッセージは、更新されたGetPromptRequestメッセージを返します - モジュールに送信された
ListToolsResultメッセージは、更新されたListToolsResultメッセージを返します
(未定:このようなプロトコルの仕様)
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。