@@ -28,6 +28,9 @@ import { HttpStreamTransport } from "../transports/http/server.js";
28
28
import { HttpStreamTransportConfig , DEFAULT_HTTP_STREAM_CONFIG } from "../transports/http/types.js" ;
29
29
import { DEFAULT_CORS_CONFIG } from "../transports/sse/types.js" ;
30
30
import { AuthConfig } from "../auth/types.js" ;
31
+ import { createRequire } from 'module' ;
32
+
33
+ const require = createRequire ( import . meta. url ) ;
31
34
32
35
function isRequest ( msg : any ) : boolean {
33
36
return msg && typeof msg . method === 'string' && msg . jsonrpc === "2.0" && 'id' in msg ;
@@ -219,7 +222,6 @@ export class MCPServer {
219
222
private getDefaultName ( ) : string {
220
223
const packageJson = this . readPackageJson ( ) ;
221
224
if ( packageJson ?. name ) {
222
- logger . info ( `Using name from package.json: ${ packageJson . name } ` ) ;
223
225
return packageJson . name ;
224
226
}
225
227
logger . error ( "Couldn't find project name in package json" ) ;
@@ -229,7 +231,6 @@ export class MCPServer {
229
231
private getDefaultVersion ( ) : string {
230
232
const packageJson = this . readPackageJson ( ) ;
231
233
if ( packageJson ?. version ) {
232
- logger . info ( `Using version from package.json: ${ packageJson . version } ` ) ;
233
234
return packageJson . version ;
234
235
}
235
236
return "0.0.0" ;
@@ -391,14 +392,40 @@ export class MCPServer {
391
392
return this . capabilities ;
392
393
}
393
394
395
+ private getSdkVersion ( ) : string {
396
+ try {
397
+ const sdkSpecificFile = require . resolve ( "@modelcontextprotocol/sdk/server/index.js" ) ;
398
+
399
+ const sdkRootDir = resolve ( dirname ( sdkSpecificFile ) , '..' , '..' , '..' ) ;
400
+
401
+ const correctPackageJsonPath = join ( sdkRootDir , "package.json" ) ;
402
+
403
+ const packageContent = readFileSync ( correctPackageJsonPath , "utf-8" ) ;
404
+
405
+ const packageJson = JSON . parse ( packageContent ) ;
406
+
407
+ if ( packageJson ?. version ) {
408
+ logger . debug ( `Found SDK version: ${ packageJson . version } ` ) ;
409
+ return packageJson . version ;
410
+ } else {
411
+ logger . warn ( "Could not determine SDK version from its package.json." ) ;
412
+ return "unknown" ;
413
+ }
414
+ } catch ( error : any ) {
415
+ logger . warn ( `Failed to read SDK package.json: ${ error . message } ` ) ;
416
+ return "unknown" ;
417
+ }
418
+ }
419
+
394
420
async start ( ) {
395
421
try {
396
422
if ( this . isRunning ) {
397
423
throw new Error ( "Server is already running" ) ;
398
424
}
399
425
this . isRunning = true ;
400
426
401
- logger . info ( "Starting MCP server..." ) ;
427
+ const sdkVersion = this . getSdkVersion ( ) ;
428
+ logger . info ( `Starting MCP server with SDK ${ sdkVersion } ...` ) ;
402
429
403
430
const tools = await this . toolLoader . loadTools ( ) ;
404
431
this . toolsMap = new Map (
@@ -420,13 +447,10 @@ export class MCPServer {
420
447
421
448
this . setupHandlers ( ) ;
422
449
423
- logger . info ( "Creating transport..." ) ;
424
450
this . transport = this . createTransport ( ) ;
425
451
426
452
logger . info ( `Connecting transport (${ this . transport . type } ) to SDK Server...` ) ;
427
- // Let the SDK handle starting the transport through the connect method
428
453
await this . server . connect ( this . transport ) ;
429
- logger . info ( `SDK Server connected to ${ this . transport . type } transport.` ) ;
430
454
431
455
logger . info ( `Started ${ this . serverName } @${ this . serverVersion } successfully on transport ${ this . transport . type } ` ) ;
432
456
@@ -466,69 +490,8 @@ export class MCPServer {
466
490
}
467
491
}
468
492
469
- private async handleSdkMessage ( message : JsonRpcMessage ) : Promise < void > {
470
- let method = 'response/notification' ;
471
- let id : JsonRpcId = null ;
472
-
473
- if ( isRequest ( message ) || isNotification ( message ) ) {
474
- method = ( message as any ) . method ;
475
- }
476
- if ( isRequest ( message ) || isResponse ( message ) ) {
477
- id = ( message as any ) . id ;
478
- }
479
-
480
- logger . debug ( `[MCPServer <- Transport] Received: ${ method } ${ id } ` ) ;
481
- logger . debug ( `[MCPServer <- Transport] Message Detail: ${ JSON . stringify ( message ) } ` ) ;
482
-
483
- if ( ! this . server ) {
484
- logger . error ( "Cannot handle message: SDK Server not initialized." ) ;
485
- if ( id !== null && id !== undefined ) {
486
- await this . trySendErrorResponse ( id , - 32005 , "Server not fully initialized" ) ;
487
- }
488
- return ;
489
- }
490
493
491
- try {
492
- const sdkMessage = message as unknown as JSONRPCMessage ;
493
- const response = await ( this . server as any ) . processMessage ( sdkMessage ) ;
494
-
495
- if ( response ) {
496
- const responses = Array . isArray ( response ) ? response : [ response ] ;
497
- logger . debug ( `[MCPServer -> Transport] Sending ${ responses . length } response(s) for ID ${ id ?? 'N/A' } ` ) ;
498
-
499
- for ( const resp of responses ) {
500
- logger . debug ( `[MCPServer -> Transport] Sending Detail: ${ JSON . stringify ( resp ) } ` ) ;
501
- await this . transport ?. send ( resp ) ;
502
- }
503
- } else {
504
- logger . debug ( `[MCPServer] SDK processed ${ method } ${ id } without direct response.` ) ;
505
- }
506
- } catch ( error : any ) {
507
- logger . error ( `[MCPServer] Error processing message via SDK Server: ${ error . message } ` ) ;
508
- logger . debug ( error . stack ) ;
509
-
510
- if ( id !== null && id !== undefined ) {
511
- await this . trySendErrorResponse ( id , - 32000 , `Internal server error: ${ error . message } ` ) ;
512
- }
513
- }
514
- }
515
494
516
- private async trySendErrorResponse ( id : JsonRpcId , code : number , message : string ) : Promise < void > {
517
- if ( ! this . transport ) return ;
518
-
519
- const errorResponse : JsonRpcErrorResponse = {
520
- jsonrpc : "2.0" ,
521
- id : id ,
522
- error : { code, message }
523
- } ;
524
-
525
- try {
526
- logger . debug ( `[MCPServer -> Transport] Sending Error Response: ${ JSON . stringify ( errorResponse ) } ` ) ;
527
- await this . transport . send ( errorResponse as unknown as JSONRPCMessage ) ;
528
- } catch ( sendError : any ) {
529
- logger . error ( `[MCPServer -> Transport] Failed to send error response for ID ${ id } : ${ sendError . message } ` ) ;
530
- }
531
- }
532
495
533
496
async stop ( ) {
534
497
if ( ! this . isRunning ) {
0 commit comments