Skip to content
Merged
27 changes: 24 additions & 3 deletions src/client/cross-spawn.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { StdioClientTransport } from "./stdio.js";
import { StdioClientTransport, getDefaultEnvironment } from "./stdio.js";
import spawn from "cross-spawn";
import { JSONRPCMessage } from "../types.js";
import { ChildProcess } from "node:child_process";
Expand Down Expand Up @@ -67,12 +67,33 @@ describe("StdioClientTransport using cross-spawn", () => {

await transport.start();

// verify environment variables are passed correctly
// verify environment variables are merged correctly
expect(mockSpawn).toHaveBeenCalledWith(
"test-command",
[],
expect.objectContaining({
env: customEnv
env: {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be removed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but.. i don't understand this comment, can i ask you to explain with detail?

...getDefaultEnvironment(),
...customEnv
}
})
);
});

test("should use default environment when env is undefined", async () => {
const transport = new StdioClientTransport({
command: "test-command",
env: undefined
});

await transport.start();

// verify default environment is used
expect(mockSpawn).toHaveBeenCalledWith(
"test-command",
[],
expect.objectContaining({
env: getDefaultEnvironment()
})
);
});
Expand Down
6 changes: 5 additions & 1 deletion src/client/stdio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,11 @@ export class StdioClientTransport implements Transport {
this._serverParams.command,
this._serverParams.args ?? [],
{
env: this._serverParams.env ?? getDefaultEnvironment(),
// merge default env with server env because mcp server needs some env vars
env: {
...getDefaultEnvironment(),
...this._serverParams.env,
},
stdio: ["pipe", "pipe", this._serverParams.stderr ?? "inherit"],
shell: false,
signal: this._abortController.signal,
Expand Down