loading…
Search for a command to run...
loading…
An MCP server for analyzing Robot Framework test results. It provides LLMs with tools to parse, summarize, and search through test execution logs from XML or JS
An MCP server for analyzing Robot Framework test results. It provides LLMs with tools to parse, summarize, and search through test execution logs from XML or JSON output files.
用于检查 Robot Framework 结果文件的 MCP Server,面向 LLM 提供简洁证据视图。
支持输入:
output.xml:Robot / Rebot 6.0.x / 6.1+ / 7.xoutput.json:Robot / Rebot 7.2+暴露的 MCP 能力:
parse_resultget_viewsearch_messagesrf://runs/{run_id}/summaryrf://runs/{run_id}/tests/{test_id}支持的视图:
summaryfailure_pathstep_window通用返回字段:
run_id:整数运行编号,推荐后续调用都使用它estimated_tokens:当前返回体的估算 token 数truncated:兼容字段,只表示返回内容发生过任意截断message_truncated:长消息被缩短budget_truncated:为了满足 budget 限制裁剪了返回内容page_truncated:当前页后面还有更多数据next_cursor:分页游标;为空表示没有下一页rf-log-mcp 进程,再通过 stdio 调用工具和资源uv sync
{
"mcpServers": {
"rf-log-mcp": {
"command": "uv",
"args": [
"run",
"python",
"-m",
"rf_log_mcp"
]
}
}
}
uv build
构建后生成:
dist/rf_log_mcp-0.1.0-py3-none-any.whldist/rf_log_mcp-0.1.0.tar.gzuv pip install dist/rf_log_mcp-0.1.0-py3-none-any.whl
安装后可直接启动:
rf-log-mcp
{
"mcpServers": {
"rf-log-mcp": {
"command": "rf-log-mcp",
"args": []
}
}
}
{
"mcpServers": {
"rf-log-mcp": {
"command": "D:\\project\\rf_log_mcp\\.venv\\Scripts\\rf-log-mcp.exe",
"args": []
}
}
}
parse_result(path="tests/fixtures/single_failure_611.xml")
典型返回:
{
"ok": true,
"run_id": 1,
"source_format": "xml"
}
get_view(run_id=1, view="summary")
如果失败用例较多,可以指定分页大小:
get_view(run_id=1, view="summary", page_size=10)
get_view(run_id=1, view="summary", cursor="<next_cursor>", page_size=10)
get_view(run_id=1, view="failure_path")
get_view(run_id=1, view="failure_path", selector="s1-t2")
failure_path 会从失败测试中选择更短、更关键的失败分支;当同层分支长度相同,会优先返回包含更高严重级别消息的分支。
get_view(run_id=1, view="step_window", selector="s1-t2")
step_window 的 selector 可以传测试节点,也可以传关键字/步骤节点。传步骤节点时,返回会自动定位到所属测试,并尽量把该节点放在窗口中间。
分页示例:
get_view(run_id=1, view="step_window", selector="s1-t2-k13", page_size=20)
get_view(run_id=1, view="step_window", selector="s1-t2-k13", cursor="<next_cursor>", page_size=20)
search_messages(run_id=1, query="timeout")
search_messages 按普通文本匹配。%、_、\ 会作为字面量处理,不会被当成 SQL LIKE 通配符。
RF_LOG_MCP_DB用于覆盖默认 SQLite 数据库路径。
PowerShell 示例:
$env:RF_LOG_MCP_DB="D:\data\rf-log-mcp\store.sqlite3"
rf-log-mcp
MCP 配置示例:
{
"mcpServers": {
"rf-log-mcp": {
"command": "rf-log-mcp",
"args": [],
"env": {
"RF_LOG_MCP_DB": "D:\\data\\rf-log-mcp\\store.sqlite3"
}
}
}
}
truncated 和三个细分字段有什么区别?truncated 是总开关,任意一种截断都会为 true。
message_truncated=true:消息字段太长,被缩短显示budget_truncated=true:返回体超过 budget,服务主动裁剪了条目或消息page_truncated=true:还有下一页,应继续传 next_cursor排查失败链时优先关注 budget_truncated。如果它为 true,可以调大 budget 或缩小 page_size 后重新查询。
get_view / search_messages 能传文件路径吗?可以。
如果该文件已经被解析过,服务会先把路径转换成对应的 run_id 再查询。
但仍然推荐优先使用 parse_result() 返回的整数 run_id。
开发临时验证可以使用:
uv run python -m rf_log_mcp
接入 MCP 宿主时,更推荐使用虚拟环境里的解释器直接启动,减少 uv 或 .exe 启动器额外进程带来的文件占用问题:
{
"mcpServers": {
"rf-log-mcp": {
"command": "D:\\project\\rf_log_mcp\\.venv\\Scripts\\python.exe",
"args": [
"-m",
"rf_log_mcp"
]
}
}
}
如果你的 LLM 平台:
那就不能直接接入,需要额外做一层集成。
路线图借鉴 Robot Framework VS Code 插件 Output View 的核心语义:先建立完整运行树,再按节点及后代的严重级别生成可展开视图。插件使用事件流和 Webview;本项目继续使用现有标准化模型和 MCP 查询接口,不引入前端状态或 rfstream 协议。
Tree View 用于理解 Suite、Test、Keyword、控制流和消息之间的结构。现有 step_window、cursor 和全局消息搜索继续保留,用于还原完整时序和跨分支追踪。
增加 tree 视图,支持从运行根节点、测试或任意节点开始按需展开直接子节点:
get_view(
run_id=1,
view="tree",
selector="s1-t1",
projection="failures",
cursor=None,
page_size=25
)
selector=None 表示运行根节点。首版支持以下投影:
all:返回全部直接子节点failures:返回自身失败或包含失败后代的节点,并保留必要祖先warnings:返回子树最高严重度达到 WARN 或 FAIL 的节点,并保留必要祖先投影必须基于完整树计算,不能先删除 PASS 节点或原始事件。先确定当前 selector 下符合投影的子节点,再按稳定的 sequence 顺序分页。cursor 应绑定 run_id、selector、projection 和排序条件,不能跨查询条件复用。
节点摘要计划包含:
node_id、parent_id、owner_test_id 和 sequencekeyword_type,覆盖 SUITE、TEST、SETUP、TEARDOWN、KEYWORD、FOR、ITERATION、IF、ELSE、TRY、EXCEPT、FINALLY、WHILE 等结构name、status、elapsed_ms、libname 和参数摘要child_count、failed_descendant_count、max_descendant_level 和 has_childrensource 和 lineno;缺失时保持为空,不根据关键字名称猜测源码位置默认只返回节点摘要,不展开大量 TRACE/INFO 正文。Test 只有行号但没有源码路径时,可以使用所属 Suite 的源码路径作为明确的继承来源。
参考 Output View 对大量成功迭代的处理,Tree View 应压缩同一父节点下连续的 PASS ITERATION,但保留原始节点的可查询性。聚合节点示例:
{
"group_id": "ig:s1-t1-k2:1-949",
"kind": "ITERATION_GROUP",
"status": "PASS",
"count": 949,
"first_node_id": "s1-t1-k2-k1",
"last_node_id": "s1-t1-k2-k949",
"expand_selector": "ig:s1-t1-k2:1-949"
}
压缩规则:
group_id;将其作为 selector 时,按 sequence 和分页返回覆盖范围内的原始迭代重点验收场景:
Run Keyword And Continue On Failure 场景保留实际失败分支和后续执行结果summary、failure_path、step_window 和 search_messages 保持兼容首版可基于现有 NodeRecord.parent_id 和 sequence 在内存中构建索引。只有真实日志证明扫描成本不可接受时,再增加持久化 nodes 表或其他结构索引。
扩展 search_messages,允许把检索范围限制到测试、节点或子树:
search_messages(
run_id=1,
query="param invalid",
selector="s1-t1-k2",
scope="subtree",
level=None,
cursor=None
)
范围搜索必须使用完整节点关系确定目标子树,再搜索该范围内的消息,不能先过滤原始事件后重新建树。搜索结果补充所属节点、节点状态、sequence 和简短运行时调用路径。模型可以在失败 ITERATION 内查询请求、回包和变量,也可以继续使用全局搜索追踪对象在 Setup、Test 和 Teardown 中的完整生命周期。
如果真实数据表明内存子树扫描或现有消息索引无法满足延迟目标,再增加节点关系表、递归索引或消息范围索引。
在 v0.2 基础字段之上,补齐不同 Robot XML/JSON 版本中的源码和调用元数据差异:
{
"source": "path/to/case.robot",
"lineno": 123,
"libname": "SystemIntegrationCommon",
"source_origin": "node"
}
该阶段需要明确字段来源和可信度,例如节点直接提供、从所属 Suite 继承或输入格式不支持。运行树负责定位实际调用实例、分支、迭代和参数,源码元数据用于解释关键字定义和业务逻辑。缺失字段保持为空,不通过关键字名称猜测文件位置。
Tree View 上线后,通过真实日志分析记录以下聚合指标:
step_window 是否仍被频繁用于大范围查询在积累足够使用记录后,再决定是否增加:
这些能力不会提前写成固定接口,避免基于假设过度设计。结构化查询仍作为可选能力;get_view 保留自定义 budget 和 cursor 分页,search_messages 保留全局搜索和 cursor 分页。工具只提供数据与结构,不负责判断根因或建议模型下一步操作。
uv run ruff check .
uv run pytest
Выполни в терминале:
claude mcp add rf-log-mcp -- npx CSA PROJECT - FZCO © 2026 IFZA Business Park, DDP, Premises Number 31174 - 001
Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.