AegisGate MCP について
AegisGate MCPは、リクエスト処理にセキュリティ制御を組み込んだMCPサーバー構築用Goフレームワークです。認証、アクセス制御、監査、脅威検出が必要な環境でサーバーを運用する開発者を対象としています。
主な機能
- 01認証と4段階のRBAC
- 02ポリシールールとレート制限
- 03改ざん検知可能な監査ログ
- 04入力と応答のスキャン
- 05正規表現とニューラル脅威検出
- 06登録時のツールポイズニング検査
活用シーン
- 01ロールごとのツールアクセス制限
- 02ツール入力と応答のスキャン
- 03MCP操作の監査
- 04プロンプトインジェクションと難読化の検出
MCP 対応
MCPサーバーを構築するフレームワークで、MCPリクエストとツール呼び出しにセキュリティ検査を適用します。stdioとTCPに対応し、TLSまたは相互TLSも利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/aegisgatesecurity/aegisgate-mcp:1.5.1Streamable HTTPツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🛡️ AegisGate MCP
安全な MCP サーバーフレームワーク — 依存関係なしで23層の防御を実現します。
純粋な Go で記述された、強化済みの依存関係ゼロの MCP サーバーです。最初の行からセキュリティが組み込まれた基盤の上に MCP サーバーを構築できます。侵害の発生後に後付けする必要はありません。
Apache 2.0 · 23層のセキュリティ · 79個の正規表現パターン+CharCNN-BiLSTM(v15)による ML 検知 · CVE ゼロ · 外部モジュール依存関係ゼロ
AegisGate MCP が役に立ったら、リポジトリにスターを付けて ⭐、同僚にも知らせてください。ほかの開発者が安全な MCP ツールを見つける助けになります。
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 SDK | AegisGate MCP | |
|---|---|---|
| 認証 | ❌ 自分で用意 | ✅ Bearer トークン + API キー + ロックアウト |
| 認可 | ❌ なし | ✅ ツールごとの権限を設定できる 4 階層 RBAC |
| 監査ログ | ❌ なし | ✅ 改ざん検知可能な SHA-256 ハッシュチェーン |
| 脅威検知 | ❌ なし | ✅ 79 個の正規表現パターン + ニューラル ML(1ms 未満) |
| サプライチェーンリスク | ❌ npm/PyPI 依存関係 | ✅ 依存関係ゼロ(Go 標準ライブラリのみ) |
| CVE | 6 か月間で重大なものが 3 件 | ゼロ。これまで一度もありません。 |
| ライセンス | MIT | Apache 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 を使わずにヒューリスティックなスコアリングで基本的な検知を提供します
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--ml | MCP_ML_ENABLED | false (CLI) / true (Docker) | ニューラル脅威検知を有効にします |
--ml-shadow | MCP_ML_SHADOW | false | 予測を記録しますが、ブロックはしません |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | 脅威スコアのしきい値(0.0~1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | ONNX モデルファイルへのパス |
ライブラリの使用方法
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 |
| 4 | RBAC | 4段階のロール階層(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 |
| 13 | STDIO 検証 | stdio トランスポートコマンドの許可リストとブロックリストによって、シェルインジェクションを防止します | stdio_guard.go |
| 14 | 監査ログ | すべての MCP アクションをファイルとメモリ内に記録します。コンプライアンス対応のために検索でき、改ざんを検知できるハッシュチェーンを備えています | audit.go |
| 15 | TLS/mTLS トランスポート | オプションの相互 TLS に対応した、暗号化 TCP 接続です | config.go, server.go |
| 16 | stdio トランスポート | 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 |
| 21 | NFKC 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 ペイロード |
| 危険な関数 | 34 | eval()、exec()、os.system()、subprocess(shell=True)、pickle.loads()、child_process.exec() |
| 認証情報 | 6 | AWS キー、GitHub PAT、JWT トークン、RSA 秘密鍵、汎用 API キー |
| 金融 | 3 | クレジットカード(Visa、Mastercard、Amex) |
| ネットワーク | 3 | ネットワークアドレス、OPC UA、Modbus、DNP3 |
| 個人情報 | 2 | SSN、メールアドレス |
| XSS | 3 | スクリプトタグ、SVG の onload、画像の onerror |
| コンプライアンス | 3 | OWASP LLM01/02/06 |
⚙️ 設定
設定の優先順位
設定は、優先度の高い順に解決されます。
- CLI フラグ — すべてを上書きします
- 環境変数 — 設定ファイルを上書きします
- JSON 設定ファイル(
--config)— 組み込みのデフォルト値を上書きします - 組み込みのデフォルト値
CLI フラグ
すべての CLI フラグには、対応する環境変数があります。
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--addr | MCP_SERVER_ADDR | :8081 | リッスンアドレス(TCP モード) |
--transport | MCP_TRANSPORT | tcp | トランスポートモード:tcp、stdio、http(Streamable HTTP) |
--token | MCP_AUTH_TOKEN | (空) | 認証用ベアラートークン |
--audit | MCP_AUDIT_LOG | (空) | 監査ログのファイルパス |
--max-sessions | MCP_MAX_SESSIONS | 50 | 同時セッションの最大数 |
--max-connections | MCP_MAX_CONNECTIONS | 1000 | 同時 TCP 接続の最大数(-1 = 無制限) |
--rate-limit | MCP_RATE_LIMIT_RPM | 60 | レート制限(リクエスト/分) |
--exec-timeout | MCP_EXEC_TIMEOUT | 30 | ツール実行のタイムアウト(秒) |
--scan-responses | MCP_SCAN_RESPONSES | true | レスポンスのスキャンを有効にする |
--block-pii | MCP_BLOCK_PII | true | 個人情報を含むレスポンスをブロックする |
--block-secrets | MCP_BLOCK_SECRETS | true | シークレットを含むレスポンスをブロックする |
--block-xss | MCP_BLOCK_XSS | true | XSS を含むレスポンスをブロックする |
--block-prompt-inject | MCP_BLOCK_PROMPT_INJECT | true | プロンプトインジェクションを含むレスポンスをブロックする |
--redact | MCP_REDACT_ENABLED | false | シークレット/個人情報のマスキングを有効にする |
--redact-pii | MCP_REDACT_PII | false | レスポンスから個人情報をマスキングする |
--redact-secrets | MCP_REDACT_SECRETS | true | レスポンスからシークレットをマスキングする |
--redact-placeholder | MCP_REDACT_PLACEHOLDER | [REDACTED] | マスキング時に使用するプレースホルダーテキスト |
--tls | MCP_TLS_ENABLED | false | TLS トランスポートを有効にする |
--tls-cert | MCP_TLS_CERT | (空) | サーバー証明書ファイル(PEM) |
--tls-key | MCP_TLS_KEY | (空) | サーバー秘密鍵ファイル(PEM) |
--tls-client-ca | MCP_TLS_CLIENT_CA | (空) | クライアント証明書用 CA バンドル(mTLS を有効化) |
--tls-min-version | MCP_TLS_MIN_VERSION | 1.2 | TLS の最小バージョン:1.2 または 1.3 |
--health-addr | MCP_HEALTH_ADDR | (空) | ヘルスエンドポイントのリッスンアドレス(空 = 無効) |
--config | MCP_CONFIG_FILE | (空) | JSON 設定ファイルのパス |
--demo | MCP_DEMO_TOOLS | false | デモ用ツール(ping、system_info、echo)を登録する |
--ml | MCP_ML_ENABLED | false | ニューラルネットワークによる脅威検出を有効にする(L3、CGO ビルドが必要) |
--ml-shadow | MCP_ML_SHADOW | false | ML シャドウモード:予測をログに記録しますが、ブロックはしません |
--ml-threshold | MCP_ML_THRESHOLD | 0.50 | ML 脅威スコアのしきい値(0.0–1.0) |
--ml-model | MCP_ML_MODEL | ./models/threat_cnn_bilstm.onnx | ONNX モデルファイルのパス |
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 リスナーによって可観測性エンドポイントが提供されます。
| エンドポイント | メソッド | 説明 |
|---|---|---|
/healthz | GET | 生存確認プローブ — サーバープロセスが実行中の場合、200 OK を返します |
/readyz | GET | 準備状況プローブ — サーバーがリクエストを受け付ける準備ができている場合、200 OK を返します |
/stats | GET | サーバー統計情報を JSON で返します(セッション、レート制限、ツール呼び出し、active_connections、max_connections) |
🔐 RBAC とポリシーエンジン
RBAC ロール
AegisGate MCP は4段階のロール階層を適用します。ロールの順序は restricted < standard < privileged < admin です。
| ロール | レベル | アクセス権限 | ツールの例 |
|---|---|---|---|
restricted | 0 | 読み取り専用ツールのみ | ping、system_info、file_exists、git_status、git_log |
standard | 1 | 読み取りと低リスクの書き込み | file_read、code_search、web_search、file_copy |
privileged | 2 | 高リスクの実行を除くすべて | shell_command、code_execute を除くすべてのツール |
admin | 3 | 制限なしですべてのツールを利用可能 | 登録済みのすべてのツール |
ロールの比較には AgentRole.AtLeast() を使用します。privileged エージェントは、standard または restricted を必要とするすべてのツールにアクセスできますが、admin を必要とするツールにはアクセスできません。
ポリシーエンジン
ポリシーエンジンは、ツールの実行前に許可/拒否ルールを評価します。ルールでは次の項目をサポートします。
- ツール名の照合 — 正確な名前とワイルドカードパターン
- エージェントのロール条件 — 特定のロールにのみルールを適用
- リスクスコアのしきい値 —
RiskAbove値を超えた場合に適用 - 優先順位 — 優先度の高いルールから評価
- 時間帯 — ツールの利用可能な時間帯を制限
- パラメータパターン — ツール呼び出しのパラメータと照合
- アクション — 許可、拒否(理由付き)、ログレベル、リスク修飾子
組み込みポリシールール
LoadDefaultPolicies() で読み込まれます。
| ルール ID | 優先度 | アクション | 条件 | 説明 |
|---|---|---|---|---|
block-shell-commands | 100 | 拒否 | ツール名:shell_command、bash、exec、cmd、terminal。ロール:restricted、standard、privileged | シェルコマンドには admin ロールが必要です |
block-file-delete | 90 | 拒否 | ツール名:file_delete、rm、unlink、remove。ロール:restricted、standard | ファイルの削除には privileged または admin ロールが必要です |
block-network-write | 80 | 拒否 | ツール名:http_request、web_search、fetch_url、curl、wget。ロール:restricted | restricted エージェントにはネットワーク操作が許可されません |
alert-high-risk | 50 | 許可+アラート | リスクスコア > 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) | 611 | 92.0% |
| 単体テスト+統合テスト(CGO+ML) | 611 | 91.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/sec | TestLoadSustainedThroughput |
| p50レイテンシ(同時接続数100) | 34 ms | TestLoadConcurrentConnections |
| p99レイテンシ(同時接続数100) | 46 ms | TestLoadConcurrentConnections |
| 接続の入れ替わり率 | 2,662 conn/sec | TestConnectionChurn |
| ゴルーチンのリーク(10秒間の連続実行) | 0 | TestSoakStability |
| 負荷時のグレースフルシャットダウン | 1.6 ms | TestShutdownUnderLoad |
k6 スタイルのストレス/バースト/過負荷テストの結果
| 指標 | 値 | テスト |
|---|---|---|
| ストレス時の段階的な負荷増加(500 接続) | 成功率 100%、p99=65ms、738 rps | TestStressRampUp |
| バースト時のリクエスト急増(1000 リクエスト) | 12,710 リクエスト/秒 | TestBurstRequestSpike |
| バーストからの回復 | ベースラインの 0.99 倍(即時) | TestBurstRecovery |
| MaxConnections を超える過負荷 | 上限を適用し、サーバーも応答 | TestCrushBeyondMaxConnections |
| ゴルーチンリーク(500 回の入れ替わり) | Δ=0 | TestCrushGoroutineExplosion |
| FD リーク(500 回の入れ替わり、5 ラウンド) | Δ=1 | TestFDLeak |
| 負荷中のグレースフルシャットダウン | 1.6ms(50 個のアクティブなジェネレーター) | TestChaosShutdownUnderLoadTCP |
| HTTP 同時実行(50 クライアント) | 2,290 rps、p99=16ms | TestHTTPLoadConcurrent |
| 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 バインディング) | MIT | internal/onnxruntime_go/ |
| libonnxruntime.so(Microsoft) | MIT | lib/amd64/、lib/arm64/ |
| golang.org/x/text(Unicode 正規化) | BSD-3-Clause | internal/textnorm/ |
| CharCNN-BiLSTM v15 モデル | Apache-2.0 | models/ |
これが重要な理由:
- エアギャップ環境へのデプロイ —
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) │
└─────────────────────────────────────────────────────────────────────────┘
リクエストの流れ:
- TCP クライアントが接続します(TLS/mTLS 経由も可能)。または、stdio が stdin 経由で JSON-RPC を送信します
- 認証ミドルウェアがベアラートークン/API キーを検証し(定時間比較)、ECDSA 署名を確認して、セッションを作成または検証します
- ガードレールがレート制限とセッション制限を適用し、チェーン分析を実行します
- レスポンススキャン(実行前のパラメーター検証はハンドラー内で行われます)
- リクエストハンドラーが RBAC 権限を確認し、ポリシーエンジンのルールを評価し、
inputSchemaに照らして必須パラメーターを検証してから、タイムアウト付きでツールを実行します - レスポンススキャン(実行後)でツールの出力をスキャンし、PII、シークレット、XSS、プロンプトインジェクションを検出します。有効な場合はマスキングします
- 監査ログがアクションチェーン全体を記録します
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 環境では、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() を呼び出すと、デモツールを有効にできます。
これらは安全な読み取り専用ツールであり、ファイルシステム、ネットワーク、外部リソースにはアクセスしません。
| ツール | リスクレベル | 必須パラメーター | 説明 |
|---|---|---|---|
ping | 10 | (なし) | "pong" を返します — ヘルスチェックツール |
system_info | 30 | (なし) | Go のバージョン、OS、アーキテクチャ、CPU 数、ゴルーチン数、タイムスタンプを返します |
echo | 20 | message(文字列) | 指定されたメッセージをそのまま返します |
例 — 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.md | Streamable HTTP トランスポート経由で Cursor を AegisGate MCP に接続する方法 |
docs/model-card.md | ML モデルの詳細:アーキテクチャ、学習データ、性能指標 |
docs/comparison.md | 機能比較:AegisGate MCP と公式 MCP SDK、および後付けのラッパー |
docs/owasp-mcp-top-10.md | OWASP MCP Top 10 のリスクマッピング — 10 件すべてのセキュリティリスクへの対応 |
docs/v1.3.0-roadmap.md | SSE ストリーミング、サーバー起点の通知、リソースサブスクリプション、リソーステンプレートのロードマップ(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 の事前の書面による許可が必要です。
🌐 AegisGate Security · 💬 Discord · ✉️ [email protected] · 𝕏 @aegisgate · 📱 Telegram · 🐘 @[email protected]
AI の攻撃対象領域を保護するため、AegisGate Security の開発者が 🖤 を込めて制作しました。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。