Skip to content

[MEDIUM][Clarity] Massive Tool Dispatch Function with 15+ Identical Patterns #179

@filthyrake

Description

@filthyrake

Summary

The _call_tool method is a 50+ line conditional chain with repetitive validation patterns that obscure business logic.

Affected Files

  • idrac-mcp/working_mcp_server.py:783-838
  • proxmox-mcp/working_proxmox_server.py:554-895
  • pfsense-mcp/src/http_pfsense_server.py:475-628

Problem

if name == "power_on":
    server_id, error = self._validate_and_get_server_id(arguments)
    if error:
        return error
    result = self.idrac_clients[server_id].power_on()
elif name == "power_off":
    server_id, error = self._validate_and_get_server_id(arguments)
    if error:
        return error
    result = self.idrac_clients[server_id].power_off()
# ... 15 more identical patterns

Recommended Fix

Use a dispatch table with declarative tool definitions:

self.tool_handlers = {
    "list_servers": ToolDefinition(
        handler=lambda args: {"servers": list(self.servers.keys())},
        requires_server_validation=False
    ),
    "power_on": ToolDefinition(
        handler=lambda args, sid: self.idrac_clients[sid].power_on(),
        requires_server_validation=True
    ),
}

def _call_tool(self, name: str, arguments: Dict) -> Dict:
    tool_def = self.tool_handlers.get(name)
    if tool_def.requires_server_validation:
        server_id, error = self._validate_and_get_server_id(arguments)
        if error:
            return error
        return tool_def.handler(arguments, server_id)
    return tool_def.handler(arguments)

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    category: code-qualityCode quality and maintainabilityenhancementNew feature or requestidrac-mcpIssues specific to iDRAC MCP serverpfsense-mcpIssues specific to pfSense MCP serverproxmox-mcpIssues specific to Proxmox MCP serverseverity: mediumMedium priority issue

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions