一个执行构建/测试命令并将输出路由到较小的LLM进行分析并提供简洁、可操作的总结的MCP服务器,同时在需要时存储完整的输出以供详细检查。

博客文章:https://gordles.io/blog/llm-friendly-test-suite-outputs-pytest-llm
此工具的主要目标是通过减少执行构建或测试时处理的令牌数量来节省主编码代理线程中的上下文。
而不是用数千行构建输出淹没Claude的上下文,此服务器:
npm test, pytest, docker build, cargo test等。# 安全的基于提供商的命令
run_build("/my-app", "npm", ["run", "test"])
run_build("/my-api", "pytest", ["--cov=src", "tests/"])
run_build("/my-container", "docker", ["build", "-t", "myapp", "."])
run_build("/my-python", "unittest", ["discover", "-s", "tests"])
| 提供商 | 描述 | 常见标志 | 示例用法 |
|---|---|---|---|
| pytest | Python 测试框架 | --cov=src, --verbose, -x, --tb=short | run_build("/app", "pytest", ["--cov=src", "tests/"]) |
| unittest | Python 内置测试 | discover, -s, -p, -v | run_build("/app", "unittest", ["discover", "-s", "tests"]) |
| npm | Node.js 包管理器 | run, test, install, --coverage | run_build("/app", "npm", ["run", "test", "--", "--coverage"]) |
| docker | 容器平台 | build, run, -t, --no-cache | run_build("/app", "docker", ["build", "-t", "myapp", "."]) |
适用于开发工作流:
# 克隆并设置
git clone https://github.com/your-username/build-output-tools-mcp.git
cd build-output-tools-mcp
# 单命令设置
./run_server.sh
设置脚本会:
.env文件编辑.env文件,添加您的OpenRouter API密钥:
OPENROUTER_API_KEY=your_openrouter_api_key_here
DEFAULT_MODEL=mistralai/mistral-small-3.2-22b-instruct-2506:free
在Claude Code中:
# 列出可用提供商
list_providers()
# 使用特定提供商运行测试
run_build(
project_path="/path/to/my-app",
provider="npm",
flags=["run", "test"]
)
run_build - 执行并分析命令使用支持的提供商执行构建/测试命令,并获取智能分析。
参数:
project_path (字符串) - 运行命令的目录provider (字符串) - 构建提供商:"pytest", "unittest", "npm" 或 "docker"flags (可选列表) - 传递给提供商的标志/参数列表timeout (可选整数) - 命令超时秒数(默认:600)model (可选字符串) - 分析使用的LLM模型返回值:
示例:
run_build(
project_path="/my-react-app",
provider="npm",
flags=["run", "test", "--", "--coverage"],
timeout=300,
model="openai/gpt-4o-mini"
)
get_build_output - 检索完整输出获取任何先前构建的完整stdout/stderr。
参数:
build_id (字符串) - run_build 结果中的构建ID返回值:
示例:
# 首先运行一个构建
result = run_build("/my-app", "npm", ["test"])
build_id = json.loads(result)["build_id"]
# 后期,获取完整输出进行详细分析
full_output = get_build_output(build_id)
list_build_history - 浏览过去构建列出最近的构建及其ID和摘要。
参数:
limit (可选整数) - 返回的最大构建数(默认:11)返回值:
list_providers - 支持的提供商显示支持的构建/测试提供商及其示例用法。
返回值:
list_models - 可用AI模型显示可用于分析的LLM模型。
返回值:
cleanup_old_builds - 管理存储清理旧构建输出以节省磁盘空间。
参数:
max_age_days (可选整数) - 最大天数(默认:7)# 运行测试并获取摘要
result = run_build("/my-app", "npm", ["run", "test"])
# 输出:
{
"status": "failed",
"summary": "测试失败:UserAuth模块中有15个测试中有2个失败。登录验证中的TypeError - 期望字符串但收到undefined。",
"build_id": "1704123456_1234",
"exit_code": 1
}
# 获取完整输出进行调试
full_output = get_build_output("1704123456_1234")
# 访问完整的日志
stdout = json.loads(full_output)["stdout"]
stderr = json.loads(full_output)["stderr"]
# 分析Docker构建
run_build(
project_path="/my-container-app",
provider="docker",
flags=["build", "-t", "myapp:latest", "."]
)
# 输出可能是:
{
"status": "success",
"summary": "Docker构建成功完成。镜像大小:1.2GB。构建时间:3分45秒。除了最终的应用层外,所有层都已缓存。",
"build_id": "1704123789_5678"
}
# 运行Python测试带覆盖率
run_build(
project_path="/my-python-api",
provider="pytest",
flags=["--cov=src", "--cov-report=term-missing", "tests/"],
model="anthropic/claude-3-haiku"
)
# 运行unittest发现
run_build(
project_path="/my-python-api",
provider="unittest",
flags=["discover", "-s", "tests", "-p", "test_*.py"]
)
# 检查最近的构建
history = list_build_history(5)
在.env文件中配置:
# OpenRouter API配置(必需)
OPENROUTER_API_KEY=your_openrouter_api_key_here
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
# 分析的默认模型
DEFAULT_MODEL=mistralai/mistral-small-3.2-22b-instruct-2506:free
# 命令超时(秒)
DEFAULT_TIMEOUT=600
用于构建分析的流行OpenRouter模型:
快速且免费:
mistralai/mistral-small-3.2-22b-instruct-2506:freegoogle/gemini-flash-1.5-8b:freedeepseek/deepseek-r1-0528:freeqwen/qwen3-32b:freegoogle/gemini-2.0-flash-exp:freemistralai/mistral-nemo:free平衡:
anthropic/claude-3-haikuopenai/gpt-4o-mini高质量:
anthropic/claude-3-sonnetopenai/gpt-4o构建输出存储在build_outputs/目录中:
run_server.sh脚本可以自动将服务器添加到Claude Code:
./run_server.sh
# 当提示添加到Claude Code时选择'Y'
claude mcp add build-output-tools -s user -- /path/to/.venv/bin/python /path/to/src/build_output_tools_mcp/server.py
# 停止MCP服务器连接
./scripts/stop_server.sh
# 完全从Claude Code移除
./scripts/uninstall_server.sh
# 移除后重新安装
./run_server.sh
添加到claude_desktop_config.json:
{
"mcpServers": {
"build-output-tools": {
"command": "/path/to/.venv/bin/python",
"args": ["/path/to/src/build_output_tools_mcp/server.py"]
}
}
}
MCP服务器连接问题:
# 停止并重启服务器
./scripts/stop_server.sh
./scripts/uninstall_server.sh
./run_server.sh
API密钥不起作用:
# 检查您的.env文件
cat .env | grep OPENROUTER_API_KEY
# 在https://openrouter.ai/验证API密钥
命令超时:
# 对于长时间构建增加超时
run_build("/my-app", "npm", ["run", "build"], timeout=1200)
存储满:
# 清理旧构建
cleanup_old_builds(max_age_days=3)
# 运行测试套件
python -m pytest tests/ -v
# 使用示例提供商测试
run_build("/tmp", "npm", ["--version"])
run_build("/tmp", "pytest", ["--help"])
# 发现可用提供商
providers = list_providers()
print(json.loads(providers)["supported_providers"]) # ["pytest", "unittest", "npm", "docker"]
# 处理无效提供商
result = run_build("/my-app", "invalid_provider", ["test"])
# 返回:{"status": "error", "error": "不支持的提供商:invalid_provider..."}
# 使用特定模型满足不同的分析需求
run_build("/my-app", "npm", ["test"], model="anthropic/claude-3-sonnet") # 深度分析
run_build("/my-app", "npm", ["run", "lint"], model="google/gemini-flash-1.5") # 快速检查
# 获取历史并分析模式
history = list_build_history(50)
# 使用构建ID分析常见的失败模式
failing_builds = [b for b in history if not b["success"]]
我们欢迎贡献!一些潜在的改进领域:
subprocess的方法是一个好的开始,但仍然可能存在恶意活动的变通方法。MIT许可证 - 详见LICENSE文件。