1. 项目概述:一个为安全审计师打造的“智能副驾”
如果你是一名区块链安全研究员或者智能合约审计师,每天的工作是不是在成百上千行的代码里寻找那些可能价值百万甚至千万的漏洞?从重入攻击到整数溢出,从逻辑缺陷到权限绕过,每一个疏忽都可能意味着项目的巨大损失。传统的审计流程,往往依赖于审计师个人的经验、记忆力和对各类漏洞模式的熟悉程度,效率瓶颈非常明显。今天要聊的这个项目——giannistbs/solodit-findings-mcp,就是为解决这个痛点而生的一个“生产力神器”。
简单来说,这是一个基于MCP(Model Context Protocol)协议构建的服务器。它的核心功能,是将全球最大的智能合约漏洞数据库之一Solodit的审计报告和漏洞发现,整合进你的 AI 工作流中。想象一下,当你正在用 Claude、Cursor 或者其他支持 MCP 的 AI 助手分析一段复杂的 Solidity 代码时,你不再需要手动去 Solodit 网站搜索类似的漏洞案例。你只需要在 IDE 里@一下你的 AI 助手,问一句:“这段代币转账函数有没有已知的类似漏洞模式?” AI 助手就能通过这个 MCP 服务器,实时查询 Solodit 数据库,并把历史上真实发生过的、高度相关的漏洞详情、攻击原理和修复建议,直接呈现在你面前。
这不仅仅是简单的信息检索,而是一个将集体智慧(全球审计师的发现)与个人工作流深度结合的“外挂大脑”。它极大地降低了审计工作的信息检索成本,让审计师能更专注于代码逻辑推理和创造性思维,而不是重复性的模式匹配。无论是独立审计师、安全团队的新人,还是经验丰富的老手,都能从这个工具中获得显著的效率提升和知识辅助。
2. 核心设计思路:为什么是 MCP + Solodit?
2.1 MCP 协议:AI 能力的“万能插头”
要理解这个项目的价值,首先得弄明白 MCP 是什么。你可以把 MCP 想象成 AI 世界的USB-C 接口。在过去,每个 AI 应用(比如一个代码分析工具)想要接入外部数据源(比如 GitHub、Jira 或者像 Solodit 这样的专业数据库),都需要开发者为特定的 AI 模型(如 Claude、GPT)编写特定的插件或集成,工作量大且不通用。
MCP 协议的出现,就是为了标准化 AI 模型与外部工具、数据源之间的通信。它定义了一套简单的规范:服务器(Server)对外提供一系列工具(Tools)和资源(Resources),而客户端(Client)(通常是 AI 应用或 IDE 插件)可以通过标准的 JSON-RPC 协议来调用这些工具和访问资源。giannistbs/solodit-findings-mcp就是一个标准的 MCP 服务器,它封装了对 Solodit 数据的查询能力,任何兼容 MCP 的客户端都能即插即用。
这种设计带来了几个关键优势:
- 解耦与复用:安全研究员(项目作者)只需要写好这一个 MCP 服务器,所有支持 MCP 的 AI 工具(Claude Desktop, Cursor, Windsurf 等)都能立刻获得查询 Solodit 的能力,无需为每个工具重复开发。
- 上下文感知:MCP 允许服务器提供“资源”(比如一份具体的审计报告),AI 可以将这些资源作为上下文加载到对话中,实现更深度的、基于具体文档的分析。
- 标准化操作:查询动作被抽象成“工具”,参数和返回值格式固定,使得 AI 能更可靠、更准确地调用这些复杂功能。
2.2 Solodit:审计知识的“黄金矿藏”
为什么选择 Solodit 作为数据源?在区块链安全领域,有几个知名的漏洞和审计报告聚合平台,如 Solodit、Code4rena、Sherlock 等。Solodit 的特点在于其聚合性和结构化程度。
- 聚合性:Solodit 并不只局限于某一个审计竞赛平台,它广泛地收录来自 Code4rena、Sherlock、Immunefi 等多个渠道的公开审计报告和漏洞提交(Findings)。这意味着它的数据库更全面,覆盖了不同审计场景(竞赛审计、专项审计、漏洞赏金)下的案例。
- 结构化数据:Solodit 对收录的漏洞进行了较好的结构化处理。每个漏洞(Finding)通常包含清晰的标题、风险等级(High/Medium/Low)、涉及的合约或项目、漏洞类别(如 Reentrancy, Access Control)、详细描述、攻击步骤(Proof of Concept)、修复建议等。这种结构化的数据非常适合被程序化查询和 AI 理解,也是构建
solodit-findings-mcp的基础。
注意:Solodit 的数据是基于各平台公开的报告。对于未公开的或保密性审计中的漏洞,无法通过此工具查询。它的价值在于学习和参考历史公开案例的模式。
2.3 项目架构拆解
这个 MCP 服务器的架构非常清晰,是一个典型的三层结构:
- 数据层:Solodit 公开的 RESTful API 或网页数据(项目可能需要通过爬虫或官方 API 获取数据)。服务器内部会处理这些数据,可能建立本地缓存或索引以提升查询速度。
- 服务层:基于 MCP 协议实现的服务器核心。它主要暴露两类东西:
- 工具(Tools):例如
search_findings。这是一个函数,接收用户(通过AI)输入的查询关键词(如“reentrancy”、“ERC-20 approval race”),向 Solodit 发起搜索,并返回结构化的漏洞列表。 - 资源(Resources):例如
finding://{id}。这是一个 URI 模式,指向某个具体的漏洞详情页。AI 可以请求加载这个资源,服务器则返回该漏洞的完整 Markdown 或结构化文本内容,供 AI 深入分析。
- 工具(Tools):例如
- 接入层:用户使用的 MCP 客户端。用户在 Claude Desktop 的聊天框里输入“搜索关于闪电贷的漏洞”,Claude 识别出意图,通过 MCP 协议调用服务器的
search_findings工具,并将结果格式化后展示给用户。
整个项目的设计思路,可以概括为“将静态的、需要主动检索的知识库,动态地、按需地注入到AI辅助的实时工作流中”。
3. 核心功能实操:如何安装与使用
3.1 环境准备与安装
假设你使用的是Claude Desktop作为你的主要 AI 客户端,以下是详细的安装和配置步骤。其他支持 MCP 的客户端(如 Cursor)流程类似,主要区别在于配置文件的位置和格式。
步骤一:安装 Node.js 和 npm该项目是一个 Node.js 服务器,因此你需要先安装 Node.js 环境。建议安装最新的 LTS 版本。
# 在 macOS 上可以使用 Homebrew brew install node # 或在 Linux 上使用 apt sudo apt update sudo apt install nodejs npm # 安装后验证版本 node --version npm --version步骤二:获取 MCP 服务器你有两种方式获取这个服务器:
- 直接使用预构建版本(如果作者提供):最方便的方式是通过
npm全局安装。
安装后,通常你会获得一个可执行命令,例如npm install -g @giannistbs/solodit-findings-mcpsolodit-findings-mcp。 - 从源码克隆并运行:
之后,你可以通过git clone https://github.com/giannistbs/solodit-findings-mcp.git cd solodit-findings-mcp npm install # 安装依赖 npm run build # 如果是 TypeScript 项目需要编译node dist/index.js或npm start来启动服务器。查看项目的package.json文件中的"bin"字段或"scripts"字段来确定入口点。
步骤三:配置 Claude DesktopClaude Desktop 需要通过一个配置文件来声明它应该连接哪些 MCP 服务器。
- 找到 Claude Desktop 的配置文件夹:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
- macOS:
- 如果该文件不存在,就创建它。如果存在,在
"mcpServers"字段中添加新的服务器配置。{ "mcpServers": { "solodit-findings": { "command": "npx", "args": [ "-y", "@giannistbs/solodit-findings-mcp" ] } } }"command": 这里使用的是npx,它会自动下载并运行指定的 npm 包。这是一种无需全局安装的简便方法。"args": 传递给命令的参数,这里就是包名。- 如果你是从源码运行,
command应改为node,args应改为你本地服务器入口文件的绝对路径,例如["/path/to/your/solodit-findings-mcp/dist/index.js"]。
步骤四:重启与验证保存配置文件后,完全重启 Claude Desktop 应用。重启后,Claude 会自动启动配置的 MCP 服务器。你可以通过以下方式验证是否成功:
- 在 Claude 聊天界面,尝试输入一些与智能合约安全相关的指令。
- 更直接的方式是,查看 Claude Desktop 的日志文件(通常可以在应用设置中找到日志位置),搜索是否有连接
solodit-findings服务器的成功或错误信息。
实操心得:配置 MCP 服务器最常见的问题是路径错误或命令执行权限问题。使用
npx是最省心的方式,但它需要网络连接。如果处于离线环境,或者追求极致的响应速度,建议采用全局安装或源码本地运行的方式,并在配置中使用绝对路径。另外,确保你的防火墙或安全软件没有阻止 Node.js 进程启动网络服务。
3.2 基础查询:像对话一样搜索漏洞
安装配置成功后,你就可以在 Claude 中直接使用了。它的交互非常自然,就像你在和一个精通 Solodit 数据库的专家同事对话。
场景一:针对性漏洞模式查询假设你正在审计一个 DeFi 协议的质押合约,看到了一个external修饰的函数,里面包含了资金转移操作。
- 你的提问:“我看到了一个外部可调用的函数,内部有
call.value()进行 ETH 转账,帮我找找 Solodit 上有没有类似的、因为重入而导致资金被盗的案例。” - Claude 的理解与操作:Claude 会识别出你的问题核心是“重入攻击”(reentrancy)和“ETH 转账”(
call.value)。它会通过 MCP 调用search_findings工具,关键词可能包括reentrancy,call.value,eth transfer。 - 返回结果:Claude 会整理返回的漏洞列表,可能包括:
- 项目A的某次审计:一个 High 风险重入漏洞,攻击者利用
call.value在余额更新前递归调用函数,盗取资金。 - 项目B的赏金报告:一个 Medium 风险漏洞,类似模式但在特定条件下触发。 Claude 不仅会列出标题和风险等级,很可能会提取关键的攻击原理描述和修复建议(例如:“应使用 Checks-Effects-Interactions 模式,先更新内部状态,再进行外部调用”),并直接关联到你的代码上下文。
- 项目A的某次审计:一个 High 风险重入漏洞,攻击者利用
场景二:学习特定类型的漏洞如果你是新手,想系统了解“权限控制(Access Control)”常见有哪些坑。
- 你的提问:“给我看看 Solodit 上风险等级为 High 的权限控制漏洞,最好有最近3个月的案例。”
- Claude 的操作:调用搜索工具,参数可能是
category: "Access Control" risk: "High",并可能对时间进行筛选。然后它会返回一系列案例,比如:“缺少 onlyOwner 修饰符”、“初始化函数可被任意用户重复调用”、“角色权限被错误地继承”等。你可以要求 Claude 对其中一个案例进行详细解释,它会通过加载finding://{id}资源来获取全文。
场景三:代码片段对比分析你可以直接将一段有疑虑的代码粘贴给 Claude。
- 你的输入:“分析这段代币
approve函数:function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; }, Solodit 上有关于approve函数的前端跑批攻击(Front-running)或竞争条件漏洞吗?” - Claude 的操作:它会先理解这段代码是标准的 ERC-20 approve 实现。然后通过 MCP 搜索
approve race condition或front-running approve。它可能会找到著名的“ERC-20 approve 竞争条件”漏洞报告,其中详细描述了攻击者如何在你修改授权额度(从100到50)的交易确认前,快速用旧的授权额度(100)发起转账,从而盗取额外资金。Claude 会结合这个案例,指出你的代码是否存在同样风险(是的,这是标准实现固有的风险),并给出缓解建议,如使用increaseAllowance/decreaseAllowance模式,或提醒用户先将授权设为0再设新值。
3.3 高级技巧:将查询融入审计工作流
单纯搜索只是基础,高手会把它深度融入审计的每一个环节。
审计清单(Checklist)增强:在开始审计一个新项目前,你可以让 Claude 通过此工具,拉取最近半年所有被标记为
High和Medium风险的漏洞,并按类别(Reentrancy, Logic Error, Oracle Manipulation...)进行分类总结。基于这份“实时更新的漏洞热点图”,来定制你本次审计的优先检查清单。相似项目对比:如果你审计的项目是一个 AMM DEX,你可以让 Claude 搜索 Solodit 上所有关于“Uniswap V2”、“PancakeSwap”或“AMM”的审计报告。通过快速浏览这些报告中发现的漏洞,你可以预先知道这类项目的常见风险点在哪里,在审计同类项目时就能有的放矢,重点关注那些易出问题的模块(如价格预言机、流动性计算、手续费机制)。
修复方案参考:当你自己发现一个潜在漏洞时,除了描述问题,更重要的是提出稳健的修复方案。此时,你可以查询 Solodit 上同类漏洞的“修复建议”部分。看看其他顶级审计师和开发团队是如何修复的。这能帮助你提出更专业、更被开发团队接受的修复意见,避免提出不切实际或引入新问题的方案。
新人培训与知识沉淀:对于安全团队,可以设计一个练习:给出一段有漏洞的代码,让新人利用这个工具去搜索和定位问题。或者,定期让工具生成“本周热门漏洞摘要”,供团队内部学习讨论,保持对最新攻击手法的敏感度。
注意事项:工具再强大,也只是辅助。它提供的是“历史案例”,而非“漏洞检测器”。它不能保证找到你代码中的所有问题,尤其是那些逻辑复杂、需要深度推理的新型漏洞。审计师的判断力和经验仍然是不可替代的核心。切勿完全依赖工具的输出,而放弃了独立的代码审查和思考。
4. 核心实现解析:服务器是如何工作的?
要真正用好一个工具,了解其内部机理大有裨益。这不仅能在它出错时帮你排查,也能让你明白其能力的边界。solodit-findings-mcp服务器的核心工作流程可以分解为以下几个步骤:
4.1 数据获取与处理层
服务器首先需要从 Solodit 获取数据。通常,这不是通过直接连接 Solodit 数据库实现的,而是通过其公开的网页接口或 API(如果有的话)。实现方式主要有两种:
- API 调用(最优选择):如果 Solodit 提供了官方或非官方的查询 API,服务器会构造 HTTP 请求,携带搜索参数(关键词、过滤器等)来获取 JSON 格式的结构化数据。这种方式稳定、高效,且尊重数据源的访问策略。
- 网页爬取(备用方案):如果缺乏 API,开发者可能需要使用像
puppeteer或cheerio这样的库来模拟浏览器访问 Solodit 网站,解析 HTML 页面,从中提取所需的漏洞信息。这种方式更脆弱,因为网站结构一旦变化,爬虫逻辑就需要更新。
数据处理:获取到的原始数据(无论是 JSON 还是 HTML 解析结果)需要被转换成服务器内部统一的、结构化的格式。例如,定义一个Finding接口:
interface Finding { id: string; // 唯一标识符 title: string; riskLevel: 'High' | 'Medium' | 'Low' | 'Informational'; category: string[]; project: string; contest: string; // 来自哪个审计竞赛/平台 description: string; poc: string; // 攻击步骤 mitigation: string; // 修复建议 link: string; // 原始报告链接 createdAt: Date; }服务器可能会对数据进行清洗、去重,并可能建立本地缓存(如使用 SQLite 或简单的 JSON 文件)以避免对 Solodit 网站进行过于频繁的请求,同时也能提升查询响应速度。
4.2 MCP 协议适配层
这是项目的核心,即按照 MCP 协议规范,将数据查询能力暴露为标准的“工具”和“资源”。
- 定义工具(Tools):在服务器的初始化代码中,会声明一个
search_findings工具。这个声明包括:name:"search_findings"description:"Search for smart contract security findings on Solodit based on keywords, risk level, category, etc."inputSchema: 定义输入参数的结构。例如:{ "type": "object", "properties": { "query": { "type": "string", "description": "Search keywords" }, "risk": { "type": "string", "enum": ["High", "Medium", "Low"], "description": "Filter by risk level" }, "category": { "type": "string", "description": "Filter by vulnerability category" }, "limit": { "type": "integer", "description": "Maximum number of results to return" } } }
- 实现工具处理函数:当客户端(如 Claude)调用
search_findings时,服务器会收到一个 JSON-RPC 请求。服务器端的处理函数会:- 解析请求中的参数(
query,risk等)。 - 调用底层的数据获取与处理层(3.1节所述)的方法,执行搜索。
- 将搜索结果(
Finding[]数组)按照 MCP 协议要求的格式进行封装并返回。
- 解析请求中的参数(
- 定义资源(Resources):服务器还会声明一种资源模式,如
finding://{id}。当 AI 想要深入了解某个特定漏洞时,它可以请求readResource来获取该 ID 对应的完整漏洞详情。服务器收到请求后,根据{id}从缓存或实时查询中获取该漏洞的完整文本内容(通常是 Markdown 格式),并将其作为资源内容返回。
4.3 与 AI 客户端的协同
服务器启动后,会在本地一个端口(如某个随机端口)启动一个 JSON-RPC 服务。Claude Desktop 根据配置文件找到这个服务器进程并建立连接。连接建立后,Claude 会通过listTools和listResources方法“发现”服务器提供了哪些能力。
当你在聊天框中输入查询时,Claude 的语言模型会进行以下判断:
- 意图识别:用户的问题是否与智能合约安全、漏洞查询相关?
- 参数提取:从用户问题中提取出搜索关键词、风险等级等参数。
- 工具调用:如果识别出需要使用
search_findings工具,Claude 就会通过已建立的 MCP 连接,向服务器发送一个格式化的callTool请求。 - 结果渲染:服务器返回结果后,Claude 的语言模型会理解这些结构化的数据,并将其组织成一段对人类友好的、带有总结和重点的文本回复,呈现给你。
整个过程中,MCP 服务器就像一个专业的、只懂 Solodit 查询的“后台专家”,而 Claude 则像是一个“前台助理”,负责理解你的自然语言,向专家提问,再把专家的专业回答翻译成你容易理解的形式。
5. 常见问题与排查技巧实录
在实际部署和使用过程中,你可能会遇到一些问题。以下是一些常见情况的排查思路和解决方法。
5.1 服务器启动失败或连接错误
问题现象:Claude Desktop 启动后,在日志中看到连接solodit-findings服务器失败的错误信息。
排查步骤:
- 检查命令路径:这是最常见的问题。回顾你的
claude_desktop_config.json文件。如果你使用的是源码路径,确保command后的node路径和args中的 JS 文件路径都是绝对路径,并且完全正确。在终端中手动执行一遍配置中的命令,看是否能成功启动一个进程。 - 检查依赖和环境:如果你是从源码运行的,确保已经在该目录下执行了
npm install安装了所有依赖。检查package.json中的启动脚本是否正确。确保你的 Node.js 版本符合项目要求(查看.nvmrc或engines字段)。 - 检查端口冲突:MCP 服务器启动时需要绑定一个本地端口。如果该端口被占用,会导致失败。不过 MCP 库通常会自动处理端口选择,这个问题不常见。
- 查看服务器日志:MCP 服务器在启动和运行时,可能会将日志输出到标准错误(stderr)。在 Claude Desktop 的配置中,有时可以配置将服务器日志重定向到文件,或者你可以尝试在终端手动启动服务器进程,直接观察其输出,看看是否有明显的错误信息(如网络请求失败、API 密钥缺失、解析错误等)。
解决方案示例:假设错误日志显示Cannot find module '/wrong/path/index.js'。
- 解决:修正配置文件中的路径。在终端使用
pwd和ls命令确认你的项目根目录和入口文件的确切位置。
5.2 搜索无结果或结果不相关
问题现象:Claude 能调用工具,但返回的结果很少,或者完全不是你想要的。
排查与优化:
- 优化查询关键词:AI 提取的关键词可能过于宽泛或狭窄。尝试在提问时使用更精确的术语。例如,将“有关转账的问题”改为“重入攻击漏洞”或“ERC-20 transferFrom 实现缺陷”。你可以直接指导 AI:“用‘reentrancy’和‘gas limit’作为关键词搜索。”
- 理解数据源局限:Solodit 的数据并非实时同步,也可能不包含所有平台的私有报告。如果你的查询非常前沿(例如针对昨天刚发布的新协议),很可能没有数据。尝试搜索更通用、经典的漏洞类型。
- 检查服务器数据获取逻辑:如果怀疑是服务器端问题,可以尝试在服务器代码中添加调试日志,查看它向 Solodit 发送的实际请求 URL 和返回的原始数据是什么。可能是 Solodit 的页面结构发生了变化,导致爬虫解析失败。
- 使用复合查询:让 Claude 进行多次、分步骤的查询。例如,先搜索“Oracle Manipulation”获取一批案例,再从结果中筛选出与“Chainlink”相关的。这比一次复杂的多条件查询更可靠。
5.3 AI 不理解或错误调用工具
问题现象:Claude 没有触发搜索,或者调用了错误的工具参数。
排查与解决:
- 清晰描述意图:在提问时,尽量使用与工具描述相关的语言。例如,直接说“请在 Solodit 中搜索关于闪电贷攻击的案例”,比说“找点闪电贷的资料”更可能被正确识别。
- 检查工具定义:理论上,Claude 等 AI 在连接服务器时已经了解了工具的名称和描述。如果频繁误解,可能是你的问题表述确实模糊。可以尝试重启 Claude Desktop,重新建立连接,确保工具列表被正确加载。
- 提供上下文:在进行复杂查询前,先给 AI 一些背景。例如:“我正在审计一个使用 Chainlink 预言机的合约。请帮我查找 Solodit 上所有与 Chainlink 预言机使用不当相关的中高风险漏洞。” 丰富的上下文能帮助 AI 更好地构建搜索参数。
5.4 性能问题:响应缓慢
问题现象:从提问到收到结果,等待时间较长。
原因分析与优化:
- 网络延迟:如果服务器每次查询都实时去爬取 Solodit 网页,受网络速度和目标网站响应的影响会很大。这是性能瓶颈的主要来源。
- 缺乏缓存:最初的服务器实现可能没有缓存机制,重复查询相同内容会导致重复的网络请求。
- 客户端-服务器通信:本地进程间通信通常很快,一般不是问题。
解决方向:
- 期待服务器增强缓存:一个健壮的实现应该包含缓存层。例如,将查询结果按关键词哈希后缓存到本地数据库或文件中,并设置合理的过期时间(如24小时)。这样,对于热门查询的响应速度会极快。
- 离线使用考虑:对于需要频繁、深度使用的团队,可以考虑定期(如每天)将 Solodit 的部分核心数据(如所有 High 风险漏洞)全量同步到本地,构建一个离线查询库。这需要修改服务器端的数据获取逻辑,但能带来最佳的查询体验和稳定性。
5.5 安全与合规性自检
在使用此类工具时,心中需有一根弦:
- 数据版权:Solodit 上的审计报告是其原始作者和平台的智力成果。此工具仅用于个人学习、研究和审计参考。切勿将批量爬取的数据用于商业用途或重新分发,尊重数据源的
robots.txt和服务条款。 - 代码安全:如果你是从源码运行,务必从官方仓库克隆。检查
package.json中的依赖,避免引入恶意包。如果是通过npx运行,npm 的包发布机制有一定安全保障,但仍建议从可信来源获取。 - 审计独立性:工具提供的案例是参考,不是标准答案。最终的审计结论必须基于你对代码的独立分析和判断,工具发现不能替代审计师的责任。
这个项目代表了 AI 赋能专业工作的一个非常务实的范式:不追求全自动的漏洞发现,而是聚焦于增强专家最耗时的环节——信息检索与知识关联。它就像给你的审计工作台安装了一个强大的“历史漏洞雷达”和“案例知识库”,让每一次代码审查都能站在巨人的肩膀上。随着 MCP 生态的丰富,未来我们或许能看到更多垂直领域的专业工具以这种方式集成,最终形成一个强大的、个性化的 AI 增强工作流网络。