import express from "express";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
const app = express();
app.use(express.json());
// 会话存储(生产环境应使用Redis等外部存储)
const sessions = new Map();
app.post("/mcp", async (req, res) => {
const sessionId = req.headers["mcp-session-id"];
if (sessionId && sessions.has(sessionId)) {
// 已有会话,复用
const transport = sessions.get(sessionId);
await transport.handlePost(req, res);
} else {
// 新会话
const transport = new StreamableHTTPServerTransport({
endpoint: "/mcp"
});
const server = createMcpServer(); // 你的Server工厂函数
await server.connect(transport);
// 保存会话
const newSessionId = transport.getSessionId();
sessions.set(newSessionId, transport);
await transport.handlePost(req, res);
}
});
// SSE端点(可选,用于Server主动推送)
app.get("/mcp", async (req, res) => {
const sessionId = req.headers["mcp-session-id"];
const transport = sessions.get(sessionId);
if (transport) {
await transport.handleGet(req, res);
} else {
res.status(404).end();
}
});
// 健康检查
app.get("/health", (req, res) => {
res.json({ status: "ok", activeSessions: sessions.size });
});
app.listen(3000, () => {
console.error("MCP Server (Streamable HTTP) running on port 3000");
});