Skip to content

Commit 8a05c48

Browse files
authored
Merge pull request #41 from QuantGeekDev/feat/sdk-version-logging
feat: add sdk version logging
2 parents 2743eaf + bb716db commit 8a05c48

File tree

2 files changed

+31
-72
lines changed

2 files changed

+31
-72
lines changed

src/core/MCPServer.ts

+30-67
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import { HttpStreamTransport } from "../transports/http/server.js";
2828
import { HttpStreamTransportConfig, DEFAULT_HTTP_STREAM_CONFIG } from "../transports/http/types.js";
2929
import { DEFAULT_CORS_CONFIG } from "../transports/sse/types.js";
3030
import { AuthConfig } from "../auth/types.js";
31+
import { createRequire } from 'module';
32+
33+
const require = createRequire(import.meta.url);
3134

3235
function isRequest(msg: any): boolean {
3336
return msg && typeof msg.method === 'string' && msg.jsonrpc === "2.0" && 'id' in msg;
@@ -219,7 +222,6 @@ export class MCPServer {
219222
private getDefaultName(): string {
220223
const packageJson = this.readPackageJson();
221224
if (packageJson?.name) {
222-
logger.info(`Using name from package.json: ${packageJson.name}`);
223225
return packageJson.name;
224226
}
225227
logger.error("Couldn't find project name in package json");
@@ -229,7 +231,6 @@ export class MCPServer {
229231
private getDefaultVersion(): string {
230232
const packageJson = this.readPackageJson();
231233
if (packageJson?.version) {
232-
logger.info(`Using version from package.json: ${packageJson.version}`);
233234
return packageJson.version;
234235
}
235236
return "0.0.0";
@@ -391,14 +392,40 @@ export class MCPServer {
391392
return this.capabilities;
392393
}
393394

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+
394420
async start() {
395421
try {
396422
if (this.isRunning) {
397423
throw new Error("Server is already running");
398424
}
399425
this.isRunning = true;
400426

401-
logger.info("Starting MCP server...");
427+
const sdkVersion = this.getSdkVersion();
428+
logger.info(`Starting MCP server with SDK ${sdkVersion}...`);
402429

403430
const tools = await this.toolLoader.loadTools();
404431
this.toolsMap = new Map(
@@ -420,13 +447,10 @@ export class MCPServer {
420447

421448
this.setupHandlers();
422449

423-
logger.info("Creating transport...");
424450
this.transport = this.createTransport();
425451

426452
logger.info(`Connecting transport (${this.transport.type}) to SDK Server...`);
427-
// Let the SDK handle starting the transport through the connect method
428453
await this.server.connect(this.transport);
429-
logger.info(`SDK Server connected to ${this.transport.type} transport.`);
430454

431455
logger.info(`Started ${this.serverName}@${this.serverVersion} successfully on transport ${this.transport.type}`);
432456

@@ -466,69 +490,8 @@ export class MCPServer {
466490
}
467491
}
468492

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-
}
490493

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-
}
515494

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-
}
532495

533496
async stop() {
534497
if (!this.isRunning) {

src/transports/http/server.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -354,17 +354,14 @@ export class HttpStreamTransport extends AbstractTransport {
354354
let session: SessionData | undefined;
355355

356356
if (this._config.session.enabled && sessionIdHeader) {
357-
// If a session ID is provided, validate it
358357
session = this.validateSession(sessionIdHeader, req, false);
359358
session.lastActivity = Date.now();
360359
logger.debug(`Found valid session: ${session.id}`);
361360
await this.handleAuthentication(req, res, `GET session ${session.id}`, session);
362361
} else if (this._config.session.enabled) {
363-
// Allow initial GET requests without session ID during initialization phase
364362
logger.debug(`GET request without session ID - allowing as potential initialization connection`);
365363
await this.handleAuthentication(req, res, `GET initialization`, undefined);
366364
} else {
367-
// Sessions disabled
368365
await this.handleAuthentication(req, res, `GET (sessions disabled)`, undefined);
369366
}
370367

@@ -538,9 +535,8 @@ export class HttpStreamTransport extends AbstractTransport {
538535
throw this.httpError(400, `Bad Request: Missing required session header ${headerName}`, -32601, undefined, requestId);
539536
}
540537
else {
541-
// This is a valid case for initialization or when sessionId is optional
542538
logger.debug(`No session ID provided and not mandatory - acceptable for initialization`);
543-
return undefined as any; // Will be caught by typescript at call site
539+
return undefined as any;
544540
}
545541
}
546542

0 commit comments

Comments
 (0)