claude-mpm 3.9.6__py3-none-any.whl → 3.9.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/templates/ticketing.json +1 -1
- claude_mpm/services/__init__.py +28 -0
- claude_mpm/services/mcp_gateway/__init__.py +122 -0
- claude_mpm/services/mcp_gateway/config/__init__.py +17 -0
- claude_mpm/services/mcp_gateway/config/config_loader.py +232 -0
- claude_mpm/services/mcp_gateway/config/config_schema.py +234 -0
- claude_mpm/services/mcp_gateway/config/configuration.py +371 -0
- claude_mpm/services/mcp_gateway/core/__init__.py +51 -0
- claude_mpm/services/mcp_gateway/core/base.py +315 -0
- claude_mpm/services/mcp_gateway/core/exceptions.py +239 -0
- claude_mpm/services/mcp_gateway/core/interfaces.py +476 -0
- claude_mpm/services/mcp_gateway/registry/__init__.py +9 -0
- claude_mpm/services/mcp_gateway/server/__init__.py +9 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +9 -0
- {claude_mpm-3.9.6.dist-info → claude_mpm-3.9.8.dist-info}/METADATA +2 -1
- {claude_mpm-3.9.6.dist-info → claude_mpm-3.9.8.dist-info}/RECORD +21 -9
- {claude_mpm-3.9.6.dist-info → claude_mpm-3.9.8.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.6.dist-info → claude_mpm-3.9.8.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.9.6.dist-info → claude_mpm-3.9.8.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.9.6.dist-info → claude_mpm-3.9.8.dist-info}/top_level.txt +0 -0
| @@ -0,0 +1,476 @@ | |
| 1 | 
            +
            """
         | 
| 2 | 
            +
            MCP Gateway Interface Definitions
         | 
| 3 | 
            +
            ==================================
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            This module defines the core interfaces for the MCP Gateway service,
         | 
| 6 | 
            +
            establishing contracts for dependency injection and service orchestration.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
         | 
| 9 | 
            +
            """
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            from abc import ABC, abstractmethod
         | 
| 12 | 
            +
            from typing import Any, Dict, List, Optional, Callable, Union
         | 
| 13 | 
            +
            from dataclasses import dataclass
         | 
| 14 | 
            +
            from datetime import datetime
         | 
| 15 | 
            +
            from pathlib import Path
         | 
| 16 | 
            +
            import asyncio
         | 
| 17 | 
            +
             | 
| 18 | 
            +
             | 
| 19 | 
            +
            # Tool-related data structures
         | 
| 20 | 
            +
            @dataclass
         | 
| 21 | 
            +
            class MCPToolDefinition:
         | 
| 22 | 
            +
                """Definition of an MCP tool."""
         | 
| 23 | 
            +
                name: str
         | 
| 24 | 
            +
                description: str
         | 
| 25 | 
            +
                input_schema: Dict[str, Any]
         | 
| 26 | 
            +
                output_schema: Optional[Dict[str, Any]] = None
         | 
| 27 | 
            +
                version: str = "1.0.0"
         | 
| 28 | 
            +
                metadata: Optional[Dict[str, Any]] = None
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
            @dataclass
         | 
| 32 | 
            +
            class MCPToolInvocation:
         | 
| 33 | 
            +
                """Represents a tool invocation request."""
         | 
| 34 | 
            +
                tool_name: str
         | 
| 35 | 
            +
                parameters: Dict[str, Any]
         | 
| 36 | 
            +
                context: Optional[Dict[str, Any]] = None
         | 
| 37 | 
            +
                timeout: Optional[float] = None
         | 
| 38 | 
            +
                request_id: Optional[str] = None
         | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 41 | 
            +
            @dataclass
         | 
| 42 | 
            +
            class MCPToolResult:
         | 
| 43 | 
            +
                """Result from a tool invocation."""
         | 
| 44 | 
            +
                success: bool
         | 
| 45 | 
            +
                data: Optional[Any] = None
         | 
| 46 | 
            +
                error: Optional[str] = None
         | 
| 47 | 
            +
                metadata: Optional[Dict[str, Any]] = None
         | 
| 48 | 
            +
                execution_time: Optional[float] = None
         | 
| 49 | 
            +
             | 
| 50 | 
            +
             | 
| 51 | 
            +
            # Core MCP interfaces
         | 
| 52 | 
            +
            class IMCPConfiguration(ABC):
         | 
| 53 | 
            +
                """
         | 
| 54 | 
            +
                Interface for MCP configuration management.
         | 
| 55 | 
            +
                
         | 
| 56 | 
            +
                Handles loading, validation, and access to MCP Gateway configuration.
         | 
| 57 | 
            +
                """
         | 
| 58 | 
            +
                
         | 
| 59 | 
            +
                @abstractmethod
         | 
| 60 | 
            +
                def load_config(self, config_path: Path) -> bool:
         | 
