mcpField
A
AegisGate MCP

AegisGate MCP

ローカル
github.com/aegisgatesecurityセキュリティ0今日更新

AegisGate MCP について

AegisGate MCPは、リクエスト処理にセキュリティ制御を組み込んだMCPサーバー構築用Goフレームワークです。認証、アクセス制御、監査、脅威検出が必要な環境でサーバーを運用する開発者を対象としています。

主な機能

  1. 01認証と4段階のRBAC
  2. 02ポリシールールとレート制限
  3. 03改ざん検知可能な監査ログ
  4. 04入力と応答のスキャン
  5. 05正規表現とニューラル脅威検出
  6. 06登録時のツールポイズニング検査

活用シーン

  1. 01ロールごとのツールアクセス制限
  2. 02ツール入力と応答のスキャン
  3. 03MCP操作の監査
  4. 04プロンプトインジェクションと難読化の検出

MCP 対応

MCPサーバーを構築するフレームワークで、MCPリクエストとツール呼び出しにセキュリティ検査を適用します。stdioとTCPに対応し、TLSまたは相互TLSも利用できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"aegisgatesecurity-aegisgate": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1"
]
}
}
}
起動コマンドdocker run -i --rm ghcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

🛡️ AegisGate MCP

安全な MCP サーバーフレームワーク — 依存関係なしで23層の防御を実現します。

純粋な Go で記述された、強化済みの依存関係ゼロの MCP サーバーです。最初の行からセキュリティが組み込まれた基盤の上に MCP サーバーを構築できます。侵害の発生後に後付けする必要はありません。

Apache 2.0 · 23層のセキュリティ · 79個の正規表現パターン+CharCNN-BiLSTM(v15)による ML 検知 · CVE ゼロ · 外部モジュール依存関係ゼロ

GitHub stars AegisGate MCP が役に立ったら、リポジトリにスターを付けて ⭐、同僚にも知らせてください。ほかの開発者が安全な MCP ツールを見つける助けになります。

License: Apache 2.0 Go Version Coverage Dependencies Docker ML Arch CI Security Patent Pending Published Research

Listed on mcpservers.org MCP Registry Glama

クイックスタート · セキュリティ層 · RBAC · アーキテクチャ · プロトコル · ドキュメント · リリース

AegisGate Security™ は、USPTO に出願済みの AegisGate Security, LLC の商標です。 「AegisGate MCP」は未登録の製品名です。下記の商標をご覧ください。


AegisGate MCP を選ぶ理由

MCP サーバーの 38%には認証がありません。590 件を超えるセキュリティ勧告。6 か月間で公式 MCP SDK に 3 件の重大な CVE が発生 — CVSS 9.8 のリモートコード実行や、1 億 5,000 万回以上のダウンロードに影響する「AI サプライチェーン最大の脆弱性」も含まれます。

公式 MCP SDK が提供するのはプロトコルです。セキュリティは提供しません。 認証も、監査ログも、脅威検知も、レート制限もありません。 RBAC もありません。ベアな SDK を基盤に構築するすべてのサーバーは、 セキュリティ対策が何もない状態から始まり、それを構築するのはあなたの責任です — サーバーの 38%がそうしているように、何もせずに済ませることもできます。

AegisGate MCP は安全な選択肢です。 侵害が発生してから セキュリティを後付けするのではなく、最初からセキュリティが組み込まれた 基盤の上に MCP サーバーを構築できます。

公式 MCP SDKAegisGate MCP
認証❌ 自分で用意✅ Bearer トークン + API キー + ロックアウト
認可❌ なし✅ ツールごとの権限を設定できる 4 階層 RBAC
監査ログ❌ なし✅ 改ざん検知可能な SHA-256 ハッシュチェーン
脅威検知❌ なし✅ 79 個の正規表現パターン + ニューラル ML(1ms 未満)
サプライチェーンリスク❌ npm/PyPI 依存関係✅ 依存関係ゼロ(Go 標準ライブラリのみ)
CVE6 か月間で重大なものが 3 件ゼロ。これまで一度もありません。
ライセンスMITApache 2.0

23 層のセキュリティ。79 個の正規表現パターン。依存関係ゼロ。CVE ゼロ。Apache 2.0。

プロキシモード、OAuth、SIEM、またはコンプライアンスフレームワークが必要ですか?以下の AegisGate Platform へのアップグレード時期を参照するか、 **AegisGate Rampart**を確認して、 ローカル AI API のプロキシ保護をご利用ください。


概要

AegisGate MCP は、純粋な Go で記述された、強化済みで依存関係ゼロの MCP サーバーです。 AI エージェントと呼び出し先のツールの間に位置し、認証や RBAC からニューラル脅威検知、 チェーン分析に至るまで、あらゆるリクエストに23 層の防御を適用します。

標準的な MCP サーバーは、信頼できるローカル環境を前提としています。本番環境では — クラウド SaaS プラットフォーム、エンタープライズデータパイプライン、 エアギャップされたプラントネットワークのいずれであっても — エージェントが コマンドを実行したり、データベースを照会したり、重要なシステムとやり取りしたりする可能性があります。 許可されていない、または悪意のあるツール呼び出しが 1 回あるだけで、 データの持ち出し、プロセスの妨害、さらにはそれ以上の事態につながりかねません。AegisGate MCP は、 外部モジュールへの依存関係をゼロに保ったまま、あらゆるツール呼び出しを多層防御で保護するため、 エアギャップ環境でも実行できます。

バージョン1.6.1
ライセンスApache-2.0
Go バージョン1.27+
モジュール依存関係ゼロ(require ディレクティブなし — サードパーティコードはすべてベンダリング済み)
Docker イメージML:debian:bookworm-slim(gnutls を削除済み)、約 127 MB、CVE 0 件 · Lite:distroless/static-debian12、約 10 MB、CVE 0 件
アーキテクチャamd64、arm64
ML モデルCharCNN-BiLSTM v15、パラメーター 160 万個、CPU 推論 1ms 未満
テスト単体/統合テスト 611 件 + 負荷/ストレステスト 32 件 = 合計 643 件、ベンチマーク 14 件、ファズターゲット 3 件、カバレッジ 92.0%(非 CGO)/91.9%(CGO)

