feat(mcps): unify SSE/Stdio transport and fix handshake timeouts

This commit is contained in:
2026-03-05 12:04:19 +01:00
parent 29423123b3
commit daa2750f89
5 changed files with 141 additions and 75 deletions

View File

@@ -15,10 +15,10 @@ import { z } from "zod";
import axios from "axios";
const GITEA_HOST = process.env.GITEA_HOST || "https://git.infra.mintel.me";
const GITEA_ACCESS_TOKEN = process.env.GITEA_ACCESS_TOKEN;
const GITEA_ACCESS_TOKEN = process.env.GITEA_ACCESS_TOKEN || process.env.GITEA_TOKEN;
if (!GITEA_ACCESS_TOKEN) {
console.error("Warning: GITEA_ACCESS_TOKEN environment variable is missing. Pipeline tools will return unauthorized errors.");
console.error("Warning: Neither GITEA_ACCESS_TOKEN nor GITEA_TOKEN environment variable is set. Pipeline tools will return unauthorized errors.");
}
const giteaClient = axios.create({
@@ -829,32 +829,42 @@ async function pollSubscriptions() {
async function run() {
const app = express();
let transport: SSEServerTransport | null = null;
const isStdio = process.argv.includes('--stdio');
app.get('/sse', async (req, res) => {
console.error('New SSE connection established');
transport = new SSEServerTransport('/message', res);
if (isStdio) {
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
const transport = new StdioServerTransport();
await server.connect(transport);
});
console.error('Gitea MCP server is running on stdio');
} else {
const app = express();
let transport: SSEServerTransport | null = null;
app.post('/message', async (req, res) => {
if (!transport) {
res.status(400).send('No active SSE connection');
return;
}
await transport.handlePostMessage(req, res);
});
app.get('/sse', async (req, res) => {
console.error('New SSE connection established');
transport = new SSEServerTransport('/message', res);
await server.connect(transport);
});
const PORT = process.env.GITEA_MCP_PORT || 3001;
app.listen(PORT, () => {
console.error(`Gitea MCP Native Server running on http://localhost:${PORT}/sse`);
});
app.post('/message', async (req, res) => {
if (!transport) {
res.status(400).send('No active SSE connection');
return;
}
await transport.handlePostMessage(req, res);
});
// Start the background poller
pollSubscriptions();
const PORT = process.env.GITEA_MCP_PORT || 3001;
app.listen(PORT, () => {
console.error(`Gitea MCP server running on http://localhost:${PORT}/sse`);
});
// Start the background poller only in SSE mode or if specifically desired
pollSubscriptions();
}
}
run().catch((error) => {
console.error("Fatal error:", error);
process.exit(1);