@@ -71,6 +71,16 @@ def validate_server_config(server_name: str, server_cfg: Dict[str, Any]) -> None
7171 # Fallback for old SSE config without explicit type
7272 pass
7373 else :
74+ raise ValueError (f"Server '{ server_name } ' must have either 'command' for stdio or 'type' and 'url' for remote servers" )
75+
76+ # Validate disabledTools
77+ disabled_tools = server_cfg .get ("disabled_tools" )
78+ if disabled_tools is not None :
79+ if not isinstance (disabled_tools , list ):
80+ raise ValueError (f"Server '{ server_name } ' 'disabledTools' must be a list" )
81+ for tool_name in disabled_tools :
82+ if not isinstance (tool_name , str ):
83+ raise ValueError (f"Server '{ server_name } ' 'disabledTools' must contain only strings" )
7484 raise ValueError (
7585 f"Server '{ server_name } ' must have either 'command' for stdio or 'type' and 'url' for remote servers"
7686 )
@@ -167,6 +177,10 @@ def create_sub_app(
167177 sub_app .state .api_dependency = api_dependency
168178 sub_app .state .connection_timeout = connection_timeout
169179
180+ # Store list of tools to be disabled, if present
181+ sub_app .state .disabled_tools = server_cfg .get ("disabled_tools" , [])
182+
183+
170184 # Store client header forwarding configuration
171185 sub_app .state .client_header_forwarding = server_cfg .get (
172186 "client_header_forwarding" , {"enabled" : False }
@@ -175,6 +189,7 @@ def create_sub_app(
175189 # Store OAuth configuration if present
176190 sub_app .state .oauth_config = server_cfg .get ("oauth" )
177191
192+
178193 return sub_app
179194
180195
@@ -346,6 +361,15 @@ async def create_dynamic_endpoints(app: FastAPI, api_dependency=None):
346361
347362 tools_result = await session .list_tools ()
348363 tools = tools_result .tools
364+
365+ # Filter out disabled tools
366+ disabled_tools = getattr (app .state , "disabled_tools" , [])
367+ if disabled_tools :
368+ original_count = len (tools )
369+ tools = [tool for tool in tools if tool .name not in disabled_tools ]
370+ filtered_count = original_count - len (tools )
371+ if filtered_count > 0 :
372+ logger .info (f"Filtered out { filtered_count } tool(s) for server '{ app .title } ': { disabled_tools } " )
349373
350374 for tool in tools :
351375 endpoint_name = tool .name
0 commit comments