mcp-server-auditor について
mcp-server-auditorは、MCP サーバーのソースコードを監査する開発者向けのMCP サーバーです。ツール定義や処理内のリスクパターンを検査し、対処法とSARIF形式の結果を示します。
主な機能
- 01ツール定義と処理のスキャン
- 025種類のセキュリティリスク検査
- 03PythonとGoの入力フロー追跡
- 04修正案の提示
- 05SARIF 2.1.0形式での出力
活用シーン
- 01リリース前のMCP サーバー監査
- 02CI/CDへのセキュリティスキャン追加
- 03PythonやGoのツール処理の監査
MCP 対応
MCP クライアント向けに、MCP サーバーのコードを監査するscan_text、scan_file、scan_directory、list_patternsツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
4掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| label | string | いいえ | 検出結果に表示する任意のラベル(例:ファイル名) |
| content | string | はい | スキャンするコードの内容 |
詳細
@guardbee/mcp-server-auditor
🇬🇧 English | 🇹🇷 Türkçe | 🇨🇳 中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇧🇷 Português | 🇪🇸 Español | 🇩🇪 Deutsch
他のMCPサーバーのツール定義をスキャンし、安全でないパターンを検出するMCP(Model Context Protocol)サーバーです。
ai-code-scannerが一般的なLLM/AI統合コードを調べるのに対し、このパッケージはMCPサーバー自体に特化しています。server.tool(...)で定義されたツールがどれほど強い権限を持つか、パラメーターの制約がどれほど緩いか、ハンドラーがツール入力をシェル/ファイルシステム/HTTP/SQLなどの危険なシンクに直接渡しているかを調べます。MCPエコシステムは急速に拡大していますが、こうしたサーバーのセキュリティを監査するための共通ツールはまだありません。
テレメトリーはデフォルトでオフです。
GUARDBEE_TELEMETRY=1を設定すると、サーバー、ツール、成功の有無、所要時間、およびファイルパスなどの短いパラメーター値が送信されます。長い文字列や、content、token、passwordなどのフィールドはプレースホルダーに置き換えられます。詳細は@guardbee/mcp-telemetryを参照してください。
Claude ──► mcp-server-auditor ──► An MCP server's source code
│
├─ Excessive agency (execSync(input.command), a tool named "run_shell")
├─ Unsafe input (fetch(input.url) → SSRF, SQL string interpolation)
├─ Loose schema (a parameter typed z.any()/z.unknown())
├─ Secrets exposure (a hardcoded API key in a schema default, the entire process.env)
└─ Network exposure (wildcard CORS)
特長
- 10個のパターン、5つのカテゴリ — 過剰な権限、安全でない入力、緩いスキーマ、シークレットの露出、ネットワークの露出
- PythonおよびGoサーバー:ツール定義(FastMCPのパラメーター、低レベルの
arguments、go-sdkの型付き引数、mcp-goのrequest.RequireString(...))から、単純な代入を経て、シェル、ファイルの書き込み/削除、HTTP、SQLの呼び出しに至るまで、ツール入力を追跡します - 検出結果にはそれぞれ、リスクの理由と対処方法(
recommendation)が含まれます。「検出した」というだけではありません - SARIF 2.1.0形式で出力 — CI/CD統合(GitHub Code Scanningなど)
guardbee.ymlによる設定ファイルのサポート- すべてのパターンに、脆弱なケースと安全なケースのPythonおよびGoフィクスチャを使った陽性テストと陰性(誤検出)テストを用意
クイックスタート
Claude Desktop/MCPクライアント
{
"mcpServers": {
"guardbee-mcp-server-auditor": {
"command": "npx",
"args": ["-y", "@guardbee/mcp-server-auditor"]
}
}
}
CLI(CI/CD)
npx @guardbee/mcp-server-auditor scan ./src --fail-on=high --format=sarif > results.sarif
MCPツール
| ツール | 説明 |
|---|---|
scan_text | 指定されたテキスト/コードスニペットをスキャンします |
scan_file | 単一のファイルをスキャンします |
scan_directory | ディレクトリを再帰的にスキャンします(node_modules、.git、distは自動的にスキップされます) |
list_patterns | カテゴリ別に、サポートされているすべてのパターンを一覧表示します |
検出されるパターン
| カテゴリ | パターン | 深刻度 | OWASP | 意味 |
|---|---|---|---|---|
| 過剰な権限 | shell_exec_from_tool_input | 重大 | MCP05:2025 | ツールハンドラーが、ツール入力を execSync/spawn のようなシェル呼び出しに直接渡します |
| 過剰な権限 | eval_of_tool_input | 重大 | MCP05:2025 | ツール入力が eval()/new Function() を使ってコードとして実行されます |
| 過剰な権限 | unrestricted_shell_tool_name | 高 | MCP05:2025 | ツール名(run_shell、execute_sql など)が、シェル/SQL の実行を直接示唆しています |
| 安全でない入力 | fs_write_from_raw_tool_input | 高 | ツール入力からのパスが、検証されずにファイルの書き込み/削除呼び出しに渡されます(パストラバーサル) | |
| 安全でない入力 | ssrf_fetch_from_tool_input | 高 | ツール入力からの URL が、許可リストなしで fetch/axios に直接渡されます(SSRF) | |
| 安全でない入力 | sql_injection_via_tool_input | 重大 | MCP05:2025 | テンプレートリテラルを使って、ツール入力が SQL 文字列に埋め込まれます |
| 緩すぎるスキーマ | overly_permissive_tool_schema | 中 | ツールのパラメーターが z.any()/z.unknown() として型指定されており、あらゆる値を受け付けます | |
| シークレットの漏えい | hardcoded_secret_in_tool_schema | 重大 | 認証情報のようなスキーマフィールドのデフォルト値が、ハードコードされたリテラルです | |
| シークレットの漏えい | full_env_exposed_to_tool_caller | 重大 | process.env 全体が展開/文字列化/返却されています(名前付き変数は対象外) | |
| ネットワークへの露出 | permissive_cors_on_server | 中 | ワイルドカード CORS(Access-Control-Allow-Origin: *)、またはオプションなしの cors() が使われています |
Python と Go
Python(.py)と Go(.go)のファイルも、ツール入力のデータフローチェックの対象になります。ツールの入力名は定義から取得され、ハンドラー内の単純な代入(command = f"du {directory}")をたどります。入力がシンク呼び出しに到達すると、問題が報告されます。
| パターン | 深刻度 | シンク |
|---|---|---|
python_shell_from_tool_input | 重大 | subprocess.*、os.system、os.popen、asyncio.create_subprocess_* |
python_eval_of_tool_input | 重大 | eval、exec |
python_fs_write_from_tool_input | 高 | open(..., "w"/"a"/"x")、os.remove/rename/…、shutil.rmtree/move、Path(...).write_text/unlink |
python_ssrf_from_tool_input | 高 | requests.*、httpx.*、client.get(...)、urlopen(URL 引数) |
python_sql_injection_via_tool_input | 重大 | cursor.execute(f"...{x}...")、%/.format/+ |
go_shell_from_tool_input | 重大(sh -c)、高(引数リスト) | exec.Command、exec.CommandContext |
go_fs_write_from_tool_input | 高 | os.WriteFile、os.Remove、os.RemoveAll、os.Rename、os.Create、書き込み用の os.OpenFile |
go_ssrf_from_tool_input | 高 | http.Get/Post/NewRequest…、client.Get |
go_sql_injection_via_tool_input | 重大 | fmt.Sprintf または + を使う db.Query…/Exec… |
ハンドラーがパスをベースディレクトリと照合する場合(is_relative_to、commonpath、.parents、filepath.IsLocal、filepath.Rel、strings.HasPrefix)、ファイルに関する検出結果はスキップされます。HTTP に関する検出結果は、ホストの許可リストを照合する場合にスキップされます。run_shell、execute_sql などの名前のツールは、どちらの言語でも報告されます。Rust、Java、Kotlin、C# などの言語では、言語に依存しないパターンのみが検出されます。
これらの検出結果はヒューリスティックなものです。完全な AST/型解析ではなく、静的なテキストパターンのスキャンによるものです。誤検出を低く抑えるよう設計されていますが、検出結果はすべて手動で確認してください。
設定(guardbee.yml)
mcp-server-auditor:
fail-on: high # any | critical | high | medium | low | none
max-files: 5000
exclude:
- ".test.ts"
- "fixtures/"
開発
npm run build
npm test
ライセンス
MIT — GuardBee
フィードバック
質問、アイデア、または誤検出がありましたか?GitHub Discussionsでスレッドを開始するか、issue を作成してください。GuardBee が役に立った場合は、リポジトリに ⭐ を付けていただくと、ほかの人にも見つけてもらいやすくなります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。