@@ -6,22 +6,34 @@ import {
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" ;
10
+ import { join , dirname } from "path" ;
11
+ import { logger } from "./Logger.js" ;
9
12
10
13
export interface MCPServerConfig {
11
- name : string ;
12
- version : string ;
14
+ name ? : string ;
15
+ version ? : string ;
13
16
}
14
17
15
18
export class MCPServer {
16
19
private server : Server ;
17
20
private toolsMap : Map < string , BaseTool > = new Map ( ) ;
18
21
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
+ ) ;
19
32
20
- constructor ( config : MCPServerConfig ) {
21
33
this . server = new Server (
22
34
{
23
- name : config . name ,
24
- version : config . version ,
35
+ name : this . serverName ,
36
+ version : this . serverVersion ,
25
37
} ,
26
38
{
27
39
capabilities : {
@@ -36,6 +48,46 @@ export class MCPServer {
36
48
this . setupHandlers ( ) ;
37
49
}
38
50
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
+
39
91
private setupHandlers ( ) {
40
92
this . server . setRequestHandler ( ListToolsRequestSchema , async ( ) => {
41
93
return {
@@ -66,9 +118,14 @@ export class MCPServer {
66
118
const transport = new StdioServerTransport ( ) ;
67
119
await this . server . connect ( transport ) ;
68
120
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
+ ) ;
70
127
} catch ( error ) {
71
- process . stderr . write ( `Server initialization error: ${ error } \n ` ) ;
128
+ logger . error ( `Server initialization error: ${ error } ` ) ;
72
129
throw error ;
73
130
}
74
131
}
0 commit comments