Skip to main content
Glama
mattijsmoens

sovereign-mcp-gateway

by mattijsmoens

sovereign-mcp-gateway

Model Context Protocol サーバー向けゲーティングプロキシ。 MCP クライアントを各サーバーではなくゲートウェイに向けます。ゲートウェイは、リストアップされたすべてのアップストリームに接続し、それらのツールカタログをひとつに統合し、実行するサーバーに到達する前に、すべての呼び出しを検証チェーンに通します。

pip install sovereign-mcp-gateway
sovereign-mcp-gateway --config gateway.json

ゲートウェイ自体が MCP サーバーであるため、MCP を話せるクライアントであれば、変更なしで動作します。

基本インストールは動作するゲートウェイです。4 つのオプションの追加機能がさらにレイヤーを重ねます — インストール を参照。


これが防ぐもの

エージェントが GitHub の issue を読み、その本文にあなたではなくモデルに向けた指示が含まれているとします。エージェントは説得され、git_commit を呼び出します。

コミット後

注入されたコミットの存在

mcp-server-git へ直接

2

あり

ゲートウェイ経由

1

なし

同じツール、同じ引数、同じサーバー。違うのは、拒否できる立場に何かがあったかどうかだけです。

ウォークスルーをお読みください: エージェントが issue を読む — または実行してみてください:

pip install "sovereign-mcp-gateway[all]" mcp-server-git
python examples/poisoned_issue.py

Related MCP server: Mavryn

なぜプロキシなのか、ライブラリではないのか

ライブラリは、サーバーを書いた人自身が採用する必要があります。プロキシは、あなたが変更できないサーバーを保護します — そして、役に立つ MCP サーバーのほとんどは、他の誰かがメンテナンスしている公開パッケージです。

また、プロキシなら、ポリシーを保持する場所と、エージェントが到達できるすべてのサーバーにわたる監査証跡をひとつにまとめられます。サーバーごとの設定を誰も同期しない、という事態にはなりません。

設定