クイックスタート

ビルド
go build -o mcp-server ./cmd/mcp-server
実行
# Basic TCP server on :8081
./mcp-server

# With authentication and audit logging
./mcp-server --token my-secret --audit /var/log/mcp-audit.json

# With demo tools (ping, system_info, echo)
./mcp-server --demo

# stdio mode for local MCP clients (Claude Desktop, Cursor)
./mcp-server --transport stdio --demo

# Streamable HTTP mode (MCP 2025-06-18)
./mcp-server --transport http --addr :8081 --demo

# TLS + mutual TLS
./mcp-server --tls --tls-cert server.pem --tls-key server.key --tls-client-ca ca.pem

# Config file + health endpoint
./mcp-server --config /etc/mcp/config.json --health-addr :8082
Docker
# Build and run (ML-enabled, ~127 MB, 0 CVEs)
docker build --target ml -t aegisgate-mcp .
docker run -p 8081:8081 aegisgate-mcp --demo

# With authentication and audit logging
docker run -p 8081:8081 \
  -e MCP_AUTH_TOKEN=your-secret-token \
  -e MCP_DEMO_TOOLS=true \
  aegisgate-mcp

# Distroless heuristic-only build (~10 MB, 0 CVEs, zero OS packages)
docker build --build-arg CGO_ENABLED=0 --target lite -t aegisgate-mcp:lite .
docker run -p 8081:8081 aegisgate-mcp:lite --demo

ML イメージは debian:bookworm-slim を使用し、libgnutls30(共有ライブラリと dpkg メタデータも削除済み)を 削除することで、ニューラル推論に必要な glibc と ONNX Runtime の依存関係を維持しながら、 Trivy の CVE 6 件をすべて解消します。Lite イメージは真の distroless (gcr.io/distroless/static-debian12:nonroot)で、OS パッケージも CVE もゼロ、 サイズは約 10 MB です。どちらのターゲットにも Docker HEALTHCHECK 用の組み込み --health-check フラグが 含まれているため、wget/curl は不要です。マルチアーキテクチャビルドでは linux/amd64 と linux/arm64 の両方がサポートされます。

ML 脅威検知(L3)

AegisGate MCP には、AegisGate Platform と Rampart で使用されているものと同じ CharCNN-BiLSTM v15 ニューラルモデルが含まれており、外部モジュールへの依存なしで同梱されています。このモデルは、次の機能を提供します。

  • セマンティック攻撃検知 — 正規表現によるパターンマッチングを回避するプロンプトインジェクションやジェイルブレイクの試みを検出します
  • 回避耐性 — 難読化手法(リートスピーク、Unicode ホモグリフ、文字の入れ替え、母音の削除、単語の逆順)を検出します
  • 2 段階ブロック — スコアが 0.95 以上の場合は単独でブロックし、スコアが 0.50~0.94 の場合は、L1(正規表現)または L2(入力スキャナー)による裏付けがある場合にのみブロックします
  • シャドーモード — ブロックせずに予測を記録します(キャリブレーション用)
  • ヒューリスティックフォールバック — CGO を利用できない場合、ONNX を使わずにヒューリスティックなスコアリングで基本的な検知を提供します
フラグ環境変数デフォルト説明
--mlMCP_ML_ENABLEDfalse (CLI) / true (Docker)ニューラル脅威検知を有効にします
--ml-shadowMCP_ML_SHADOWfalse予測を記録しますが、ブロックはしません
--ml-thresholdMCP_ML_THRESHOLD0.50脅威スコアのしきい値(0.0~1.0)
--ml-modelMCP_ML_MODEL./models/threat_cnn_bilstm.onnxONNX モデルファイルへのパス
ライブラリの使用方法

AegisGate MCP は Go ライブラリとして組み込めます。

package main

import (
    "context"
    "log"
    mcp "github.com/aegisgatesecurity/aegisgate-mcp"
)

func main() {
    cfg := mcp.DefaultServerConfig()
    cfg.AuthToken = "my-secret-token"
    cfg.AuditLogPath = "/var/log/mcp-audit.json"
    cfg.RateLimitRPM = 120
    cfg.ScanResponses = true

    server, err := mcp.NewSecuredMCPServer(cfg)
    if err != nil {
        log.Fatal(err)
    }

    // Register a custom tool
    // Note: tools are automatically scanned for prompt-injection poisoning
    // at registration time. If the description or inputSchema contains
    // malicious patterns, RegisterTool returns *ToolPoisoningError.
    server.RegisterTool("my_tool", "Does something useful", 40, map[string]interface{}{
        "type": "object",
        "properties": map[string]interface{}{
            "param1": map[string]interface{}{"type": "string"},
        },
        "required": []interface{}{"param1"},
    })
    server.RegisterToolHandler("my_tool", func(ctx context.Context, params map[string]interface{}) (interface{}, error) {
        return "result", nil
    })

    // Register a resource (MCP resources/list, resources/read)
    server.RegisterResource("config://app/info", "App Info", "App config as JSON", "application/json",
        func(ctx context.Context, uri string) (*mcp.ResourceContent, error) {
            return &mcp.ResourceContent{URI: uri, Text: `{"version":"1.0"}`, MimeType: "application/json"}, nil
        })

    // Register a prompt (MCP prompts/list, prompts/get)
    server.RegisterPrompt("code_review", "Generate a code review prompt",
        []mcp.PromptArgument{{Name: "filename", Required: true}},
        func(ctx context.Context, args map[string]string) (*mcp.GetPromptResult, error) {
            return &mcp.GetPromptResult{
                Messages: []mcp.PromptMessage{{Role: "user", Content: "Review " + args["filename"]}},
            }, nil
        })

    // Load built-in policy rules
    server.LoadDefaultPolicies()

    // Start the server
    if err := server.Start(context.Background()); err != nil {
        log.Fatal(err)
    }
    defer server.Stop()
}

