From 4ca143e8af313afa3fb398c878a48c2701e03f08 Mon Sep 17 00:00:00 2001 From: RuiDaniel Date: Tue, 25 Nov 2025 18:27:22 +0000 Subject: [PATCH 1/6] add mcp filters to client --- src/pipecat/services/mcp_service.py | 34 ++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/pipecat/services/mcp_service.py b/src/pipecat/services/mcp_service.py index 2c1a53768..56f498c15 100644 --- a/src/pipecat/services/mcp_service.py +++ b/src/pipecat/services/mcp_service.py @@ -7,7 +7,7 @@ """MCP (Model Context Protocol) client for integrating external tools with LLMs.""" import json -from typing import Any, Dict, List, TypeAlias +from typing import Any, Dict, List, TypeAlias, Callable from loguru import logger @@ -46,17 +46,24 @@ class MCPClient(BaseObject): def __init__( self, server_params: ServerParameters, + tools_filter: List[str] | None = None, + tools_output_filters: Dict[str, Callable[[Any], Any]] | None = None, **kwargs, ): """Initialize the MCP client with server parameters. Args: server_params: Server connection parameters (stdio or SSE). + tools_filter: Optional list of tool names to register. If None, all tools are registered. + tools_output_filters: Optional dict mapping tool names to filter functions that process tool outputs. + Each filter function receives the raw tool output (any type) and returns the processed output (any type). **kwargs: Additional arguments passed to the parent BaseObject. """ super().__init__(**kwargs) self._server_params = server_params self._session = ClientSession + self._tools_filter = tools_filter + self._tools_output_filters = tools_output_filters or {} if isinstance(server_params, StdioServerParameters): self._client = stdio_client @@ -264,13 +271,24 @@ class MCPClient(BaseObject): else: # logger.debug(f"Non-text result content: '{content}'") pass - logger.info(f"Tool '{function_name}' completed successfully") - logger.debug(f"Final response: {response}") else: logger.error(f"Error getting content from {function_name} results.") - final_response = response if len(response) else "Sorry, could not call the mcp tool" - await result_callback(final_response) + # Apply output filter if configured for this tool + if function_name in self._tools_output_filters: + try: + response = self._tools_output_filters[function_name](response) + logger.debug(f"Final response (after filter): {response}") + + except Exception: + logger.error("Error applying output filter") + response = "" + + if response and isinstance(response, str): + logger.info(f"Tool '{function_name}' completed successfully") + logger.debug(f"Final response: {response}") + + await result_callback(response) async def _list_tools_helper(self, session): available_tools = await session.list_tools() @@ -283,6 +301,12 @@ class MCPClient(BaseObject): for tool in available_tools.tools: tool_name = tool.name + + # Apply tools filter if configured + if self._tools_filter and tool_name not in self._tools_filter: + logger.debug(f"Skipping tool '{tool_name}' - not in allowed tools list") + continue + logger.debug(f"Processing tool: {tool_name}") logger.debug(f"Tool description: {tool.description}") From 7961f8a6647bdb2fe409720fcefc756d58f3c009 Mon Sep 17 00:00:00 2001 From: RuiDaniel Date: Tue, 25 Nov 2025 18:35:59 +0000 Subject: [PATCH 2/6] same behaviour on error --- src/pipecat/services/mcp_service.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pipecat/services/mcp_service.py b/src/pipecat/services/mcp_service.py index 56f498c15..be7da4a46 100644 --- a/src/pipecat/services/mcp_service.py +++ b/src/pipecat/services/mcp_service.py @@ -284,9 +284,11 @@ class MCPClient(BaseObject): logger.error("Error applying output filter") response = "" - if response and isinstance(response, str): + if response and len(response) and isinstance(response, str): logger.info(f"Tool '{function_name}' completed successfully") logger.debug(f"Final response: {response}") + else: + response = "Sorry, could not call the mcp tool" await result_callback(response) From 406bdfad0d13d6d4e399f2aa9705d471dc5beec9 Mon Sep 17 00:00:00 2001 From: Rpcd <67294809+RuiDaniel@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:21:59 +0000 Subject: [PATCH 3/6] Update src/pipecat/services/mcp_service.py Co-authored-by: Vanessa Pyne --- src/pipecat/services/mcp_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pipecat/services/mcp_service.py b/src/pipecat/services/mcp_service.py index be7da4a46..0891f4e06 100644 --- a/src/pipecat/services/mcp_service.py +++ b/src/pipecat/services/mcp_service.py @@ -46,7 +46,7 @@ class MCPClient(BaseObject): def __init__( self, server_params: ServerParameters, - tools_filter: List[str] | None = None, + tools_filter: Optional[List[str]] = None, tools_output_filters: Dict[str, Callable[[Any], Any]] | None = None, **kwargs, ): From 435b53f1a0e8dd39d62c1bba07d282f8b6c2c5e8 Mon Sep 17 00:00:00 2001 From: Rpcd <67294809+RuiDaniel@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:22:08 +0000 Subject: [PATCH 4/6] Update src/pipecat/services/mcp_service.py Co-authored-by: Vanessa Pyne --- src/pipecat/services/mcp_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pipecat/services/mcp_service.py b/src/pipecat/services/mcp_service.py index 0891f4e06..8e4b47013 100644 --- a/src/pipecat/services/mcp_service.py +++ b/src/pipecat/services/mcp_service.py @@ -281,7 +281,7 @@ class MCPClient(BaseObject): logger.debug(f"Final response (after filter): {response}") except Exception: - logger.error("Error applying output filter") + logger.error(f"Error applying output filter for {function_name}") response = "" if response and len(response) and isinstance(response, str): From 0bbb14eb9bacd3aea2e7382c28401d08c605aefe Mon Sep 17 00:00:00 2001 From: Rpcd <67294809+RuiDaniel@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:28:29 +0000 Subject: [PATCH 5/6] Update src/pipecat/services/mcp_service.py Co-authored-by: Vanessa Pyne --- src/pipecat/services/mcp_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pipecat/services/mcp_service.py b/src/pipecat/services/mcp_service.py index 8e4b47013..288461da6 100644 --- a/src/pipecat/services/mcp_service.py +++ b/src/pipecat/services/mcp_service.py @@ -7,7 +7,7 @@ """MCP (Model Context Protocol) client for integrating external tools with LLMs.""" import json -from typing import Any, Dict, List, TypeAlias, Callable +from typing import Any, Callable, Dict, List, Optional, TypeAlias from loguru import logger From 9dd882ecf8cce5a12499097eda28038eee8f88d6 Mon Sep 17 00:00:00 2001 From: Rpcd <67294809+RuiDaniel@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:28:37 +0000 Subject: [PATCH 6/6] Update src/pipecat/services/mcp_service.py Co-authored-by: Vanessa Pyne --- src/pipecat/services/mcp_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pipecat/services/mcp_service.py b/src/pipecat/services/mcp_service.py index 288461da6..8760c439c 100644 --- a/src/pipecat/services/mcp_service.py +++ b/src/pipecat/services/mcp_service.py @@ -47,7 +47,7 @@ class MCPClient(BaseObject): self, server_params: ServerParameters, tools_filter: Optional[List[str]] = None, - tools_output_filters: Dict[str, Callable[[Any], Any]] | None = None, + tools_output_filters: Optional[Dict[str, Callable[[Any], Any]]] = None, **kwargs, ): """Initialize the MCP client with server parameters.