From 88bbd732fce4b3dca968e3a289f57eae16a87dac Mon Sep 17 00:00:00 2001 From: jnjpng Date: Tue, 15 Jul 2025 14:44:48 -0700 Subject: [PATCH] fix: environment variable handling for stdio mcp (#3340) Co-authored-by: Jin Peng --- letta/server/rest_api/routers/v1/tools.py | 4 ++-- letta/services/mcp/stdio_client.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 4feec778..aaed7782 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -20,7 +20,7 @@ from letta.helpers.composio_helpers import get_composio_api_key from letta.log import get_logger from letta.orm.errors import UniqueConstraintViolationError from letta.schemas.letta_message import ToolReturnMessage -from letta.schemas.mcp import UpdateSSEMCPServer, UpdateStreamableHTTPMCPServer +from letta.schemas.mcp import UpdateSSEMCPServer, UpdateStdioMCPServer, UpdateStreamableHTTPMCPServer from letta.schemas.tool import Tool, ToolCreate, ToolRunFromSource, ToolUpdate from letta.server.rest_api.utils import get_letta_server from letta.server.server import SyncServer @@ -550,7 +550,7 @@ async def add_mcp_server_to_config( ) async def update_mcp_server( mcp_server_name: str, - request: Union[UpdateSSEMCPServer, UpdateStreamableHTTPMCPServer] = Body(...), + request: Union[UpdateStdioMCPServer, UpdateSSEMCPServer, UpdateStreamableHTTPMCPServer] = Body(...), server: SyncServer = Depends(get_letta_server), actor_id: Optional[str] = Header(None, alias="user_id"), ): diff --git a/letta/services/mcp/stdio_client.py b/letta/services/mcp/stdio_client.py index 166ee06c..f7b2c716 100644 --- a/letta/services/mcp/stdio_client.py +++ b/letta/services/mcp/stdio_client.py @@ -11,11 +11,10 @@ logger = get_logger(__name__) # TODO: Get rid of Async prefix on this class name once we deprecate old sync code class AsyncStdioMCPClient(AsyncBaseMCPClient): async def _initialize_connection(self, server_config: StdioServerConfig) -> None: - args = [arg.split() for arg in server_config.args] # flatten args = [arg for sublist in args for arg in sublist] - server_params = StdioServerParameters(command=server_config.command, args=args) + server_params = StdioServerParameters(command=server_config.command, args=args, env=server_config.env) stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params)) self.stdio, self.write = stdio_transport self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))