/* * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. * @generated-id: 03e83f226068 */ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js"; import express from "express"; import { LocalContext } from "../../cli.js"; import { resolveMcpApps } from "../../apps/config.js"; import { ConsoleLoggerLevel, createConsoleLogger, } from "../../console-logger.js"; import { MCPServerFlags } from "../../flags.js"; import { createMCPServer } from "../../server.js"; import { buildAnnotationFilter } from "../../tools.js"; import { buildSDK } from "../../tools.js"; import { landingPageExpress } from "../../../landing-page.js"; interface ServeCommandFlags extends MCPServerFlags { readonly port: number; readonly "disable-static-auth": boolean; readonly "log-level": ConsoleLoggerLevel; readonly env?: [string, string][]; } export async function main(this: LocalContext, flags: ServeCommandFlags) { flags.env?.forEach(([key, value]) => { process.env[key] = value; }); await startStreamableHTTP(flags); } async function startStreamableHTTP(cliFlags: ServeCommandFlags) { const logger = createConsoleLogger(cliFlags["log-level"]); const app = express(); // Enable CORS for cross-origin requests app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); res.header("Access-Control-Allow-Headers", "*"); if (req.method === "OPTIONS") { res.sendStatus(204); return; } next(); }); app.use(express.json()); app.post("/mcp", async (req, res) => { const headers = new Headers(); for (const [key, value] of Object.entries(req.headers)) { if (Array.isArray(value)) { for (const v of value) headers.append(key, v); } else if (value !== undefined) { headers.set(key, value); } } const transport = new StreamableHTTPServerTransport({}); const { server: mcpServer } = createMCPServer({ logger, allowedTools: cliFlags.tool, dynamic: cliFlags.mode === "dynamic", annotationFilter: buildAnnotationFilter(cliFlags["tool-annotations"]), scopes: cliFlags.scope, serverURL: cliFlags["server-url"], getSDK: () => buildSDK(headers, cliFlags, cliFlags["disable-static-auth"], logger), cloud_name: cliFlags["cloud-name"], serverIdx: cliFlags["server-index"], region: cliFlags.region, host: cliFlags["api-host"], mcpApps: resolveMcpApps(cliFlags["mcp-apps"]), }); mcpServer.server.onerror = (error) => { logger.error("MCP protocol error", { error: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined, }); }; await mcpServer.connect(transport as Transport); await transport.handleRequest(req, res, req.body); }); app.get("/", landingPageExpress); const httpServer = app.listen(cliFlags.port, "0.0.0.0", () => { const ha = httpServer.address(); const host = typeof ha === "string" ? ha : `${ha?.address}:${ha?.port}`; logger.info("MCP Streamable HTTP server started", { host }); }); const shutdown = () => { logger.info("Shutting down HTTP server"); const timer = setTimeout(() => { logger.info("Forcing shutdown"); process.exit(1); }, 5000); httpServer.close(() => { clearTimeout(timer); logger.info("Graceful shutdown complete"); process.exit(0); }); }; process.on("SIGTERM", shutdown); process.on("SIGINT", shutdown); }