|
1 | 1 | /** |
2 | | - * Shared utilities for running MCP servers with multiple transports. |
| 2 | + * Shared utilities for running MCP servers with HTTP transports. |
3 | 3 | * |
4 | 4 | * Supports: |
5 | | - * - stdio transport (when port is undefined) |
6 | 5 | * - Streamable HTTP transport (/mcp) - stateful sessions |
7 | 6 | * - Legacy SSE transport (/sse, /messages) - backwards compatibility |
8 | 7 | */ |
9 | 8 |
|
10 | 9 | import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; |
11 | 10 | import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js"; |
12 | 11 | import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; |
13 | | -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; |
14 | 12 | import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; |
15 | 13 | import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; |
16 | 14 | import cors from "cors"; |
17 | 15 | import { randomUUID } from "node:crypto"; |
18 | 16 | import type { Request, Response } from "express"; |
19 | 17 |
|
20 | 18 | export interface ServerOptions { |
21 | | - /** Port to listen on. If undefined, uses stdio transport. */ |
22 | | - port?: number; |
| 19 | + /** Port to listen on (required). */ |
| 20 | + port: number; |
23 | 21 | /** Server name for logging. */ |
24 | 22 | name?: string; |
25 | 23 | } |
26 | 24 |
|
27 | 25 | type Transport = StreamableHTTPServerTransport | SSEServerTransport; |
28 | 26 |
|
29 | 27 | /** |
30 | | - * Starts an MCP server. |
| 28 | + * Starts an MCP server with HTTP transports. |
31 | 29 | * |
32 | | - * - If port is undefined: uses stdio transport |
33 | | - * - If port is provided: HTTP server with Streamable HTTP + legacy SSE |
| 30 | + * Provides: |
| 31 | + * - /mcp (GET/POST/DELETE): Streamable HTTP with stateful sessions |
| 32 | + * - /sse (GET) + /messages (POST): Legacy SSE for older clients |
34 | 33 | */ |
35 | 34 | export async function startServer( |
36 | 35 | server: McpServer, |
37 | | - options: ServerOptions = {}, |
| 36 | + options: ServerOptions, |
38 | 37 | ): Promise<void> { |
39 | 38 | const { port, name = "MCP Server" } = options; |
40 | 39 |
|
41 | | - if (port === undefined) { |
42 | | - await server.connect(new StdioServerTransport()); |
43 | | - console.error(`${name} running in stdio mode`); |
44 | | - return; |
45 | | - } |
46 | | - |
47 | 40 | // Unified session store for both transport types |
48 | 41 | const sessions = new Map<string, Transport>(); |
49 | 42 |
|
@@ -162,9 +155,3 @@ export async function startServer( |
162 | 155 | process.on("SIGTERM", shutdown); |
163 | 156 | }); |
164 | 157 | } |
165 | | - |
166 | | -/** Helper to get port from args/env, returns undefined for stdio mode */ |
167 | | -export function getPort(defaultPort = 3001): number | undefined { |
168 | | - if (process.argv.includes("--stdio")) return undefined; |
169 | | - return process.env.PORT ? parseInt(process.env.PORT, 10) : defaultPort; |
170 | | -} |
0 commit comments