From bfd10caeee7f27f81c7b301e611b40cb51cc83db Mon Sep 17 00:00:00 2001 From: "D. Michael Piscitelli" Date: Sat, 7 Mar 2026 05:34:44 +0100 Subject: [PATCH] fix: make pywin32 imports soft to support server-only Windows installs Wrap pywin32 imports in try/except ImportError so that server-only Windows users are not forced to install pywin32. The package is only needed for Job Object support in mcp.client.stdio, but the eager import in mcp/__init__.py pulls it in for all users. All downstream functions (_create_job_object, _maybe_assign_process_to_job, terminate_windows_process_tree) already null-check these modules before use, so graceful degradation is fully covered. Fixes server-only deployments that fail with pywin32 installation errors when antivirus software locks extracted DLLs during uv cache cleanup. Github-Issue: #2233 Reported-by: Nikhil Suresh --- src/mcp/os/win32/utilities.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mcp/os/win32/utilities.py b/src/mcp/os/win32/utilities.py index 0e188691f..ff2236aae 100644 --- a/src/mcp/os/win32/utilities.py +++ b/src/mcp/os/win32/utilities.py @@ -17,10 +17,18 @@ # Windows-specific imports for Job Objects if sys.platform == "win32": - import pywintypes - import win32api - import win32con - import win32job + try: + import pywintypes + import win32api + import win32con + import win32job + except ImportError: + # pywin32 is not installed — degrade gracefully. + # All downstream code null-checks these modules before use. + pywintypes = None + win32api = None + win32con = None + win32job = None else: # Type stubs for non-Windows platforms win32api = None