代码扫描与修复工具

MCP Scanner是一个自动化代码扫描与修复工具,通过枚举仓库架构、关联Semgrep发现、生成DSPy修复脚本并应用修复,适用于代码安全审计和自动化漏洞修复场景。

  • by rymarinelli
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 rymarinelli/MCP_Scanner

使用说明

MCP扫描仪

MCP扫描仪项目的基础脚手架。当前存储库 包含共享配置、日志记录助手和抽象接口 图形、LLM和扫描组件。

先决条件

  • Python 3.10+
  • pip

入门

  1. 创建虚拟环境

    python -m venv .venv
    source .venv/bin/activate  # On Windows use: .venv\\Scripts\\activate
    
  2. 以可编辑模式安装项目

    pip install --upgrade pip
    pip install -e .[dev]
    

    修复工作流程将发送到Git和Semgrep。安装它们 您的平台包管理器(如果尚未提供):

    # macOS (Homebrew)
    brew install git semgrep
    
    # Debian/Ubuntu
    sudo apt-get update && sudo apt-get install -y git curl
    curl -sL https://semgrep.dev/install.sh | sudo bash
    
  3. 提供配置(可选)

    复制 .env.example 到 .env 并根据需要调整任何值。

    cp .env.example .env
    

    环境变量前缀为 MCP_ 并且可以使用嵌套 双下划线。例如, MCP_LLM__API_KEY 设置LLM提供程序 API密钥。

项目布局

src/
├── common/        # Shared helpers (config, logging, etc.)
├── graph/         # Graph provider abstractions
├── llm/           # LLM provider abstractions
└── scanners/      # Repository scanner interfaces

自动扫描流水线

HTTP服务驱动了一个旨在镜像的多阶段补救工作流 您描述的过程:

  1. 枚举存储库架构。 这 enumeration 包裹行走 目标存储库,构建属性图,并具体化JSON 上下文文件和交互式HTML可视化。这些文物是 在扫描响应中发出 enumeration.artifacts.
  2. 将Semgrep的发现与RAG图相关联。 Semgrep与 捆绑的规则集及其JSON结果通过以下方式得到丰富 graph.enrichers.correlate_semgrep_findings,注入周围环境 来自RAG的节点元数据、代码片段和关系信息。
  3. 生成DSPy修复脚本。 丰富的发现为DSP提供了信息 补救驱动程序。司机写了一个Markdown剧本,总结了 针对每个漏洞提出补丁和持久性JSON有效载荷,其中包含 DSPy输出。扫描响应在以下位置显示这些文件的持久路径 remediation.artifacts (例如, dspy_summary.md 和那个 dspy_cases/ 目录)。
  4. 应用修复程序并创建提交。 补丁建议按以下方式分组 漏洞,一次应用一个提交。每个成功的提交都使用 描述性信息(fix(<vulnerability_id>): ...).如果GitHub令牌是 配置后,服务推送补救分支并打开拉取 请求链接到每个提交。

每个阶段都会在响应有效载荷中留下稳定的伪影,以便 您可以查看RAG图、Semgrep JSON、DSPy脚本和修正分支 扫描完成后。

正在加载配置

Pydantic设置用于集中运行时配置:

from common.config import get_settings

settings = get_settings()
print(settings.llm.model)

加载器读取 .env 默认情况下,会回退到环境 变量。

使用捆绑的Hugging Face编码模型

通过启用本地 拥抱面部整合。设置以下环境变量以使 服务负载 ise-uiuc/Magicoder-S-DS-6.7B 型号(或其他兼容型号 编码模型)通过Transformers库:

export MCP_LLM__PROVIDER=huggingface
export MCP_LLM__MODEL=ise-uiuc/Magicoder-S-DS-6.7B

当这些设置处于活动状态时,补救建议流会提示 本地托管的模型,而不是依赖于远程API。您可以替换 MCP_LLM__MODEL 对于较小的CPU友好型模型(例如, deepseek-ai/deepseek-coder-1.3b-instruct)如果内存受到限制。第一 run会将模型权重下载到本地Hugging Face缓存中。

