@@ -6,22 +6,34 @@ import {
66} from "@modelcontextprotocol/sdk/types.js" ;
77import { ToolLoader } from "./toolLoader.js" ;
88import { BaseTool } from "../tools/BaseTool.js" ;
9+ import { readFileSync } from "fs" ;
10+ import { join , dirname } from "path" ;
11+ import { logger } from "./Logger.js" ;
912
1013export interface MCPServerConfig {
11- name : string ;
12- version : string ;
14+ name ? : string ;
15+ version ? : string ;
1316}
1417
1518export class MCPServer {
1619 private server : Server ;
1720 private toolsMap : Map < string , BaseTool > = new Map ( ) ;
1821 private toolLoader : ToolLoader ;
22+ private serverName : string ;
23+ private serverVersion : string ;
24+
25+ constructor ( config : MCPServerConfig = { } ) {
26+ this . serverName = config . name ?? this . getDefaultName ( ) ;
27+ this . serverVersion = config . version ?? this . getDefaultVersion ( ) ;
28+
29+ logger . info (
30+ `Initializing MCP Server: ${ this . serverName } @${ this . serverVersion } `
31+ ) ;
1932
20- constructor ( config : MCPServerConfig ) {
2133 this . server = new Server (
2234 {
23- name : config . name ,
24- version : config . version ,
35+ name : this . serverName ,
36+ version : this . serverVersion ,
2537 } ,
2638 {
2739 capabilities : {
@@ -36,6 +48,46 @@ export class MCPServer {
3648 this . setupHandlers ( ) ;
3749 }
3850
51+ private readPackageJson ( ) : any {
52+ try {
53+ const mainModulePath = process . argv [ 1 ] ;
54+ const packagePath = join ( dirname ( mainModulePath ) , ".." , "package.json" ) ;
55+ const packageContent = readFileSync ( packagePath , "utf-8" ) ;
56+ const packageJson = JSON . parse ( packageContent ) ;
57+ logger . debug ( `Successfully read package.json from: ${ packagePath } ` ) ;
58+ return packageJson ;
59+ } catch ( error ) {
60+ logger . warn ( `Could not read package.json: ${ error } ` ) ;
61+ return null ;
62+ }
63+ }
64+
65+ private getDefaultName ( ) : string {
66+ try {
67+ const packageJson = this . readPackageJson ( ) ;
68+ if ( packageJson ?. name ) {
69+ logger . info ( `Using name from package.json: ${ packageJson . name } ` ) ;
70+ return packageJson . name ;
71+ }
72+ } catch ( error ) {
73+ logger . warn ( `Error getting name from package.json: ${ error } ` ) ;
74+ }
75+ return "unnamed-mcp-server" ;
76+ }
77+
78+ private getDefaultVersion ( ) : string {
79+ try {
80+ const packageJson = this . readPackageJson ( ) ;
81+ if ( packageJson ?. version ) {
82+ logger . info ( `Using version from package.json: ${ packageJson . version } ` ) ;
83+ return packageJson . version ;
84+ }
85+ } catch ( error ) {
86+ logger . warn ( `Error getting version from package.json: ${ error } ` ) ;
87+ }
88+ return "0.0.0" ;
89+ }
90+
3991 private setupHandlers ( ) {
4092 this . server . setRequestHandler ( ListToolsRequestSchema , async ( ) => {
4193 return {
@@ -66,9 +118,14 @@ export class MCPServer {
66118 const transport = new StdioServerTransport ( ) ;
67119 await this . server . connect ( transport ) ;
68120
69- process . stderr . write ( `Server started with ${ tools . length } tools\n` ) ;
121+ logger . info (
122+ `Started ${ this . serverName } @${ this . serverVersion } with ${ tools . length } tools`
123+ ) ;
124+ logger . info (
125+ `Available tools: ${ Array . from ( this . toolsMap . keys ( ) ) . join ( ", " ) } `
126+ ) ;
70127 } catch ( error ) {
71- process . stderr . write ( `Server initialization error: ${ error } \n ` ) ;
128+ logger . error ( `Server initialization error: ${ error } ` ) ;
72129 throw error ;
73130 }
74131 }
0 commit comments