Skip to content

Commit ad6ba8f

Browse files
Merge pull request #14695 from uc4w6c/fix/mcp-gateway-tools-list
Fix/mcp gateway tools list
2 parents d5a839d + 7f8b1d0 commit ad6ba8f

File tree

29 files changed

+2116
-1638
lines changed

29 files changed

+2116
-1638
lines changed

docs/my-website/docs/mcp.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ mcp_servers:
114114
description: "My custom MCP server"
115115
auth_type: "api_key"
116116
auth_value: "abc123"
117-
spec_version: "2025-03-26"
118117
```
119118
120119
**Configuration Options:**
@@ -716,7 +715,6 @@ mcp_servers:
716715
url: https://mcp.deepwiki.com/mcp
717716
transport: "http"
718717
auth_type: "none"
719-
spec_version: "2025-03-26"
720718
access_groups: ["dev_group"]
721719
```
722720
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
Warnings:
3+
4+
- You are about to drop the column `spec_version` on the `LiteLLM_MCPServerTable` table. All the data in the column will be lost.
5+
6+
*/
7+
-- AlterTable
8+
ALTER TABLE "public"."LiteLLM_MCPServerTable" DROP COLUMN "spec_version";

litellm-proxy-extras/litellm_proxy_extras/schema.prisma

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ model LiteLLM_MCPServerTable {
171171
description String?
172172
url String?
173173
transport String @default("sse")
174-
spec_version String @default("2025-03-26")
175174
auth_type String?
176175
created_at DateTime? @default(now()) @map("created_at")
177176
created_by String?

litellm/experimental_mcp_client/client.py

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
from litellm.types.mcp import (
2020
MCPAuth,
2121
MCPAuthType,
22-
MCPSpecVersion,
23-
MCPSpecVersionType,
2422
MCPStdioConfig,
2523
MCPTransport,
2624
MCPTransportType,
@@ -48,7 +46,6 @@ def __init__(
4846
auth_value: Optional[str] = None,
4947
timeout: float = 60.0,
5048
stdio_config: Optional[MCPStdioConfig] = None,
51-
protocol_version: MCPSpecVersionType = MCPSpecVersion.jun_2025,
5249
):
5350
self.server_url: str = server_url
5451
self.transport_type: MCPTransport = transport_type
@@ -62,7 +59,6 @@ def __init__(
6259
self._session_ctx = None
6360
self._task: Optional[asyncio.Task] = None
6461
self.stdio_config: Optional[MCPStdioConfig] = stdio_config
65-
self.protocol_version: MCPSpecVersionType = protocol_version
6662

6763
# handle the basic auth value if provided
6864
if auth_value:
@@ -84,22 +80,24 @@ async def connect(self):
8480
"""Initialize the transport and session."""
8581
if self._session:
8682
return # Already connected
87-
83+
8884
try:
8985
if self.transport_type == MCPTransport.stdio:
9086
# For stdio transport, use stdio_client with command-line parameters
9187
if not self.stdio_config:
9288
raise ValueError("stdio_config is required for stdio transport")
93-
89+
9490
server_params = StdioServerParameters(
9591
command=self.stdio_config.get("command", ""),
9692
args=self.stdio_config.get("args", []),
97-
env=self.stdio_config.get("env", {})
93+
env=self.stdio_config.get("env", {}),
9894
)
99-
95+
10096
self._transport_ctx = stdio_client(server_params)
10197
self._transport = await self._transport_ctx.__aenter__()
102-
self._session_ctx = ClientSession(self._transport[0], self._transport[1])
98+
self._session_ctx = ClientSession(
99+
self._transport[0], self._transport[1]
100+
)
103101
self._session = await self._session_ctx.__aenter__()
104102
await self._session.initialize()
105103
elif self.transport_type == MCPTransport.sse:
@@ -110,7 +108,9 @@ async def connect(self):
110108
headers=headers,
111109
)
112110
self._transport = await self._transport_ctx.__aenter__()
113-
self._session_ctx = ClientSession(self._transport[0], self._transport[1])
111+
self._session_ctx = ClientSession(
112+
self._transport[0], self._transport[1]
113+
)
114114
self._session = await self._session_ctx.__aenter__()
115115
await self._session.initialize()
116116
else: # http
@@ -121,7 +121,9 @@ async def connect(self):
121121
headers=headers,
122122
)
123123
self._transport = await self._transport_ctx.__aenter__()
124-
self._session_ctx = ClientSession(self._transport[0], self._transport[1])
124+
self._session_ctx = ClientSession(
125+
self._transport[0], self._transport[1]
126+
)
125127
self._session = await self._session_ctx.__aenter__()
126128
await self._session.initialize()
127129
except ValueError as e:
@@ -185,7 +187,7 @@ def update_auth_value(self, mcp_auth_value: str):
185187
def _get_auth_headers(self) -> dict:
186188
"""Generate authentication headers based on auth type."""
187189
headers = {}
188-
190+
189191
if self._mcp_auth_value:
190192
if self.auth_type == MCPAuth.bearer_token:
191193
headers["Authorization"] = f"Bearer {self._mcp_auth_value}"
@@ -196,18 +198,8 @@ def _get_auth_headers(self) -> dict:
196198
elif self.auth_type == MCPAuth.authorization:
197199
headers["Authorization"] = self._mcp_auth_value
198200

199-
# Handle protocol version - it might be a string or enum
200-
if hasattr(self.protocol_version, 'value'):
201-
# It's an enum
202-
protocol_version_str = self.protocol_version.value
203-
else:
204-
# It's a string
205-
protocol_version_str = str(self.protocol_version)
206-
207-
headers["MCP-Protocol-Version"] = protocol_version_str
208201
return headers
209202

210-
211203
async def list_tools(self) -> List[MCPTool]:
212204
"""List available tools from the server."""
213205
if not self._session:
@@ -216,7 +208,7 @@ async def list_tools(self) -> List[MCPTool]:
216208
except Exception as e:
217209
verbose_logger.warning(f"MCP client connection failed: {str(e)}")
218210
return []
219-
211+
220212
if self._session is None:
221213
verbose_logger.warning("MCP client session is not initialized")
222214
return []
@@ -245,17 +237,20 @@ async def call_tool(
245237
except Exception as e:
246238
verbose_logger.warning(f"MCP client connection failed: {str(e)}")
247239
return MCPCallToolResult(
248-
content=[TextContent(type="text", text=f"{str(e)}")],
249-
isError=True
240+
content=[TextContent(type="text", text=f"{str(e)}")], isError=True
250241
)
251242

252243
if self._session is None:
253244
verbose_logger.warning("MCP client session is not initialized")
254245
return MCPCallToolResult(
255-
content=[TextContent(type="text", text="MCP client session is not initialized")],
246+
content=[
247+
TextContent(
248+
type="text", text="MCP client session is not initialized"
249+
)
250+
],
256251
isError=True,
257252
)
258-
253+
259254
try:
260255
tool_result = await self._session.call_tool(
261256
name=call_tool_request_params.name,
@@ -270,8 +265,8 @@ async def call_tool(
270265
await self.disconnect()
271266
# Return a default error result instead of raising
272267
return MCPCallToolResult(
273-
content=[TextContent(type="text", text=f"{str(e)}")], # Empty content for error case
268+
content=[
269+
TextContent(type="text", text=f"{str(e)}")
270+
], # Empty content for error case
274271
isError=True,
275272
)
276-
277-

0 commit comments

Comments
 (0)