From 57b8378cd8cbf186b7d9680f0cf351bbcf655852 Mon Sep 17 00:00:00 2001 From: NamesMT Date: Sun, 25 May 2025 17:03:04 +0000 Subject: [PATCH 1/4] types(utils/config): improve return type infer --- src/utils/config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/config.ts b/src/utils/config.ts index da746be2044..36d4abf9314 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -5,11 +5,11 @@ * * Does not mutate original object */ -export async function injectEnv(config: string | Record, notFoundValue: any = "") { +export async function injectEnv>(config: C, notFoundValue: any = "") { // Use simple regex replace for now, will see if object traversal and recursion is needed here (e.g: for non-serializable objects) const isObject = typeof config === "object" - let _config = isObject ? JSON.stringify(config) : config + let _config: string = isObject ? JSON.stringify(config) : config _config = _config.replace(/\$\{env:([\w]+)\}/g, (_, name) => { // Check if null or undefined @@ -21,5 +21,5 @@ export async function injectEnv(config: string | Record, notFo return process.env[name] ?? notFoundValue }) - return isObject ? JSON.parse(_config) : _config + return (isObject ? JSON.parse(_config) : _config) as C extends string ? string : Record } From 89616142b47c83ad8e6e298b2b33118493ff3c69 Mon Sep 17 00:00:00 2001 From: NamesMT Date: Sun, 25 May 2025 17:04:20 +0000 Subject: [PATCH 2/4] feat(McpHub): inject env variable on whole mcp config --- src/services/mcp/McpHub.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index a77fc8013f9..8bb743ad054 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -443,13 +443,16 @@ export class McpHub { let transport: StdioClientTransport | SSEClientTransport - if (config.type === "stdio") { + // Inject environment variables to the config + const configInjected = (await injectEnv(config)) as typeof config + + if (configInjected.type === "stdio") { transport = new StdioClientTransport({ - command: config.command, - args: config.args, - cwd: config.cwd, + command: configInjected.command, + args: configInjected.args, + cwd: configInjected.cwd, env: { - ...(config.env ? await injectEnv(config.env) : {}), + ...configInjected.env, ...(process.env.PATH ? { PATH: process.env.PATH } : {}), ...(process.env.HOME ? { HOME: process.env.HOME } : {}), }, @@ -508,16 +511,16 @@ export class McpHub { // SSE connection const sseOptions = { requestInit: { - headers: config.headers, + headers: configInjected.headers, }, } // Configure ReconnectingEventSource options const reconnectingEventSourceOptions = { max_retry_time: 5000, // Maximum retry time in milliseconds - withCredentials: config.headers?.["Authorization"] ? true : false, // Enable credentials if Authorization header exists + withCredentials: configInjected.headers?.["Authorization"] ? true : false, // Enable credentials if Authorization header exists } global.EventSource = ReconnectingEventSource - transport = new SSEClientTransport(new URL(config.url), { + transport = new SSEClientTransport(new URL(configInjected.url), { ...sseOptions, eventSourceInit: reconnectingEventSourceOptions, }) @@ -537,9 +540,9 @@ export class McpHub { const connection: McpConnection = { server: { name, - config: JSON.stringify(config), + config: JSON.stringify(configInjected), status: "connecting", - disabled: config.disabled, + disabled: configInjected.disabled, source, projectPath: source === "project" ? vscode.workspace.workspaceFolders?.[0]?.uri.fsPath : undefined, errorHistory: [], From e4db4f4cb522205d135fe21f2529d57d618989a0 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Wed, 28 May 2025 11:31:16 -0500 Subject: [PATCH 3/4] fix: check for undefined configInjected --- src/services/mcp/McpHub.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 8bb743ad054..1e8aabf1f5b 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -452,7 +452,7 @@ export class McpHub { args: configInjected.args, cwd: configInjected.cwd, env: { - ...configInjected.env, + ...(configInjected.env || {}), ...(process.env.PATH ? { PATH: process.env.PATH } : {}), ...(process.env.HOME ? { HOME: process.env.HOME } : {}), }, From 179452d1a3ebf63cd406751b78440d28f6dd0109 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Wed, 28 May 2025 11:32:21 -0500 Subject: [PATCH 4/4] refactor: improve type assertion --- src/utils/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/config.ts b/src/utils/config.ts index 36d4abf9314..50dc7d63862 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -21,5 +21,5 @@ export async function injectEnv>(con return process.env[name] ?? notFoundValue }) - return (isObject ? JSON.parse(_config) : _config) as C extends string ? string : Record + return (isObject ? JSON.parse(_config) : _config) as C extends string ? string : C }