claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +2 -2
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +330 -86
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +363 -220
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +124 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +133 -53
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +575 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +166 -64
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +185 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
| @@ -4,36 +4,38 @@ MCP Gateway Implementation | |
| 4 4 |  | 
| 5 5 | 
             
            MCP protocol gateway using Anthropic's official MCP package.
         | 
| 6 6 | 
             
            Handles stdio-based communication, request routing, and tool invocation.
         | 
| 7 | 
            -
            Acts as a bridge between Claude  | 
| 7 | 
            +
            Acts as a bridge between Claude Code and internal tools.
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            NOTE: MCP is ONLY for Claude Code - NOT for Claude Desktop.
         | 
| 10 | 
            +
            Claude Desktop uses a different system for agent deployment.
         | 
| 8 11 |  | 
| 9 12 | 
             
            Part of ISS-0035: MCP Gateway Implementation - Core Gateway and Tool Registry
         | 
| 10 13 | 
             
            """
         | 
| 11 14 |  | 
| 12 15 | 
             
            import asyncio
         | 
| 13 16 | 
             
            import json
         | 
| 14 | 
            -
            import sys
         | 
| 15 | 
            -
            from typing import Any, Dict, List, Optional, Callable, Set
         | 
| 16 | 
            -
            from datetime import datetime
         | 
| 17 17 | 
             
            import traceback
         | 
| 18 | 
            +
            from datetime import datetime
         | 
| 19 | 
            +
            from typing import Any, Callable, Dict, List, Optional, Set, Union
         | 
| 18 20 |  | 
| 19 21 | 
             
            # Import from the official MCP package
         | 
| 20 | 
            -
            from mcp.server import  | 
| 22 | 
            +
            from mcp.server import NotificationOptions, Server
         | 
| 21 23 | 
             
            from mcp.types import (
         | 
| 24 | 
            +
                EmbeddedResource,
         | 
| 25 | 
            +
                ImageContent,
         | 
| 22 26 | 
             
                InitializeResult,
         | 
| 23 | 
            -
                Tool,
         | 
| 24 27 | 
             
                TextContent,
         | 
| 25 | 
            -
                 | 
| 26 | 
            -
                EmbeddedResource
         | 
| 28 | 
            +
                Tool,
         | 
| 27 29 | 
             
            )
         | 
| 28 30 |  | 
| 31 | 
            +
            from claude_mpm.services.mcp_gateway.core.base import BaseMCPService, MCPServiceState
         | 
| 29 32 | 
             
            from claude_mpm.services.mcp_gateway.core.interfaces import (
         | 
| 33 | 
            +
                IMCPCommunication,
         | 
| 30 34 | 
             
                IMCPGateway,
         | 
| 31 35 | 
             
                IMCPToolRegistry,
         | 
| 32 | 
            -
                IMCPCommunication,
         | 
| 33 36 | 
             
                MCPToolInvocation,
         | 
| 34 37 | 
             
                MCPToolResult,
         | 
| 35 38 | 
             
            )
         | 
| 36 | 
            -
            from claude_mpm.services.mcp_gateway.core.base import BaseMCPService, MCPServiceState
         | 
| 37 39 |  | 
| 38 40 |  | 
| 39 41 | 
             
            class MCPGateway(BaseMCPService, IMCPGateway):
         | 
| @@ -41,8 +43,8 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 41 43 | 
             
                MCP Protocol Gateway implementation using Anthropic's official MCP package.
         | 
| 42 44 |  | 
| 43 45 | 
             
                WHY: We use the official MCP package to ensure protocol compliance and
         | 
| 44 | 
            -
                compatibility with Claude  | 
| 45 | 
            -
                seamless integration with Claude  | 
| 46 | 
            +
                compatibility with Claude Code. The stdio-based communication model allows
         | 
| 47 | 
            +
                seamless integration with Claude Code's MCP client as a protocol bridge.
         | 
| 46 48 |  | 
| 47 49 | 
             
                DESIGN DECISIONS:
         | 
| 48 50 | 
             
                - Use asyncio for all I/O operations to handle concurrent requests efficiently
         | 
| @@ -50,7 +52,7 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 50 52 | 
             
                - Implement comprehensive error handling to prevent gateway crashes
         | 
| 51 53 | 
             
                - Use structured logging for debugging and monitoring
         | 
| 52 54 | 
             
                """
         | 
| 53 | 
            -
             | 
| 55 | 
            +
             | 
| 54 56 | 
             
                def __init__(self, gateway_name: str = "claude-mpm-mcp", version: str = "1.0.0"):
         | 
| 55 57 | 
             
                    """
         | 
| 56 58 | 
             
                    Initialize MCP Gateway.
         | 
| @@ -60,7 +62,7 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 60 62 | 
             
                        version: Gateway version
         | 
| 61 63 | 
             
                    """
         | 
| 62 64 | 
             
                    super().__init__(f"MCPGateway-{gateway_name}")
         | 
| 63 | 
            -
             | 
| 65 | 
            +
             | 
| 64 66 | 
             
                    # Gateway configuration
         | 
| 65 67 | 
             
                    self.gateway_name = gateway_name
         | 
| 66 68 | 
             
                    self.server_name = gateway_name  # Keep for compatibility
         | 
| @@ -68,193 +70,200 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 68 70 |  | 
| 69 71 | 
             
                    # MCP Server instance from official package
         | 
| 70 72 | 
             
                    self.mcp_server = Server(gateway_name)
         | 
| 71 | 
            -
             | 
| 73 | 
            +
             | 
| 72 74 | 
             
                    # Dependencies (injected via setters)
         | 
| 73 75 | 
             
                    self._tool_registry: Optional[IMCPToolRegistry] = None
         | 
| 74 76 | 
             
                    self._communication: Optional[IMCPCommunication] = None
         | 
| 75 | 
            -
             | 
| 77 | 
            +
             | 
| 76 78 | 
             
                    # Request handlers
         | 
| 77 79 | 
             
                    self._handlers: Dict[str, Callable] = {}
         | 
| 78 | 
            -
             | 
| 80 | 
            +
             | 
| 79 81 | 
             
                    # Server capabilities
         | 
| 80 82 | 
             
                    self._capabilities = {
         | 
| 81 83 | 
             
                        "tools": {},
         | 
| 82 84 | 
             
                        "prompts": {},
         | 
| 83 85 | 
             
                        "resources": {},
         | 
| 84 | 
            -
                        "experimental": {}
         | 
| 86 | 
            +
                        "experimental": {},
         | 
| 85 87 | 
             
                    }
         | 
| 86 | 
            -
             | 
| 88 | 
            +
             | 
| 87 89 | 
             
                    # Metrics
         | 
| 88 90 | 
             
                    self._metrics = {
         | 
| 89 91 | 
             
                        "requests_handled": 0,
         | 
| 90 92 | 
             
                        "errors": 0,
         | 
| 91 93 | 
             
                        "tool_invocations": 0,
         | 
| 92 94 | 
             
                        "start_time": None,
         | 
| 93 | 
            -
                        "last_request_time": None
         | 
| 95 | 
            +
                        "last_request_time": None,
         | 
| 94 96 | 
             
                    }
         | 
| 95 | 
            -
             | 
| 97 | 
            +
             | 
| 96 98 | 
             
                    # Running state
         | 
| 97 99 | 
             
                    self._run_task: Optional[asyncio.Task] = None
         | 
| 98 100 | 
             
                    self._shutdown_event = asyncio.Event()
         | 
| 99 | 
            -
             | 
| 101 | 
            +
             | 
| 100 102 | 
             
                    # Setup default handlers
         | 
| 101 103 | 
             
                    self._setup_default_handlers()
         | 
| 102 | 
            -
             | 
| 104 | 
            +
             | 
| 103 105 | 
             
                def _setup_default_handlers(self) -> None:
         | 
| 104 106 | 
             
                    """
         | 
| 105 107 | 
             
                    Setup default MCP protocol handlers.
         | 
| 106 | 
            -
             | 
| 108 | 
            +
             | 
| 107 109 | 
             
                    WHY: The MCP protocol requires specific handlers for initialization,
         | 
| 108 110 | 
             
                    tool discovery, and tool invocation. We set these up to ensure
         | 
| 109 111 | 
             
                    protocol compliance.
         | 
| 110 112 | 
             
                    """
         | 
| 113 | 
            +
             | 
| 111 114 | 
             
                    # Initialize handler
         | 
| 112 115 | 
             
                    @self.mcp_server.list_tools()
         | 
| 113 116 | 
             
                    async def handle_list_tools() -> List[Tool]:
         | 
| 114 117 | 
             
                        """Handle tools/list request."""
         | 
| 115 118 | 
             
                        self.log_info("Handling tools/list request")
         | 
| 116 | 
            -
             | 
| 119 | 
            +
             | 
| 117 120 | 
             
                        if not self._tool_registry:
         | 
| 118 121 | 
             
                            self.log_warning("No tool registry available")
         | 
| 119 122 | 
             
                            return []
         | 
| 120 | 
            -
             | 
| 123 | 
            +
             | 
| 121 124 | 
             
                        tools = []
         | 
| 122 125 | 
             
                        for tool_def in self._tool_registry.list_tools():
         | 
| 123 126 | 
             
                            tool = Tool(
         | 
| 124 127 | 
             
                                name=tool_def.name,
         | 
| 125 128 | 
             
                                description=tool_def.description,
         | 
| 126 | 
            -
                                inputSchema=tool_def.input_schema
         | 
| 129 | 
            +
                                inputSchema=tool_def.input_schema,
         | 
| 127 130 | 
             
                            )
         | 
| 128 131 | 
             
                            tools.append(tool)
         | 
| 129 | 
            -
             | 
| 132 | 
            +
             | 
| 130 133 | 
             
                        self.log_info(f"Returning {len(tools)} tools")
         | 
| 131 134 | 
             
                        return tools
         | 
| 132 | 
            -
             | 
| 135 | 
            +
             | 
| 133 136 | 
             
                    @self.mcp_server.call_tool()
         | 
| 134 | 
            -
                    async def handle_call_tool( | 
| 137 | 
            +
                    async def handle_call_tool(
         | 
| 138 | 
            +
                        name: str, arguments: Dict[str, Any]
         | 
| 139 | 
            +
                    ) -> List[Union[TextContent, ImageContent, EmbeddedResource]]:
         | 
| 135 140 | 
             
                        """Handle tools/call request."""
         | 
| 136 141 | 
             
                        self.log_info(f"Handling tools/call request for tool: {name}")
         | 
| 137 | 
            -
             | 
| 142 | 
            +
             | 
| 138 143 | 
             
                        if not self._tool_registry:
         | 
| 139 144 | 
             
                            error_msg = "No tool registry available"
         | 
| 140 145 | 
             
                            self.log_error(error_msg)
         | 
| 141 146 | 
             
                            return [TextContent(type="text", text=f"Error: {error_msg}")]
         | 
| 142 | 
            -
             | 
| 147 | 
            +
             | 
| 143 148 | 
             
                        # Create invocation request
         | 
| 144 149 | 
             
                        invocation = MCPToolInvocation(
         | 
| 145 150 | 
             
                            tool_name=name,
         | 
| 146 151 | 
             
                            parameters=arguments,
         | 
| 147 | 
            -
                            request_id=f"req_{datetime.now().timestamp()}"
         | 
| 152 | 
            +
                            request_id=f"req_{datetime.now().timestamp()}",
         | 
| 148 153 | 
             
                        )
         | 
| 149 | 
            -
             | 
| 154 | 
            +
             | 
| 150 155 | 
             
                        try:
         | 
| 151 156 | 
             
                            # Invoke tool through registry
         | 
| 152 157 | 
             
                            result = await self._tool_registry.invoke_tool(invocation)
         | 
| 153 | 
            -
             | 
| 158 | 
            +
             | 
| 154 159 | 
             
                            # Update metrics
         | 
| 155 160 | 
             
                            self._metrics["tool_invocations"] += 1
         | 
| 156 | 
            -
             | 
| 161 | 
            +
             | 
| 157 162 | 
             
                            # Log invocation
         | 
| 158 163 | 
             
                            self.log_tool_invocation(name, result.success, result.execution_time)
         | 
| 159 | 
            -
             | 
| 164 | 
            +
             | 
| 160 165 | 
             
                            if result.success:
         | 
| 161 166 | 
             
                                # Return successful result
         | 
| 162 167 | 
             
                                if isinstance(result.data, str):
         | 
| 163 168 | 
             
                                    return [TextContent(type="text", text=result.data)]
         | 
| 164 169 | 
             
                                else:
         | 
| 165 | 
            -
                                    return [ | 
| 170 | 
            +
                                    return [
         | 
| 171 | 
            +
                                        TextContent(
         | 
| 172 | 
            +
                                            type="text", text=json.dumps(result.data, indent=2)
         | 
| 173 | 
            +
                                        )
         | 
| 174 | 
            +
                                    ]
         | 
| 166 175 | 
             
                            else:
         | 
| 167 176 | 
             
                                # Return error
         | 
| 168 177 | 
             
                                return [TextContent(type="text", text=f"Error: {result.error}")]
         | 
| 169 | 
            -
             | 
| 178 | 
            +
             | 
| 170 179 | 
             
                        except Exception as e:
         | 
| 171 180 | 
             
                            error_msg = f"Failed to invoke tool {name}: {str(e)}"
         | 
| 172 181 | 
             
                            self.log_error(error_msg)
         | 
| 173 182 | 
             
                            self._metrics["errors"] += 1
         | 
| 174 183 | 
             
                            return [TextContent(type="text", text=f"Error: {error_msg}")]
         | 
| 175 | 
            -
             | 
| 184 | 
            +
             | 
| 176 185 | 
             
                def set_tool_registry(self, registry: IMCPToolRegistry) -> None:
         | 
| 177 186 | 
             
                    """
         | 
| 178 187 | 
             
                    Set the tool registry for the server.
         | 
| 179 | 
            -
             | 
| 188 | 
            +
             | 
| 180 189 | 
             
                    Args:
         | 
| 181 190 | 
             
                        registry: Tool registry to use
         | 
| 182 191 | 
             
                    """
         | 
| 183 192 | 
             
                    self._tool_registry = registry
         | 
| 184 193 | 
             
                    self.log_info("Tool registry set")
         | 
| 185 | 
            -
             | 
| 194 | 
            +
             | 
| 186 195 | 
             
                def set_communication(self, communication: IMCPCommunication) -> None:
         | 
| 187 196 | 
             
                    """
         | 
| 188 197 | 
             
                    Set the communication handler.
         | 
| 189 | 
            -
             | 
| 198 | 
            +
             | 
| 190 199 | 
             
                    Args:
         | 
| 191 200 | 
             
                        communication: Communication handler to use
         | 
| 192 201 | 
             
                    """
         | 
| 193 202 | 
             
                    self._communication = communication
         | 
| 194 203 | 
             
                    self.log_info("Communication handler set")
         | 
| 195 | 
            -
             | 
| 204 | 
            +
             | 
| 196 205 | 
             
                async def _do_initialize(self) -> bool:
         | 
| 197 206 | 
             
                    """
         | 
| 198 207 | 
             
                    Perform server initialization.
         | 
| 199 | 
            -
             | 
| 208 | 
            +
             | 
| 200 209 | 
             
                    Returns:
         | 
| 201 210 | 
             
                        True if initialization successful
         | 
| 202 211 | 
             
                    """
         | 
| 203 212 | 
             
                    try:
         | 
| 204 213 | 
             
                        self.log_info("Initializing MCP server components")
         | 
| 205 | 
            -
             | 
| 214 | 
            +
             | 
| 206 215 | 
             
                        # Validate dependencies
         | 
| 207 216 | 
             
                        if not self._tool_registry:
         | 
| 208 217 | 
             
                            self.log_warning("No tool registry set - server will have no tools")
         | 
| 209 | 
            -
             | 
| 218 | 
            +
             | 
| 210 219 | 
             
                        # Initialize metrics
         | 
| 211 220 | 
             
                        self._metrics["start_time"] = datetime.now().isoformat()
         | 
| 212 | 
            -
             | 
| 221 | 
            +
             | 
| 213 222 | 
             
                        # Update capabilities based on registry
         | 
| 214 223 | 
             
                        if self._tool_registry:
         | 
| 215 224 | 
             
                            tools = self._tool_registry.list_tools()
         | 
| 216 225 | 
             
                            self._capabilities["tools"]["available"] = len(tools)
         | 
| 217 226 | 
             
                            self._capabilities["tools"]["names"] = [t.name for t in tools]
         | 
| 218 | 
            -
             | 
| 227 | 
            +
             | 
| 219 228 | 
             
                        self.log_info("MCP server initialization complete")
         | 
| 220 229 | 
             
                        return True
         | 
| 221 | 
            -
             | 
| 230 | 
            +
             | 
| 222 231 | 
             
                    except Exception as e:
         | 
| 223 232 | 
             
                        self.log_error(f"Failed to initialize MCP server: {e}")
         | 
| 224 233 | 
             
                        return False
         | 
| 225 | 
            -
             | 
| 234 | 
            +
             | 
| 226 235 | 
             
                async def _do_start(self) -> bool:
         | 
| 227 236 | 
             
                    """
         | 
| 228 237 | 
             
                    Start the MCP server.
         | 
| 229 | 
            -
             | 
| 238 | 
            +
             | 
| 230 239 | 
             
                    Returns:
         | 
| 231 240 | 
             
                        True if startup successful
         | 
| 232 241 | 
             
                    """
         | 
| 233 242 | 
             
                    try:
         | 
| 234 243 | 
             
                        self.log_info("Starting MCP server")
         | 
| 235 | 
            -
             | 
| 244 | 
            +
             | 
| 236 245 | 
             
                        # Clear shutdown event
         | 
| 237 246 | 
             
                        self._shutdown_event.clear()
         | 
| 238 | 
            -
             | 
| 247 | 
            +
             | 
| 239 248 | 
             
                        # Start the run task
         | 
| 240 249 | 
             
                        self._run_task = asyncio.create_task(self.run())
         | 
| 241 | 
            -
             | 
| 250 | 
            +
             | 
| 242 251 | 
             
                        self.log_info("MCP server started successfully")
         | 
| 243 252 | 
             
                        return True
         | 
| 244 | 
            -
             | 
| 253 | 
            +
             | 
| 245 254 | 
             
                    except Exception as e:
         | 
| 246 255 | 
             
                        self.log_error(f"Failed to start MCP server: {e}")
         | 
| 247 256 | 
             
                        return False
         | 
| 248 | 
            -
             | 
| 257 | 
            +
             | 
| 249 258 | 
             
                async def _do_shutdown(self) -> None:
         | 
| 250 259 | 
             
                    """
         | 
| 251 260 | 
             
                    Shutdown the MCP server gracefully.
         | 
| 252 261 | 
             
                    """
         | 
| 253 262 | 
             
                    self.log_info("Shutting down MCP server")
         | 
| 254 | 
            -
             | 
| 263 | 
            +
             | 
| 255 264 | 
             
                    # Signal shutdown
         | 
| 256 265 | 
             
                    self._shutdown_event.set()
         | 
| 257 | 
            -
             | 
| 266 | 
            +
             | 
| 258 267 | 
             
                    # Cancel run task if active
         | 
| 259 268 | 
             
                    if self._run_task and not self._run_task.done():
         | 
| 260 269 | 
             
                        self._run_task.cancel()
         | 
| @@ -262,23 +271,23 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 262 271 | 
             
                            await self._run_task
         | 
| 263 272 | 
             
                        except asyncio.CancelledError:
         | 
| 264 273 | 
             
                            pass
         | 
| 265 | 
            -
             | 
| 274 | 
            +
             | 
| 266 275 | 
             
                    # Clean up resources
         | 
| 267 276 | 
             
                    if self._tool_registry:
         | 
| 268 277 | 
             
                        self.log_info("Cleaning up tool registry")
         | 
| 269 278 | 
             
                        # Tool registry cleanup if needed
         | 
| 270 | 
            -
             | 
| 279 | 
            +
             | 
| 271 280 | 
             
                    self.log_info("MCP server shutdown complete")
         | 
| 272 | 
            -
             | 
| 281 | 
            +
             | 
| 273 282 | 
             
                async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:
         | 
| 274 283 | 
             
                    """
         | 
| 275 284 | 
             
                    Handle an MCP request.
         | 
| 276 | 
            -
             | 
| 285 | 
            +
             | 
| 277 286 | 
             
                    This method routes requests to appropriate handlers based on the method.
         | 
| 278 | 
            -
             | 
| 287 | 
            +
             | 
| 279 288 | 
             
                    Args:
         | 
| 280 289 | 
             
                        request: MCP request message
         | 
| 281 | 
            -
             | 
| 290 | 
            +
             | 
| 282 291 | 
             
                    Returns:
         | 
| 283 292 | 
             
                        Response message
         | 
| 284 293 | 
             
                    """
         | 
| @@ -286,70 +295,60 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 286 295 | 
             
                        # Update metrics
         | 
| 287 296 | 
             
                        self._metrics["requests_handled"] += 1
         | 
| 288 297 | 
             
                        self._metrics["last_request_time"] = datetime.now().isoformat()
         | 
| 289 | 
            -
             | 
| 298 | 
            +
             | 
| 290 299 | 
             
                        # Extract request details
         | 
| 291 300 | 
             
                        method = request.get("method", "")
         | 
| 292 301 | 
             
                        params = request.get("params", {})
         | 
| 293 302 | 
             
                        request_id = request.get("id")
         | 
| 294 | 
            -
             | 
| 303 | 
            +
             | 
| 295 304 | 
             
                        self.log_debug(f"Handling request: {method}")
         | 
| 296 | 
            -
             | 
| 305 | 
            +
             | 
| 297 306 | 
             
                        # Check for custom handler
         | 
| 298 307 | 
             
                        if method in self._handlers:
         | 
| 299 308 | 
             
                            handler = self._handlers[method]
         | 
| 300 309 | 
             
                            result = await handler(params)
         | 
| 301 | 
            -
             | 
| 310 | 
            +
             | 
| 302 311 | 
             
                            # Build response
         | 
| 303 | 
            -
                            response = {
         | 
| 304 | 
            -
                                "jsonrpc": "2.0",
         | 
| 305 | 
            -
                                "id": request_id,
         | 
| 306 | 
            -
                                "result": result
         | 
| 307 | 
            -
                            }
         | 
| 312 | 
            +
                            response = {"jsonrpc": "2.0", "id": request_id, "result": result}
         | 
| 308 313 | 
             
                        else:
         | 
| 309 314 | 
             
                            # Unknown method
         | 
| 310 315 | 
             
                            self.log_warning(f"Unknown method: {method}")
         | 
| 311 316 | 
             
                            response = {
         | 
| 312 317 | 
             
                                "jsonrpc": "2.0",
         | 
| 313 318 | 
             
                                "id": request_id,
         | 
| 314 | 
            -
                                "error": {
         | 
| 315 | 
            -
                                    "code": -32601,
         | 
| 316 | 
            -
                                    "message": f"Method not found: {method}"
         | 
| 317 | 
            -
                                }
         | 
| 319 | 
            +
                                "error": {"code": -32601, "message": f"Method not found: {method}"},
         | 
| 318 320 | 
             
                            }
         | 
| 319 | 
            -
             | 
| 321 | 
            +
             | 
| 320 322 | 
             
                        return response
         | 
| 321 | 
            -
             | 
| 323 | 
            +
             | 
| 322 324 | 
             
                    except Exception as e:
         | 
| 323 325 | 
             
                        self.log_error(f"Error handling request: {e}")
         | 
| 324 326 | 
             
                        self._metrics["errors"] += 1
         | 
| 325 | 
            -
             | 
| 327 | 
            +
             | 
| 326 328 | 
             
                        return {
         | 
| 327 329 | 
             
                            "jsonrpc": "2.0",
         | 
| 328 330 | 
             
                            "id": request.get("id"),
         | 
| 329 | 
            -
                            "error": {
         | 
| 330 | 
            -
                                "code": -32603,
         | 
| 331 | 
            -
                                "message": f"Internal error: {str(e)}"
         | 
| 332 | 
            -
                            }
         | 
| 331 | 
            +
                            "error": {"code": -32603, "message": f"Internal error: {str(e)}"},
         | 
| 333 332 | 
             
                        }
         | 
| 334 | 
            -
             | 
| 333 | 
            +
             | 
| 335 334 | 
             
                async def run(self) -> None:
         | 
| 336 335 | 
             
                    """
         | 
| 337 336 | 
             
                    Run the MCP server main loop.
         | 
| 338 | 
            -
             | 
| 337 | 
            +
             | 
| 339 338 | 
             
                    This method uses the official MCP Server's stdio-based communication
         | 
| 340 339 | 
             
                    to handle incoming requests from Claude Code.
         | 
| 341 | 
            -
             | 
| 340 | 
            +
             | 
| 342 341 | 
             
                    WHY: We use stdio (stdin/stdout) as it's the standard communication
         | 
| 343 342 | 
             
                    method for MCP servers in Claude Desktop. This ensures compatibility
         | 
| 344 343 | 
             
                    and allows the server to be launched as a subprocess.
         | 
| 345 344 | 
             
                    """
         | 
| 346 345 | 
             
                    try:
         | 
| 347 346 | 
             
                        self.log_info("Starting MCP server main loop")
         | 
| 348 | 
            -
             | 
| 347 | 
            +
             | 
| 349 348 | 
             
                        # Import the stdio server function
         | 
| 350 | 
            -
                        from mcp.server.stdio import stdio_server
         | 
| 351 | 
            -
                        from mcp.server.models import InitializationOptions
         | 
| 352 349 | 
             
                        from mcp.server.lowlevel import NotificationOptions
         | 
| 350 | 
            +
                        from mcp.server.models import InitializationOptions
         | 
| 351 | 
            +
                        from mcp.server.stdio import stdio_server
         | 
| 353 352 |  | 
| 354 353 | 
             
                        # Create initialization options
         | 
| 355 354 | 
             
                        init_options = InitializationOptions(
         | 
| @@ -366,66 +365,62 @@ class MCPGateway(BaseMCPService, IMCPGateway): | |
| 366 365 | 
             
                            self.log_info("MCP server stdio connection established")
         | 
| 367 366 |  | 
| 368 367 | 
             
                            # Run the server
         | 
| 369 | 
            -
                            await self.mcp_server.run(
         | 
| 370 | 
            -
             | 
| 371 | 
            -
                                write_stream,
         | 
| 372 | 
            -
                                init_options
         | 
| 373 | 
            -
                            )
         | 
| 374 | 
            -
                            
         | 
| 368 | 
            +
                            await self.mcp_server.run(read_stream, write_stream, init_options)
         | 
| 369 | 
            +
             | 
| 375 370 | 
             
                        self.log_info("MCP server main loop ended")
         | 
| 376 | 
            -
             | 
| 371 | 
            +
             | 
| 377 372 | 
             
                    except Exception as e:
         | 
| 378 373 | 
             
                        self.log_error(f"Error in MCP server main loop: {e}")
         | 
| 379 374 | 
             
                        self.log_error(f"Traceback: {traceback.format_exc()}")
         | 
| 380 375 | 
             
                        self._metrics["errors"] += 1
         | 
| 381 376 | 
             
                        raise
         | 
| 382 | 
            -
             | 
| 377 | 
            +
             | 
| 383 378 | 
             
                def register_handler(self, method: str, handler: Callable) -> None:
         | 
| 384 379 | 
             
                    """
         | 
| 385 380 | 
             
                    Register a custom request handler.
         | 
| 386 | 
            -
             | 
| 381 | 
            +
             | 
| 387 382 | 
             
                    Args:
         | 
| 388 383 | 
             
                        method: Method name to handle
         | 
| 389 384 | 
             
                        handler: Handler function
         | 
| 390 385 | 
             
                    """
         | 
| 391 386 | 
             
                    self._handlers[method] = handler
         | 
| 392 387 | 
             
                    self.log_info(f"Registered handler for method: {method}")
         | 
| 393 | 
            -
             | 
| 388 | 
            +
             | 
| 394 389 | 
             
                def get_capabilities(self) -> Dict[str, Any]:
         | 
| 395 390 | 
             
                    """
         | 
| 396 391 | 
             
                    Get server capabilities.
         | 
| 397 | 
            -
             | 
| 392 | 
            +
             | 
| 398 393 | 
             
                    Returns:
         | 
| 399 394 | 
             
                        Dictionary of server capabilities formatted for MCP protocol
         | 
| 400 395 | 
             
                    """
         | 
| 401 396 | 
             
                    capabilities = {}
         | 
| 402 | 
            -
             | 
| 397 | 
            +
             | 
| 403 398 | 
             
                    # Add tool capabilities if registry is available
         | 
| 404 399 | 
             
                    if self._tool_registry:
         | 
| 405 400 | 
             
                        capabilities["tools"] = {}
         | 
| 406 | 
            -
             | 
| 401 | 
            +
             | 
| 407 402 | 
             
                    # Add experimental features
         | 
| 408 403 | 
             
                    capabilities["experimental"] = {}
         | 
| 409 | 
            -
             | 
| 404 | 
            +
             | 
| 410 405 | 
             
                    return capabilities
         | 
| 411 | 
            -
             | 
| 406 | 
            +
             | 
| 412 407 | 
             
                def get_metrics(self) -> Dict[str, Any]:
         | 
| 413 408 | 
             
                    """
         | 
| 414 409 | 
             
                    Get server metrics.
         | 
| 415 | 
            -
             | 
| 410 | 
            +
             | 
| 416 411 | 
             
                    Returns:
         | 
| 417 412 | 
             
                        Server metrics dictionary
         | 
| 418 413 | 
             
                    """
         | 
| 419 414 | 
             
                    return self._metrics.copy()
         | 
| 420 | 
            -
             | 
| 415 | 
            +
             | 
| 421 416 | 
             
                async def stop(self) -> None:
         | 
| 422 417 | 
             
                    """
         | 
| 423 418 | 
             
                    Stop the MCP service gracefully.
         | 
| 424 | 
            -
             | 
| 419 | 
            +
             | 
| 425 420 | 
             
                    This implements the IMCPLifecycle interface method.
         | 
| 426 421 | 
             
                    """
         | 
| 427 422 | 
             
                    await self.shutdown()
         | 
| 428 423 |  | 
| 429 424 |  | 
| 430 425 | 
             
            # Backward compatibility alias
         | 
| 431 | 
            -
            MCPServer = MCPGateway
         | 
| 426 | 
            +
            MCPServer = MCPGateway
         |