diff --git a/pyproject.toml b/pyproject.toml index 04d5d61..81ff9a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "mcp-server-metatool" -version = "0.0.3" +version = "0.0.4" description = "Metatool MCP Server" readme = "README.md" requires-python = ">=3.10" diff --git a/setup.py b/setup.py index 8e02bc9..4a74609 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="mcp-server-metatool", - version="0.0.3", + version="0.0.4", author="James Zhang", author_email="james@jczstudio.com", description="Metatool MCP Server", diff --git a/src/mcp_server_metatool/__init__.py b/src/mcp_server_metatool/__init__.py index 2f4e091..b47d443 100644 --- a/src/mcp_server_metatool/__init__.py +++ b/src/mcp_server_metatool/__init__.py @@ -2,7 +2,7 @@ Metatool MCP Server """ -__version__ = "0.0.2" +__version__ = "0.0.4" from .server import serve diff --git a/src/mcp_server_metatool/server.py b/src/mcp_server_metatool/server.py index bb68ec3..45344c2 100644 --- a/src/mcp_server_metatool/server.py +++ b/src/mcp_server_metatool/server.py @@ -11,6 +11,47 @@ import tempfile import subprocess import ast +import sys + +# Environment variables to inherit by default +DEFAULT_INHERITED_ENV_VARS = ( + [ + "APPDATA", + "HOMEDRIVE", + "HOMEPATH", + "LOCALAPPDATA", + "PATH", + "PROCESSOR_ARCHITECTURE", + "SYSTEMDRIVE", + "SYSTEMROOT", + "TEMP", + "USERNAME", + "USERPROFILE", + ] + if sys.platform == "win32" + else ["HOME", "LOGNAME", "PATH", "SHELL", "TERM", "USER"] +) + + +def get_default_environment() -> dict[str, str]: + """ + Returns a default environment object including only environment variables deemed + safe to inherit. + """ + env: dict[str, str] = {} + + for key in DEFAULT_INHERITED_ENV_VARS: + value = os.environ.get(key) + if value is None: + continue + + if value.startswith("()"): + # Skip functions, which are a security risk + continue + + env[key] = value + + return env def sanitize_name(name: str) -> str: @@ -42,8 +83,13 @@ async def get_mcp_servers() -> list[StdioServerParameters]: # Convert empty lists and dicts to None if "args" in params and not params["args"]: params["args"] = None - if "env" in params and not params["env"]: - params["env"] = None + + # Merge environment variables + params["env"] = { + **get_default_environment(), + **(params.get("env") or {}), + } + server_params.append(StdioServerParameters(**params)) return server_params except Exception: @@ -118,8 +164,11 @@ async def get_custom_mcp_servers() -> list[StdioServerParameters]: params["command"] = "uv" params["args"] = ["run", script_path] + params.get("additionalArgs", []) - if "env" in params and not params["env"]: - params["env"] = None + # Merge environment variables + params["env"] = { + **get_default_environment(), + **(params.get("env") or {}), + } server_params.append(StdioServerParameters(**params)) return server_params @@ -212,7 +261,7 @@ async def serve(): write_stream, InitializationOptions( server_name="metatool", - server_version="0.0.1", + server_version="0.0.4", capabilities=server.get_capabilities( notification_options=NotificationOptions(), experimental_capabilities={}, diff --git a/uv.lock b/uv.lock index da863a8..080fd56 100644 --- a/uv.lock +++ b/uv.lock @@ -404,7 +404,7 @@ wheels = [ [[package]] name = "mcp-server-metatool" -version = "0.0.3" +version = "0.0.4" source = { editable = "." } dependencies = [ { name = "mcp" },