Check for existing issues
What happened?
When upgrading LiteLLM from v1.80.0‑stable to v1.80.15‑stable.1, uvx time MCP stdio server stops working.
The same MCP configuration that previously worked now fails with:
FileNotFoundError: [Errno 2] No such file or directory
LiteLLM is unable to spawn the stdio MCP server process, even though the command works when executed manually.
This is a regression introduced between the two versions.
Is it possible that uvx is not installed in the docker image anymore?
Might the reason be, that you changed the docker base image from cgr.dev/chainguard/python:latest-dev to cgr.dev/chainguard/wolfi-base?
Steps to Reproduce
- Install LiteLLM v1.80.15‑stable.1
- Add the following MCP server configuration:
{
"mcpServers": {
"time": {
"command": "uvx",
"args": ["mcp-server-time"]
}
}
}
- Start LiteLLM and trigger any MCP operation (e.g., list_tools)
- Observe that the stdio transport fails to spawn the process
Expected:
The MCP server starts normally, as it does in v1.80.0‑stable.
Actual:
LiteLLM throws a FileNotFoundError before the MCP handshake begins.
Relevant log output
2026-01-19T14:39:20.8203113Z INFO: 169.254.129.7:50834 - "POST /v1/mcp/server HTTP/1.1" 201 Created
2026-01-19T14:39:37.4871089Z �[92m14:39:37 - LiteLLM:WARNING�[0m: client.py:127 - MCP client run_with_session failed for stdio
2026-01-19T14:39:37.4871692Z WARNING:LiteLLM:MCP client run_with_session failed for stdio
2026-01-19T14:39:37.4960499Z �[92m14:39:37 - LiteLLM:ERROR�[0m: client.py:224 - MCP client list_tools failed - Error Type: FileNotFoundError, Error: [Errno 2] No such file or directory, Server: stdio, Transport: MCPTransport.stdio
2026-01-19T14:39:37.4960939Z Traceback (most recent call last):
2026-01-19T14:39:37.4961053Z File "/usr/lib/python3.13/site-packages/litellm/experimental_mcp_client/client.py", line 212, in list_tools
2026-01-19T14:39:37.4961087Z result = await self.run_with_session(_list_tools_operation)
2026-01-19T14:39:37.4961117Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4961149Z File "/usr/lib/python3.13/site-packages/litellm/experimental_mcp_client/client.py", line 120, in run_with_session
2026-01-19T14:39:37.4961177Z async with transport_ctx as transport:
2026-01-19T14:39:37.4961206Z ^^^^^^^^^^^^^
2026-01-19T14:39:37.4961235Z File "/usr/lib/python3.13/contextlib.py", line 214, in __aenter__
2026-01-19T14:39:37.4961262Z return await anext(self.gen)
2026-01-19T14:39:37.4961289Z ^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.496132Z File "/usr/lib/python3.13/site-packages/mcp/client/stdio/__init__.py", line 124, in stdio_client
2026-01-19T14:39:37.4961348Z process = await _create_platform_compatible_process(
2026-01-19T14:39:37.4961397Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4961425Z ...<5 lines>...
2026-01-19T14:39:37.4961453Z )
2026-01-19T14:39:37.4961478Z ^
2026-01-19T14:39:37.4961509Z File "/usr/lib/python3.13/site-packages/mcp/client/stdio/__init__.py", line 251, in _create_platform_compatible_process
2026-01-19T14:39:37.4961537Z process = await anyio.open_process(
2026-01-19T14:39:37.4961563Z ^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.496159Z ...<5 lines>...
2026-01-19T14:39:37.4961617Z ) # pragma: no cover
2026-01-19T14:39:37.4961642Z ^
2026-01-19T14:39:37.4961673Z File "/usr/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 184, in open_process
2026-01-19T14:39:37.4961718Z return await get_async_backend().open_process(
2026-01-19T14:39:37.4961746Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4961774Z ...<11 lines>...
2026-01-19T14:39:37.4961799Z )
2026-01-19T14:39:37.4961825Z ^
2026-01-19T14:39:37.4961854Z File "/usr/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2552, in open_process
2026-01-19T14:39:37.4961882Z process = await asyncio.create_subprocess_exec(
2026-01-19T14:39:37.496191Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4961937Z ...<5 lines>...
2026-01-19T14:39:37.4961961Z )
2026-01-19T14:39:37.4961987Z ^
2026-01-19T14:39:37.4962033Z File "/usr/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
2026-01-19T14:39:37.4962062Z transport, protocol = await loop.subprocess_exec(
2026-01-19T14:39:37.496209Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4962115Z ...<3 lines>...
2026-01-19T14:39:37.4962142Z stderr=stderr, **kwds)
2026-01-19T14:39:37.4962168Z ^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4962196Z File "uvloop/loop.pyx", line 2841, in subprocess_exec
2026-01-19T14:39:37.4962224Z File "uvloop/loop.pyx", line 2799, in __subprocess_run
2026-01-19T14:39:37.4962253Z File "uvloop/handles/process.pyx", line 611, in uvloop.loop.UVProcessTransport.new
2026-01-19T14:39:37.4962283Z File "uvloop/handles/process.pyx", line 112, in uvloop.loop.UVProcess._init
2026-01-19T14:39:37.4962311Z FileNotFoundError: [Errno 2] No such file or directory
2026-01-19T14:39:37.4962359Z ERROR:LiteLLM:MCP client list_tools failed - Error Type: FileNotFoundError, Error: [Errno 2] No such file or directory, Server: stdio, Transport: MCPTransport.stdio
2026-01-19T14:39:37.4962387Z Traceback (most recent call last):
2026-01-19T14:39:37.4962418Z File "/usr/lib/python3.13/site-packages/litellm/experimental_mcp_client/client.py", line 212, in list_tools
2026-01-19T14:39:37.4962447Z result = await self.run_with_session(_list_tools_operation)
2026-01-19T14:39:37.4962475Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4962506Z File "/usr/lib/python3.13/site-packages/litellm/experimental_mcp_client/client.py", line 120, in run_with_session
2026-01-19T14:39:37.4962533Z async with transport_ctx as transport:
2026-01-19T14:39:37.496256Z ^^^^^^^^^^^^^
2026-01-19T14:39:37.4962589Z File "/usr/lib/python3.13/contextlib.py", line 214, in __aenter__
2026-01-19T14:39:37.4962616Z return await anext(self.gen)
2026-01-19T14:39:37.4962642Z ^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.496269Z File "/usr/lib/python3.13/site-packages/mcp/client/stdio/__init__.py", line 124, in stdio_client
2026-01-19T14:39:37.4962719Z process = await _create_platform_compatible_process(
2026-01-19T14:39:37.4962747Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4962774Z ...<5 lines>...
2026-01-19T14:39:37.4962798Z )
2026-01-19T14:39:37.4962824Z ^
2026-01-19T14:39:37.4962855Z File "/usr/lib/python3.13/site-packages/mcp/client/stdio/__init__.py", line 251, in _create_platform_compatible_process
2026-01-19T14:39:37.4962882Z process = await anyio.open_process(
2026-01-19T14:39:37.4962908Z ^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4962934Z ...<5 lines>...
2026-01-19T14:39:37.496296Z ) # pragma: no cover
2026-01-19T14:39:37.4963001Z ^
2026-01-19T14:39:37.4963032Z File "/usr/lib/python3.13/site-packages/anyio/_core/_subprocesses.py", line 184, in open_process
2026-01-19T14:39:37.496306Z return await get_async_backend().open_process(
2026-01-19T14:39:37.4963087Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4963113Z ...<11 lines>...
2026-01-19T14:39:37.4963138Z )
2026-01-19T14:39:37.4963163Z ^
2026-01-19T14:39:37.4963193Z File "/usr/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 2552, in open_process
2026-01-19T14:39:37.4963221Z process = await asyncio.create_subprocess_exec(
2026-01-19T14:39:37.4963249Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4963275Z ...<5 lines>...
2026-01-19T14:39:37.4963316Z )
2026-01-19T14:39:37.4963602Z ^
2026-01-19T14:39:37.4963635Z File "/usr/lib/python3.13/asyncio/subprocess.py", line 224, in create_subprocess_exec
2026-01-19T14:39:37.4963664Z transport, protocol = await loop.subprocess_exec(
2026-01-19T14:39:37.4963692Z ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.4963718Z ...<3 lines>...
2026-01-19T14:39:37.4963745Z stderr=stderr, **kwds)
2026-01-19T14:39:37.4963772Z ^^^^^^^^^^^^^^^^^^^^^^
2026-01-19T14:39:37.49638Z File "uvloop/loop.pyx", line 2841, in subprocess_exec
2026-01-19T14:39:37.4963828Z File "uvloop/loop.pyx", line 2799, in __subprocess_run
2026-01-19T14:39:37.4963857Z File "uvloop/handles/process.pyx", line 611, in uvloop.loop.UVProcessTransport.new
2026-01-19T14:39:37.4963906Z File "uvloop/handles/process.pyx", line 112, in uvloop.loop.UVProcess._init
2026-01-19T14:39:37.4963936Z FileNotFoundError: [Errno 2] No such file or directory
What part of LiteLLM is this about?
Proxy
What LiteLLM version are you on ?
v1.80.15‑stable.1
Twitter / LinkedIn details
No response
Check for existing issues
What happened?
When upgrading LiteLLM from v1.80.0‑stable to v1.80.15‑stable.1, uvx time MCP stdio server stops working.
The same MCP configuration that previously worked now fails with:
FileNotFoundError: [Errno 2] No such file or directoryLiteLLM is unable to spawn the stdio MCP server process, even though the command works when executed manually.
This is a regression introduced between the two versions.
Is it possible that uvx is not installed in the docker image anymore?
Might the reason be, that you changed the docker base image from cgr.dev/chainguard/python:latest-dev to cgr.dev/chainguard/wolfi-base?
Steps to Reproduce
Expected:
The MCP server starts normally, as it does in v1.80.0‑stable.
Actual:
LiteLLM throws a FileNotFoundError before the MCP handshake begins.
Relevant log output
What part of LiteLLM is this about?
Proxy
What LiteLLM version are you on ?
v1.80.15‑stable.1
Twitter / LinkedIn details
No response