Skip to main content
Glama
server.ts1.99 kB
import http from 'http'; import cors from 'cors'; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { logger } from '#core/logger'; import express from 'express'; export async function createServer(mcpServer: McpServer, port: number): Promise<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>> { const app = express(); app.use(cors({ origin: "*", allowedHeaders: ["Content-Type", "Authorization", "Mcp-Session-Id", "Mcp-Protocol-Version", "Accept", "User-Agent", "Authorization", "authorization","GITHUB_TOKEN","github_token"], exposedHeaders: ["Mcp-Session-Id", "Mcp-Protocol-Version"], })); app.use((req, res, next) => { // Fix Accept header for MCP SDK strict check if (req.headers.accept === "*/*" || !req.headers.accept) { req.headers.accept = "application/json, text/event-stream"; } next(); }); const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true, }); await mcpServer.connect(transport); app.all("/sse", async (req, res) => { try { await transport.handleRequest(req, res, req.body); } catch (error) { logger.error("Error handling /sse:", error); } }); app.all("/messages", async (req, res) => { try { await transport.handleRequest(req, res, req.body); } catch (error) { logger.error("Error handling /messages:", error); } }); const httpServer = http.createServer(app); httpServer.listen(port, () => { logger.info(`MCP Server (Express with SSE & Streamable HTTP) listening on port ${port}`); }); httpServer.on('error', (error) => { logger.error('HTTP Server error:', error); }); return httpServer; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JesusMaster/github-see-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server