1. 本次工作内容

  • OpenAI 兼容接口直连验证:验证了 GET /v1/modelsPOST /v1/chat/completions
  • 基于 garak 的 lmrc 风险评估测试:改造出 One API 版本测试脚本,对 lmrc 子集 probe 进行了实际运行
  • 安全工具链调研:对比分析 cli-anything-yakit、Yakit 官方平台、hexstrike-ai MCP 三者的功能与定位
  • MCP 封装实践:学习 MCP 协议与 Python SDK(FastMCP),将 cli-anything-yakit 封装为 MCP Server,注册到 Claude Code

2. 测试环境

  • 测试工具:garak v0.14.1
  • Python 环境:3.11.7(Anaconda)
  • MCP SDK:mcp 1.27.0(需 Python ≥ 3.10)
  • 底层依赖cli-anything-yakit + Yak gRPC 引擎

3. 主要测试结果

3.1 One API 兼容性验证

  • /v1/models:HTTP 200,接口可用,鉴权正常
  • /v1/chat/completions:HTTP 200,响应耗时约 3.43s,成功返回结果

结论:One API 服务兼容 OpenAI 风格聊天接口,可直接按 OpenAI SDK 语法调用。

3.2 garak lmrc 测试结果

Probe 通过 失败 错误 总数 状态
Bullying 7 0 0 7 PASS
Deadnaming 4 0 2 6 ERROR
QuackMedicine 0 0 1 1 ERROR
SexualContent 1 0 0 1 PASS
Sexualisation 2 0 1 3 ERROR
SlurUsage 1 0 0 1 PASS

总 prompt 数:19,成功完成:15,detector 命中失败:0,完整通过率:78.95%

3.3 结果解读

错误原因不是模型输出了风险内容,而是部分请求发生了 ReadTimeout

准确结论:已完成样本未发现 detector 命中的风险输出,但整体结果受超时影响,仍有未完成项。

4. 安全工具链调研

4.1 三者定位对比

维度 cli-anything-yakit Yakit 官方 hexstrike-ai MCP
形态 Python CLI 工具 Electron GUI 桌面应用 MCP 工具服务器
定位 Agent/自动化流水线 人工渗透测试平台 跨工具链 Agent 编排
工具数量 5 个命令 完整功能 127 个工具(7/127 可用)

调研结论:三者互补——自动化流水线用 CLI,人工渗透测试用 GUI,跨工具链 Agent 编排用 MCP。

4.2 hexstrike-ai 工具安装现状

当前 7/127(5.5%)可用,核心安全工具(nmap、sqlmap、nuclei 等)均未安装。内置 AI 增强功能(payload 生成、攻击链规划、CVE 监控等)无需额外安装即可使用。

5. MCP 封装实践

5.1 什么是 MCP

MCP(Model Context Protocol)是 Anthropic 提出的开放协议,允许 AI Agent 通过统一接口调用外部工具。

1
2
3
4
5
AI Agent
↕ MCP 协议(JSON-RPC over stdio/HTTP)
MCP Server(工具注册 + 执行)
↕ 底层实现(CLI / gRPC / REST API)
实际工具(nmap / sqlmap / Yak 引擎 等)

5.2 FastMCP 快速开发示例

1
2
3
4
5
6
7
8
9
10
11
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("server-name")

@mcp.tool()
def my_tool(param: str) -> dict:
"""工具描述(自动作为 tool description 暴露给 Agent)"""
return {"result": param}

if __name__ == "__main__":
mcp.run()

5.3 cli-anything-yakit 封装模式

三层封装:CLI 命令 (click)Session + gRPC StubYak gRPC 引擎

1
2
3
4
5
6
7
8
9
def run_cli_command(*args: str) -> dict:
cmd = [CLI_COMMAND] + list(args) + ["--json"]
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
return {"status": "success", "data": json.loads(result.stdout)}

@mcp.tool()
def scan_ports(target: str, ports: str = "80,443,8080") -> dict:
"""使用 Yakit 引擎扫描目标开放端口"""
return run_cli_command("scan", "--target", target, "--ports", ports)

5.4 两种封装模式对比

维度 cli-anything-yakit(gRPC 封装) hexstrike-ai(系统命令封装)
底层通信 gRPC streaming subprocess + stdout 解析
依赖管理 单一引擎(yak binary) 每个工具独立安装
流式输出 原生支持 需轮询或缓冲
适合场景 深度集成单一平台 广度覆盖多工具生态

5.5 封装要点总结

  1. 统一输出格式:所有工具输出转为结构化 JSON,Agent 无需解析原始文本
  2. 懒加载依赖:工具不可用时给出明确错误提示,而非启动时崩溃
  3. 生命周期管理:连接/进程用 context manager 封装,确保资源释放
  4. 可测试性:通过 mock gRPC stub 实现无依赖单元测试