| 61 | 
            +
                    """
         | 
| 62 | 
            +
                    Load configuration from a file.
         | 
| 63 | 
            +
                    
         | 
| 64 | 
            +
                    Args:
         | 
| 65 | 
            +
                        config_path: Path to configuration file
         | 
| 66 | 
            +
                        
         | 
| 67 | 
            +
                    Returns:
         | 
| 68 | 
            +
                        True if configuration loaded successfully
         | 
| 69 | 
            +
                    """
         | 
| 70 | 
            +
                    pass
         | 
| 71 | 
            +
                
         | 
| 72 | 
            +
                @abstractmethod
         | 
| 73 | 
            +
                def get(self, key: str, default: Any = None) -> Any:
         | 
| 74 | 
            +
                    """
         | 
| 75 | 
            +
                    Get configuration value by key.
         | 
| 76 | 
            +
                    
         | 
| 77 | 
            +
                    Args:
         | 
| 78 | 
            +
                        key: Configuration key (supports dot notation)
         | 
| 79 | 
            +
                        default: Default value if key not found
         | 
| 80 | 
            +
                        
         | 
| 81 | 
            +
                    Returns:
         | 
| 82 | 
            +
                        Configuration value or default
         | 
| 83 | 
            +
                    """
         | 
| 84 | 
            +
                    pass
         | 
| 85 | 
            +
                
         | 
| 86 | 
            +
                @abstractmethod
         | 
| 87 | 
            +
                def set(self, key: str, value: Any) -> None:
         | 
| 88 | 
            +
                    """
         | 
| 89 | 
            +
                    Set configuration value.
         | 
| 90 | 
            +
                    
         | 
| 91 | 
            +
                    Args:
         | 
| 92 | 
            +
                        key: Configuration key (supports dot notation)
         | 
| 93 | 
            +
                        value: Configuration value
         | 
| 94 | 
            +
                    """
         | 
| 95 | 
            +
                    pass
         | 
| 96 | 
            +
                
         | 
| 97 | 
            +
                @abstractmethod
         | 
| 98 | 
            +
                def validate(self) -> bool:
         | 
| 99 | 
            +
                    """
         | 
| 100 | 
            +
                    Validate the current configuration.
         | 
| 101 | 
            +
                    
         | 
| 102 | 
            +
                    Returns:
         | 
| 103 | 
            +
                        True if configuration is valid
         | 
| 104 | 
            +
                    """
         | 
| 105 | 
            +
                    pass
         | 
| 106 | 
            +
                
         | 
| 107 | 
            +
                @abstractmethod
         | 
| 108 | 
            +
                def get_server_config(self) -> Dict[str, Any]:
         | 
| 109 | 
            +
                    """
         | 
| 110 | 
            +
                    Get MCP server configuration.
         | 
| 111 | 
            +
                    
         | 
| 112 | 
            +
                    Returns:
         | 
| 113 | 
            +
                        Server configuration dictionary
         | 
| 114 | 
            +
                    """
         | 
| 115 | 
            +
                    pass
         | 
| 116 | 
            +
                
         | 
| 117 | 
            +
                @abstractmethod
         | 
| 118 | 
            +
                def get_tools_config(self) -> Dict[str, Any]:
         | 
| 119 | 
            +
                    """
         | 
| 120 | 
            +
                    Get tools configuration.
         | 
| 121 | 
            +
                    
         | 
| 122 | 
            +
                    Returns:
         | 
| 123 | 
            +
                        Tools configuration dictionary
         | 
| 124 | 
            +
                    """
         | 
| 125 | 
            +
                    pass
         | 
| 126 | 
            +
             | 
| 127 | 
            +
             | 
| 128 | 
            +
            class IMCPToolAdapter(ABC):
         | 
| 129 | 
            +
                """
         | 
| 130 | 
            +
                Interface for MCP tool adapters.
         | 
| 131 | 
            +
                
         | 
| 132 | 
            +
                Tool adapters wrap external tools to make them MCP-compatible.
         | 
| 133 | 
            +
                """
         | 
| 134 | 
            +
                
         | 
| 135 | 
            +
                @abstractmethod
         | 
| 136 | 
            +
                def get_definition(self) -> MCPToolDefinition:
         | 
| 137 | 
            +
                    """
         | 
| 138 | 
            +
                    Get the tool definition.
         | 
| 139 | 
            +
                    
         | 
| 140 | 
            +
                    Returns:
         | 
| 141 | 
            +
                        Tool definition with schema and metadata
         | 
| 142 | 
            +
                    """
         | 
| 143 | 
            +
                    pass
         | 
| 144 | 
            +
                
         | 
| 145 | 
            +
                @abstractmethod
         | 
| 146 | 
            +
                async def invoke(self, invocation: MCPToolInvocation) -> MCPToolResult:
         | 
| 147 | 
            +
                    """
         | 
| 148 | 
            +
                    Invoke the tool with given parameters.
         | 
| 149 | 
            +
                    
         | 
| 150 | 
            +
                    Args:
         | 
| 151 | 
            +
                        invocation: Tool invocation request
         | 
| 152 | 
            +
                        
         | 
| 153 | 
            +
                    Returns:
         | 
| 154 | 
            +
                        Tool execution result
         | 
| 155 | 
            +
                    """
         | 
| 156 | 
            +
                    pass
         | 
| 157 | 
            +
                
         | 
| 158 | 
            +
                @abstractmethod
         | 
| 159 | 
            +
                def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
         | 
| 160 | 
            +
                    """
         | 
| 161 | 
            +
                    Validate tool parameters against schema.
         | 
| 162 | 
            +
                    
         | 
| 163 | 
            +
                    Args:
         | 
| 164 | 
            +
                        parameters: Parameters to validate
         | 
| 165 | 
            +
                        
         | 
| 166 | 
            +
                    Returns:
         | 
| 167 | 
            +
                        True if parameters are valid
         | 
| 168 | 
            +
                    """
         | 
| 169 | 
            +
                    pass
         | 
| 170 | 
            +
                
         | 
| 171 | 
            +
                @abstractmethod
         | 
| 172 | 
            +
                async def initialize(self) -> bool:
         | 
| 173 | 
            +
                    """
         | 
| 174 | 
            +
                    Initialize the tool adapter.
         | 
| 175 | 
            +
                    
         | 
| 176 | 
            +
                    Returns:
         | 
| 177 | 
            +
                        True if initialization successful
         | 
| 178 | 
            +
                    """
         | 
| 179 | 
            +
                    pass
         | 
| 180 | 
            +
                
         | 
| 181 | 
            +
                @abstractmethod
         | 
| 182 | 
            +
                async def shutdown(self) -> None:
         | 
| 183 | 
            +
                    """
         | 
| 184 | 
            +
                    Shutdown the tool adapter and clean up resources.
         | 
| 185 | 
            +
                    """
         | 
| 186 | 
            +
                    pass
         | 
| 187 | 
            +
             | 
| 188 | 
            +
             | 
| 189 | 
            +
            class IMCPToolRegistry(ABC):
         | 
| 190 | 
            +
                """
         | 
| 191 | 
            +
                Interface for MCP tool registry.
         | 
| 192 | 
            +
                
         | 
| 193 | 
            +
                Manages registration, discovery, and invocation of MCP tools.
         | 
| 194 | 
            +
                """
         | 
| 195 | 
            +
                
         | 
| 196 | 
            +
                @abstractmethod
         | 
| 197 | 
            +
                def register_tool(self, adapter: IMCPToolAdapter) -> bool:
         | 
| 198 | 
            +
                    """
         | 
| 199 | 
            +
                    Register a tool adapter.
         | 
| 200 | 
            +
                    
         | 
| 201 | 
            +
                    Args:
         | 
| 202 | 
            +
                        adapter: Tool adapter to register
         | 
| 203 | 
            +
                        
         | 
| 204 | 
            +
                    Returns:
         | 
| 205 | 
            +
                        True if registration successful
         | 
| 206 | 
            +
                    """
         | 
| 207 | 
            +
                    pass
         | 
| 208 | 
            +
                
         | 
| 209 | 
            +
                @abstractmethod
         | 
| 210 | 
            +
                def unregister_tool(self, tool_name: str) -> bool:
         | 
| 211 | 
            +
                    """
         | 
| 212 | 
            +
                    Unregister a tool by name.
         | 
| 213 | 
            +
                    
         | 
| 214 | 
            +
                    Args:
         | 
| 215 | 
            +
                        tool_name: Name of tool to unregister
         | 
| 216 | 
            +
                        
         | 
| 217 | 
            +
                    Returns:
         | 
| 218 | 
            +
                        True if unregistration successful
         | 
| 219 | 
            +
                    """
         | 
| 220 | 
            +
                    pass
         | 
| 221 | 
            +
                
         | 
| 222 | 
            +
                @abstractmethod
         | 
| 223 | 
            +
                def get_tool(self, tool_name: str) -> Optional[IMCPToolAdapter]:
         | 
| 224 | 
            +
                    """
         | 
| 225 | 
            +
                    Get a tool adapter by name.
         | 
| 226 | 
            +
                    
         | 
| 227 | 
            +
                    Args:
         | 
| 228 | 
            +
                        tool_name: Name of the tool
         | 
| 229 | 
            +
                        
         | 
| 230 | 
            +
                    Returns:
         | 
| 231 | 
            +
                        Tool adapter if found, None otherwise
         | 
| 232 | 
            +
                    """
         | 
| 233 | 
            +
                    pass
         | 
| 234 | 
            +
                
         | 
| 235 | 
            +
                @abstractmethod
         | 
| 236 | 
            +
                def list_tools(self) -> List[MCPToolDefinition]:
         | 
| 237 | 
            +
                    """
         | 
| 238 | 
            +
                    List all registered tools.
         | 
| 239 | 
            +
                    
         | 
| 240 | 
            +
                    Returns:
         | 
| 241 | 
            +
                        List of tool definitions
         | 
| 242 | 
            +
                    """
         | 
| 243 | 
            +
                    pass
         | 
| 244 | 
            +
                
         | 
| 245 | 
            +
                @abstractmethod
         | 
| 246 | 
            +
                async def invoke_tool(self, invocation: MCPToolInvocation) -> MCPToolResult:
         | 
| 247 | 
            +
                    """
         | 
| 248 | 
            +
                    Invoke a tool through the registry.
         | 
| 249 | 
            +
                    
         | 
| 250 | 
            +
                    Args:
         | 
| 251 | 
            +
                        invocation: Tool invocation request
         | 
| 252 | 
            +
                        
         | 
| 253 | 
            +
                    Returns:
         | 
| 254 | 
            +
                        Tool execution result
         | 
| 255 | 
            +
                    """
         | 
| 256 | 
            +
                    pass
         | 
| 257 | 
            +
                
         | 
| 258 | 
            +
                @abstractmethod
         | 
| 259 | 
            +
                def search_tools(self, query: str) -> List[MCPToolDefinition]:
         | 
| 260 | 
            +
                    """
         | 
| 261 | 
            +
                    Search for tools by query.
         | 
| 262 | 
            +
                    
         | 
| 263 | 
            +
                    Args:
         | 
| 264 | 
            +
                        query: Search query
         | 
| 265 | 
            +
                        
         | 
| 266 | 
            +
                    Returns:
         | 
| 267 | 
            +
                        List of matching tool definitions
         | 
| 268 | 
            +
                    """
         | 
| 269 | 
            +
                    pass
         | 
| 270 | 
            +
             | 
| 271 | 
            +
             | 
| 272 | 
            +
            class IMCPCommunication(ABC):
         | 
| 273 | 
            +
                """
         | 
| 274 | 
            +
                Interface for MCP communication handling.
         | 
| 275 | 
            +
                
         | 
| 276 | 
            +
                Manages stdio-based communication with MCP clients.
         | 
| 277 | 
            +
                """
         | 
| 278 | 
            +
                
         | 
| 279 | 
            +
                @abstractmethod
         | 
| 280 | 
            +
                async def send_message(self, message: Dict[str, Any]) -> None:
         | 
| 281 | 
            +
                    """
         | 
| 282 | 
            +
                    Send a message to the MCP client.
         | 
| 283 | 
            +
                    
         | 
| 284 | 
            +
                    Args:
         | 
| 285 | 
            +
                        message: Message to send
         | 
| 286 | 
            +
                    """
         | 
| 287 | 
            +
                    pass
         | 
| 288 | 
            +
                
         | 
| 289 | 
            +
                @abstractmethod
         | 
| 290 | 
            +
                async def receive_message(self) -> Optional[Dict[str, Any]]:
         | 
| 291 | 
            +
                    """
         | 
| 292 | 
            +
                    Receive a message from the MCP client.
         | 
| 293 | 
            +
                    
         | 
| 294 | 
            +
                    Returns:
         | 
| 295 | 
            +
                        Received message or None if no message available
         | 
| 296 | 
            +
                    """
         | 
| 297 | 
            +
                    pass
         | 
| 298 | 
            +
                
         | 
| 299 | 
            +
                @abstractmethod
         | 
| 300 | 
            +
                async def send_response(self, request_id: str, result: Any) -> None:
         | 
| 301 | 
            +
                    """
         | 
| 302 | 
            +
                    Send a response to a request.
         | 
| 303 | 
            +
                    
         | 
| 304 | 
            +
                    Args:
         | 
| 305 | 
            +
                        request_id: ID of the request being responded to
         | 
| 306 | 
            +
                        result: Result data
         | 
| 307 | 
            +
                    """
         | 
| 308 | 
            +
                    pass
         | 
| 309 | 
            +
                
         | 
| 310 | 
            +
                @abstractmethod
         | 
| 311 | 
            +
                async def send_error(self, request_id: str, error: str, code: int = -1) -> None:
         | 
| 312 | 
            +
                    """
         | 
| 313 | 
            +
                    Send an error response.
         | 
| 314 | 
            +
                    
         | 
| 315 | 
            +
                    Args:
         | 
| 316 | 
            +
                        request_id: ID of the request that caused the error
         | 
| 317 | 
            +
                        error: Error message
         | 
| 318 | 
            +
                        code: Error code
         | 
| 319 | 
            +
                    """
         | 
| 320 | 
            +
                    pass
         | 
| 321 | 
            +
                
         | 
| 322 | 
            +
                @abstractmethod
         | 
| 323 | 
            +
                def is_connected(self) -> bool:
         | 
| 324 | 
            +
                    """
         | 
| 325 | 
            +
                    Check if communication channel is connected.
         | 
| 326 | 
            +
                    
         | 
| 327 | 
            +
                    Returns:
         | 
| 328 | 
            +
                        True if connected
         | 
| 329 | 
            +
                    """
         | 
| 330 | 
            +
                    pass
         | 
| 331 | 
            +
             | 
| 332 | 
            +
             | 
| 333 | 
            +
            class IMCPLifecycle(ABC):
         | 
| 334 | 
            +
                """
         | 
| 335 | 
            +
                Interface for MCP service lifecycle management.
         | 
| 336 | 
            +
                
         | 
| 337 | 
            +
                Manages initialization, startup, shutdown, and health monitoring.
         | 
| 338 | 
            +
                """
         | 
| 339 | 
            +
                
         | 
| 340 | 
            +
                @abstractmethod
         | 
| 341 | 
            +
                async def initialize(self) -> bool:
         | 
| 342 | 
            +
                    """
         | 
| 343 | 
            +
                    Initialize the MCP service.
         | 
| 344 | 
            +
                    
         | 
| 345 | 
            +
                    Returns:
         | 
| 346 | 
            +
                        True if initialization successful
         | 
| 347 | 
            +
                    """
         | 
| 348 | 
            +
                    pass
         | 
| 349 | 
            +
                
         | 
| 350 | 
            +
                @abstractmethod
         | 
| 351 | 
            +
                async def start(self) -> bool:
         | 
| 352 | 
            +
                    """
         | 
| 353 | 
            +
                    Start the MCP service.
         | 
| 354 | 
            +
                    
         | 
| 355 | 
            +
                    Returns:
         | 
| 356 | 
            +
                        True if startup successful
         | 
| 357 | 
            +
                    """
         | 
| 358 | 
            +
                    pass
         | 
| 359 | 
            +
                
         | 
| 360 | 
            +
                @abstractmethod
         | 
| 361 | 
            +
                async def stop(self) -> None:
         | 
| 362 | 
            +
                    """
         | 
| 363 | 
            +
                    Stop the MCP service gracefully.
         | 
| 364 | 
            +
                    """
         | 
| 365 | 
            +
                    pass
         | 
| 366 | 
            +
                
         | 
| 367 | 
            +
                @abstractmethod
         | 
| 368 | 
            +
                async def restart(self) -> bool:
         | 
| 369 | 
            +
                    """
         | 
| 370 | 
            +
                    Restart the MCP service.
         | 
| 371 | 
            +
                    
         | 
| 372 | 
            +
                    Returns:
         | 
| 373 | 
            +
                        True if restart successful
         | 
| 374 | 
            +
                    """
         | 
| 375 | 
            +
                    pass
         | 
| 376 | 
            +
                
         | 
| 377 | 
            +
                @abstractmethod
         | 
| 378 | 
            +
                def get_state(self) -> str:
         | 
| 379 | 
            +
                    """
         | 
| 380 | 
            +
                    Get current service state.
         | 
| 381 | 
            +
                    
         | 
| 382 | 
            +
                    Returns:
         | 
| 383 | 
            +
                        Service state (e.g., "initialized", "running", "stopped")
         | 
| 384 | 
            +
                    """
         | 
| 385 | 
            +
                    pass
         | 
| 386 | 
            +
                
         | 
| 387 | 
            +
                @abstractmethod
         | 
| 388 | 
            +
                def is_healthy(self) -> bool:
         | 
| 389 | 
            +
                    """
         | 
| 390 | 
            +
                    Check if service is healthy.
         | 
| 391 | 
            +
                    
         | 
| 392 | 
            +
                    Returns:
         | 
| 393 | 
            +
                        True if service is healthy
         | 
| 394 | 
            +
                    """
         | 
| 395 | 
            +
                    pass
         | 
| 396 | 
            +
                
         | 
| 397 | 
            +
                @abstractmethod
         | 
| 398 | 
            +
                def get_health_status(self) -> Dict[str, Any]:
         | 
| 399 | 
            +
                    """
         | 
| 400 | 
            +
                    Get detailed health status.
         | 
| 401 | 
            +
                    
         | 
| 402 | 
            +
                    Returns:
         | 
| 403 | 
            +
                        Health status information
         | 
| 404 | 
            +
                    """
         | 
| 405 | 
            +
                    pass
         | 
| 406 | 
            +
             | 
| 407 | 
            +
             | 
| 408 | 
            +
            class IMCPServer(IMCPLifecycle):
         | 
| 409 | 
            +
                """
         | 
| 410 | 
            +
                Main interface for MCP server implementation.
         | 
| 411 | 
            +
                
         | 
| 412 | 
            +
                Orchestrates tool registry, communication, and request handling.
         | 
| 413 | 
            +
                """
         | 
| 414 | 
            +
                
         | 
