UNPKG

@thorium-dev-group/x402-mcp-extension

Version:
102 lines 4.33 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = __importDefault(require("express")); const node_crypto_1 = require("node:crypto"); const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js"); const types_js_1 = require("@modelcontextprotocol/sdk/types.js"); const x402MCPServer_1 = require("../../server/x402MCPServer"); const mockFacilitator_1 = require("../../server/services/facilitators/mockFacilitator"); const TestCalculator_1 = require("./TestCalculator"); async function startServer() { new TestCalculator_1.TestCalculator(); const app = (0, express_1.default)(); const port = process.env.PORT || 3000; app.use(express_1.default.json({ limit: '4mb' })); const sessions = {}; async function createSession() { const sessionId = (0, node_crypto_1.randomUUID)(); const serverConfig = { name: 'test-x402-server', version: '1.0.0', x402Config: { payTo: '0x1234567890123456789012345678901234567890', network: 'base-sepolia', facilitator: new mockFacilitator_1.MockFacilitatorService(true, true), baseMCPServerDomain: `http://example.com`, }, }; const mcpServer = new x402MCPServer_1.X402MCPServer(serverConfig); mcpServer.registerHandlers(TestCalculator_1.TestCalculator); const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({ sessionIdGenerator: () => sessionId, }); transport.onclose = () => { console.log('🔧 Session closed', sessionId); delete sessions[sessionId]; }; await mcpServer.connect(transport); sessions[sessionId] = { mcpServer, transport }; return { sessionId, mcpServer, transport }; } app.post('/mcp', async (req, res) => { const sessionId = req.headers['mcp-session-id']; let session = sessionId ? sessions[sessionId] : undefined; if (session) { await session.transport.handleRequest(req, res, req.body); return; } else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) { const { sessionId: newSessionId, transport } = await createSession(); res.setHeader('mcp-session-id', newSessionId); console.log('🔧 New session initialized', newSessionId); await transport.handleRequest(req, res, req.body); return; } else { res.status(400).json({ jsonrpc: '2.0', error: { code: -32000, message: 'Bad Request: No valid session ID provided', }, id: req.body?.id || null, }); return; } }); app.get('/mcp', async (req, res) => { const sessionId = req.headers['mcp-session-id']; const session = sessionId ? sessions[sessionId] : undefined; if (!session) { res.status(400).send('Invalid or missing session ID'); return; } res.on('close', () => { console.log('🔧 Session closed on original response', sessionId); if (sessionId) { delete sessions[sessionId]; } }); await session.transport.handleRequest(req, res); }); app.delete('/mcp', async (req, res) => { const sessionId = req.headers['mcp-session-id']; const session = sessionId ? sessions[sessionId] : undefined; if (!session) { res.status(400).send('Invalid or missing session ID'); return; } await session.transport.handleRequest(req, res); }); app.listen(port, () => { console.log(`🚀 X402-MCP Server running on port ${port}`); console.log(`📡 POST /mcp - Client to server communication`); console.log(`📡 GET /mcp - Server to client notifications (SSE)`); console.log(`📡 DELETE /mcp - Session termination`); }); } startServer().catch(console.error); //# sourceMappingURL=server.js.map