8.3 KiB
8.3 KiB
Windows 测试问题修复总结 (v0.1.39)
测试环境
- 版本: v0.1.37 → v0.1.39
- 平台: Windows
- 日志文件: nuwax-agent.log.2026-02-12
发现的问题及修复状态
1. ✅ 隐藏 CMD 窗口没有效果
问题描述:
- 在 Windows 上启动 MCP 子进程时,控制台窗口仍然显示
根本原因:
mcp-streamable-proxy/src/server_builder.rs中,CREATE_NO_WINDOW标志设置得太早- 后续的
cmd.env()和cmd.args()调用导致标志可能失效
修复方案:
- 将
CREATE_NO_WINDOW设置移到所有命令配置(env/args)之后 - 确保在创建
TokioChildProcess之前作为最后一步设置
修复代码:
// 在所有 env() 和 args() 调用之后
#[cfg(windows)]
{
use std::os::windows::process::CommandExt;
const CREATE_NO_WINDOW: u32 = 0x08000000;
cmd.creation_flags(CREATE_NO_WINDOW);
}
修复文件:
/Users/apple/workspace/mcp-proxy/mcp-streamable-proxy/src/server_builder.rs:180-241
状态: ✅ 已修复,待测试验证
2. ❌ mcp-proxy 启动失败
问题描述:
- mcp-proxy 进程启动后,健康检查超时失败
- 错误: "等待 15s 后 http://127.0.0.1:18099/mcp 仍未就绪"
日志证据:
2026-02-12T06:18:41.088275Z INFO [McpProxy] 可执行文件路径: C:\Users\MECHREVO\.local\bin\mcp-proxy.cmd
2026-02-12T06:18:41.088293Z INFO [McpProxy] 监听地址: 127.0.0.1:18099
2026-02-12T06:19:01.052725Z ERROR [McpProxy] 健康检查失败: MCP Proxy 健康检查超时
分析:
- 进程启动成功: mcp-proxy.cmd 被调用
- HTTP 服务未启动: 15秒后健康检查端点仍不可用
- 日志缺失: 由于 CMD 窗口隐藏,子进程的 stdout/stderr 未被捕获
可能的原因:
- mcp-proxy 子进程内部 panic/crash
- 缺少必要的运行时依赖
- 配置文件解析错误
- 端口 18099 被占用
- Node.js 环境变量缺失
诊断步骤 (需要用户执行):
# 1. 检查 mcp-proxy 版本
C:\Users\MECHREVO\.local\bin\mcp-proxy.cmd --version
# 2. 手动启动服务器(查看完整错误)
C:\Users\MECHREVO\.local\bin\mcp-proxy.cmd server --port 18099
# 3. 检查端口占用
netstat -ano | findstr "18099"
# 4. 验证 Node.js 环境
node --version
npm list -g mcp-stdio-proxy
# 5. 查看批处理文件内容
type C:\Users\MECHREVO\.local\bin\mcp-proxy.cmd
建议修复 (针对 nuwax-agent):
// 需要捕获子进程的 stdout/stderr
let mut child = Command::new(mcp_proxy_path)
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()?;
// 异步读取并记录输出
tokio::spawn(async move {
let mut stdout = BufReader::new(child.stdout.take().unwrap()).lines();
while let Ok(Some(line)) = stdout.next_line().await {
tracing::info!("[McpProxy stdout] {}", line);
}
});
tokio::spawn(async move {
let mut stderr = BufReader::new(child.stderr.take().unwrap()).lines();
while let Ok(Some(line)) = stderr.next_line().await {
tracing::error!("[McpProxy stderr] {}", line);
}
});
状态: ⏳ 等待用户提供诊断信息(这是 nuwax-agent 的问题,不是 mcp-proxy 代码的问题)
3. ⚠️ Node.js 检测逻辑问题
问题描述:
- 第一次启动时,即使系统已安装 Node.js,仍然出现多次重复安装尝试
- 第二次启动时,应用安装了自己的 Node.js 到
~/.local/bin
日志证据:
# 第一次启动 - 10 次重复尝试
2026-02-12T06:14:50.437049Z INFO [resolve_node_bin] npm -> fallback to PATH
2026-02-12T06:15:22.509303Z INFO [Dependency] 开始全局安装 npm 包: mcp-stdio-proxy
2026-02-12T06:15:29.360632Z INFO [Dependency] 开始全局安装 npm 包: mcp-stdio-proxy
...(共 10 次)
# 第二次启动 - 成功
2026-02-12T06:16:55.747776Z INFO [NodeInstall] 开始自动安装 Node.js...
2026-02-12T06:17:00.275214Z INFO [resolve_node_bin] npm -> "C:\\Users\\MECHREVO\\.local\\bin\\npm.cmd"
2026-02-12T06:17:13.857546Z INFO [Dependency] mcp-stdio-proxy 全局安装成功
根本原因:
- 缺少 Node.js 可用性检测: 直接假设 PATH 中的 npm 可用
- 未验证命令执行结果:
fallback to PATH后未检查 npm 命令是否真正可用 - 重试逻辑问题: 安装失败后一直重试,未触发 Node.js 安装
建议修复 (针对 nuwax-agent):
/// 检查 Node.js 是否真正可用
async fn is_node_available() -> bool {
let node_cmd = if cfg!(windows) { "node.exe" } else { "node" };
match tokio::process::Command::new(node_cmd)
.arg("--version")
.output()
.await
{
Ok(output) if output.status.success() => {
let version = String::from_utf8_lossy(&output.stdout);
tracing::info!("Found Node.js: {}", version.trim());
true
}
Ok(_) => {
tracing::warn!("Node.js command exists but failed");
false
}
Err(e) => {
tracing::warn!("Node.js not found: {}", e);
false
}
}
}
/// 确保 npm 包安装(带前置检查)
async fn ensure_npm_package(package_name: &str) -> Result<()> {
// 1. 先检查 Node.js 是否可用
if !is_node_available().await {
tracing::info!("Node.js not available, installing...");
install_nodejs().await?;
// 再次验证
if !is_node_available().await {
anyhow::bail!("Failed to install Node.js");
}
}
// 2. 检查包是否已安装
if is_package_installed(package_name).await? {
tracing::info!("{} is already installed", package_name);
return Ok(());
}
// 3. 安装包(带重试限制)
let max_retries = 3;
for attempt in 1..=max_retries {
match install_npm_package(package_name).await {
Ok(_) => return Ok(()),
Err(e) if attempt < max_retries => {
tracing::warn!("Install attempt {}/{} failed: {}", attempt, max_retries, e);
tokio::time::sleep(Duration::from_secs(2)).await;
}
Err(e) => anyhow::bail!("Failed to install {} after {} attempts: {}", package_name, max_retries, e),
}
}
Ok(())
}
状态: ⚠️ 这是 nuwax-agent 的问题,已提供修复建议
修改文件清单
mcp-proxy 仓库
-
✅
mcp-streamable-proxy/src/server_builder.rs- 移动 CREATE_NO_WINDOW 到最后设置
-
✅
mcp-proxy/Cargo.toml- 版本号: 0.1.38 → 0.1.39
-
✅
WINDOWS_ISSUE_ANALYSIS.md- 新增:完整的问题分析文档
-
✅
WINDOWS_FIX_SUMMARY.md- 新增:修复总结和诊断指南
验证检查清单
立即需要用户验证
- 手动运行
mcp-proxy.cmd server --port 18099并提供完整输出 - 检查端口 18099 是否被占用
- 验证 Node.js 和 npm 全局包安装情况
编译新版本后验证
- CMD 窗口是否成功隐藏(问题 1)
- mcp-proxy 是否能正常启动(问题 2,取决于诊断结果)
- Node.js 检测是否正常(问题 3,需要 nuwax-agent 修复)
构建和发布
构建命令
# 构建发布版本
cargo build --release -p mcp-stdio-proxy
# 生成的二进制文件
# target/release/mcp-proxy (或 mcp-proxy.exe on Windows)
版本信息
- 当前版本: v0.1.39
- 修复内容: Windows CMD 窗口隐藏问题
- 待验证: 需要在 Windows 环境测试
后续行动
短期(立即)
- 等待用户诊断信息: 运行诊断命令并提供输出
- 编译测试: 在 Windows 上编译 v0.1.39 并测试
中期(本周)
- 与 nuwax-agent 团队协作:
- 分享子进程输出捕获建议
- 分享 Node.js 检测逻辑改进建议
- 完善文档: 添加 Windows 平台特定的故障排除指南
长期(下一版本)
- 考虑添加 mcp-proxy 自检命令:
mcp-proxy doctor # 检查环境、依赖、配置 - 改进错误信息: 提供更详细的启动失败诊断
- 添加 Windows 集成测试: 自动化测试 CMD 窗口隐藏等功能
联系信息
如有问题,请提供:
- 完整的错误日志
- 运行诊断命令的输出
- Windows 版本和系统信息
- Node.js/npm 版本信息
GitHub Issue: https://github.com/nuwax-ai/mcp-proxy/issues