@@ -3,7 +3,7 @@ import WebSocket from "ws";
3
3
// eslint-disable-next-line @typescript-eslint/no-explicit-any
4
4
( global as any ) . WebSocket = WebSocket ;
5
5
6
- import express from "express " ;
6
+ import http from "http " ;
7
7
import { Client } from "./client/index.js" ;
8
8
import { SSEClientTransport } from "./client/sse.js" ;
9
9
import { StdioClientTransport } from "./client/stdio.js" ;
@@ -59,54 +59,55 @@ async function runClient(url_or_command: string, args: string[]) {
59
59
60
60
async function runServer ( port : number | null ) {
61
61
if ( port !== null ) {
62
- const app = express ( ) ;
63
-
64
62
let servers : Server [ ] = [ ] ;
63
+ const app = http . createServer ( async ( req , res ) => {
64
+ const url = new URL ( req . url ?? '/' , `http://${ req . headers . host } ` ) ;
65
+ if ( req . method === 'GET' && url . pathname === '/sse' ) {
66
+ console . log ( "Got new SSE connection" ) ;
67
+
68
+ const transport = new SSEServerTransport ( "/message" , res ) ;
69
+ const server = new Server (
70
+ {
71
+ name : "mcp-typescript test server" ,
72
+ version : "0.1.0" ,
73
+ } ,
74
+ {
75
+ capabilities : { } ,
76
+ } ,
77
+ ) ;
78
+
79
+ servers . push ( server ) ;
80
+
81
+ server . onclose = ( ) => {
82
+ console . log ( "SSE connection closed" ) ;
83
+ servers = servers . filter ( ( s ) => s !== server ) ;
84
+ } ;
85
+
86
+ await server . connect ( transport ) ;
87
+ }
65
88
66
- app . get ( "/sse" , async ( req , res ) => {
67
- console . log ( "Got new SSE connection" ) ;
68
-
69
- const transport = new SSEServerTransport ( "/message" , res ) ;
70
- const server = new Server (
71
- {
72
- name : "mcp-typescript test server" ,
73
- version : "0.1.0" ,
74
- } ,
75
- {
76
- capabilities : { } ,
77
- } ,
78
- ) ;
79
-
80
- servers . push ( server ) ;
81
-
82
- server . onclose = ( ) => {
83
- console . log ( "SSE connection closed" ) ;
84
- servers = servers . filter ( ( s ) => s !== server ) ;
85
- } ;
86
-
87
- await server . connect ( transport ) ;
88
- } ) ;
89
+ if ( req . method === 'POST' && url . pathname === '/message' ) {
90
+ console . log ( "Received message" ) ;
89
91
90
- app . post ( "/message" , async ( req , res ) => {
91
- console . log ( "Received message" ) ;
92
+ const sessionId = url . searchParams . get ( "sessionId" ) as string ;
93
+ const transport = servers
94
+ . map ( ( s ) => s . transport as SSEServerTransport )
95
+ . find ( ( t ) => t . sessionId === sessionId ) ;
96
+ if ( ! transport ) {
97
+ res . statusCode = 404 ;
98
+ res . end ( "Session not found" ) ;
99
+ return ;
100
+ }
92
101
93
- const sessionId = req . query . sessionId as string ;
94
- const transport = servers
95
- . map ( ( s ) => s . transport as SSEServerTransport )
96
- . find ( ( t ) => t . sessionId === sessionId ) ;
97
- if ( ! transport ) {
98
- res . status ( 404 ) . send ( "Session not found" ) ;
99
- return ;
102
+ await transport . handlePostMessage ( req , res ) ;
100
103
}
101
-
102
- await transport . handlePostMessage ( req , res ) ;
103
104
} ) ;
104
105
105
- app . listen ( port , ( error ) => {
106
- if ( error ) {
107
- console . error ( 'Failed to start server:' , error ) ;
108
- process . exit ( 1 ) ;
109
- }
106
+ app . on ( 'error' , error => {
107
+ console . error ( 'Failed to start server:' , error ) ;
108
+ process . exit ( 1 ) ;
109
+ } )
110
+ app . listen ( port , ( ) => {
110
111
console . log ( `Server running on http://localhost:${ port } /sse` ) ;
111
112
} ) ;
112
113
} else {
0 commit comments