@@ -23,6 +23,14 @@ export {
2323 getActiveMcpLoopbackRuntime ,
2424} from "./mcp-http.loopback-runtime.js" ;
2525
26+ type McpLoopbackServer = {
27+ port : number ;
28+ close : ( ) => Promise < void > ;
29+ } ;
30+
31+ let activeMcpLoopbackServer : McpLoopbackServer | undefined ;
32+ let activeMcpLoopbackServerPromise : Promise < McpLoopbackServer > | null = null ;
33+
2634export async function startMcpLoopbackServer ( port = 0 ) : Promise < {
2735 port : number ;
2836 close : ( ) => Promise < void > ;
@@ -98,13 +106,16 @@ export async function startMcpLoopbackServer(port = 0): Promise<{
98106 setActiveMcpLoopbackRuntime ( { port : address . port , token } ) ;
99107 logDebug ( `mcp loopback listening on 127.0.0.1:${ address . port } ` ) ;
100108
101- return {
109+ const server : McpLoopbackServer = {
102110 port : address . port ,
103111 close : ( ) =>
104112 new Promise < void > ( ( resolve , reject ) => {
105113 httpServer . close ( ( error ) => {
106114 if ( ! error ) {
107115 clearActiveMcpLoopbackRuntime ( token ) ;
116+ if ( activeMcpLoopbackServer === server ) {
117+ activeMcpLoopbackServer = undefined ;
118+ }
108119 }
109120 if ( error ) {
110121 reject ( error ) ;
@@ -114,4 +125,33 @@ export async function startMcpLoopbackServer(port = 0): Promise<{
114125 } ) ;
115126 } ) ,
116127 } ;
128+ return server ;
129+ }
130+
131+ export async function ensureMcpLoopbackServer ( port = 0 ) : Promise < McpLoopbackServer > {
132+ if ( activeMcpLoopbackServer ) {
133+ return activeMcpLoopbackServer ;
134+ }
135+ if ( ! activeMcpLoopbackServerPromise ) {
136+ activeMcpLoopbackServerPromise = startMcpLoopbackServer ( port )
137+ . then ( ( server ) => {
138+ activeMcpLoopbackServer = server ;
139+ return server ;
140+ } )
141+ . finally ( ( ) => {
142+ activeMcpLoopbackServerPromise = null ;
143+ } ) ;
144+ }
145+ return activeMcpLoopbackServerPromise ;
146+ }
147+
148+ export async function closeMcpLoopbackServer ( ) : Promise < void > {
149+ const server =
150+ activeMcpLoopbackServer ??
151+ ( activeMcpLoopbackServerPromise ? await activeMcpLoopbackServerPromise : undefined ) ;
152+ if ( ! server ) {
153+ return ;
154+ }
155+ activeMcpLoopbackServer = undefined ;
156+ await server . close ( ) ;
117157}
0 commit comments