fix(mcp): refactor all mcp servers to use multi-session sse transport
All checks were successful
Monorepo Pipeline / ⚡ Prioritize Release (push) Successful in 1s
Monorepo Pipeline / 🧪 Test (push) Successful in 1m1s
Monorepo Pipeline / 🏗️ Build (push) Successful in 2m44s
Monorepo Pipeline / 🧹 Lint (push) Successful in 2m55s
Monorepo Pipeline / 🚀 Release (push) Has been skipped
Monorepo Pipeline / 🐳 Build Gatekeeper (Product) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Build-Base (push) Has been skipped
Monorepo Pipeline / 🐳 Build Production Runtime (push) Has been skipped

This commit is contained in:
2026-03-10 13:32:16 +01:00
parent 5e1f2669e6
commit 8486261555
18 changed files with 144 additions and 619 deletions

View File

@@ -15,5 +15,5 @@ COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
# Use node to run the compiled index.js
ENTRYPOINT ["node", "dist/index.js"]
# Use node to run the compiled start.js
ENTRYPOINT ["node", "dist/start.js"]

View File

@@ -1,6 +1,7 @@
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import express from "express";
import crypto from "crypto";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
@@ -1265,17 +1266,35 @@ async function run() {
console.error("Gitea MCP server is running on stdio");
} else {
const app = express();
let transport: SSEServerTransport | null = null;
const transports = new Map<string, SSEServerTransport>();
// Middleware to log all requests for debugging
app.use((req, _res, next) => {
console.error(`${req.method} ${req.url}`);
next();
});
app.get("/sse", async (req, res) => {
console.error("New SSE connection established");
transport = new SSEServerTransport("/message", res);
const sessionId = crypto.randomUUID();
console.error(`New SSE connection: ${sessionId}`);
const transport = new SSEServerTransport(`/message/${sessionId}`, res);
transports.set(sessionId, transport);
req.on("close", () => {
console.error(`SSE connection closed: ${sessionId}`);
transports.delete(sessionId);
});
await server.connect(transport);
});
app.post("/message", async (req, res) => {
app.post("/message/:sessionId", async (req, res) => {
const { sessionId } = req.params;
const transport = transports.get(sessionId);
if (!transport) {
res.status(400).send("No active SSE connection");
console.error(`No transport found for session: ${sessionId}`);
res.status(400).send("No active SSE connection for this session");
return;
}
await transport.handlePostMessage(req, res);