1
+ import os
1
2
import sys
2
3
from contextlib import asynccontextmanager
3
4
10
11
from mcp_python .types import JSONRPCMessage
11
12
12
13
14
+ # Environment variables to inherit by default
15
+ DEFAULT_INHERITED_ENV_VARS = (
16
+ ["APPDATA" , "HOMEDRIVE" , "HOMEPATH" , "LOCALAPPDATA" , "PATH" ,
17
+ "PROCESSOR_ARCHITECTURE" , "SYSTEMDRIVE" , "SYSTEMROOT" , "TEMP" ,
18
+ "USERNAME" , "USERPROFILE" ]
19
+ if sys .platform == "win32"
20
+ else ["HOME" , "LOGNAME" , "PATH" , "SHELL" , "TERM" , "USER" ]
21
+ )
22
+
23
+
24
+ def get_default_environment () -> dict [str , str ]:
25
+ """Returns a default environment object including only environment variables deemed safe to inherit."""
26
+ env : dict [str , str ] = {}
27
+
28
+ for key in DEFAULT_INHERITED_ENV_VARS :
29
+ value = os .environ .get (key )
30
+ if value is None :
31
+ continue
32
+
33
+ if value .startswith ("()" ):
34
+ # Skip functions, which are a security risk
35
+ continue
36
+
37
+ env [key ] = value
38
+
39
+ return env
40
+
41
+
13
42
class StdioServerParameters (BaseModel ):
14
43
command : str
15
44
"""The executable to run to start the server."""
16
45
17
46
args : list [str ] = Field (default_factory = list )
18
47
"""Command line arguments to pass to the executable."""
19
48
20
- env : dict [str , str ] = Field ( default_factory = dict )
49
+ env : dict [str , str ] | None = None
21
50
"""
22
51
The environment to use when spawning the process.
23
52
24
- The environment is NOT inherited from the parent process by default .
53
+ If not specified, the result of get_default_environment() will be used .
25
54
"""
26
55
27
56
@@ -41,7 +70,9 @@ async def stdio_client(server: StdioServerParameters):
41
70
write_stream , write_stream_reader = anyio .create_memory_object_stream (0 )
42
71
43
72
process = await anyio .open_process (
44
- [server .command , * server .args ], env = server .env , stderr = sys .stderr
73
+ [server .command , * server .args ],
74
+ env = server .env if server .env is not None else get_default_environment (),
75
+ stderr = sys .stderr
45
76
)
46
77
47
78
async def stdout_reader ():
0 commit comments