diff --git a/mcp-gitea-server/src/index.ts b/mcp-gitea-server/src/index.ts index f2935e3..c7496ac 100644 --- a/mcp-gitea-server/src/index.ts +++ b/mcp-gitea-server/src/index.ts @@ -1,5 +1,5 @@ -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamablehttp.js'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; import express from 'express'; import { z } from 'zod'; @@ -33,17 +33,10 @@ async function giteaRequest(endpoint: string, options: RequestInit = {}) { } // Crear servidor MCP -const server = new Server( - { - name: 'mcp-gitea-server', - version: '1.0.0', - }, - { - capabilities: { - tools: {}, - }, - } -); +const server = new McpServer({ + name: 'gitea-server', + version: '1.0.0' +}); // ==================== HERRAMIENTA 1: gitea_repos ==================== server.registerTool( @@ -402,9 +395,10 @@ server.registerTool( // ==================== SERVIDOR EXPRESS ==================== const app = express(); +app.use(express.json()); // Health check -app.get('/health', (_req, res) => { +app.get('/health', (req, res) => { res.json({ status: 'ok', service: 'mcp-gitea-server', @@ -413,23 +407,41 @@ app.get('/health', (_req, res) => { }); }); -// Endpoint MCP -app.post('/mcp', async (req, res) => { - const transport = new StreamableHTTPServerTransport({ - sessionId: `session-${Date.now()}`, - req, - res, - server, - }); +// Endpoint MCP (escucha en / porque Traefik hace StripPrefix de /mcp) +app.post('/', async (req, res) => { + try { + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + enableJsonResponse: true + }); - await transport.start(); - await transport.runLoop(); + res.on('close', () => { + transport.close(); + }); + + await server.connect(transport); + await transport.handleRequest(req, res, req.body); + } catch (error) { + console.error('Error handling MCP request:', error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: '2.0', + error: { + code: -32603, + message: 'Internal server error' + }, + id: null + }); + } + } }); -// Iniciar servidor app.listen(PORT, '0.0.0.0', () => { console.log(`MCP Gitea Server corriendo en http://0.0.0.0:${PORT}/mcp`); console.log(`Health check disponible en http://0.0.0.0:${PORT}/health`); console.log(`Gitea URL: ${GITEA_URL}`); console.log(`Token configurado: ${GITEA_TOKEN ? 'Sí' : 'No'}`); +}).on('error', error => { + console.error('Error del servidor:', error); + process.exit(1); });