| 415 | 
            +
                @abstractmethod
         | 
| 416 | 
            +
                def set_tool_registry(self, registry: IMCPToolRegistry) -> None:
         | 
| 417 | 
            +
                    """
         | 
| 418 | 
            +
                    Set the tool registry for the server.
         | 
| 419 | 
            +
                    
         | 
| 420 | 
            +
                    Args:
         | 
| 421 | 
            +
                        registry: Tool registry to use
         | 
| 422 | 
            +
                    """
         | 
| 423 | 
            +
                    pass
         | 
| 424 | 
            +
                
         | 
| 425 | 
            +
                @abstractmethod
         | 
| 426 | 
            +
                def set_communication(self, communication: IMCPCommunication) -> None:
         | 
| 427 | 
            +
                    """
         | 
| 428 | 
            +
                    Set the communication handler.
         | 
| 429 | 
            +
                    
         | 
| 430 | 
            +
                    Args:
         | 
| 431 | 
            +
                        communication: Communication handler to use
         | 
| 432 | 
            +
                    """
         | 
| 433 | 
            +
                    pass
         | 
| 434 | 
            +
                
         | 
| 435 | 
            +
                @abstractmethod
         | 
| 436 | 
            +
                async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:
         | 
| 437 | 
            +
                    """
         | 
| 438 | 
            +
                    Handle an MCP request.
         | 
| 439 | 
            +
                    
         | 
| 440 | 
            +
                    Args:
         | 
| 441 | 
            +
                        request: MCP request message
         | 
| 442 | 
            +
                        
         | 
| 443 | 
            +
                    Returns:
         | 
| 444 | 
            +
                        Response message
         | 
| 445 | 
            +
                    """
         | 
| 446 | 
            +
                    pass
         | 
| 447 | 
            +
                
         | 
| 448 | 
            +
                @abstractmethod
         | 
| 449 | 
            +
                async def run(self) -> None:
         | 
| 450 | 
            +
                    """
         | 
| 451 | 
            +
                    Run the MCP server main loop.
         | 
| 452 | 
            +
                    
         | 
| 453 | 
            +
                    This method should handle incoming requests and manage the server lifecycle.
         | 
| 454 | 
            +
                    """
         | 
| 455 | 
            +
                    pass
         | 
| 456 | 
            +
                
         | 
| 457 | 
            +
                @abstractmethod
         | 
| 458 | 
            +
                def register_handler(self, method: str, handler: Callable) -> None:
         | 
| 459 | 
            +
                    """
         | 
| 460 | 
            +
                    Register a custom request handler.
         | 
| 461 | 
            +
                    
         | 
| 462 | 
            +
                    Args:
         | 
| 463 | 
            +
                        method: Method name to handle
         | 
| 464 | 
            +
                        handler: Handler function
         | 
| 465 | 
            +
                    """
         | 
| 466 | 
            +
                    pass
         | 
| 467 | 
            +
                
         | 
| 468 | 
            +
                @abstractmethod
         | 
| 469 | 
            +
                def get_capabilities(self) -> Dict[str, Any]:
         | 
| 470 | 
            +
                    """
         | 
| 471 | 
            +
                    Get server capabilities.
         | 
| 472 | 
            +
                    
         | 
| 473 | 
            +
                    Returns:
         | 
| 474 | 
            +
                        Dictionary of server capabilities
         | 
| 475 | 
            +
                    """
         | 
| 476 | 
            +
                    pass
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Metadata-Version: 2.4
         | 
| 2 2 | 
             
            Name: claude-mpm
         | 
| 3 | 
            -
            Version: 3.9. | 
| 3 | 
            +
            Version: 3.9.8
         | 
| 4 4 | 
             
            Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
         | 
| 5 5 | 
             
            Home-page: https://github.com/bobmatnyc/claude-mpm
         | 
| 6 6 | 
             
            Author: Claude MPM Team
         | 
| @@ -37,6 +37,7 @@ Requires-Dist: python-engineio>=4.8.0 | |
| 37 37 | 
             
            Requires-Dist: python-frontmatter>=1.0.0
         | 
| 38 38 | 
             
            Requires-Dist: mistune>=3.0.0
         | 
| 39 39 | 
             
            Requires-Dist: aiofiles>=23.0.0
         | 
| 40 | 
            +
            Requires-Dist: mcp>=0.1.0
         | 
| 40 41 | 
             
            Provides-Extra: dev
         | 
| 41 42 | 
             
            Requires-Dist: pytest>=7.0; extra == "dev"
         | 
| 42 43 | 
             
            Requires-Dist: pytest-asyncio; extra == "dev"
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            claude_mpm/VERSION,sha256= | 
| 1 | 
            +
            claude_mpm/VERSION,sha256=h01io9HCAB1m4bnlQNdifYpyeVWWMCfYdccCRf4Vw2A,6
         | 
| 2 2 | 
             
            claude_mpm/__init__.py,sha256=_adJRYaqKpyQFHGdsXrUgODkLmAXt4NRTj8khx4miAY,1512
         | 
| 3 3 | 
             
            claude_mpm/__main__.py,sha256=8IcM9tEbTqSN_er04eKTPX3AGo6qzRiTnPI7KfIf7rw,641
         | 
| 4 4 | 
             
            claude_mpm/constants.py,sha256=2r2YXHgILU9Vf_HW3alxx7Ma6rk72C0-arsyDqLMZrY,5248
         | 
| @@ -32,7 +32,7 @@ claude_mpm/agents/templates/qa.json,sha256=ObztCsMr9haahOaHvaLDRHYj1TZwRxECuzluK | |
| 32 32 | 
             
            claude_mpm/agents/templates/research.json,sha256=WlPnKlojeiCBZ4H75nWexLl_dHU5cSORIqLCDp4tCMM,8419
         | 
| 33 33 | 
             
            claude_mpm/agents/templates/research_memory_efficient.json,sha256=WlPnKlojeiCBZ4H75nWexLl_dHU5cSORIqLCDp4tCMM,8419
         | 
| 34 34 | 
             
            claude_mpm/agents/templates/security.json,sha256=KAJOIZeYUPbnC83S2q7ufwdmpS1xrEwWW6H9bvSNVdo,12349
         | 
| 35 | 
            -
            claude_mpm/agents/templates/ticketing.json,sha256= | 
| 35 | 
            +
            claude_mpm/agents/templates/ticketing.json,sha256=H4-RJHATbDPv07iK_Heff8GdYZRf3d6uIL9_L_KDKwM,33920
         | 
| 36 36 | 
             
            claude_mpm/agents/templates/version_control.json,sha256=yaRwaFA2JjMzCfGki2RIylKytjiVcn-lJKJ3jzTbuyY,11692
         | 
| 37 37 | 
             
            claude_mpm/agents/templates/web_qa.json,sha256=4enHHY0KonWE7c2zS_P7JPoOG1foarMtI4CzUpZp49k,17634
         | 
| 38 38 | 
             
            claude_mpm/agents/templates/web_ui.json,sha256=M4ILRYG_EhIilUcu93XVlO51BiVh72M4p7XvUbTqkcs,22752
         | 
| @@ -146,7 +146,7 @@ claude_mpm/models/agent_session.py,sha256=cBl71q33TIBX8S6U1w2UnKOjEWyypFB04s0BCy | |
| 146 146 | 
             
            claude_mpm/scripts/__init__.py,sha256=zKYLZfT0P5z7C7r1YrhsTDnnyFXY-2awxhLVPYx68ek,552
         | 
| 147 147 | 
             
            claude_mpm/scripts/socketio_daemon.py,sha256=93jzq-h5GQRK-xYpLaovaqNAXtwR_ZqYjmEMmFn0xE8,9741
         | 
| 148 148 | 
             
            claude_mpm/scripts/start_activity_logging.py,sha256=9xTu6Kd9lmCx17vMmoAGRXegoaZIVqLzLJoXQDeZ9Yw,2917
         | 
| 149 | 
            -
            claude_mpm/services/__init__.py,sha256= | 
| 149 | 
            +
            claude_mpm/services/__init__.py,sha256=cO6w9pl5LWGZ955ZyzNzNe6-qvDnMxkLyVJ7Xys3hS8,8188
         | 
| 150 150 | 
             
            claude_mpm/services/async_session_logger.py,sha256=bCQ-7dlkZlbffTcG2b-CO5Y9UZoBvHwwyu1Ueaqo2Os,21829
         | 
| 151 151 | 
             
            claude_mpm/services/claude_session_logger.py,sha256=VgXOo45k2hCqxLGyHzuOmdQZRk0-S8KVzVUNHas7Bbk,10535
         | 
| 152 152 | 
             
            claude_mpm/services/event_aggregator.py,sha256=Ty2hwDS3IbH9PD1u7NPbPAJM-UFcuOTNeCJ0Tns84LA,20478
         | 
| @@ -217,6 +217,18 @@ claude_mpm/services/framework_claude_md_generator/section_generators/troubleshoo | |
| 217 217 | 
             
            claude_mpm/services/infrastructure/__init__.py,sha256=rZir3Ktwc0Dyrc0Sl2rAn7h6uc8VBp7QWcnRRK3kQ5Y,504
         | 
| 218 218 | 
             
            claude_mpm/services/infrastructure/logging.py,sha256=LuujazzNebzfOCB921wSAUpGDrIxkMrlsvLxI4e1RRo,6693
         | 
| 219 219 | 
             
            claude_mpm/services/infrastructure/monitoring.py,sha256=OPyT976wENCMFzid88ovG5HLqCo71evYqTVn5lsJ4SU,33882
         | 