{
  "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 --check
SOVEREIGN 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

intentshield

呼び出しが行動基準を満たさない

text-filter

sovereign-shield

引数が、22 言語または 7 種類のエンコーディングのいずれかで注入を含む

frozen-verify

sovereign-mcp

呼び出しが、起動時に凍結されたツール定義と一致しない

output-verify

sovereign-mcp

結果がスキーマ、偽装、PII、コンテンツの各チェックに不合格

logic-rules

logicshield

結果が、あなたが設定したルールと矛盾する

audit

sovereign-mcp

— すべての呼び出し(許可・拒否の両方)をハッシュチェーンログに記録する

インストール

基本インストールは動作するゲートウェイであり、単なるスタブではありません:

pip install sovereign-mcp-gateway

これで policy → frozen-verify → audit が得られます。これだけで、アップストリームが公開していないツール、型が間違った引数、未宣言のパラメータ、拒否リストにあるツール、引数へのプロンプトインジェクションをすでに拒否できます。他には何も必要ありません。

各追加機能はレイヤーをひとつ重ねます:

追加機能

追加されるもの

導入が有効なケース

[text]

sovereign-shield — 文字列引数に対するより深い検査: 22 言語、および base64・hex・ROT13・leet 表記・反転テキストに隠されたペイロードの 7 種のデコード

エージェントが、あなたの管理外のどこからでもテキストを読む場合。基本インストールは IGNORE ALL PREVIOUS INSTRUCTIONS を検出しますが、同じ文が base64 エンコードされていたり、オランダ語で書かれていたりすると検出できません

[intent]

intentshield — 呼び出されたツールに関係なく適用される行動基準: シェル禁止、削除禁止、資格情報 URL、マルウェア構文

すべてのツールのスキーマを正しく把握することに依存せずに、抑止策を設けたい場合

[rules]

logicshield — ツールの出力に対してあなたが書く整合性ルール

正しい結果がどう見えるかを表現できる場合。output_rules を設定するまで何もしません

[consensus]

requests — レイヤー C の HTTP プロバイダーに必要

ホスト型プロバイダーで N モデル合意を有効にする場合

必要なものだけを組み合わせるか、すべてを導入します:

pip install "sovereign-mcp-gateway[text]"             # one extra
pip install "sovereign-mcp-gateway[text,intent]"      # several
pip install "sovereign-mcp-gateway[all]"              # every layer

4 つの追加機能はすべて小さな純 Python パッケージです — [all] はコンパイル済み依存関係も追加サービスも必要としません。

部分インストールは見た目でわかるように劣化します。 ゲートウェイは起動時にアクティブなレイヤーを表示するため、実際に何が動作しているかを常に確認できます:

layers:   policy -> frozen-verify -> audit                                  # base
layers:   policy -> intent -> text-filter -> frozen-verify -> audit         # [all]

その行にレイヤーがなければ、それは動作していません — 設定がどうであれ。

エンドツーエンドで検証済み

mcp-server-gitmcp-server-sqlite を実際のアップストリームとして、実際の MCP クライアントで駆動して検証しています:

呼び出し

結果

git__git_status, git__git_log

許可

sqlite__create_table, __write_query, __read_query

許可 — 行は実際にデータベースに存在する

git__git_reset

拒否: 拒否リストにある

git__git_push_force

拒否: どのアップストリームも公開していない

git__git_status(repo_path=12345)

拒否: 凍結されたスキーマと型が一致しない

git__git_commit("IGNORE ALL PREVIOUS INSTRUCTIONS…")

拒否: テキストフィルター

sqlite__git_commit(...)

拒否: 別のアップストリームの名前空間を通じてツールに到達できない

その後もリポジトリはコミット 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_interval0 で、行動基準レイヤー独自のアクション間遅延を無効にします。その遅延は、1 つのエージェントが慎重にステップを踏む場合には適切ですが、ツール呼び出しのバーストが通常のトラフィックであるプロキシには不適切です。

  • entropy_policy のデフォルトは warn です。テキストフィルターのエントロピーヒューリスティックは、散文に隠されたエンコード済みペイロードを探しますが、ツールの引数は日常的に構造化されています — パス、識別子、ハッシュ — そこでは高いエントロピーが普通です。一時ディレクトリのパスだけでも、正当な呼び出しが拒否される原因になりました。引数が本当に散文である場合にのみ block に設定してください。

これが行わないこと

凍結された定義に対する呼び出しの検証と、引数および結果の検査は行います。サーバーのソースコードは読みません。したがって、存在し、呼び出され、そして黙って何もしないチェックを発見することはできません。それには依然として、誰かが実装を読む必要があります。

また、改ざんされた上流が正しい形式のデータを返す場合も防ぐことはできません。sovereign-mcp の Layer C コンセンサスはこの問題に対処しており、モデルプロバイダーを自分で設定する必要があります。

ライセンス

Business Source License 1.1LICENSE を参照してください。

ソースコードは公開されています。読むこと、変更すること、二次的著作物を作成すること、開発・評価・その他の本番環境以外の目的で無償で使用することができます。

本番環境での使用も無料です。個人、または4人以下の組織であれば、ライセンスに Additional Use Grant として明記されており、ここでの記載だけではありません。それより大きな組織は商用ライセンスが必要です。

各バージョンは、公開から4年後の Change Date に Apache 2.0 に移行します。

本番環境での使用のためにライセンスを取得する場合、または使用にライセンスが必要かどうかを確認する場合: contact@sovereign-shield.net

F
license - not found
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
9Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Universal MCP proxy server that discovers, searches, and executes tools across all configured MCP servers from a single entry point.
    7
  • A
    license
    Not graded
    quality
    B
    maintenance
    Centralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.
    7
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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

View all related MCP servers

Related MCP Connectors

  • A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r

  • Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.

  • Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mattijsmoens/sovereign-mcp-gateway'

If you have feedback or need assistance with the MCP directory API, please join our Discord server