Skip to content

Commit 7d47c4c

Browse files
committed
Implement ResilientMcpToolset for improved error handling in MCP connections and update layout title to "K-Dense BYOK".
1 parent 139fa60 commit 7d47c4c

2 files changed

Lines changed: 55 additions & 13 deletions

File tree

kady_agent/mcps.py

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,73 @@
1+
import logging
12
import os
3+
from typing import List, Optional
24

5+
from google.adk.agents.readonly_context import ReadonlyContext
6+
from google.adk.tools.base_tool import BaseTool
7+
from google.adk.tools.base_toolset import BaseToolset
38
from google.adk.tools.mcp_tool import McpToolset
49
from google.adk.tools.mcp_tool.mcp_session_manager import (
510
StdioConnectionParams,
611
StdioServerParameters,
712
StreamableHTTPConnectionParams,
813
)
914

10-
all_mcps = []
15+
logger = logging.getLogger(__name__)
16+
17+
18+
class ResilientMcpToolset(BaseToolset):
19+
"""Wraps an McpToolset so that connection failures log a warning
20+
instead of crashing the agent run."""
21+
22+
def __init__(self, inner: McpToolset, label: str = "MCP"):
23+
super().__init__(
24+
tool_filter=inner.tool_filter,
25+
tool_name_prefix=inner.tool_name_prefix,
26+
)
27+
self._inner = inner
28+
self._label = label
29+
30+
async def get_tools(
31+
self, readonly_context: Optional[ReadonlyContext] = None
32+
) -> List[BaseTool]:
33+
try:
34+
return await self._inner.get_tools(readonly_context)
35+
except Exception as exc:
36+
logger.warning("%s unavailable, skipping its tools: %s", self._label, exc)
37+
return []
38+
39+
async def close(self) -> None:
40+
try:
41+
await self._inner.close()
42+
except Exception:
43+
pass
44+
45+
46+
all_mcps: list[BaseToolset] = []
1147

1248
if os.getenv("PARALLEL_API_KEY"):
13-
parallel_search_mcp = McpToolset(
14-
connection_params=StreamableHTTPConnectionParams(
15-
url="https://search-mcp.parallel.ai/mcp",
16-
headers={"Authorization": f"Bearer {os.getenv('PARALLEL_API_KEY')}"},
17-
timeout=600,
49+
parallel_search_mcp = ResilientMcpToolset(
50+
McpToolset(
51+
connection_params=StreamableHTTPConnectionParams(
52+
url="https://search-mcp.parallel.ai/mcp",
53+
headers={"Authorization": f"Bearer {os.getenv('PARALLEL_API_KEY')}"},
54+
timeout=600,
55+
),
1856
),
57+
label="Parallel Search MCP",
1958
)
2059
all_mcps.append(parallel_search_mcp)
2160

22-
docling_mcp = McpToolset(
23-
connection_params=StdioConnectionParams(
24-
server_params=StdioServerParameters(
25-
command="uvx",
26-
args=["--from=docling-mcp", "docling-mcp-server"],
61+
docling_mcp = ResilientMcpToolset(
62+
McpToolset(
63+
connection_params=StdioConnectionParams(
64+
server_params=StdioServerParameters(
65+
command="uvx",
66+
args=["--from=docling-mcp", "docling-mcp-server"],
67+
),
68+
timeout=120.0,
2769
),
28-
timeout=120.0,
2970
),
71+
label="Docling MCP",
3072
)
3173
all_mcps.append(docling_mcp)

web/src/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const geistMono = Geist_Mono({
1414
});
1515

1616
export const metadata: Metadata = {
17-
title: "Kady",
17+
title: "K-Dense BYOK",
1818
description: "Multi-agent research assistant",
1919
};
2020

0 commit comments

Comments
 (0)