ツール、リソース、プロンプトを登録する、動作する完全な例については、examples/simple-server/ を参照してください。

ML モデルのホットスワップ

サーバーを再起動せずに、実行時にニューラル脅威検知モデルを再読み込みします。

// Swap to a new ONNX model file (verifies SHA-256 hash)
err := server.ReloadMLModel("/path/to/new_model.onnx")
if err != nil {
    log.Printf("model reload failed: %v", err)
}
ツールポイズニング検知

RegisterTool() を介して登録されたすべてのツールは、説明と inputSchema に含まれるプロンプトインジェクションを自動的にスキャンされます。手動でスキャンするには、次のようにします。

err := server.ScanToolForPoisoning("my_tool", description, inputSchema)
if err != nil {
    // err is *ToolPoisoningError — do not register this tool
}

セキュリティレイヤー

AegisGate MCP は、すべてのリクエストに対して、以下の23のセキュリティレイヤーを順番に適用します。

#レイヤー説明ソース
1認証Bearer トークンと API キーを使用し、比較には一定時間の処理を行います。認証に繰り返し失敗すると自動的にロックアウトしますauth.go
2署名検証ECDSA P-256 による偽造防止機能です。信頼された公開鍵を使用してメッセージの署名を検証しますauth.go
3セッション管理暗号学的に安全な256ビットのランダムなセッション ID、有効期限、乗っ取り防止チェックを使用しますsession.go
4RBAC4段階のロール階層(restricted → standard → privileged → admin)と、ツールごとの権限を設定しますrbac.go
5ポリシーエンジン条件、優先度、時間帯、パラメーターのパターンを設定できる許可/拒否ルールですpolicy.go
6ガードレールセッションごとのツール呼び出し制限とレート制限を適用しますguardrails.go
7チェーン分析権限昇格、データ流出につながる連鎖、危険なツールの繰り返し呼び出しを検出しますguardrails.go
8トークンバケットによるレート制限トークンバケットアルゴリズム(RPM + バースト容量)を用いたスライディングウィンドウ方式のレート制限ですguardrails.go
9入力スキャン実行前にツールのパラメーターをスキャンして、プロンプトインジェクションを検出します(約79パターン)handler.go, scanner.go
10レスポンススキャンツールのレスポンスをスキャンして、PII、シークレット、XSS、プロンプトインジェクションを検出します(約79の検出パターン)scanner.go
11シークレットのマスキングクライアントに返す前に、レスポンスから機密データ(PII、シークレット)を除去しますscanner.go
12ツール実行タイムアウト呼び出しごとに設定可能なタイムアウトにより、ツールのハングや暴走を防ぎますhandler.go
13STDIO 検証stdio トランスポートコマンドの許可リストとブロックリストによって、シェルインジェクションを防止しますstdio_guard.go
14監査ログすべての MCP アクションをファイルとメモリ内に記録します。コンプライアンス対応のために検索でき、改ざんを検知できるハッシュチェーンを備えていますaudit.go
15TLS/mTLS トランスポートオプションの相互 TLS に対応した、暗号化 TCP 接続ですconfig.go, server.go
16stdio トランスポートClaude Desktop、Cursor、その他のローカル統合向けの標準 MCP クライアントトランスポートですtransport.go
17ヘルスエンドポイント別のリスナーで HTTP /healthz、/readyz、/stats エンドポイントを提供しますtransport.go
18パラメーター検証実行前に、必須フィールドを各ツールの inputSchema と照合して確認しますhandler.go
19ニューラル脅威検出(L3)CharCNN-BiLSTM v15 モデルが、正規表現では見逃される意味的な攻撃や回避パターンをスコアリングします。2段階でブロックし、スコアが0.95以上の場合は単独でブロックし、0.50~0.94の場合はL1/L2による裏付けを必要としますinternal/ml/
20ヒューリスティック回避検出文字の転置、母音の削除、単語の逆順、leet speak、エンコード、分割、ゼロ幅文字による難読化を検出しますinternal/ml/evasion_resistance.go
21NFKC Unicode 正規化スキャン前にUnicode互換文字を標準形に変換し、ホモグリフ攻撃や合字攻撃を防ぎます(全角の Ignore → ignore)internal/ml/normalizer.go
22ツールポイズニング検出登録時にツールの説明と inputSchema を再帰的にスキャンして、プロンプトインジェクション(AegisGate Scanner の34の危険な関数パターン)を検出します。ポイズニングされたツールは呼び出し可能になる前に拒否します。OWASP MCP Top 10 の M1 に対応しますhandler.go
23回避検出(L2.5)エンコード(base64、URL、Unicode、HTML エンティティ)、分割(ゼロ幅文字、文字の交互挿入)、難読化(leet speak、パディング、マークアップ)、意味的回避(ロールプレイ形式、指示の上書き)を検出する15の正規表現パターンです。スコアが0.8以上の場合は単独でブロックし、0.3以上の場合は警告を記録します。L1 の正規表現検出と L3 のニューラル検出の間で実行されますinternal/ml/evasion_resistance.go
検出パターンのカテゴリ(79 パターン)

AegisGate MCP は、8 つのカテゴリにわたる 79 個の正規表現パターンを使用して、すべてのツールパラメーターとレスポンスをスキャンします。

カテゴリパターン数例
プロンプト25以前の指示の無視、ロールプレイによる権限昇格、RAG の密輸、システムプロンプトの漏えい、区切り文字のインジェクション、base64 ペイロード
危険な関数34eval()、exec()、os.system()、subprocess(shell=True)、pickle.loads()、child_process.exec()
認証情報6AWS キー、GitHub PAT、JWT トークン、RSA 秘密鍵、汎用 API キー
金融3クレジットカード(Visa、Mastercard、Amex)
ネットワーク3ネットワークアドレス、OPC UA、Modbus、DNP3
個人情報2SSN、メールアドレス
XSS3スクリプトタグ、SVG の onload、画像の onerror
コンプライアンス3OWASP LLM01/02/06

