Execute a tool on an MCP server This function creates a fresh connection for each tool execution to ensure reliability.
(server_name: str, tool_name: str, arguments: Dict[str, Any])
| 662 | return {"error": f"Error executing tool: {str(e)}"} |
| 663 | |
| 664 | async def execute_tool(server_name: str, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]: |
| 665 | """ |
| 666 | Execute a tool on an MCP server |
| 667 | |
| 668 | This function creates a fresh connection for each tool execution to ensure reliability. |
| 669 | """ |
| 670 | logger.info(f"Executing tool {tool_name} on server {server_name} with arguments: {arguments}") |
| 671 | |
| 672 | # Load configuration |
| 673 | config_manager = MCPConfigManager() |
| 674 | if not config_manager.load_config(): |
| 675 | return {"error": "Failed to load MCP configuration"} |
| 676 | |
| 677 | # Get server configuration |
| 678 | server_config = config_manager.servers.get(server_name) |
| 679 | if not server_config: |
| 680 | return {"error": f"Server {server_name} not found in configuration"} |
| 681 | |
| 682 | # Log the tool call in detail |
| 683 | logger.debug(f"Tool call details:") |
| 684 | logger.debug(f" Server: {server_name}") |
| 685 | logger.debug(f" Tool: {tool_name}") |
| 686 | logger.debug(f" Arguments: {json.dumps(arguments, indent=2)}") |
| 687 | logger.debug(f" Transport: {server_config.transport}") |
| 688 | |
| 689 | try: |
| 690 | # Route to appropriate transport |
| 691 | if server_config.transport == "stdio": |
| 692 | return await execute_tool_stdio(server_config, tool_name, arguments) |
| 693 | elif server_config.transport == "sse": |
| 694 | return await execute_tool_sse(server_config, tool_name, arguments) |
| 695 | elif server_config.transport == "websocket": |
| 696 | return await execute_tool_websocket(server_config, tool_name, arguments) |
| 697 | else: |
| 698 | return {"error": f"Unsupported transport type: {server_config.transport}"} |
| 699 | |
| 700 | except Exception as e: |
| 701 | logger.error(f"Error executing tool {tool_name} on server {server_name}: {e}") |
| 702 | logger.error(traceback.format_exc()) |
| 703 | return {"error": f"Error executing tool: {str(e)}"} |
| 704 | |
| 705 | async def execute_tool_stdio(server_config: ServerConfig, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]: |
| 706 | """Execute tool using stdio transport""" |