From b2aa118d9501fe959ba062076cba67257d2eaa54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Castro=20Castrill=C3=B3n?= Date: Thu, 12 Feb 2026 11:07:14 +0100 Subject: [PATCH] Allow passing a logger to the server --- src/index.ts | 4 ++-- src/logger.ts | 13 +++++++++++-- src/server.ts | 36 +++++++++++++++++++++++------------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1d3a287..8e30b06 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ #!/usr/bin/env node -import Logger from "./logger.js"; +import DefaultLogger, { type Logger } from "./logger.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import YepCodeMcpServer from "./server.js"; import { getVersion } from "./utils.js"; -const logger = new Logger("StdioServer", { logsToStderr: true }); +const logger: Logger = new DefaultLogger("StdioServer", { logsToStderr: true }); const main = async (): Promise => { let tools: string[] | undefined; diff --git a/src/logger.ts b/src/logger.ts index 510722b..9f8193d 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,6 +1,14 @@ import { isObject } from "./utils.js"; -class Logger { +interface Logger { + error(message: string, error?: Error | undefined): void; + + warn(message: string): void; + + info(message: string): void; +} + +class DefaultLogger implements Logger { private name: string | undefined; private logsToStderr: boolean; @@ -53,4 +61,5 @@ class Logger { } } -export default Logger; +export default DefaultLogger; +export type { Logger }; diff --git a/src/server.ts b/src/server.ts index d7d7715..bc70dd0 100644 --- a/src/server.ts +++ b/src/server.ts @@ -19,7 +19,7 @@ import dotenv from "dotenv"; import { ToolCallRequest, ToolHandler } from "./types.js"; import { z } from "zod"; import { getVersion, isEmpty } from "./utils.js"; -import Logger from "./logger.js"; +import DefaultLogger, { type Logger } from "./logger.js"; import { GetStorageObjectsSchema, UploadStorageObjectSchema, @@ -154,12 +154,14 @@ class YepCodeMcpServer extends Server { tools = DEFAULT_TOOL_TAGS, runCodeCleanup = false, skipCodingRules = false, + externalLogger = undefined, }: { logsToStderr?: boolean; tools?: string[]; runCodeCleanup?: boolean; skipCodingRules?: boolean; - } = {} + externalLogger?: Logger; + } = {}, ) { super( { @@ -184,12 +186,16 @@ class YepCodeMcpServer extends Server { this.yepCodeRun = new YepCodeRun(config); this.yepCodeEnv = new YepCodeEnv(config); this.yepCodeApi = new YepCodeApi(config); - this.logger = new Logger(this.yepCodeApi.getTeamId(), { - logsToStderr, - }); + if (externalLogger) { + this.logger = externalLogger; + } else { + this.logger = new DefaultLogger(this.yepCodeApi.getTeamId(), { + logsToStderr, + }); + } this.logger.info("YepCode initialized successfully"); } catch (error) { - this.logger = new Logger("YepCodeMcpServer", { + this.logger = new DefaultLogger("YepCodeMcpServer", { logsToStderr, }); this.logger.error("Exception while initializing YepCode", error as Error); @@ -437,10 +443,12 @@ class YepCodeMcpServer extends Server { let executionError: string | undefined; let returnValue: unknown; - this.logger.info("Running code with YepCode", { - codeLength: code.length, - options, - }); + this.logger.info( + `Running code with YepCode ${JSON.stringify({ + codeLength: code.length, + options, + })}`, + ); const execution = await this.yepCodeRun.run(code, { removeOnDone: this.runCodeCleanup, @@ -455,9 +463,11 @@ class YepCodeMcpServer extends Server { }, onFinish: (value) => { returnValue = value; - this.logger.info("YepCode execution finished", { - hasReturnValue: value !== undefined, - }); + this.logger.info( + `YepCode execution finished ${JSON.stringify({ + hasReturnValue: value !== undefined, + })}`, + ); }, });