Skip to content

[Bug]: official uvx time MCP stdio server fails to start in LiteLLM v1.80.15‑stable.1 (worked in v1.80.0‑stable) #19361

@cirellamhcs

Description

@cirellamhcs

Check for existing issues

  • I have searched the existing issues and checked that my issue is not a duplicate.

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

  1. Install LiteLLM v1.80.15‑stable.1
  2. Add the following MCP server configuration:
{
  "mcpServers": {
    "time": {
      "command": "uvx",
      "args": ["mcp-server-time"]
    }
  }
}
  1. Start LiteLLM and trigger any MCP operation (e.g., list_tools)
  2. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingproxy

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions