Skip to main content
Glama
mattijsmoens

sovereign-mcp-gateway

by mattijsmoens

sovereign-mcp-gateway

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

Built on patent-pending components

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 を呼び出します。

コミット数

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

mcp-server-git に直接

2

あり

ゲートウェイ経由

1

なし

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

ウォークスルーを読む: エージェントが issue を読む — または実行する:

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

Related 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 --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

引数に注入が含まれる(21言語または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 が得られます。すでに、どのアップストリームも公開していないツール、間違った型の引数、未宣言のパラメータ、拒否リストにあるツール、引数へのプロンプトインジェクションを拒否します。他に必要なものはありません。

各拡張がレイヤーを1つ追加します:

拡張

追加されるもの

導入価値がある場合

[text]

sovereign-shield — 文字列引数に対するより深い検査: 21言語、および base64、hex、ROT13、リートスピーク、反転テキストに隠されたペイロードの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-git と mcp-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つのコミットがあり、データベースには正確に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

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Centralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.
    13 npm
    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
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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