sovereign-mcp-gateway
sovereign-mcp-gateway
Model Context Protocol サーバー用のゲーティングプロキシ。 MCP クライアントをサーバーではなくゲートウェイに向けます。ゲートウェイはリストアップされたすべてのアップストリームに接続し、それらのツールカタログを1つに統合し、実行するサーバーに到達する前にすべての呼び出しを検証チェーンに通します。
pip install sovereign-mcp-gateway
sovereign-mcp-gateway --init # writes gateway.json from the servers you already run
sovereign-mcp-gateway --config gateway.json --check--init は既存の MCP 設定(Claude Desktop、Claude Code、Cursor、VS Code、Windsurf)を読み取り、それらのサーバーをプロキシする gateway.json を書き出します。初回実行で設定エラーではなく動作する設定が生成されます。ゲートウェイ自身のエントリはインポートしません。自分自身をプロキシすることになるためです。
ゲートウェイ自体が MCP サーバーであるため、MCP を話せるクライアントは変更なしで動作します。
この基本インストールで動作するゲートウェイが完成します。オプションの拡張が4つあり、さらにレイヤーを追加できます — インストール を参照してください。
防ぐもの
エージェントが GitHub の issue を読み取ります。その本文には、あなたではなくモデルに向けられた指示が含まれています。エージェントは説得され、git_commit を呼び出します。
コミット数 | 注入されたコミットの存在 | |
| 2 | あり |
ゲートウェイ経由 | 1 | なし |
同じツール、同じ引数、同じサーバー。違いは、拒否できる立場に何かがあったかどうかだけです。
ウォークスルーを読む: エージェントが issue を読む — または実行する:
pip install "sovereign-mcp-gateway[all]" mcp-server-git
python examples/poisoned_issue.pyRelated MCP server: Agentrim MCP
ライブラリではなくプロキシである理由
ライブラリはサーバーを書いた人が採用する必要があります。プロキシは変更できないサーバーを保護します — ほとんどのサーバーがこれに該当します。なぜなら、有用な MCP サーバーは他人がメンテナンスする公開パッケージだからです。
また、エージェントが到達できるすべてのサーバーに対して、ポリシーを保持する場所と監査証跡を1つにまとめられます。誰も同期を取らないサーバーごとの設定とは異なります。
設定
既存の設定から始める
$ sovereign-mcp-gateway --init
Wrote gateway.json
imported 3 servers from Claude Desktop
/Users/you/Library/Application Support/Claude/claude_desktop_config.json
imported 1 server from VS Code (project)
upstreams: fetch, git, sqlite, time
skipped:
sovereign - this gateway - importing it would proxy itself
notion - no command, probably a remote/SSE server
git - already imported from another client実行しない4つのこと: 自身のインポート、サブプロセスとして起動できないリモートサーバーのインポート、--force なしでの既存ファイルの上書き、選択していない deny_tools リストの書き込み。ファイルを書き込み、何を取り込み何を残したかを伝え、停止します。
--init と併せて --config PATH を渡すと、./gateway.json 以外の場所に書き込めます。
実行後、クライアント内のそれらのサーバーをゲートウェイへの単一エントリに置き換えてください。両方を残すと、エージェントはプロキシ経由に加えて直接サーバーとも通信し、監査証跡にはトラフィックの半分しか記録されません。
{
"servers": {
"git": {"command": "mcp-server-git", "args": ["--repository", "/repo"]},
"sqlite": {"command": "mcp-server-sqlite", "args": ["--db-path", "/data.db"]}
},
"policy": {"deny_tools": ["git__git_reset"], "pii_policy": "warn"},
"audit": {"path": "gateway-audit.jsonl"}
}クライアントが認識する前に配線を確認:
sovereign-mcp-gateway --config gateway.json --checkSOVEREIGN GATEWAY - configuration check
upstreams: 2
layers: policy -> intent -> text-filter -> frozen-verify -> audit
EXPOSED AS UPSTREAM TOOL
git__git_status git.git_status
git__git_reset git.git_reset [DENIED]
sqlite__read_query sqlite.read_query
...
18 tools exposed.チェーン
policy → intent → text-filter → frozen-verify → [ call executes ] → output-verify → logic-rules → auditレイヤー | パッケージ | 拒否する条件 |
policy | — | ツールが拒否リストにある、または許可リストにない |
intent |
| 呼び出しが行動基準を満たさない |
text-filter |
| 引数に注入が含まれる(21言語または7種類のエンコーディングのいずれか) |
frozen-verify |
| 呼び出しが起動時に固定されたツール定義と一致しない |
output-verify |
| 結果がスキーマ、欺瞞、PII、コンテンツチェックに失敗する |
logic-rules |
| 結果が設定したルールと矛盾する |
audit |
| — すべての呼び出し(許可・拒否を問わず)をハッシュチェーンログに記録 |
インストール
基本インストールはスタブではなく動作するゲートウェイです:
pip install sovereign-mcp-gatewayこれで policy → frozen-verify → audit が得られます。すでに、どのアップストリームも公開していないツール、間違った型の引数、未宣言のパラメータ、拒否リストにあるツール、引数へのプロンプトインジェクションを拒否します。他に必要なものはありません。
各拡張がレイヤーを1つ追加します:
拡張 | 追加されるもの | 導入価値がある場合 |
|
| エージェントが管理外の場所からテキストを読む場合。基本インストールは |
|
| すべてのツールのスキーマを正確に把握することに依存しないバックストップが欲しい場合 |
|
| 正しい結果がどのようなものかを表現できる場合。 |
|
| ホスト型プロバイダーで N モデルコンセンサスを有効にする場合 |
必要なものを組み合わせるか、すべてを取得:
pip install "sovereign-mcp-gateway[text]" # one extra
pip install "sovereign-mcp-gateway[text,intent]" # several
pip install "sovereign-mcp-gateway[all]" # every layer4つの拡張はすべて小さな純 Python パッケージです — [all] はコンパイル済み依存関係も実行するサービスも追加しません。
部分インストールは目に見えて劣化します。 ゲートウェイは起動時にアクティブなレイヤーを表示するため、実際に何が実行されているかを常に確認できます:
layers: policy -> frozen-verify -> audit # base
layers: policy -> intent -> text-filter -> frozen-verify -> audit # [all]その行にレイヤーがなければ、実行されていません — インストールしたつもりでもです。
エンドツーエンドで検証済み
mcp-server-git と mcp-server-sqlite を実際のアップストリームとして実行し、実際の MCP クライアントで駆動:
呼び出し | 結果 |
| 許可 |
| 許可 — 行は実際にデータベースに存在 |
| 拒否: 拒否リストに含まれる |
| 拒否: どのアップストリームも公開していない |
| 拒否: 固定スキーマに対して型が間違っている |
| 拒否: テキストフィルター |
| 拒否: 別のアップストリームの名前空間を通じてツールに到達できない |
その後、リポジトリには依然として1つのコミットがあり、データベースには正確に1つの行だけが存在します — ゲートウェイ自身の報告を信頼するのではなく、直接開いて確認しました。10回の呼び出しに対して11件の監査記録。いずれか1つを編集するとチェーンが壊れます。
これらのケースはスクリーンショットではなくテストスイートです: pytest tests/ -v。
レイヤー C: N モデルコンセンサス
他のすべてのレイヤーは決定的でローカルです。レイヤー C は例外です: 複数の独立したモデルにツールの結果から同じ構造化ドキュメントを抽出させ、各回答を正規化し、SHA-256 ハッシュを比較します。一致は散文ではなくハッシュで判定されます。
設定しない限りオフです。呼び出しごとにコストとレイテンシがかかる唯一のレイヤーであり、ツール出力をモデルに送信する唯一のレイヤーだからです。
{
"servers": { "...": {} },
"consensus": {
"providers": [
{"type": "local", "model": "llama3.1:8b"},
{"type": "local", "model": "qwen2.5:7b", "base_url": "http://localhost:11434/v1"},
{"type": "openrouter", "model": "anthropic/claude-3.5-sonnet",
"api_key_env": "OPENROUTER_API_KEY"}
]
}
}2つのプロバイダータイプ: local(OpenAI 互換エンドポイント — Ollama、vLLM、LM Studio。base_url のデフォルトは http://localhost:11434/v1)と openrouter(キーは指定された環境変数から読み取られ、設定に書き込まれることはありません)。
ゲートウェイが実行時ではなく起動時に強制する3つのルール:
少なくとも2つのプロバイダー。 1つのモデルは自分自身と矛盾できません。1つのコンセンサスはすべての呼び出しで一致を報告しますが、これは検証のように見えるためレイヤーがないより悪いです。
重複モデルなし。 同じモデルの2つのインスタンスが一致しても、独立した検証にはなりません。
API キーがないと起動を拒否。 レイヤーなしで実行するフォールバックはありません。
すべてのプロバイダーは temperature = 0 で実行され、コンストラクタで強制されます。
レイヤーを信頼する前にモデルが一致することを確認
--check は設定されたモデルに対して実際のコンセンサス呼び出しを1回実行し、何が起こったかを報告します。これは聞こえる以上に重要です:
LAYER C - probing the configured models with one real call
--------------------------------------------------------------
OK. The configured models produced identical documents.
Layer C will pass ordinary output rather than refusing it.コンセンサスは正規化ハッシュを比較するため、意味的に正しいが構造的に異なる2つのモデルは決して一致しません。スキーマをそのままエコーバックする弱いモデルは —
{"branch": {"type": "string", "value": "main"}} instead of {"branch": "main"}— すべての呼び出しで永久に不一致となり、ゲートウェイは「モデルが不一致」と正しく読める理由で全てを拒否します。実際に不一致だからです。
プローブは3つの結果を区別します:
意味 | |
OK | モデルが同一のドキュメントを生成。レイヤーは使用可能 |
MISMATCH | 些細なドキュメントでも不一致。すべての呼び出しを拒否する — モデルを交換するか、セクションを削除 |
provider unreachable | 何も検証されなかった。キー、モデル ID、またはエンドポイントが間違っている |
sovereign-mcp-gateway[consensus] または [all] をインストールしてください — HTTP プロバイダーには requests が必要で、コアライブラリは意図的に依存していません。
--check はアクティブなレイヤーも一覧表示するため、一目で確認できます:
layers: policy -> intent -> text-filter -> frozen-verify -> consensus -> auditその行に consensus がなければ、設定がどうであれ実行されていません。
名前空間
namespace がオンの場合(デフォルト)、ツールは git__git_status として公開されます。同じツール名を提供する2つのアップストリームは衝突せず、互いを覆い隠さず、間違った名前空間を通じて到達することもできません。アップストリームが1つだけの場合にのみオフにしてください。
ポリシー
"policy": {
"deny_tools": ["git__git_reset", "write_query"],
"allow_tools": null,
"pii_policy": "warn",
"fail_closed": true,
"rate_limit_interval": 0
}deny_toolsは、公開名(git__git_reset)または上流ツール名(git_reset、それを保持するすべての上流)のいずれかに一致します。allow_toolsは、設定されている場合、リストにないすべてのものを拒否します。pii_policyはデフォルトでwarnであり、blockではありません。実際のツールは通常の出力として個人データを返します — すべてのgit logエントリには著者のメールアドレスが含まれます — そのため、それらをブロックするとゲートウェイが使用できなくなります。ツールがPIIを決して出力すべきでない場合はblockに設定してください。fail_closedは、レイヤー自体がエラーになったときに何が起こるかを決定します。デフォルト: 拒否。rate_limit_intervalは0で、ビヘイビアフロア独自のアクション間遅延を無効にします。その遅延は、意図的なステップを踏む単一のエージェントには適切ですが、ツール呼び出しのバーストが通常のトラフィックであるプロキシには不適切です。entropy_policyはデフォルトでwarnです。テキストフィルタのエントロピーヒューリスティックは、散文に隠されたエンコードされたペイロードを探しますが、ツールの引数は日常的に構造化されています — パス、識別子、ハッシュ — 高エントロピーが正常な場所です。一時ディレクトリのパスだけでも、正当な呼び出しが拒否されるのに十分でした。引数が本当に散文である場合はblockに設定してください。
これが行わないこと
これは、固定された定義に対して呼び出しを検証し、引数と結果を検査します。サーバーのソースコードは読み取らないため、存在し、呼び出され、静かに何もしないチェックを確認することはできません。それには依然として誰かが実装を読む必要があります。
また、侵害された上流が正しく見えるデータを返すことから保護することもできません — sovereign-mcp のレイヤーCコンセンサスがそれに対処し、自分で設定するモデルプロバイダーを必要とします。
ライセンス
Business Source License 1.1 — LICENSE を参照してください。
ソースは公開されています。読むこと、変更すること、派生作品を作成すること、開発、評価、その他の非本番目的で無料で使用することができます。
本番環境での使用も無料です 個人、または4人以下の組織の場合 — これは単にここに記載されているだけでなく、ライセンスに追加使用許諾(Additional Use Grant)として明記されています。より大きな組織は商用ライセンスが必要です。
各バージョンは、公開から4年後の変更日(Change Date)にApache 2.0に変換されます。
本番環境でのライセンス取得、または使用にライセンスが必要かどうかの問い合わせ: contact@sovereign-shield.net
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceCentralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.13 npmMIT
- AlicenseNot gradedqualityBmaintenanceA least-privilege enforcement proxy for MCP servers. It sits between MCP clients and upstream servers, enforcing tool policies, hiding denied tools, requiring human approval for risky actions, and providing a structured audit trail.MIT
- AlicenseNot gradedqualityAmaintenanceProvides a governance proxy layer for MCP servers, enforcing per-tool allowlists, human approval for write operations, quotas, secret redaction, and a hash-chained audit log of all calls.MIT
- AlicenseNot gradedqualityCmaintenanceProvides a security and context-control layer that multiplexes multiple MCP servers behind a single endpoint, scanning tool definitions and results, enforcing authorization, rate limiting, and audit logging, and dynamically retrieving tools to manage context window usage.MIT