通过Docker运行HTTP服务

该存储库现在包含一个轻量级的HTTP服务,该服务公开了 扫描仪工作流程。构建并运行容器,如下所示:

docker build -t mcp-scanner .
docker run --rm -p 8000:8000 mcp-scanner

通过发送 POST 请求 /scan 终点。提供 请求体中的Git URL(和可选分支)。您还可以切换 管道行为——例如禁用补救提交或拉取请求——通过 提供如下所示的可选布尔开关:

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "repo_url": "https://github.com/example/repo.git",
        "branch": "main",
        "quick": false,
        "apply_commits": true,
        "push": true,
        "create_pr": true,
        "base_branch": "main",
        "pr_labels": ["automated", "security"]
      }' \
  http://localhost:8000/scan

响应包含Semgrep的发现和建议的补救补丁 由MCP管道生成。

当修复成功时,您会发现 pull_request JSON中的对象 响应谁 status 是 success 以及谁的 url 链接到创建的PR。 如果字段不存在或状态为 skipped,检查随附的 reason--例如,缺失 GITHUB_TOKEN 证书或缺失 Semgrep的发现将阻止打开拉取请求。

运行GitHub修复扫描

支持MCP扫描器的工作流假定Git和GitHub凭据为 可用,因此它可以提交修复程序并打开拉取请求。在触发之前 扫描设置以下环境变量:

export GIT_USER="Your Name"
export GIT_EMAIL="you@example.com"
export GITHUB_TOKEN="ghp_your_personal_access_token"

GitHub代币需要 repo 范围,以便扫描仪可以推动补救 分支并代表您创建pull请求。

配置后,启动HTTP服务(直接或在Docker中):

python -m service.http_server  # binds to 0.0.0.0:8000 by default

通过POSTing直接触发对GitHub存储库的完整修复运行 到 /scan 终点。只要 GITHUB_TOKEN 在出口 服务运行的环境中,扫描仪将拾取它 automatics--不需要在请求有效负载中嵌入凭据:

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "repo_url": "https://github.com/rymarinelli/vulnerable_flask_SQL",
        "branch": "main",
        "quick": false,
        "apply_commits": true,
        "push": true,
        "create_pr": true,
        "pr_labels": ["automated", "security"]
      }' \
  http://localhost:8000/scan

响应捆绑了枚举工件、Semgrep发现、应用提交、, 以及(在启用时)补救拉取请求元数据。进行干扫描 无需提交或打开PR,设置 "apply_commits": false (以及 可选地 "quick": true)在请求有效载荷中。

使用mytunnel(localtunnel)公开服务

当您需要与远程客户端共享本地MCP Scanner实例时, 使用捆绑的测试部署助手。该脚本启动HTTP服务器, 确保 mytunnel CLI是 并打印隧道发出的公共URL:

python -m mcp_scanner.scripts.deploy_test_tunnel --install-lt --subdomain busy-papers-melt

关键标志:

  • --install-lt 安装 lt CLI与 npm 如果还没有 可用。在没有全局安装的环境中运行时忽略它 渴望的。
  • --subdomain 请求一个稳定的本地隧道子域。
  • --host 和 --port 控制嵌入式MCP服务器绑定(默认: 0.0.0.0:8000).

该命令一直运行,直到被中断 Ctrl+C,同时关闭两者 退出时,服务器和隧道干净。一旦脚本打印 🌐 Public MCP URL,您可以调用 /scan 来自任何机器的端点,以及 通过以下方式驱动完整的修复(包括Git提交、推送和拉取请求) curl:

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "repo_url": "https://github.com/rymarinelli/vulnerable_flask_SQL",
        "apply_commits": true,
        "push": true,
        "create_pr": true
      }' \
  https://busy-papers-melt.loca.lt/scan

只要 GITHUB_TOKEN 在隧道所在的环境中导出 脚本正在运行,扫描程序向GitHub进行身份验证,推送修复 分支,并打开一个 pull请求。保持 GIT_USER 和 GIT_EMAIL 配置为控制提交 应用于生成的修复程序的作者信息。