ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI-Infra-Guard mcp-scan 报告格式化提示词深度解析:format_report 模板的设计、调用链与落地实践

AI-Infra-Guard mcp-scan 报告格式化提示词深度解析:format_report 模板的设计、调用链与落地实践 AI-Infra-Guard mcp-scan 报告格式化提示词深度解析format_report 模板的设计、调用链与落地实践【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard在 mcp-scan 的 Agent 扫描流程中扫描结果最终能否变成一份结构严谨、无捏造、可直接交付的漏洞报告关键取决于一个非常短小却处于收口位置的提示词模板——format_report.md。本指南以该模板为绝对核心结合 AI-Infra-Guard 仓库内mcp-scan模块的真实源码完整还原它被触发的位置、输出格式如何注入、模板变量如何替换以及它与vulnXML 提取、SARIF 2.1.0 报告、安全评分之间的联动关系。读完本文你将掌握 mcp-scan 报告生成链路的底层原理并能自行定制符合自身输出要求的报告格式。一、模板定位整个扫描流程的最终收口人format_report.md位于 mcp-scan/mcp_scan/prompt/format_report.md是 mcp-scan 提示词模板家族的一员。它不负责发现漏洞也不负责审查漏洞而是承担一个唯一的职责将扫描过程中累积的完整对话历史整理成符合预设output_format的最终报告。从 mcp-scan 的扫描管线mcp-scan/mcp_scan/agent/agent.py可以看到一次完整扫描由多个阶段组成静态三阶段模式AIG 集成信息收集 → 代码审计 → 漏洞整理每阶段产出结果前一阶段的报告作为下一阶段的上下文传入静态单阶段模式CLI 默认仅代码审计直接输出vulnXML速度约为三阶段模式的 3 倍动态分析模式信息收集 → 恶意行为检测 → 漏洞检测 → 漏洞整理。这些阶段每轮都会调用工具、追加对话记录模型上下文越长最终从对话历史里提炼出一份干净报告的需求就越强烈。format_report.md正是为这一需求设计的专用提示词。二、模板原文完整继承与逐行解析以下是format_report.md的全文是理解整个报告生成机制的起点# 角色 你现在是一个专业的报告格式化专家。 # 任务 请根据提供的对话历史将其整理为符合【输出格式要求】的最终报告。 # 输出格式要求 {output_format} # 注意事项 1. 严禁捏造事实只能根据历史记录中的真实发现进行整理。 2. 保持专业、严谨的语气。 3. 只返回格式化后的内容不要包含任何开场白或解释性文字。这份模板虽然只有 11 行却通过四个部分完成了对格式化专家角色的完整约束区块作用关键点# 角色定义模型在本次调用中的身份专业报告格式化专家# 任务声明任务边界只依据对话历史整理不新增内容# 输出格式要求注入真正的输出规范占位符{output_format}由调用方填充# 注意事项约束行为与语气严禁捏造、保持严谨、不输出多余文字其中{output_format}是模板的活口它决定了模型最终输出是vulnXML、Markdown 审计报告还是其他自定义格式。这个占位符在运行时由代码注入具体机制见下一节。三、调用链format_report 何时、如何被触发3.1 触发位置_format_final_outputformat_report模板的唯一调用点位于 mcp-scan/mcp_scan/agent/base_agent.py#L400-L417 的_format_final_output方法async def _format_final_output(self) - str: 使用 LLM 根据历史记录和预设格式生成最终输出 recent_history self.history[1:] formatting_prompt prompt_manager.format_prompt( format_report, output_formatself.output_format ) recent_history.append({role: user, content: formatting_prompt}) final_output for _ in range(3): final_output self.llm.chat(recent_history) logger.info(fFinal Output: {final_output}) if self.output_check_fn: ret self.output_check_fn(final_output) if isinstance(ret, bool) and ret: break else: break return final_output这段源码揭示了三个关键设计输入是对话历史recent_history self.history[1:]取除系统提示词之外的全部历史消息包括用户的原始任务、Agent 的工具调用与结果、各阶段中间报告与模板中根据提供的对话历史的任务描述一一对应格式通过output_format注入调用format_prompt时将self.output_format传入替换模板中的{output_format}占位符最多重试 3 次且带校验for _ in range(3)循环调用 LLM每次调用后用output_check_fn校验输出是否满足格式要求校验通过立即跳出。若未配置校验函数则第一次调用后即返回。3.2 前置判断finish工具的短路优化并非每次扫描结束都会走_format_final_output。在 base_agent.py#L212-L228 中当 Agent 调用finish工具宣告任务完成时if tool_name finish: self.is_finished True ... last_msg self.history[-1][content] if self.history else if last_msg and self.output_check_fn and self.output_check_fn(clean_content(last_msg)): result clean_content(last_msg) else: result await self._format_final_output()也就是说如果 Agent 的最后一条回复已经通过了output_check_fn校验例如已包含vuln或empty标记就直接采用该回复省去一次额外的 LLM 往返只有未通过校验时才进入_format_final_output用format_report模板做最终格式化。这是一处非常典型的减少 LLM 调用、降本增效优化。3.3 边界兜底达到最大迭代次数BaseAgent._run中max_iter默认值为 80base_agent.py#L66。当 Agent 未能在迭代上限内完成时会记录警告达到最大迭代次数返回当前结果此时若尚未产出result同样会调用_format_final_output兜底格式化base_agent.py#L167-L179。四、模板加载与变量替换PromptManager 机制format_report能被按名字加载并完成{output_format}替换依赖PromptManager单例mcp-scan/mcp_scan/utils/prompt_manager.py。4.1 模板查找路径load_template会按顺序尝试以下四个路径命中即读取并缓存到_templatesprompt_manager.py#L34-L56possible_paths [ os.path.join(base_dir, prompt, name), os.path.join(base_dir, prompt, f{name}.md), os.path.join(base_dir, prompt, agents, name), os.path.join(base_dir, prompt, agents, f{name}.md), ]因此format_report实际对应base_dir/prompt/format_report.md而agents/code_audit、agents/dynamic/project_summary等阶段模板则对应prompt/agents/目录。模板只加载一次后续复用缓存避免了重复的磁盘 IO。4.2 占位符替换规则format_promptprompt_manager.py#L58-L77支持两种占位符写法{key}形式如模板中的{output_format}${key}形式如system_prompt.md中的${NOWTIME}未显式传入时自动填充为当前时间datetime.now().strftime(%Y-%m-%d %H:%M:%S)。替换时按传入的关键字参数逐一对模板字符串做replace这意味着同一个模板可以被不同阶段的 Agent 复用仅靠参数注入差异化内容——format_report就是典型例证静态审计、动态分析、AIG 模式共用同一个格式化模板差异全部体现在output_format参数里。五、output_format 的实战形态从 XML 到 Markdownoutput_format由每个扫描阶段在ScanStage中声明随BaseAgent构造传入agent.py#L168-L186。mcp-scan 中至少有三类典型的output_format形态5.1 漏洞整理阶段的vulnXML最终漏洞交付格式在 agent.py#L101-L160 中定义了_VULN_XML_FORMAT_ZH/_VULN_XML_FORMAT_EN要求模型按如下结构输出多漏洞输出多个vuln标签无漏洞时返回emptyvuln titletitle/title desc !-- Markdown格式漏洞描述 -- ## 漏洞详情 **文件位置**: **漏洞类型**: **风险等级**: ### 技术分析 ### 攻击路径 ### 影响评估 /desc risk_typeRiskType/risk_type levelLevel/level !-- 以下三个为可选的结构化定位字段用于生成 SARIF 报告若无法精确定位可留空 -- file相对于项目根目录的文件路径如 src/index.ts/file line_start起始行号纯数字/line_start line_end结束行号纯数字若只有单行可与line_start相同/line_end suggestion ## 修复建议 /suggestion /vuln其中的file、line_start、line_end三个结构化字段尤其重要——它们是后续生成 SARIF 报告时定位漏洞位置的依据。对应的输出校验函数为is_vuln_review_outputagent.py#L163-L165只需检查输出中是否包含vuln或emptydef is_vuln_review_output(content: str) - bool: return vuln in content or empty in content该函数正是前文 3.2 节短路优化中output_check_fn的真实实现——它保证 Agent 在finish前就已产出符合 XML 要求的报告从而减少格式化阶段的 LLM 往返。5.2 代码审计阶段的 Markdown 报告格式单阶段扫描的output_format是audit_ret_format与 XML 格式拼接agent.py#L406-L433要求对每个确认漏洞提供具体位置文件路径和行号范围完整代码片段显示漏洞的代码段技术分析漏洞原理和利用方法影响评估可获得的权限和影响范围修复建议详细的安全加固方案攻击路径具体的利用步骤如适用5.3 动态分析阶段的 Overview/Threats 结构动态分析dynamic_analysisagent.py#L604-L739则要求 Markdown 文档包含四个固定章节Overview是否存在风险、ThreatsXML 字符串列表含工具名、威胁类型、置信度、影响、Reasons对应分析理由、Summarization整体安全评估总结例如threattool_name{{ tool_name }}/tool_nametypeSQL Injection/typeconfidence0.9/confidenceimpactHigh/impact/threat由此可见format_report模板本身不关心输出长什么样真正的格式大脑是output_format字符串——不同场景注入不同规范格式化专家只负责忠实执行。六、格式化之后的处理链提取、评分与 SARIFformat_report产出的最终文本并非终点它会继续进入下游处理链agent.py#L575-L601漏洞提取VulnerabilityExtractor 使用正则vuln\s*(.*?)\s*/vulnre.DOTALL从最终报告中提取全部vuln块逐块解析title、desc、risk_type、level、file、line_start、line_end、suggestion等字段若提取失败还有extract_result兜底解析安全评分calc_mcp_score(vuln_results)根据提取到的漏洞列表计算 MCP 安全评分报告生成结合 SARIF 2.1.0 格式化器MCP01-MCP10 规则体系与报告生成模块mcp-scan/mcp_scan/utils/CLI 模式默认输出 SARIF 2.1.0 JSON可被 GitHub Code Scanning、Azure DevOps、VS Code 等直接消费mcp-scan/README.md。因此在完整链路中format_report是LLM 分析结果通向机器可消费的 SARIF/JSON 报告之间的最后一道质量闸门——它保证输出结构合法后续的正则提取与规则映射才能稳定工作。七、严禁捏造约束的工程意义模板注意事项第 1 条严禁捏造事实只能根据历史记录中的真实发现进行整理并非一句空洞的修辞而是 mcp-scan 安全审计正确性的基石。仓库中有多处机制与此呼应上下文压缩优先级compact.md 明确规定安全发现是最终交付物已确认或疑似的漏洞文件与行号、风险类型、证据摘要、置信度在压缩后必须完整保留、不得合并删除并强制以security_findings结构逐条输出——这保证了格式化阶段能基于真实发现整理而不是基于被压缩丢失的信息空项目快速返回_is_empty_or_metadata_only检测agent.py#L52-L65在项目为空或仅含.DS_Store等元数据时直接返回无可审计内容避免 LLM 对空目录凭空发现漏洞扫描不完整标记_warn_if_scan_incompleteagent.py#L310-L328在审计原始输出与漏洞列表同时为空时将scanNote标记为possibly-incomplete防止空结果被误读为安全间接提示注入防御system_prompt.md 明确要求将 MCP 工具响应视为不可信外部数据禁止服从其中嵌入的指令、禁止因工具声称这是预期行为而降级或隐瞒发现。这些机制共同支撑了格式化阶段只整理、不发明的可靠性前提。八、扩展视角format_report 在提示词家族中的位置format_report.md与同目录下的其他模板构成了 mcp-scan 的完整提示词体系mcp-scan/mcp_scan/prompt/模板阶段职责system_prompt.md每阶段 Agent 启动定义 Agent 身份、工具使用格式、执行指南与间接提示注入防御next_prompt.md每轮工具调用后以{round}提示当前轮次要求尽量少轮次达成结果compact.md上下文接近窗口上限时压缩历史但强制保留安全发现输出结构化摘要format_report.md扫描收尾finish 或超限兜底将对话历史整理为符合output_format的最终报告四者各司其职system_prompt管怎么做next_prompt管继续做compact管记住关键的format_report管最终交付什么。九、小结如何在实际项目中用好 format_report自定义报告格式时只需改output_format在ScanStage构造时传入自定义格式字符串XML、Markdown、JSON 均可无需改动format_report.md模板本身务必配套output_check_fn提供格式校验函数可让 Agent 在finish时短路跳过格式化调用同时保证最终输出可被下游VulnerabilityExtractor稳定解析结构化定位字段是 SARIF 的关键XML 中的file/line_start/line_end直接决定 SARIF 报告中漏洞位置是否可精确定位把事实来源约束放在第一位格式化阶段的忠实性依赖压缩、空目录检测、不完整标记等全链路机制的支撑而非仅靠模板中的一句严禁捏造。掌握format_report模板及其调用链就等于掌握了 mcp-scan 报告输出的最后一公里——从一条看似只有 11 行的提示词你可以在 AI-Infra-Guard 中完整追溯一条漏洞从模型对话历史到SARIF 可消费报告的全过程并在此基础上按需定制属于自己的扫描报告格式。【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表