| 220 | 
            +
            claude_mpm/services/mcp_gateway/__init__.py,sha256=cxoD-Bpwfg--W7P_c0KY6vUjy8HrlUdCAo5s9KjAGGY,3866
         | 
| 221 | 
            +
            claude_mpm/services/mcp_gateway/config/__init__.py,sha256=nBj4JSBi2A9TFNXw_nM6tdoLMrServ-yqzMBvFruGlg,385
         | 
| 222 | 
            +
            claude_mpm/services/mcp_gateway/config/config_loader.py,sha256=dIajqrDboSY7ArAoAOzlXqQarqix6i9ZEjpcVpofygo,7611
         | 
| 223 | 
            +
            claude_mpm/services/mcp_gateway/config/config_schema.py,sha256=cP1FZoLd_RSuFnP51aLN36f2ifzDWQalBAEeisHUj_Y,9452
         | 
| 224 | 
            +
            claude_mpm/services/mcp_gateway/config/configuration.py,sha256=Zp8FhPQ_Xp5cfEfa3ktblX1En2neHXb-vGbEqdfyJJY,12658
         | 
| 225 | 
            +
            claude_mpm/services/mcp_gateway/core/__init__.py,sha256=5alHHmyb6SKrF-HX00fALk8L-XecBgC0WWULvQ1_HK4,919
         | 
| 226 | 
            +
            claude_mpm/services/mcp_gateway/core/base.py,sha256=zZ36EYvjLEhm75E4q7sB5SZltYCGp4N3SrP3Tu9DHOE,10639
         | 
| 227 | 
            +
            claude_mpm/services/mcp_gateway/core/exceptions.py,sha256=aygJk4qLI4dJXvpBhvxXz9GS7WlBxtHvaXMIUWhmx6M,6924
         | 
| 228 | 
            +
            claude_mpm/services/mcp_gateway/core/interfaces.py,sha256=Z1b71vA444yExicMZr9PCzlY7Y9iRS-E6kdkcvKcmt0,11075
         | 
| 229 | 
            +
            claude_mpm/services/mcp_gateway/registry/__init__.py,sha256=ePGM1q7smHcPo0kKgzDfMXIfg4Vs35xq_J_7pnSgePI,221
         | 
| 230 | 
            +
            claude_mpm/services/mcp_gateway/server/__init__.py,sha256=aLT78iptTwoCOjMgFV5gyyWQwmbj1Z2aV1ClZYMTyJY,210
         | 
| 231 | 
            +
            claude_mpm/services/mcp_gateway/tools/__init__.py,sha256=n7niUlLV7DMk6VfpAJyIQRPibdZSuIQLO-kiZ9-04eo,230
         | 
| 220 232 | 
             
            claude_mpm/services/memory/__init__.py,sha256=XkRcNRalLYPClYc8CX9PNhmSqSI5FNHatMfiGHCuW4o,394
         | 
| 221 233 | 
             
            claude_mpm/services/memory/builder.py,sha256=a3X3mZsd3YxmhwOYsAmbpmCACkoKxcuKuyHXPa26gqs,34075
         | 
| 222 234 | 
             
            claude_mpm/services/memory/indexed_memory.py,sha256=nb2bVxFelNyJ9GINw5mPABj8wNJJ23XyTNZ9NgywB1w,20098
         | 
| @@ -262,9 +274,9 @@ claude_mpm/utils/session_logging.py,sha256=9G0AzB7V0WkhLQlN0ocqbyDv0ifooEsJ5UPXI | |
| 262 274 | 
             
            claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
         | 
| 263 275 | 
             
            claude_mpm/validation/agent_validator.py,sha256=OEYhmy0K99pkoCCoVea2Q-d1JMiDyhEpzEJikuF8T-U,20910
         | 
| 264 276 | 
             
            claude_mpm/validation/frontmatter_validator.py,sha256=vSinu0XD9-31h0-ePYiYivBbxTZEanhymLinTCODr7k,7206
         | 
| 265 | 
            -
            claude_mpm-3.9. | 
| 266 | 
            -
            claude_mpm-3.9. | 
| 267 | 
            -
            claude_mpm-3.9. | 
| 268 | 
            -
            claude_mpm-3.9. | 
| 269 | 
            -
            claude_mpm-3.9. | 
| 270 | 
            -
            claude_mpm-3.9. | 
| 277 | 
            +
            claude_mpm-3.9.8.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
         | 
| 278 | 
            +
            claude_mpm-3.9.8.dist-info/METADATA,sha256=Ug3P-YCt3Ygy2GYebTt0Lfc8PP6sns2pKZ4zvr8VjVU,8706
         | 
| 279 | 
            +
            claude_mpm-3.9.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
         | 
| 280 | 
            +
            claude_mpm-3.9.8.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
         | 
| 281 | 
            +
            claude_mpm-3.9.8.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
         | 
| 282 | 
            +
            claude_mpm-3.9.8.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |