关于 SAST MCP Server
SAST MCP Server 让 AI Agent 借助多种扫描器检查代码和运行中的应用。它汇总扫描结果,并提供筛选、基线比较、SARIF 导出及补丁修复工具。
主要功能
- 01并行运行多种扫描器并去重
- 02扫描代码、依赖、密钥和 IaC
- 03使用 OWASP ZAP 扫描运行中应用
- 04筛选并分页显示发现项
- 05导出 SARIF 并比较基线
- 06生成修复提示词并应用补丁
适用场景
- 01检查代码变更中的新漏洞
- 02排查依赖和 Git 历史中的风险
- 03根据扫描结果设置 CI 门禁
- 04生成并应用漏洞修复方案
MCP 相关
向 MCP 客户端提供扫描、发现项管理、SARIF、基线、修复、提示词和资源能力,支持 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 Agent 的静态应用安全测试(SAST)。 一个可用于生产环境的 MCP 服务,让任何 AI Agent 都能扫描代码中的安全漏洞。
支持 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 | 容器、操作系统软件包、锁文件、SBOM | SCA / 镜像扫描 |
| OWASP ZAP | 运行时 | 通过 Docker 进行动态扫描(DAST) |
可与 任何兼容 MCP 的 Agent 配合使用:Gemini CLI、Claude Desktop、OpenAI Agents、Cursor、Windsurf 等。
功能
- 🔍 11 款 SAST/SCA/DAST 扫描器,采用统一的输出格式
- 🌳 感知 AST 的上下文 — 显示完整的外层函数,而不只是行号
- 📊 按严重性和可信度筛选 — 聚焦重要问题
- 🔀 Git 差异模式 — 仅扫描修改过的文件,进行增量审查
- 🙈 忽略项管理 — 抑制误报并保留审计记录
- 📄 分页 — 处理大型代码库,避免 Agent 不堪重负
- 🌐 双传输方式 — stdio(本地)或 Streamable HTTP(远程部署)
- 🔐 JWT 和 API 密钥身份验证 — 保护远程部署
- 📦 一条命令即可安装 —
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 提示词与资源 — 为 Agent 提供预置安全工作流和实时仪表板
- 📤 仪表板集成 — 将 SARIF 结果推送到 DefectDojo 或 GitHub Code Scanning
- 🩹 AI 辅助修复 — 生成修复提示词,并通过
git apply应用 Agent 编写的补丁
快速开始
此服务的实用性取决于同时安装的扫描器。请选择符合你所需工具集范围的安装方式。
选项 1 — 完整容器(推荐:9 个扫描器,无需设置)
docker pull ghcr.io/skyrxin/sast-mcp-server:full
捆绑了 bandit、njsscan、bearer、semgrep、trivy、checkov、gitleaks、
osv-scanner 和 grype,因此 scan_all 开箱即用。或者,只需一条命令即可启动 HTTP
服务:
docker compose up # serves http://localhost:8080/mcp + /health /ready /metrics
选项 2 — pip 附加组件(4 个可通过 pip 安装的扫描器)
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 Agent 配合使用
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"]
}
}
}
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
以 SARIF 2.1.0 格式导出扫描结果,用于 CI/CD 集成。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
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
将缓存发现中的易受攻击代码及上下文打包为适用于大模型的提示词, 要求生成严格的统一差异修复补丁。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
target_path | string | 必需 | 已扫描的项目根目录(含 .sast-mcp-cache) |
finding_hash | string | 必需 | 要修复的发现哈希值(来自扫描输出) |
context_window | int | 15 | 要包含在发现前后文中的源代码行数 |
apply_patch
通过 git apply 将 Agent 生成的统一差异补丁应用到磁盘(拒绝路径超出
目标目录范围的补丁)。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
target_path | string | 必需 | 补丁路径所相对的目录 |
patch | string | 必需 | 要应用的统一差异文本 |
check_only | bool | false | 验证但不修改文件 |
evaluate_policy
运行所有扫描器,并返回明确的 PASS/FAIL 判定,以便在 CI 中进行门禁检查。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
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 | 必填 | 要应用的统一差异 |
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 问题类型 |
提示:
scan_vulnerabilities、scan_all和scan_git_history支持output_format="json",可在 CI/Agent 工作流中返回机器可读的结果。
身份验证: 在 HTTP 传输中,每个工具都受作用域限制 —
scan:read(扫描、 报告、导出)、scan:write(基线、补丁、上传、通知)、config:write(忽略列表)。设置SAST_MCP_JWT_SECRET并签发带作用域的 JWT。
SARIF/CI/CD 集成
将扫描结果导出为 SARIF 2.1.0 格式,以便与 CI/CD 平台集成:
# 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 Authentication 保护服务。或者,为了向后兼容,也可以使用静态 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
注意:旧的
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 Agent:
security_review:全面评估代码库fix_vulnerability:针对性修复建议pr_security_check:仅扫描 git 差异并执行严重性门槛检查compliance_report:生成 OWASP Top 10 或 PCI-DSS 报告
6. MCP 资源(安全仪表板)
为 AI Agent 提供只读上下文数据,无需运行完整扫描:
sast://dashboard/{path}:安全态势仪表板sast://config:服务配置和状态sast://scanners:可用的扫描器和语言sast://cache/{path}/latest:最新扫描结果元数据
7. 仪表板上传与 AI 辅助修复
将 SARIF 结果推送到外部平台,并使用 Agent 编写的补丁修复问题:
upload_to_defectdojo/upload_to_github:将 SARIF 导出结果推送到仪表板generate_fix_prompt:为特定问题构建适用于大模型的提示词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持续提供 约 210 req/s,p95 ≈ 290 ms,且零失败。 - 运维端点 —
/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 bearer 身份验证的 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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。