⚙️ 設定
設定の優先順位

設定は、優先度の高い順に解決されます。

  1. CLI フラグ — すべてを上書きします
  2. 環境変数 — 設定ファイルを上書きします
  3. JSON 設定ファイル(--config)— 組み込みのデフォルト値を上書きします
  4. 組み込みのデフォルト値
CLI フラグ

すべての CLI フラグには、対応する環境変数があります。

フラグ環境変数デフォルト説明
--addrMCP_SERVER_ADDR:8081リッスンアドレス(TCP モード)
--transportMCP_TRANSPORTtcpトランスポートモード:tcp、stdio、http(Streamable HTTP)
--tokenMCP_AUTH_TOKEN(空)認証用ベアラートークン
--auditMCP_AUDIT_LOG(空)監査ログのファイルパス
--max-sessionsMCP_MAX_SESSIONS50同時セッションの最大数
--max-connectionsMCP_MAX_CONNECTIONS1000同時 TCP 接続の最大数(-1 = 無制限)
--rate-limitMCP_RATE_LIMIT_RPM60レート制限(リクエスト/分)
--exec-timeoutMCP_EXEC_TIMEOUT30ツール実行のタイムアウト(秒)
--scan-responsesMCP_SCAN_RESPONSEStrueレスポンスのスキャンを有効にする
--block-piiMCP_BLOCK_PIItrue個人情報を含むレスポンスをブロックする
--block-secretsMCP_BLOCK_SECRETStrueシークレットを含むレスポンスをブロックする
--block-xssMCP_BLOCK_XSStrueXSS を含むレスポンスをブロックする
--block-prompt-injectMCP_BLOCK_PROMPT_INJECTtrueプロンプトインジェクションを含むレスポンスをブロックする
--redactMCP_REDACT_ENABLEDfalseシークレット/個人情報のマスキングを有効にする
--redact-piiMCP_REDACT_PIIfalseレスポンスから個人情報をマスキングする
--redact-secretsMCP_REDACT_SECRETStrueレスポンスからシークレットをマスキングする
--redact-placeholderMCP_REDACT_PLACEHOLDER[REDACTED]マスキング時に使用するプレースホルダーテキスト
--tlsMCP_TLS_ENABLEDfalseTLS トランスポートを有効にする
--tls-certMCP_TLS_CERT(空)サーバー証明書ファイル(PEM)
--tls-keyMCP_TLS_KEY(空)サーバー秘密鍵ファイル(PEM)
--tls-client-caMCP_TLS_CLIENT_CA(空)クライアント証明書用 CA バンドル(mTLS を有効化)
--tls-min-versionMCP_TLS_MIN_VERSION1.2TLS の最小バージョン:1.2 または 1.3
--health-addrMCP_HEALTH_ADDR(空)ヘルスエンドポイントのリッスンアドレス(空 = 無効)
--configMCP_CONFIG_FILE(空)JSON 設定ファイルのパス
--demoMCP_DEMO_TOOLSfalseデモ用ツール(ping、system_info、echo)を登録する
--mlMCP_ML_ENABLEDfalseニューラルネットワークによる脅威検出を有効にする(L3、CGO ビルドが必要)
--ml-shadowMCP_ML_SHADOWfalseML シャドウモード:予測をログに記録しますが、ブロックはしません
--ml-thresholdMCP_ML_THRESHOLD0.50ML 脅威スコアのしきい値(0.0–1.0)
--ml-modelMCP_ML_MODEL./models/threat_cnn_bilstm.onnxONNX モデルファイルのパス
JSON 設定ファイル
{
  "address": ":8081",
  "auth_token": "my-secret-token",
  "audit_log_path": "/var/log/mcp-audit.json",
  "max_sessions": 100,
  "max_connections": 1000,
  "rate_limit_rpm": 120,
  "exec_timeout_seconds": 30,
  "scan_responses": true,
  "block_on_pii": true,
  "block_on_secrets": true,
  "block_on_xss": true,
  "block_on_prompt_inject": true,
  "redact_enabled": true,
  "redact_pii": true,
  "redact_secrets": true,
  "redact_placeholder": "[REDACTED]",
  "tls_enabled": true,
  "tls_cert_file": "/etc/ssl/mcp/server.pem",
  "tls_key_file": "/etc/ssl/mcp/server.key",
  "tls_client_ca_file": "/etc/ssl/mcp/ca.pem",
  "tls_min_version": "1.3",
  "demo_tools": true
}
トランスポートモード
モードフラグ説明
tcp--transport tcp (default)TCP リスナー。ネットワーク環境へのデプロイ向けに TLS/mTLS 暗号化をサポートします
stdio--transport stdioローカルクライアント(Claude Desktop、Cursor)向けの標準 MCP stdin/stdout トランスポートです
http--transport httpストリーム可能な HTTP(MCP 2025-06-18)です。/mcp エンドポイントへの POST JSON-RPC、Mcp-Session-Id によるセッション管理、Accept ヘッダー経由の SSE ストリーミング、セッション終了用の DELETE に対応し、TLS 終端リバースプロキシもサポートします
ヘルスエンドポイント

--health-addr を設定すると、別の HTTP リスナーによって可観測性エンドポイントが提供されます。

エンドポイントメソッド説明
/healthzGET生存確認プローブ — サーバープロセスが実行中の場合、200 OK を返します
/readyzGET準備状況プローブ — サーバーがリクエストを受け付ける準備ができている場合、200 OK を返します
/statsGETサーバー統計情報を JSON で返します(セッション、レート制限、ツール呼び出し、active_connections、max_connections)

🔐 RBAC とポリシーエンジン

RBAC ロール

AegisGate MCP は4段階のロール階層を適用します。ロールの順序は restricted < standard < privileged < admin です。

ロールレベルアクセス権限ツールの例
restricted0読み取り専用ツールのみping、system_info、file_exists、git_status、git_log
standard1読み取りと低リスクの書き込みfile_read、code_search、web_search、file_copy
privileged2高リスクの実行を除くすべてshell_command、code_execute を除くすべてのツール
admin3制限なしですべてのツールを利用可能登録済みのすべてのツール

ロールの比較には AgentRole.AtLeast() を使用します。privileged エージェントは、standard または restricted を必要とするすべてのツールにアクセスできますが、admin を必要とするツールにはアクセスできません。

ポリシーエンジン

ポリシーエンジンは、ツールの実行前に許可/拒否ルールを評価します。ルールでは次の項目をサポートします。

  • ツール名の照合 — 正確な名前とワイルドカードパターン
  • エージェントのロール条件 — 特定のロールにのみルールを適用
  • リスクスコアのしきい値 — RiskAbove 値を超えた場合に適用
  • 優先順位 — 優先度の高いルールから評価
  • 時間帯 — ツールの利用可能な時間帯を制限
  • パラメータパターン — ツール呼び出しのパラメータと照合
  • アクション — 許可、拒否(理由付き)、ログレベル、リスク修飾子
組み込みポリシールール

LoadDefaultPolicies() で読み込まれます。

ルール ID優先度アクション条件説明
block-shell-commands100拒否ツール名:shell_command、bash、exec、cmd、terminal。ロール:restricted、standard、privilegedシェルコマンドには admin ロールが必要です
block-file-delete90拒否ツール名:file_delete、rm、unlink、remove。ロール:restricted、standardファイルの削除には privileged または admin ロールが必要です
block-network-write80拒否ツール名:http_request、web_search、fetch_url、curl、wget。ロール:restrictedrestricted エージェントにはネットワーク操作が許可されません
alert-high-risk50許可+アラートリスクスコア > 70監査ログ用に高リスク操作を記録します

カスタムルールはプログラムから追加できます。

server.AddPolicyRule(mcp.PolicyRule{
    ID:          "block-after-hours",
    Name:        "Block Dangerous Tools After Hours",
    Description: "No high-risk tools outside business hours",
    Condition: mcp.RuleCondition{
        ToolNames: []string{"shell_command", "file_delete"},
        TimeWindow: &mcp.TimeWindow{
            Start: "08:00",
            End:   "18:00",
        },
    },
    Action: mcp.RuleAction{
        Allow:      false,
        DenyReason: "High-risk tools only available during business hours",
        LogLevel:   "warn",
    },
    Priority: 75,
    Enabled:   true,
})

チェーン分析

チェーンアナライザーは、セッション内のツール呼び出しの連続(直近20回分)を追跡し、不審なパターンを検出します。

検出内容フラグ発動条件
権限昇格privilege_escalation低リスクのツール呼び出しの後に高リスクのツール(shell_command、file_delete、db_query)が呼び出される
データ流出data_exfiltration_chain機密データの読み取り(file_read、db_query、code_search)の後に外部への書き込み(http_request、file_write、web_search)が行われる
危険なツールの繰り返しrepeated_dangerous_tools分析対象範囲内で高リスクのツールが3回以上呼び出される

いずれかのフラグが立つと、チェーンリスクは高に設定され、セッションID、フラグ、呼び出し回数とともにイベントがWARNレベルで記録されます。


✍️ 署名検証

AegisGate MCP は、リクエストの偽造や改ざんを防ぐため、ECDSA P-256 によるメッセージ署名をサポートしています。 クライアントは各リクエストの正規化されたJSON(SignatureフィールドとKeyIDフィールドをゼロ化したもの)に署名し、 リクエストヘッダーに署名を含めます。

サーバーのセットアップ
server, _ := mcp.NewSecuredMCPServer(cfg)

// Register a trusted client public key (SEC1 encoded)
server.AddTrustedKey("agent-001", clientPubKeySEC1)
クライアントの署名(例)
import (
    "crypto/ecdsa"
    "crypto/sha256"
    "crypto/rand"
    "encoding/hex"
)

func signRequest(privKey *ecdsa.PrivateKey, canonicalJSON []byte) string {
    hash := sha256.Sum256(canonicalJSON)
    sig, _ := ecdsa.SignASN1(rand.Reader, privKey, hash[:])
    return hex.EncodeToString(sig)
}

サーバーは、信頼された公開鍵を使用してecdsa.VerifyASN1で署名を検証します。 KeyIDまたはSignatureが存在しない場合、検証はスキップされます。これにより、署名のないクライアントとの相互運用性を保ちながら、署名を提供するクライアントには署名を必須にできます。


🧪 テストとパフォーマンス

テストカバレッジ

カテゴリテスト数カバレッジ
単体テスト+統合テスト(非CGO)61192.0%
単体テスト+統合テスト(CGO+ML)61191.9%
負荷/ストレス/バースト/クラッシュ/カオス(ビルドタグ:load)32—
ベンチマーク14—
ファズターゲット3—
競合状態検出器✅ 問題なし—
テストの実行
# Non-CGO test suite (heuristic-only, no ONNX)
CGO_ENABLED=0 go test ./... -count=1 -timeout 120s

# CGO test suite (full ML, requires libonnxruntime.so)
CGO_ENABLED=1 CGO_LDFLAGS="-L$(pwd)/lib/amd64 -lonnxruntime" go test ./... -count=1 -timeout 120s

# With race detector (CGO only — -race requires CGO)
CGO_ENABLED=1 CGO_LDFLAGS="-L$(pwd)/lib/amd64 -lonnxruntime" go test -race -count=1 -timeout 300s ./...

# Load/stress/burst/crush/chaos tests (behind build tag)
go test -tags=load -count=1 -timeout 600s -v ./...

# Benchmarks (regression tracking)
go test -bench=. -benchmem -benchtime=5s ./...

# Fuzz testing (run for 60 seconds per target)
go test -fuzz=FuzzHandleRequest -fuzztime=60s ./...
パフォーマンス特性

