From 129e635460b3c2a8717b9c6b25919fb9bdacf099 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 11 Apr 2026 01:33:29 +0000 Subject: [PATCH] =?UTF-8?q?test:=20mcp=20discover=20=E2=80=94=20env-var=20?= =?UTF-8?q?interpolation=20in=20external=20configs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cover the readJsonSafe env-var resolution path added in f030bf8. Users with ${VAR} or ${VAR:-default} in .vscode/mcp.json now get their MCP servers resolved correctly; these tests guard against regressions in that interpolation path. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/opencode/test/mcp/discover.test.ts | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/opencode/test/mcp/discover.test.ts b/packages/opencode/test/mcp/discover.test.ts index 382f0a98bf..5b20e9bbfc 100644 --- a/packages/opencode/test/mcp/discover.test.ts +++ b/packages/opencode/test/mcp/discover.test.ts @@ -363,4 +363,44 @@ describe("discoverExternalMcp", () => { expect(result["project-server"]).toBeDefined() expect((result["project-server"] as any).enabled).toBe(false) }) + + // altimate_change start — env-var interpolation in external MCP configs (commit f030bf8) + test("resolves ${VAR} env-var references in external config values", async () => { + const envKey = "__TEST_MCP_DISCOVER_CMD_" + Date.now() + process.env[envKey] = "my-custom-node" + try { + await mkdir(path.join(tempDir, ".vscode"), { recursive: true }) + await writeFile( + path.join(tempDir, ".vscode/mcp.json"), + `{"servers": {"env-test": {"command": "\${${envKey}}", "args": ["serve"]}}}`, + ) + + const { servers: result } = await discoverExternalMcp(tempDir) + expect(result["env-test"]).toBeDefined() + expect(result["env-test"]).toMatchObject({ + type: "local", + command: ["my-custom-node", "serve"], + }) + } finally { + delete process.env[envKey] + } + }) + + test("resolves ${VAR:-default} with fallback when env var is unset", async () => { + const envKey = "__TEST_MCP_DISCOVER_UNSET_" + Date.now() + delete process.env[envKey] + await mkdir(path.join(tempDir, ".vscode"), { recursive: true }) + await writeFile( + path.join(tempDir, ".vscode/mcp.json"), + `{"servers": {"default-test": {"command": "\${${envKey}:-fallback-cmd}", "args": ["run"]}}}`, + ) + + const { servers: result } = await discoverExternalMcp(tempDir) + expect(result["default-test"]).toBeDefined() + expect(result["default-test"]).toMatchObject({ + type: "local", + command: ["fallback-cmd", "run"], + }) + }) + // altimate_change end })