@@ -88,6 +88,9 @@ def get_remote_mcp_servers() -> List[dict[str, str]]:
8888 print (f"MCP_SERVER_NAME_MAP: { os .getenv ('MCP_SERVER_NAME_MAP' , 'NOT SET' )} " )
8989 print (f"MCP_BEARER_TOKEN: { 'SET' if os .getenv ('MCP_BEARER_TOKEN' ) else 'NOT SET' } " )
9090
91+ # Get bearer token
92+ bearer_token = os .getenv ('MCP_BEARER_TOKEN' )
93+
9194 # Load environment variable overrides
9295 name_override = _load_override ("MCP_SERVER_NAME_MAP" )
9396 url_override = _load_override ("MCP_SERVER_URL_MAP" )
@@ -100,22 +103,37 @@ def get_remote_mcp_servers() -> List[dict[str, str]]:
100103
101104 if single_server_url :
102105 print (f"🌐 Using single remote SSE MCP server: { single_server_url [:50 ]} { '...' if len (single_server_url ) > 50 else '' } " )
103- return [ {
106+ server_config = {
104107 "name" : "perplexity_server" ,
105108 "url" : single_server_url ,
106- }]
109+ }
110+ # ADD THE API KEY!
111+ if bearer_token :
112+ server_config ["api_key" ] = bearer_token
113+ return [server_config ]
107114
108115 # Check URL override map
109116 if url_override :
110117 servers = []
111118 for server_name , server_url in url_override .items ():
112119 actual_name = name_override .get (server_name , server_name )
113- servers . append ( {
120+ server_config = {
114121 "name" : actual_name ,
115122 "url" : server_url ,
116- })
123+ }
124+ # ADD THE API KEY!
125+ if bearer_token :
126+ server_config ["api_key" ] = bearer_token
127+ servers .append (server_config )
117128 print (f"🌐 Using { len (servers )} remote SSE MCP server(s) from URL map" )
118- print (f"📋 Servers: { servers } " )
129+ # Don't print the actual api_key in logs
130+ safe_servers = []
131+ for s in servers :
132+ safe_s = s .copy ()
133+ if 'api_key' in safe_s :
134+ safe_s ['api_key' ] = 'SET'
135+ safe_servers .append (safe_s )
136+ print (f"📋 Servers: { safe_servers } " )
119137 return servers
120138
121139 # No MCP configuration found
@@ -140,6 +158,8 @@ async def bootstrap_remote_mcp() -> None:
140158 print (f"🔄 Connecting to remote SSE MCP server(s)..." )
141159 for server in servers :
142160 print (f" 📡 { server ['name' ]} : { server ['url' ]} " )
161+ if 'api_key' in server :
162+ print (f" 🔑 Auth: SET" )
143163
144164 server_names = {i : srv ["name" ] for i , srv in enumerate (servers )}
145165
@@ -289,9 +309,36 @@ async def run_remote_demo() -> None:
289309 # Create generic test calls for whatever tools are available
290310 generic_calls = []
291311 for ns , tool_name in tools [:3 ]: # Test first 3 tools
312+ # Get tool metadata to determine correct arguments
313+ tool_meta = await registry .get_metadata (tool_name , ns )
314+ args = {}
315+
316+ if tool_meta and hasattr (tool_meta , 'input_schema' ):
317+ schema = tool_meta .input_schema
318+ required = schema .get ('required' , [])
319+ properties = schema .get ('properties' , {})
320+
321+ for field in required :
322+ if field in properties :
323+ prop = properties [field ]
324+ if prop .get ('type' ) == 'string' :
325+ if 'query' in field .lower ():
326+ args [field ] = f"Test query for { tool_name } "
327+ elif 'message' in field .lower ():
328+ args [field ] = f"Test message for { tool_name } "
329+ else :
330+ args [field ] = "test_string"
331+ elif prop .get ('type' ) == 'integer' :
332+ args [field ] = 1
333+ elif prop .get ('type' ) == 'boolean' :
334+ args [field ] = True
335+
336+ if not args :
337+ args = {"query" : f"Test query for { tool_name } " }
338+
292339 generic_calls .append (ToolCall (
293340 tool = f"{ ns } .{ tool_name } " ,
294- arguments = { "query" : f"Test query for { tool_name } " }
341+ arguments = args
295342 ))
296343
297344 if generic_calls :
@@ -321,9 +368,61 @@ async def run_remote_demo() -> None:
321368
322369 parallel_calls = []
323370 for i , (ns , tool_name ) in enumerate (tools [:3 ]): # Max 3 parallel
371+ # Get tool metadata to build correct arguments
372+ tool_meta = await registry .get_metadata (tool_name , ns )
373+
374+ # Build arguments based on tool requirements
375+ if tool_name == "echo" :
376+ args = {"message" : f"Parallel test { i + 1 } : Hello from SSE!" }
377+ elif tool_name == "get_current_time" :
378+ args = {"timezone" : "UTC" }
379+ elif tool_name == "convert_time" :
380+ args = {
381+ "source_timezone" : "UTC" ,
382+ "time" : "12:00" ,
383+ "target_timezone" : "America/New_York"
384+ }
385+ elif tool_name == "ping" :
386+ args = {"host" : "google.com" }
387+ elif tool_name == "tcp_ping" :
388+ args = {"host" : "google.com" , "port" : 80 }
389+ elif tool_name == "perplexity_search" :
390+ args = {"query" : f"Parallel test query { i + 1 } " }
391+ elif tool_name == "perplexity_quick_fact" :
392+ args = {"query" : f"What is test fact { i + 1 } ?" }
393+ elif tool_name == "google_search" :
394+ args = {"query" : f"Test search { i + 1 } " }
395+ elif tool_name == "wikipedia_search" :
396+ args = {"query" : "Python programming" }
397+ else :
398+ # For unknown tools, try to build minimal valid args from schema
399+ args = {}
400+ if tool_meta and hasattr (tool_meta , 'input_schema' ):
401+ schema = tool_meta .input_schema
402+ required = schema .get ('required' , [])
403+ properties = schema .get ('properties' , {})
404+
405+ for field in required [:1 ]: # Just fill first required field
406+ if field in properties :
407+ prop = properties [field ]
408+ if prop .get ('type' ) == 'string' :
409+ # Check if it's likely a query field
410+ if 'query' in field .lower () or 'message' in field .lower () or 'text' in field .lower ():
411+ args [field ] = f"Parallel test { i + 1 } "
412+ elif 'timezone' in field .lower ():
413+ args [field ] = "UTC"
414+ elif 'host' in field .lower ():
415+ args [field ] = "example.com"
416+ else :
417+ args [field ] = "test_value"
418+ elif prop .get ('type' ) == 'integer' :
419+ args [field ] = 1
420+ elif prop .get ('type' ) == 'boolean' :
421+ args [field ] = True
422+
324423 parallel_calls .append (ToolCall (
325424 tool = f"{ ns } .{ tool_name } " ,
326- arguments = { "query" : f"Parallel test query { i + 1 } for { tool_name } " }
425+ arguments = args
327426 ))
328427
329428 try :
0 commit comments