@thorium-dev-group/x402-mcp-extension
Version:
X402-MCP Protocol Extension
102 lines • 4.33 kB
JavaScript
;
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