k6スタイルの負荷テストスイート(//go:build load)で検証済みです。

コアパフォーマンス
指標値テスト
持続スループット14,427 req/secTestLoadSustainedThroughput
p50レイテンシ(同時接続数100)34 msTestLoadConcurrentConnections
p99レイテンシ(同時接続数100)46 msTestLoadConcurrentConnections
接続の入れ替わり率2,662 conn/secTestConnectionChurn
ゴルーチンのリーク(10秒間の連続実行)0TestSoakStability
負荷時のグレースフルシャットダウン1.6 msTestShutdownUnderLoad
k6 スタイルのストレス/バースト/過負荷テストの結果
指標値テスト
ストレス時の段階的な負荷増加(500 接続)成功率 100%、p99=65ms、738 rpsTestStressRampUp
バースト時のリクエスト急増(1000 リクエスト)12,710 リクエスト/秒TestBurstRequestSpike
バーストからの回復ベースラインの 0.99 倍(即時)TestBurstRecovery
MaxConnections を超える過負荷上限を適用し、サーバーも応答TestCrushBeyondMaxConnections
ゴルーチンリーク(500 回の入れ替わり)Δ=0TestCrushGoroutineExplosion
FD リーク(500 回の入れ替わり、5 ラウンド)Δ=1TestFDLeak
負荷中のグレースフルシャットダウン1.6ms(50 個のアクティブなジェネレーター)TestChaosShutdownUnderLoadTCP
HTTP 同時実行(50 クライアント)2,290 rps、p99=16msTestHTTPLoadConcurrent
HTTP 継続負荷(20×30 ping)ゴルーチンリーク 0 件TestHTTPLoadSustained
トランスポート間のレイテンシーHTTP は TCP の 0.62 倍TestCrossTransportLatency
カオスランダムドロップ(30%)サーバーはすべてのドロップに耐えたTestChaosRandomDrops
不正データの大量送信(混在 500 件)サーバーはすべてに耐えたTestCrushMalformedFlood

📦 モジュール依存関係ゼロ

AegisGate MCP には外部モジュールへの依存関係がありません。go.mod ファイルに require ディレクティブはありません。サードパーティーコード(ONNX Runtime バインディング、Unicode 正規化、ML モデル)はすべて internal/、lib/、models/ にベンダリングされています。

module github.com/aegisgatesecurity/aegisgate-mcp

go 1.26.9

// Zero external module dependencies (no `require` directives).
// All third-party code is vendored into internal/ — see NOTICE for details.

ベンダリングされたコンポーネント(完全な帰属情報については NOTICE を参照してください):

コンポーネントライセンス場所
onnxruntime_go(Go バインディング)MITinternal/onnxruntime_go/
libonnxruntime.so(Microsoft)MITlib/amd64/、lib/arm64/
golang.org/x/text(Unicode 正規化)BSD-3-Clauseinternal/textnorm/
CharCNN-BiLSTM v15 モデルApache-2.0models/

これが重要な理由:

  • エアギャップ環境へのデプロイ — go mod download は不要で、サプライチェーンのリスクもありません
  • 推移的依存関係なし — ベンダリングされたコード以外に監査対象はありません
  • 再現可能なビルド — ビルド間でバイナリは同一です
  • 最小限の攻撃対象領域 — すべてのサードパーティーコードを確認・監査できます
  • 高速なコンパイル — 依存関係の解決によるオーバーヘッドがありません

🏗️ アーキテクチャとプロトコル

アーキテクチャ

┌─────────────────────────────────────────────────────────────────────────┐
│                          AegisGate MCP Server                           │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  TCP Mode:                                                              │
│  ┌──────────┐    ┌──────────────┐    ┌───────────┐    ┌──────────────┐  │
│  │ TCP      │───▶│ Auth         │───▶│ Guardrails│───▶│ Response     │  │
│  │ Client   │    │ Middleware   │    │ (Rate +   │    │ Scan         │  │
│  │          │    │ (Token +     │    │  Chain)   │    │ (PII/Secrets │  │
│  │ (TLS/    │    │  Signature + │    │           │    │  /XSS/Inject)│  │
│  │  mTLS)   │    │  Session)    │    │           │    │              │  │
│  └──────────┘    └──────────────┘    └───────────┘    └──────┬───────┘  │
│                                                             │          │
│                                                             ▼          │
│  stdio Mode:                                    ┌──────────────────────┐ │
│  ┌──────────┐    (same security chain,          │   Request Handler    │ │
│  │ stdin /  │     stdin/stdout instead          │  ┌────────────────┐  │ │
│  │ stdout   │     of TCP)                      │  │  RBAC Check    │  │ │
│  └──────────┘                                  │  ├────────────────┤  │ │
│                                                 │  │  Policy Engine │  │ │
│                                                 │  ├────────────────┤  │ │
│                                                 │  │  Param Validate│  │ │
│                                                 │  ├────────────────┤  │ │
│                                                 │  │  Tool Registry │  │ │
│                                                 │  │  + Exec Timeout│  │ │
│                                                 │  └────────────────┘  │ │
│                                                 └──────────────────────┘ │
│                                                                         │
│  Health Endpoint (separate HTTP listener):                              │
│  ┌────────────────────────────────────────┐                             │
│  │  GET /healthz  → liveness              │                             │
│  │  GET /readyz   → readiness             │                             │
│  │  GET /stats    → server statistics     │                             │
│  └────────────────────────────────────────┘                             │
│                                                                         │
│  Audit Log: all MCP actions → file + in-memory (queryable)              │
└─────────────────────────────────────────────────────────────────────────┘

リクエストの流れ:

  1. TCP クライアントが接続します(TLS/mTLS 経由も可能)。または、stdio が stdin 経由で JSON-RPC を送信します
  2. 認証ミドルウェアがベアラートークン/API キーを検証し(定時間比較)、ECDSA 署名を確認して、セッションを作成または検証します
  3. ガードレールがレート制限とセッション制限を適用し、チェーン分析を実行します
  4. レスポンススキャン(実行前のパラメーター検証はハンドラー内で行われます)
  5. リクエストハンドラーが RBAC 権限を確認し、ポリシーエンジンのルールを評価し、inputSchema に照らして必須パラメーターを検証してから、タイムアウト付きでツールを実行します
  6. レスポンススキャン(実行後)でツールの出力をスキャンし、PII、シークレット、XSS、プロンプトインジェクションを検出します。有効な場合はマスキングします
  7. 監査ログがアクションチェーン全体を記録します

MCP プロトコルのサポート

AegisGate MCP は、次の JSON-RPC メソッドを実装しています(MCP Protocol 2025-06-18)。

メソッド種類説明
initializeリクエストclientInfo を解析し、serverInfo と機能(ツール、リソース、プロンプト、ログ)を返します
notifications/initialized通知サイレントに処理されます。レスポンスは送信されません(MCP の仕様に準拠)
notifications/cancelled通知クライアントによるキャンセルです。ログに記録され、レスポンスは送信されません
notifications/tools/list_changedサーバー起点ツールが追加または削除されたときに送信されます
notifications/resources/list_changedサーバー起点リソースが追加または削除されたときに送信されます
notifications/resources/updatedサーバー起点購読中のリソースのコンテンツが変更されたときに送信されます
notifications/prompts/list_changedサーバー起点プロンプトが追加または削除されたときに送信されます
tools/listリクエスト登録済みのツールを説明と inputSchema とともに返します。カーソルベースのページネーションに対応しています
tools/callリクエストすべてのセキュリティレイヤーを通過した後にツールを実行します
resources/listリクエスト登録済みのリソース(URI、名前、説明)を返します。カーソルベースのページネーションに対応しています
resources/readリクエストURI でリソースを読み込み、登録済みの ResourceHandlerFunc を呼び出します
resources/templates/listリクエストパラメーター付きリソース用に登録された URI テンプレートを返します
resources/subscribeリクエストURI のリソース更新通知を受け取るよう、セッションを登録します
resources/unsubscribeリクエストリソースの購読を解除します
prompts/listリクエスト登録済みのプロンプト(名前、説明、引数)を返します。カーソルベースのページネーションに対応しています
prompts/getリクエスト名前と任意の引数を指定してプロンプトを取得し、登録済みの PromptHandlerFunc を呼び出します
pingリクエストヘルスチェックです。空の成功レスポンスを返します

ストリーム可能な HTTP セッション管理(v1.2.2 以降):

  • initialize を指定した POST /mcp → レスポンスに Mcp-Session-Id ヘッダーが含まれます
  • 後続のリクエストを指定した POST /mcp → Mcp-Session-Id ヘッダーを含める必要があります
  • Mcp-Session-Id ヘッダーを指定した DELETE /mcp → セッションを終了します(204 No Content)
  • セッションは、30 分間操作がないと期限切れになります

🏭 ユースケースとデプロイシナリオ

AegisGate MCP は、AI エージェントがツールを使用するあらゆる環境に対応します。クラウド SaaS プラットフォームから、エンタープライズのデータパイプライン、OT/ICS のプラントネットワークまで、幅広く利用できます。デプロイ環境にかかわらず、同じ 21 層のセキュリティが適用されます。

一般的なデプロイ
  • クラウド SaaS — プロンプトインジェクションやデータの持ち出しから、ユーザー向け AI 機能を保護します
  • エンタープライズのデータアクセス — エージェント主導のデータベースクエリに RBAC と監査ログを適用します
  • CI/CD の自動化 — AI 支援パイプラインで実行可能な処理を制限します
  • エアギャップネットワーク — 依存関係がないため、インターネットに接続せずにサーバーを実行できます
### OT/ICS 環境

OT/ICS 環境では、AegisGate MCP は AI エージェントと重要インフラのツールの間に配置されます。

AI Agent (Claude, Cursor, custom)
    │
    ▼
┌──────────────────┐
│  AegisGate MCP   │  ← 23 security layers
│  (TLS/mTLS)      │
└────────┬─────────┘
         │
    ┌────┼────┬────┬────┐
    ▼    ▼    ▼    ▼    ▼
  SCADA  PLC  Hist  Tag  Log
  Read  Status Query DB  Analyzer

一般的な導入シナリオ:

  • 読み取り専用の監視エージェント — restricted ロール。SCADA のステータスやヒストリアンデータを照会できますが、コマンドは実行できません。
  • 保守エージェント — standard ロール。トラブルシューティング中にファイルを読み取り、コードを検索できます。
  • 運用エージェント — privileged ロール。ほとんどのツールを操作できますが、シェルコマンドは実行できません。
  • 管理者エージェント — admin ロール。承認された保守時間帯に、すべての機能にアクセスできます。

OT/ICS に特に関連するセキュリティ機能:

  • TLS/mTLS は、プラントネットワーク上のすべてのトラフィックを暗号化します。
  • 時間帯ポリシー は、リスクの高いツールの利用を保守時間帯に制限します。
  • チェーン分析 は、エージェントが機密性の高いプロセスデータを読み取った後、外部ネットワークへの書き込みを試みる(情報を持ち出す)といった行動を検出します。
  • 監査ログ は、コンプライアンス(NERC CIP、IEC 62443)に必要な完全な管理履歴を提供します。
  • エアギャップ環境での運用 — 依存関係がないため、インターネットに接続できない隔離ネットワークにもサーバーを導入できます。

デモツール

--demo フラグを指定するか、ライブラリモードで RegisterDemoTools() を呼び出すと、デモツールを有効にできます。 これらは安全な読み取り専用ツールであり、ファイルシステム、ネットワーク、外部リソースにはアクセスしません。

ツールリスクレベル必須パラメーター説明
ping10(なし)"pong" を返します — ヘルスチェックツール
system_info30(なし)Go のバージョン、OS、アーキテクチャ、CPU 数、ゴルーチン数、タイムスタンプを返します
echo20message(文字列)指定されたメッセージをそのまま返します

例 — system_info の応答:

{
  "go_version": "go1.26.9",
  "os": "linux",
  "arch": "amd64",
  "cpus": 8,
  "goroutines": 12,
  "timestamp": "2026-10-08T08:58:00Z"
}

ドキュメント

詳細なドキュメントは docs/ ディレクトリにあります。

ドキュメント説明
docs/getting-started.mdインストール、初回起動、基本設定
docs/deployment-guide.md本番環境への導入:Docker、TLS、エアギャップ環境のセットアップ
docs/admin-guide.md管理:セッション、監査ログ、RBAC 管理、ポリシー
docs/how-to-guides.mdタスク別ガイド:カスタムツール、署名検証、mTLS のセットアップ
docs/building-your-first-server.mdチュートリアル:カスタムツール、RBAC、ポリシーを使用して、セキュアな MCP サーバーを一から構築する方法
docs/integrating-with-cursor.mdStreamable HTTP トランスポート経由で Cursor を AegisGate MCP に接続する方法
docs/model-card.mdML モデルの詳細:アーキテクチャ、学習データ、性能指標
docs/comparison.md機能比較:AegisGate MCP と公式 MCP SDK、および後付けのラッパー
docs/owasp-mcp-top-10.mdOWASP MCP Top 10 のリスクマッピング — 10 件すべてのセキュリティリスクへの対応
docs/v1.3.0-roadmap.mdSSE ストリーミング、サーバー起点の通知、リソースサブスクリプション、リソーステンプレートのロードマップ(P1~P4 完了)

変更履歴

バージョン履歴と主な変更点については、CHANGELOG.md をご覧ください。


プラットフォーム連携(任意)

AegisGate MCP は、パターンの取得とイベントの転送のために、AegisGate Platform と任意で連携できます。

  • パターン取得:ETag キャッシュを使用して、Platform のテレメトリエンドポイントから標準検出パターンを取得します。
  • イベント転送:標準コントラクト形式で、セキュリティイベントを Platform のテレメトリレシーバーに送信します。
  • ツールの説明のスクリーニング:AegisGate Scanner の危険な関数パターン 34 件を追加して強化されています。

すべての連携機能はエアギャップ環境に対応しています。platform_url が設定されていない場合は、完全に無効になります。ネットワーク呼び出し、テレメトリ、外部依存関係はありません。


AegisGate Platform にアップグレードするタイミング

AegisGate MCP は、セキュリティを組み込んだ MCP サーバーの構築と実行に最適な、スタンドアロンのセキュアな MCP サーバーフレームワークです。無料のオープンソースで、外部依存関係は一切ありません。

ニーズが単一のサーバーを超えて拡大した場合、AegisGate Platform が自然なアップグレード先です。

ニーズAegisGate MCP(無料)AegisGate Platform
セキュアな MCP サーバーフレームワーク✅ 23 層、依存関係なし✅ MCP サーバーを内蔵
ML 脅威検知✅ 1 分あたり最大 100 件(単一サーバー)✅ 無制限、組織全体に対応
プロキシ/ゲートウェイモード❌ プロキシではなくフレームワーク✅ クライアントとすべての AI サービスの間に配置
OAuth 2.0/OIDC/SSO❌ ベアラートークン+API キー✅ SAML、OIDC、JWT
SIEM 統合❌ ファイルベースの監査+Prometheus✅ Splunk、Elasticsearch、QRadar、Datadog(11 プラットフォーム)
コンプライアンスフレームワーク❌ なし✅ 31 のフレームワーク(HIPAA、PCI、SOC 2、EU AI Act、NIST など)
マルチプロトコル(HTTP、A2A、ACP)❌ MCP のみ✅ 6 つの柱
エンタープライズ規模⚠️ 250 接続、25 セッション✅ 無制限

このように考えてください。 AegisGate MCP は、MCP サーバーを構築するためのセキュアな基盤です。AegisGate Platform は、MCP、HTTP、A2A、ACP を含め、組織全体のすべての AI トラフィックを保護するエンタープライズゲートウェイです。

その他の AegisGate 製品:

  • AegisGate Rampart — Claude、Cursor、Copilot を使用する開発者向けの無料のローカルプロキシ
  • AegisGate Lens — 日常的な AI との会話に使える無料のブラウザー拡張機能

ライセンス

Apache-2.0。全文はLICENSE、帰属表示についてはNOTICEをご覧ください。

セキュリティ

脆弱性の報告についてはSECURITY.mdをご覧ください。

コントリビューション

CONTRIBUTING.mdをご覧ください。DCO に従い、すべてのコミットに署名が必要です(git commit -s)。


知的財産に関するお知らせ

AegisGate のコア技術は USPTO に特許出願中です(仮出願番号 64/153,573–64/153,577、2026 年 9 月 12 日出願;64/174,824、2026 年 10 月 12 日出願;64/180,722、2026 年 10 月 20 日出願;および 64/184,057、2026 年 10 月 26 日出願)。ソースコードの著作権は © 2025-2026 AegisGate Security, LLC に帰属します。Apache 2.0 ライセンスの下で提供されています。


商標

AegisGate Security™ は AegisGate Security, LLC の商標であり、米国特許商標庁(USPTO)に出願されています。この商標は 2026 年 10 月 13 日に異議申立てのために公告されました。

AegisGate MCP は AegisGate Security, LLC の未登録製品名です。商標として個別に出願されていないため、この製品名には ™ 記号を使用していません。「AegisGate Security」標章の使用は、Lanham Act(15 U.S.C. § 1126)および適用される州の商標法に準拠します。

GitHub で公開されている改変されていないオープンソースソフトウェアの配布物に関連して、AegisGate の名称および標章を使用することが許可されています。派生物、商用製品、サービス提供、またはマーケティング資料における AegisGate の名称、ロゴ、その他のブランド資産の使用には、AegisGate Security, LLC の事前の書面による許可が必要です。

連絡先:[email protected]


🌐 AegisGate Security · 💬 Discord · ✉️ [email protected] · 𝕏 @aegisgate · 📱 Telegram · 🐘 @[email protected]

AI の攻撃対象領域を保護するため、AegisGate Security の開発者が 🖤 を込めて制作しました。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。