6
6
} from "@modelcontextprotocol/sdk/types.js" ;
7
7
import { ToolLoader } from "./toolLoader.js" ;
8
8
import { BaseTool } from "../tools/BaseTool.js" ;
9
+ import { readFileSync } from "fs" ;
9
10
import { join , dirname } from "path" ;
10
11
import { logger } from "./Logger.js" ;
11
12
@@ -18,51 +19,73 @@ export class MCPServer {
18
19
private server : Server ;
19
20
private toolsMap : Map < string , BaseTool > = new Map ( ) ;
20
21
private toolLoader : ToolLoader ;
22
+ private serverName : string ;
23
+ private serverVersion : string ;
21
24
22
25
constructor ( config : MCPServerConfig = { } ) {
23
- const serverConfig = {
24
- name : config . name ?? this . getDefaultName ( ) ,
25
- version : config . version ?? this . getDefaultVersion ( ) ,
26
- } ;
26
+ this . serverName = config . name ?? this . getDefaultName ( ) ;
27
+ this . serverVersion = config . version ?? this . getDefaultVersion ( ) ;
27
28
28
- this . server = new Server ( serverConfig , {
29
- capabilities : {
30
- tools : {
31
- enabled : true ,
32
- } ,
29
+ logger . info (
30
+ `Initializing MCP Server: ${ this . serverName } @${ this . serverVersion } `
31
+ ) ;
32
+
33
+ this . server = new Server (
34
+ {
35
+ name : this . serverName ,
36
+ version : this . serverVersion ,
33
37
} ,
34
- } ) ;
38
+ {
39
+ capabilities : {
40
+ tools : {
41
+ enabled : true ,
42
+ } ,
43
+ } ,
44
+ }
45
+ ) ;
35
46
36
47
this . toolLoader = new ToolLoader ( ) ;
37
48
this . setupHandlers ( ) ;
38
49
}
39
50
40
- private getDefaultName ( ) : string {
51
+ private readPackageJson ( ) : any {
41
52
try {
42
53
const mainModulePath = process . argv [ 1 ] ;
43
54
const packagePath = join ( dirname ( mainModulePath ) , ".." , "package.json" ) ;
44
- const packageContent = require ( packagePath ) ;
45
- logger . debug ( `Found package.json with name: ${ packageContent . name } ` ) ;
46
- return packageContent . name ;
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 ;
47
59
} catch ( error ) {
48
- logger . warn ( `Could not read package.json for name : ${ error } ` ) ;
49
- return "unnamed-mcp-server" ;
60
+ logger . warn ( `Could not read package.json: ${ error } ` ) ;
61
+ return null ;
50
62
}
51
63
}
52
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
+
53
78
private getDefaultVersion ( ) : string {
54
79
try {
55
- const mainModulePath = process . argv [ 1 ] ;
56
- const packagePath = join ( dirname ( mainModulePath ) , ".." , "package.json" ) ;
57
- const packageContent = require ( packagePath ) ;
58
- logger . debug (
59
- `Found package.json with version: ${ packageContent . version } `
60
- ) ;
61
- return packageContent . version ;
80
+ const packageJson = this . readPackageJson ( ) ;
81
+ if ( packageJson ?. version ) {
82
+ logger . info ( `Using version from package.json: ${ packageJson . version } ` ) ;
83
+ return packageJson . version ;
84
+ }
62
85
} catch ( error ) {
63
- logger . warn ( `Could not read package.json for version: ${ error } ` ) ;
64
- return "0.0.0" ;
86
+ logger . warn ( `Error getting version from package.json: ${ error } ` ) ;
65
87
}
88
+ return "0.0.0" ;
66
89
}
67
90
68
91
private setupHandlers ( ) {
@@ -95,9 +118,14 @@ export class MCPServer {
95
118
const transport = new StdioServerTransport ( ) ;
96
119
await this . server . connect ( transport ) ;
97
120
98
- 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
+ ) ;
99
127
} catch ( error ) {
100
- process . stderr . write ( `Server initialization error: ${ error } \n ` ) ;
128
+ logger . error ( `Server initialization error: ${ error } ` ) ;
101
129
throw error ;
102
130
}
103
131
}
0 commit comments