SAST MCP Server について
SAST MCP Server は、AI エージェントが複数のスキャナーでコードや稼働中のアプリケーションを検査するためのサーバーです。結果の集約に加え、絞り込み、ベースライン比較、SARIF 出力、パッチによる修正を扱えます。
主な機能
- 01複数スキャナーの並列実行と重複排除
- 02コード、依存関係、シークレット、IaC のスキャン
- 03OWASP ZAP による稼働中アプリのスキャン
- 04検出結果の絞り込みとページ分割
- 05SARIF 出力とベースライン比較
- 06修正プロンプトの生成とパッチ適用
活用シーン
- 01コード変更に含まれる新たな脆弱性の確認
- 02依存関係や Git 履歴に潜むリスクの検査
- 03スキャン結果による CI のゲート設定
- 04脆弱性修正案の作成と適用
MCP 対応
スキャン、検出結果管理、SARIF、ベースライン、修正、プロンプト、リソースの機能を MCP クライアントに提供します。stdio と Streamable HTTP に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx sast-mcp-serverSAST_MCP_TIMEOUTPer-scan timeout in seconds (default: 300).SAST_MCP_LOG_LEVELLogging level: DEBUG, INFO, WARNING, ERROR (default: INFO).SAST_MCP_API_KEYシークレットOptional static API key to require auth (legacy mode; HTTP transports).SAST_MCP_JWT_SECRETシークレットOptional HMAC secret to require JWT auth with scopes (HTTP transports).ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
27掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 返す検出結果の最大数(ページネーション用)。 |
| offset | integer | いいえ | ページネーションのオフセット。 |
| use_cache | boolean | いいえ | true の場合、対象ファイルに変更がなければ前回キャッシュしたスキャン結果を再利用します(増分スキャン)。git_diff_only が設定されている場合は無視されます。 |
| target_path | string | はい | スキャンするディレクトリまたはファイルの絶対パス。 |
| min_severity | string | いいえ | 報告する最低重大度(LOW、MEDIUM、HIGH、CRITICAL)。 |
| scanner_name | string | いいえ | 使用するスキャナー('bandit'、'njsscan'、'bearer'、 'semgrep')。デフォルトは 'bearer' です。 |
| git_diff_only | boolean | いいえ | true の場合、git diff で変更されたファイルの検出結果のみを報告します。 |
| output_format | string | いいえ | 'markdown'(人が読みやすい形式、デフォルト)または 'json' (Agent/CI 向けの機械可読な検出結果リスト)。 |
| min_confidence | string | いいえ | 報告する最低信頼度(LOW、MEDIUM、HIGH)。 |
詳細
SAST MCP サーバー
AI エージェント向け静的アプリケーションセキュリティテスト(SAST)。 あらゆる AI エージェントにコードのセキュリティ脆弱性をスキャンする機能を提供する、本番環境対応の MCP サーバーです。
業界標準のスキャナー 11 種類に対応しています。
| スキャナー | 言語/対象範囲 | 種類 |
|---|---|---|
| Bandit | Python | セキュリティリンター |
| njsscan | JavaScript、Node.js | 静的解析 |
| Bearer | Python、JS、Ruby、Java、Go、PHP | データフロー SAST |
| Semgrep | 30 以上の言語 | ルールベース SAST |
| Trivy | すべて(CVE、シークレット、IaC、イメージ) | マルチスキャナー |
| CodeQL | Python、JS、Java、Go、C/C++、C#、Ruby、Swift | セマンティック SAST |
| Checkov | Terraform、K8s、Docker、CloudFormation | IaC ポリシースキャナー |
| Gitleaks | すべて(.git の履歴) | 詳細なシークレットスキャン |
| OSV-Scanner | 複数(ロックファイル、SBOM) | SCA |
| Grype | コンテナ、OS パッケージ、ロックファイル、SBOM | SCA/イメージスキャン |
| OWASP ZAP | 実行時 | Docker 経由の動的スキャン(DAST) |
Gemini CLI、Claude Desktop、OpenAI Agents、Cursor、Windsurf など、あらゆる MCP 対応エージェントで利用できます。
機能
- 🔍 SAST/SCA/DAST スキャナー 11 種類と統一された出力形式
- 🌳 AST 対応コンテキスト — 行番号だけでなく、該当箇所を含む関数全体を表示
- 📊 重大度と信頼度によるフィルタリング — 重要な項目に集中できます
- 🔀 Git 差分モード — 増分レビューでは変更されたファイルのみをスキャン
- 🙈 除外設定の管理 — 監査証跡を残して誤検知を抑制
- 📄 ページネーション — エージェントに過剰な負荷をかけずに大規模なコードベースを処理
- 🌐 デュアルトランスポート — stdio(ローカル)または Streamable HTTP(リモートデプロイ)
- 🔐 JWT と API キーによる認証 — リモートデプロイを保護
- 📦 1 つのコマンドでインストール —
pip install sast-mcp-server - 🚀 マルチスキャナーモード — インストール済みのすべてのスキャナーを並列実行し、重複を除去
- 📋 SARIF エクスポート — GitHub、GitLab、Azure DevOps との CI/CD 統合
- 🏗️ IaC スキャン — Terraform、Kubernetes、Docker のセキュリティポリシー
- 🔑 シークレット検出 — コードや Git の履歴にハードコードされた API キー、トークン、パスワードを検出
- 📦 SCA/依存関係の CVE — ロックファイルをスキャンし、OSV データベースを照合して既知の脆弱性を検出
- 🕷️ DAST — OWASP ZAP と Docker を使用して、稼働中のアプリを動的にベースラインスキャン
- 📈 ベースラインと傾向の追跡 — スキャンをキャッシュし、保存済みのベースラインと比較
- 🤖 MCP プロンプトとリソース — エージェント向けのセキュリティワークフローとリアルタイムダッシュボードを標準搭載
- 📤 ダッシュボード連携 — SARIF の結果を DefectDojo または GitHub Code Scanning に送信
- 🩹 AI 支援の修正 — 修正プロンプトを生成し、エージェントが作成したパッチを
git applyで適用
クイックスタート
サーバーの有用性は、併せてインストールされているスキャナーに左右されます。必要なツールセットに応じて、インストール方法を選択してください。
オプション 1 — フルコンテナ(推奨:スキャナー 9 種、セットアップ不要)
docker pull ghcr.io/skyrxin/sast-mcp-server:full
bandit、njsscan、bearer、semgrep、trivy、checkov、gitleaks、osv-scanner、grype が含まれているため、すぐに scan_all を実行できます。または、1 つのコマンドで HTTP サーバーを起動できます。
docker compose up # serves http://localhost:8080/mcp + /health /ready /metrics
オプション 2 — pip エクストラ(pip でインストール可能なスキャナー 4 種)
pip install "sast-mcp-server[scanners]" # adds bandit, njsscan, semgrep, checkov
オプション 3 — 最小構成/カスタム構成
pip install sast-mcp-server # server only — bring your own scanners
uvx sast-mcp-server # run without installing
次に、必要なスキャナーをインストールします(バイナリスキャナーは pip パッケージではありません)。
pip install bandit njsscan semgrep checkov # pip-installable
# trivy: https://aquasecurity.github.io/trivy/latest/getting-started/installation/
# grype: https://github.com/anchore/grype#installation
# gitleaks: https://github.com/gitleaks/gitleaks#installing
# osv-scanner: https://google.github.io/osv-scanner/installation/
# bearer: https://docs.bearer.com/installation/
# codeql: https://github.com/github/codeql-cli-binaries/releases
各スキャナーの提供形態
| スキャナー | :full イメージ | [scanners] エクストラ | 備考 |
|---|---|---|---|
| Bandit | ✅ | ✅ | pip |
| njsscan | ✅ | ✅ | pip |
| Semgrep | ✅ | ✅ | pip |
| Checkov | ✅ | ✅ | pip |
| Bearer | ✅ | — | インストールスクリプト |
| Trivy | ✅ | — | バイナリ |
| Gitleaks | ✅ | — | バイナリ |
| OSV-Scanner | ✅ | — | バイナリ |
| Grype | ✅ | — | バイナリ |
| CodeQL | — | — | 数 GB のバンドル — 実行時にマウント |
| OWASP ZAP | — | — | ホスト上の Docker 経由で実行(run_active_scan) |
起動時に、サーバーは実際に認識できるスキャナーの数(例:
Scanners available: 9/11 (...))をログに出力します。list_scannersツールと/readyエンドポイントでも同じ内容を報告するため、利用可能なスキャナーが常に明確です。
AI エージェントでの使用
Gemini CLI
拡張機能としてインストールします。
gemini extensions install https://github.com/Skyrxin/sast-mcp-server
または、~/.gemini/settings.json に追加します。
{
"mcpServers": {
"sast": {
"command": "uvx",
"args": ["sast-mcp-server"]
}
}
}
Claude Desktop
claude_desktop_config.json に追加します。
{
"mcpServers": {
"sast": {
"command": "uvx",
"args": ["sast-mcp-server"]
}
}
}
Claude Desktop の完全なガイドを参照してください。
Cursor IDE
Cursor の設定 → MCP サーバーに追加します。
{
"mcpServers": {
"sast": {
"command": "uvx",
"args": ["sast-mcp-server"]
}
}
}
Cursor の完全なガイドを参照してください。
OpenAI Agents SDK
from agents.mcp import MCPServerStdio
sast_server = MCPServerStdio(command="uvx", args=["sast-mcp-server"])
OpenAI の完全なガイドを参照してください。
利用可能な MCP ツール
scan_vulnerabilities
特定のスキャナーを使用して、ディレクトリのセキュリティ脆弱性をスキャンします。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャン対象のパス |
scanner_name | string | "bearer" | スキャナー:bandit、njsscan、bearer、semgrep、trivy、codeql、checkov |
min_severity | string | "LOW" | 最小重大度:LOW、MEDIUM、HIGH、CRITICAL |
min_confidence | string | "LOW" | 最小信頼度:LOW、MEDIUM、HIGH |
git_diff_only | bool | false | Git で変更されたファイルのみをスキャン |
limit | int | 50 | 返す検出結果の最大数 |
offset | int | 0 | ページネーションのオフセット |
scan_all
インストール済みのすべてのスキャナーを並列実行し、自動的に重複を除去します。包括的なセキュリティスキャンにおすすめです。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャン対象のパス |
min_severity | string | "MEDIUM" | 最小重大度(ノイズを減らすため、デフォルトは高めです) |
min_confidence | string | "LOW" | 最小信頼度 |
git_diff_only | bool | false | Git で変更されたファイルのみをスキャン |
limit | int | 50 | 返す検出結果の最大数 |
offset | int | 0 | ページネーションのオフセット |
scan_git_history
Gitleaks を使用して、.git の全履歴から漏えいしたシークレットと認証情報をスキャンします。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | "." | リポジトリのルートへのパス(.git を含む必要があります) |
min_severity | string | "LOW" | 報告する最小重大度 |
run_active_scan
Docker Compose スタックを実行して、OWASP ZAP による動的(DAST)ベースラインスキャンを行います。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | docker-compose ファイルを含むディレクトリ |
docker_compose_file | string | 必須 | docker-compose ファイルの名前(例:docker-compose.yml) |
target_url | string | 必須 | 起動後のアプリの URL(例:http://localhost:8080) |
export_sarif
CI/CD との統合用に、スキャン結果を SARIF 2.1.0 形式でエクスポートします。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
scanner_name | string | "bearer" | 使用するスキャナー |
min_severity | string | "LOW" | 最低重大度 |
min_confidence | string | "LOW" | 最低信頼度 |
output_path | string | "" | SARIF の書き込み先ファイルパス(空の場合は文字列として返します) |
list_scanners
利用可能なスキャナー、そのインストール状況、および対応言語を一覧表示します。
ignore_vulnerability
検出結果を今後のスキャンで抑制します(監査証跡付き)。
unignore_vulnerability
以前に抑制した検出結果を再度有効にします。
list_ignored_vulnerabilities
プロジェクトで現在抑制されている検出結果をすべて表示します。
save_baseline
スキャンを実行し、今後の傾向比較用に、名前を付けたベースラインとして結果をキャッシュします。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
tag | string | "latest" | このベースラインの名前(例:main、pre-release) |
scanner_name | string | "bearer" | 使用するスキャナー |
min_severity | string | "LOW" | 含める最低重大度 |
min_confidence | string | "LOW" | 含める最低信頼度 |
compare_baseline
新しいスキャン結果と保存済みのベースラインを比較し、新規および修正済みの検出結果を明らかにします。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
tag | string | "latest" | 比較対象のベースラインタグ |
scanner_name | string | "bearer" | 使用するスキャナー |
min_severity | string | "LOW" | 含める最低重大度 |
min_confidence | string | "LOW" | 含める最低信頼度 |
upload_to_defectdojo
SARIF エクスポートを DefectDojo のエンゲージメントにインポートします。環境変数 DEFECTDOJO_URL
および DEFECTDOJO_API_KEY が必要です。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
sarif_path | string | 必須 | export_sarif による SARIF ファイルのパス |
engagement_id | int | 必須 | 対象となる DefectDojo エンゲージメント ID |
active | bool | true | インポートした検出結果をアクティブとしてマークします |
verified | bool | false | インポートした検出結果を検証済みとしてマークします |
upload_to_github
SARIF レポートを GitHub Code Scanning にアップロードします。security_events: write スコープを持つ
GITHUB_TOKEN が必要です。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
sarif_path | string | 必須 | export_sarif による SARIF ファイルのパス |
repo | string | 必須 | owner/name 形式のリポジトリ |
commit_sha | string | 必須 | 結果の対象となる完全なコミット SHA |
ref | string | 必須 | 完全修飾参照(例:refs/heads/main) |
generate_fix_prompt
キャッシュされた検出結果の脆弱なコードとコンテキストをまとめ、厳密な統一差分による修正を求める、LLM 用のプロンプトを生成します。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンしたプロジェクトのルート(.sast-mcp-cache を含む) |
finding_hash | string | 必須 | 修正する検出結果のハッシュ(スキャン出力から取得) |
context_window | int | 15 | 検出箇所の前後に含めるソース行数 |
apply_patch
エージェントが生成した統一差分を git apply でディスクに適用します(対象ディレクトリ外へ出るパスは拒否されます)。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | パッチのパスの基準となるディレクトリ |
patch | string | 必須 | 適用する統一差分テキスト |
check_only | bool | false | ファイルを変更せずに検証します |
evaluate_policy
すべてのスキャナーを実行し、CI ゲート判定用に明示的な PASS/FAIL を返します。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
max_critical | int | 0 | 許容する CRITICAL の最大数(−1 = 無制限) |
max_high | int | -1 | 許容する HIGH の最大数(−1 = 無制限) |
max_medium | int | -1 | 許容する MEDIUM の最大数(−1 = 無制限) |
fail_on_new | bool | false | scan_all のベースラインと比較して、新しい検出結果があれば失敗にします |
baseline_tag | string | "latest" | fail_on_new の場合に使用するベースラインタグ |
output_format | string | "markdown" | markdown または json |
export_sbom
すべてのスキャナーを実行し、SBOM/脆弱性レポートをエクスポートします。CycloneDX モードでは、 Syft がインストールされている場合、コンポーネント一覧には 脆弱性のあるパッケージだけでなく、依存関係がすべて含まれます。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
output_path | string | "" | 書き込み先ファイル(空の場合はインラインで返します) |
min_severity | string | "LOW" | 含める最小深刻度 |
sca_only | bool | true | 依存関係(SCA)の検出結果のみを対象とします。false = すべて |
format | string | "cyclonedx" | cyclonedx または spdx(SPDX 2.3) |
generate_report
すべてのスキャナーを実行し、経営層向けのセキュリティレポートを生成します。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
output_path | string | "" | 書き込み先ファイル(空の場合は HTML をインラインで返します。PDF の場合は必須です) |
min_severity | string | "LOW" | 含める最小深刻度 |
format | string | "html" | html または pdf([pdf] の追加機能が必要です) |
compliance_report
検出結果をコンプライアンスフレームワークにマッピングし、対応状況をレポートします。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | スキャンするパス |
framework | string | "owasp" | owasp、sans、pci、または cis |
output_path | string | "" | Markdown レポートの任意の書き込み先ファイル |
min_severity | string | "LOW" | 含める最小深刻度 |
scan_image
コンテナイメージの参照をスキャンして、脆弱性とシークレットを検出します(Trivy または Grype)。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
image_ref | string | 必須 | イメージの参照。例:nginx:1.25 |
scanner_name | string | "trivy" | trivy または grype |
min_severity | string | "MEDIUM" | レポートする最小深刻度 |
output_format | string | "markdown" | markdown または json |
remediate_and_verify
クローズドループで修正します。パッチをドライランし、適用して再スキャンし、検出結果がなくなったことを確認します(失敗した場合はパッチをロールバックします)。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | プロジェクトのルート(.sast-mcp-cache を含む) |
finding_hash | string | 必須 | 修正する検出結果のハッシュ |
patch | string | 必須 | 適用する統合 diff |
scanner_name | string | "" | 再スキャンに使用するスキャナー(デフォルト:検出結果のスキャナー) |
auto_rollback | bool | true | 検証に失敗した場合にパッチを元に戻します |
import_sarif
外部の SARIF ファイル(Snyk、Veracode、CI ジョブなど)を正規化された検出結果パイプラインに取り込み、重複排除、ベースライン、ダッシュボードに反映します。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
target_path | string | 必須 | 結果が属するプロジェクトのルート |
sarif_path | string | 必須 | SARIF 2.1.0 ファイルのパス |
scanner_name | string | "external" | 記録するソーススキャナー名 |
save | bool | true | インポートした検出結果をキャッシュします |
triage_finding
悪用可能性/誤検知の評価プロンプトを取得するか、CycloneDX VEX の判定を記録します(抑制する処置の場合、検出結果も無視リストに追加されます)。
| Parameter | Type | Default | Description |
|---|---|---|---|
target_path | string | required | プロジェクトのルート(.sast-mcp-cache を含む) |
finding_hash | string | required | トリアージする検出結果のハッシュ |
disposition | string | "" | exploitable、not_affected、false_positive、resolved、in_triage(空の場合はプロンプトを返します) |
justification | string | "" | 根拠/CycloneDX の正当化キーワード |
comment_on_pr
GitHub の PR または GitLab のマージリクエストにセキュリティの概要を投稿します。GITHUB_TOKEN または GITLAB_TOKEN(および任意の GITLAB_URL)が必要です。
| Parameter | Type | Default | Description |
|---|---|---|---|
provider | string | required | github または gitlab |
repo | string | required | owner/name(GitHub)またはプロジェクト ID/パス(GitLab) |
pr_number | int | required | PR 番号/MR IID |
body | string | required | Markdown コメント本文 |
notify_slack / notify_teams
Slack または Microsoft Teams の受信 Webhook(SLACK_WEBHOOK_URL/TEAMS_WEBHOOK_URL)に通知を送信します。
create_jira_issue
検出結果の Jira 課題を作成します。JIRA_URL、JIRA_EMAIL、JIRA_API_TOKEN が必要です。
| Parameter | Type | Default | Description |
|---|---|---|---|
project_key | string | required | Jira プロジェクトキー(例:SEC) |
summary | string | required | 課題のタイトル |
description | string | required | 課題の説明 |
issue_type | string | "Bug" | Jira の課題タイプ |
Tip:
scan_vulnerabilities、scan_all、scan_git_historyは、CI/エージェントのパイプラインで機械可読な結果を得るためにoutput_format="json"を指定できます。
Auth: HTTP トランスポートでは、すべてのツールでスコープによるアクセス制御が適用されます。
scan:read(スキャン、レポート、エクスポート)、scan:write(ベースライン、パッチ、アップロード、通知)、config:write(無視リスト)。SAST_MCP_JWT_SECRETを設定し、スコープ付き JWT を発行してください。
SARIF/CI/CD 統合
CI/CD プラットフォームと統合するため、スキャン結果を SARIF 2.1.0 形式でエクスポートします。
# In your CI pipeline, use the MCP tool:
# export_sarif(target_path=".", scanner_name="semgrep", output_path="results.sarif")
# Then upload to GitHub Code Scanning:
# gh api /repos/{owner}/{repo}/code-scanning/sarifs -f [email protected]
対応対象:GitHub Code Scanning、GitLab SAST、Azure DevOps、VS Code SARIF Viewer。
リモートデプロイ(Streamable HTTP)
リモートまたはクラウドでホストするデプロイでは、2026 年の MCP 標準で Streamable HTTP が使用されます。
シークレットを設定すると、JWT Bearer 認証でサーバーを保護できます。また、下位互換性のために静的 API キーを使用することもできます。
# Set JWT secret for secure authentication
export SAST_MCP_JWT_SECRET="your_hmac_sha256_secret"
# Or use the legacy API key method
export SAST_MCP_API_KEY="your_secure_api_key_here"
# Start the server with streamable-http transport
uv run sast-mcp-server --transport streamable-http --port 8080 --host 0.0.0.0
Note:従来の
sseトランスポートは非推奨です。streamable-httpに移行してください。
主なワークフロー
1. 統合脆弱性スキャン
インストール済みのスキャナーを個別に実行する(scan_vulnerabilities(scanner_name="bandit"))か、scan_all を使用してすべてを一度に実行します。
2. 詳細なシークレットスキャンと動的スキャン
scan_git_history を使用して何年も前に漏えいした API キーを検出するか、run_active_scan を使用して Docker Compose でアプリケーションを起動し、OWASP ZAP で動的にテストします。
3. ベースラインと傾向の追跡
スキャン結果を名前付きベースラインとして保存し、以降のスキャンと比較して、新たな脆弱性、修正済みの問題、重大度の傾向を時系列で追跡します。
save_baseline(target_path=".", tag="main")compare_baseline(target_path=".", tag="main")
4. CI/CD 統合
スキャン結果を SARIF 形式(export_sarif)でエクスポートし、GitHub Code Scanning、GitLab SAST、その他の SARIF 対応プラットフォームと統合します。
5. MCP プロンプト(セキュリティワークフロー)
AI エージェントをガイドする、事前構築済みのセキュリティワークフロー:
security_review:コードベース全体の評価fix_vulnerability:脆弱性の修正に特化したアドバイザーpr_security_check:Git の差分のみをスキャンし、重大度のしきい値を適用compliance_report:OWASP Top 10 または PCI-DSS のレポートを生成
6. MCP リソース(セキュリティダッシュボード)
フルスキャンを実行せずに、AI エージェントが参照できる読み取り専用のコンテキストデータです。
sast://dashboard/{path}:セキュリティポスチャダッシュボードsast://config:サーバーの設定とステータスsast://scanners:利用可能なスキャナーと言語sast://cache/{path}/latest:最新スキャン結果のメタデータ
7. ダッシュボードへのアップロードと AI 支援による修正
SARIF の結果を外部プラットフォームに送信し、エージェントが作成したパッチで検出結果を修正します。
upload_to_defectdojo/upload_to_github:SARIF エクスポートをダッシュボードに送信しますgenerate_fix_prompt:特定の検出結果に対応した LLM 向けプロンプトを作成しますapply_patch:生成された統合差分をgit applyで適用します
Docker
リリースごとに、ビルド済みイメージが GHCR に公開されます。
docker pull ghcr.io/skyrxin/sast-mcp-server:full # 9 scanners (recommended)
docker pull ghcr.io/skyrxin/sast-mcp-server:minimal # bandit, njsscan, bearer
# Run as an HTTP server
docker run -p 8080:8080 -e SAST_MCP_JWT_SECRET=your-secret \
ghcr.io/skyrxin/sast-mcp-server:full --transport streamable-http
# …or use the bundled compose file (exposes /health /ready /metrics too)
docker compose up
ローカルでビルドしますか?
docker build -t sast-mcp-server . # minimal
docker build -f Dockerfile.full -t sast-mcp-server:full . # full
CodeQL と OWASP ZAP はイメージに含まれていません。CodeQL は数 GB のバンドルとして提供されるため、実行時にマウントしてください。ZAP の
run_active_scanはホスト上で Docker をオーケストレーションします。
信頼性
ここで「本番環境対応」は単なるスローガンではありません。プッシュのたびに CI で測定しています。
- 226 件のテスト、74% の行カバレッジ(Codecov)。Python 3.10–3.13 全体でテストが成功し、mypy による型チェックを必須としています。
- ビルドごとのセルフスキャン。 CI でサーバー自身のコードに対して自らのスキャナーを実行し、SARIF とサマリーを
self-scan-reportアーティファクトとして公開します。スナップショットはexamples/self-scan/にあります。 - 負荷テスト済みの HTTP トランスポート。
scripts/loadtest.pyを CI で Streamable HTTP サーバーに対して実行します。ローカルでの実行では、30 個の同時ワーカーを使い、/health、/ready、/metrics全体で失敗ゼロのまま、p95 ≈ 290 ms で約 210 req/s を維持できます。 - 運用エンドポイント —
/health(稼働状態)、/ready(キャッシュされたスキャナー一覧。インストール済みのスキャナーがない場合は 503)、/metrics(Prometheus テキスト形式)。 - 負荷時も上限を維持 — サブプロセススキャナーには設定可能な同時実行数の上限(
SAST_MCP_MAX_CONCURRENT_SCANS)、HTTP トランスポートにはクライアントごとのトークンバケット方式のレート制限(SAST_MCP_RATE_LIMIT_PER_MIN)を設け、スキャナーごとのタイムアウトと任意のインクリメンタルスキャンキャッシュも備えています。
負荷テストを自分で実行するには:
python scripts/loadtest.py --requests 2000 --concurrency 50
設定
環境変数
| 変数 | デフォルト | 説明 |
|---|---|---|
SAST_MCP_TIMEOUT | 300 | スキャンのタイムアウト時間(秒) |
SAST_MCP_LOG_LEVEL | INFO | ログレベル:DEBUG、INFO、WARNING、ERROR |
SAST_MCP_CACHE_TTL | 86400 | キャッシュの有効期間(秒、タグなしのスキャン) |
SAST_MCP_CACHE_MAX_SCANS | 200 | 保持するタグなしキャッシュ済みスキャンの最大数(0 = 無制限) |
SAST_MCP_HTTP_RETRIES | 3 | インテグレーションの HTTP 呼び出しの再試行回数 |
SAST_MCP_HTTP_TIMEOUT | 60 | インテグレーションの HTTP 呼び出しのリクエストごとのタイムアウト(秒) |
SAST_MCP_MAX_CONCURRENT_SCANS | 8 | 同時に実行できるサブプロセスのスキャナーの最大数(0 = 無制限) |
SAST_MCP_RATE_LIMIT_PER_MIN | 0 | HTTP トランスポートにおけるクライアントごとのリクエスト上限(0 = 無効) |
SAST_MCP_SCANNER_TIMEOUTS | (なし) | スキャナーごとのタイムアウト上書きを指定する JSON マップ。例:{"trivy":600} |
SAST_MCP_API_KEY | (なし) | リモート(HTTP)認証用の API キー |
SAST_MCP_JWT_SECRET | (なし) | JWT ベアラー認証用の HMAC-SHA256 シークレット(スコープはツールごとに適用されます) |
DEFECTDOJO_URL | (なし) | DefectDojo インスタンスのベース URL(upload_to_defectdojo 用) |
DEFECTDOJO_API_KEY | (なし) | DefectDojo API v2 トークン |
GITHUB_TOKEN | (なし) | security_events: write 権限を持つトークン(SARIF のアップロードと PR コメント用) |
GITLAB_TOKEN | (なし) | api スコープを持つ GitLab トークン(comment_on_pr 用) |
GITLAB_URL | https://gitlab.com | GitLab のベース URL(セルフマネージド環境での上書き用) |
SLACK_WEBHOOK_URL | (なし) | Slack の受信 Webhook(notify_slack 用) |
TEAMS_WEBHOOK_URL | (なし) | Microsoft Teams の受信 Webhook(notify_teams 用) |
JIRA_URL / JIRA_EMAIL / JIRA_API_TOKEN | (なし) | Jira Cloud の認証情報(create_jira_issue 用) |
運用エンドポイント(HTTP トランスポート)
--transport streamable-http を指定して実行すると、サーバーは次のエンドポイントを公開します。
| エンドポイント | 用途 |
|---|---|
GET /health | 稼働確認プローブ — プロセスの実行中はバージョンとともに 200 を返します |
GET /ready | 準備状況プローブ — インストール済みスキャナーを一覧表示します(該当するスキャナーがない場合は 503) |
GET /metrics | Prometheus 形式のテキスト出力(ツール呼び出し、スキャン時間、検出結果) |
インクリメンタルスキャン
scan_vulnerabilities と scan_all は use_cache=true を受け付けます。サーバーはターゲットのファイルをフィンガープリント化し、変更がない場合は前回のスキャン結果を再利用するため、セッション中にスキャンを繰り返しても高速です。
開発
# Clone and install with dev dependencies
git clone https://github.com/Skyrxin/sast-mcp-server.git
cd sast-mcp-server
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Lint
ruff check sast_mcp_server/
# Run locally
python -m sast_mcp_server
プロジェクト構成
sast_mcp_server/
├── __init__.py # Package version
├── __main__.py # python -m entry point
├── server.py # FastMCP server with all tools + /health /ready /metrics
├── models.py # Typed data models (Finding, Severity, etc.)
├── config.py # Central validated settings (env-driven)
├── sarif.py # SARIF 2.1.0 export and parsing
├── aggregator.py # Multi-scanner parallel execution + deduplication
├── cache.py # Scan caching, baselines, comparison, fingerprints
├── auth.py # JWT / API key authentication for remote transports
├── metrics.py # In-process Prometheus metrics
├── ratelimit.py # Per-client token-bucket rate limiting
├── prompts.py # MCP prompt templates (security workflows)
├── resources.py # MCP resources (sast:// dashboards and metadata)
├── scanners/
│ ├── base.py # Abstract scanner base class
│ ├── factory.py # Scanner registry and factory
│ ├── bandit.py # Bandit (Python)
│ ├── njsscan.py # njsscan (JavaScript)
│ ├── bearer.py # Bearer (multi-language)
│ ├── semgrep.py # Semgrep (30+ languages)
│ ├── trivy.py # Trivy (CVEs, secrets, IaC)
│ ├── codeql.py # CodeQL (deep semantic SAST)
│ ├── checkov.py # Checkov (IaC policies)
│ ├── gitleaks.py # Gitleaks (git history secret scanning)
│ ├── osv_scanner.py # OSV-Scanner (SCA / dependency CVEs)
│ ├── grype.py # Grype (SCA + container image scanning)
│ └── zap.py # OWASP ZAP (DAST via Docker)
├── enrichment/
│ ├── ast_context.py # AST-aware code context extraction
│ ├── git_diff.py # Git diff for incremental scanning
│ ├── ignore_manager.py # Finding ignore list management
│ ├── patch_prompt.py # Builds LLM prompts to fix a cached finding
│ └── patch_apply.py # Applies/reverts agent-generated diffs via `git apply`
├── reporting/
│ ├── sbom.py # CycloneDX SBOM/VDR (+ optional Syft inventory)
│ ├── spdx.py # SPDX 2.3 SBOM
│ ├── vex.py # CycloneDX VEX statements (triage decisions)
│ ├── html.py # Standalone HTML executive report
│ ├── pdf.py # PDF report (optional [pdf] extra)
│ └── compliance.py # OWASP / SANS / PCI / CIS mapping
└── integrations/
├── defectdojo.py # Upload SARIF to DefectDojo
├── github.py # GitHub Code Scanning + PR comments
├── gitlab.py # GitLab MR comments
├── slack.py / teams.py # Webhook notifications
└── jira.py # Create Jira issues
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。