suna/backend/templates/support/factory.py

54 lines
2.3 KiB
Python

from ..domain.entities import MCPRequirementValue, ConfigType
class MCPRequirementFactory:
@staticmethod
def from_configured_mcp(mcp: ConfigType) -> MCPRequirementValue:
qualified_name = mcp.get('qualifiedName') or mcp.get('qualified_name')
if not qualified_name:
raise ValueError(f"Missing qualifiedName in configured MCP: {mcp}")
display_name = mcp.get('name') or mcp.get('display_name') or qualified_name
enabled_tools = mcp.get('enabled_tools') or mcp.get('enabledTools') or []
config = mcp.get('config', {})
required_config = list(config.keys()) if isinstance(config, dict) else []
return MCPRequirementValue(
qualified_name=qualified_name,
display_name=display_name,
enabled_tools=enabled_tools,
required_config=required_config
)
@staticmethod
def from_custom_mcp(custom_mcp: ConfigType) -> MCPRequirementValue:
if 'name' not in custom_mcp:
raise ValueError(f"Missing name in custom MCP: {custom_mcp}")
custom_type = custom_mcp.get('customType') or custom_mcp.get('type') or 'http'
config = custom_mcp.get('config', {})
if custom_type == 'pipedream':
app_slug = None
if isinstance(config, dict):
app_slug = config.get('app_slug')
if not app_slug and 'headers' in config:
headers = config.get('headers', {})
if isinstance(headers, dict):
app_slug = headers.get('x-pd-app-slug')
qualified_name = f"pipedream:{app_slug}" if app_slug else f"pipedream:{custom_mcp['name'].lower().replace(' ', '_')}"
else:
qualified_name = custom_mcp['name'].lower().replace(' ', '_')
display_name = custom_mcp['name']
enabled_tools = custom_mcp.get('enabled_tools') or custom_mcp.get('enabledTools') or []
required_config = list(config.keys()) if isinstance(config, dict) else []
return MCPRequirementValue(
qualified_name=qualified_name,
display_name=display_name,
enabled_tools=enabled_tools,
required_config=required_config,
custom_type=custom_type
)