You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js+Express开发Claude对接的MCP服务器时遭遇-32001请求超时错误的排查求助

Node.js+Express开发Claude对接的MCP服务器时遭遇-32001请求超时错误的排查求助

我仔细梳理了你的问题描述、代码和日志,这个-32001超时错误的核心矛盾点很明确:Claude已经发送了初始化请求,但你的Express服务器的/mcp路由完全没收到请求,导致客户端等待60秒后触发超时断开。结合MCP协议的特性和Express的工作机制,我整理了几个针对性的排查方向和修复建议:

一、优先排查Express中间件的请求解析问题

你的代码里用了默认的express.json()中间件,但MCP的Streamable HTTP传输采用的是**分块编码(chunked transfer encoding)**的流式请求,默认的express.json()无法正确解析这种非完整的JSON请求体,会导致请求被卡在中间件层,根本到不了你的/mcp路由。

建议替换掉默认的json中间件,改用raw中间件接收原始请求体后手动解析:

// 移除原有app.use(express.json());
// 只为/mcp路由配置raw中间件,指定接收application/json类型的原始数据
app.use('/mcp', express.raw({ type: 'application/json' }));

app.post("/mcp", async (req, res) => {
  console.error("----- Neue /mcp Anfrage -----");
  console.error("Headers:", req.headers);
  
  // 手动解析原始请求体
  let requestBody;
  try {
    requestBody = JSON.parse(req.body.toString());
    console.error("Parsed Body:", JSON.stringify(requestBody, null, 2));
  } catch (parseErr) {
    console.error("请求体解析失败:", parseErr);
    return res.status(400).json({ 
      jsonrpc: "2.0", 
      error: { code: -32700, message: "Parse error" }, 
      id: null 
    });
  }

  try {
    await transport.handleRequest(req, res, requestBody);
    if (!res.headersSent) res.end();
  } catch (error) {
    console.error("Fehler in /mcp:", error);
    if (!res.headersSent) {
      res.status(500).json({ 
        jsonrpc: "2.0", 
        error: { code: -32603, message: "Internal server error" }, 
        id: requestBody?.id ?? null, 
      });
    }
  }
});

二、调整MCP实例的初始化顺序

你当前的代码是先初始化MCP Server和Transport,再挂载路由。虽然理论上没问题,但可能存在Transport未完全就绪就开始接收请求的情况。建议调整顺序,先挂载路由再初始化MCP相关组件:

// 先创建Express实例并配置路由
const app = express();
app.use('/mcp', express.raw({ type: 'application/json' }));

app.post("/mcp", async (req, res) => {
  // 你的路由逻辑
});

// 再初始化MCP Server和Transport
const server = new McpServer({ name: "Supabase MCP Server", version: "1.0.0" });
const transport = new StreamableHTTPServerTransport({ 
  sessionIdGenerator: () => crypto.randomUUID(), 
});
await server.connect(transport);

// 最后启动服务器
const PORT = 3002;
app.listen(PORT, '0.0.0.0', () => {
  console.error(`MCP HTTP server läuft auf http://localhost:${PORT}/mcp`);
});

三、验证Transport的请求处理绑定

可以在路由里添加更详细的日志,确认请求是否真的到达服务器。比如打印原始请求体的内容,判断Claude的初始化请求是否真的发送到了你的服务端。

四、检查网络和Claude配置细节

  • 确认Claude Desktop的MCP配置中url字段完全正确:http://localhost:3002/mcp,端口和路径没有拼写错误
  • 检查本地防火墙、杀毒软件或代理工具是否拦截了Claude与本地服务器的通信,尝试临时关闭这些工具测试
  • 显式指定Express监听0.0.0.0(如上代码所示),确保服务器能接收来自本地所有网卡的请求

五、补充MCP初始化请求的手动处理

如果Transport没有自动处理initialize请求,你可以手动注册事件监听函数,确保服务器能正确响应Claude的初始化请求:

server.on('initialize', async (params, context) => {
  console.log("收到初始化请求:", params);
  return {
    protocolVersion: "2025-06-18",
    capabilities: {}, // 返回你的服务器支持的能力集合
    serverInfo: { name: "Supabase MCP Server", version: "1.0.0" }
  };
});

建议你先从替换express.json()为express.raw()开始测试,这是此类问题最常见的根源——默认中间件无法处理MCP的流式请求,导致请求被吞掉,服务器无响应最终触发客户端超时。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:48:03