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

