Skip to content

fix(client): Some mcp server need default env(#393, #196) #394

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

sunrabbit123
Copy link

@sunrabbit123 sunrabbit123 commented Apr 24, 2025

Motivation and Context

ref: #393, #196

How Has This Been Tested?

npm run test

Breaking Changes

We now always include the default environment variables when executing.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

@sunrabbit123 sunrabbit123 marked this pull request as ready for review April 24, 2025 12:15
@sunrabbit123 sunrabbit123 changed the title fix(client): No such file or directory in StdioClientTransport(#393, #196) fix(client): Some mcp server need default env(#393, #196) Apr 24, 2025
test("should work with actual node mcp server", async () => {
const client = new StdioClientTransport({
command: "npx",
args: ["-y", "@wrtnlabs/calculator-mcp"],
Copy link
Author

Choose a reason for hiding this comment

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

it's the simple mcp server
i make it for test

Copy link
Author

Choose a reason for hiding this comment

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

Copy link
Contributor

Choose a reason for hiding this comment

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

we should not be using real servers in tests

sunrabbit123 added a commit to wrtnlabs/mcp-bundler that referenced this pull request Apr 24, 2025
test("should work with actual node mcp server", async () => {
const client = new StdioClientTransport({
command: "npx",
args: ["-y", "@wrtnlabs/calculator-mcp"],
Copy link
Contributor

Choose a reason for hiding this comment

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

we should not be using real servers in tests

@sunrabbit123 sunrabbit123 requested a review from ihrpr April 29, 2025 04:37
@sunrabbit123
Copy link
Author

@ihrpr can i ask you to request review?

@ihrpr
Copy link
Contributor

ihrpr commented Jun 26, 2025

Thank you for working on this. Sorry about the delays in reviews. I'm closing it for now as it's a breaking change that could affect existing implementations.
#196 explains how to make it work.

@ihrpr ihrpr closed this Jun 26, 2025
@sunrabbit123
Copy link
Author

The method presented in #196 works quite well. The reason this approach is effective is that when users inject an Env, the SDK essentially ignores the default environment variables used internally and exclusively uses the environment variables provided by the user.

However, if we shift this responsibility entirely to users, it could potentially create significant challenges when developing third-party libraries that utilize this SDK.

Most MCP users generally prefer configuration files that work seamlessly out of the box, as typically no one really wants to manually retrieve environment variables and configure them in their own setup files.

@sunrabbit123
Copy link
Author

sunrabbit123 commented Jun 27, 2025

The current env merging logic differs from our Python SDK implementation. The Python SDK uses a different approach for this - we should align both SDKs to maintain consistency.

env: ({**get_default_environment(), **server.env} if server.env is not None else get_default_environment())

This creates inconsistent behavior across SDKs.

https://github.com/modelcontextprotocol/python-sdk/blob/dced22344d80d85884df9c26281fdfe0331e9c65/src/mcp/client/stdio/__init__.py#L111-L121

related PR's

related issue's

@ihrpr ihrpr reopened this Jun 27, 2025
Copy link
Contributor

@ihrpr ihrpr left a comment

Choose a reason for hiding this comment

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

Thank you for pointing out inconsistency between SDKs! Sorry, I didn't realise it was changed recently.

Some comments around tests 🙏 and then we can merge

@@ -72,7 +72,10 @@ describe("StdioClientTransport using cross-spawn", () => {
"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


const serverParameters: StdioServerParameters = {
command: "/usr/bin/tee",
};


let spawnEnv: Record<string, string> | undefined;
Copy link
Contributor

Choose a reason for hiding this comment

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

let spawnEnv at module level is problematic:
- Tests can interfere with each other
- Not thread-safe if tests run in parallel
- Violates test isolation principles

@ihrpr ihrpr added this to the HPR milestone Jun 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants