claude-mpm 3.9.9__py3-none-any.whl → 4.0.3__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 +155 -0
- 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 +1 -1
- 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 +90 -49
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +21 -18
- 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 +143 -762
- 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 +203 -81
- 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 +305 -197
- claude_mpm/cli/parser.py +24 -1150
- 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 +104 -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 +217 -0
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +36 -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/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 +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- 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 +120 -54
- 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 +571 -0
- 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 +40 -23
- 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 +14 -21
- 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 +97 -93
- claude_mpm/services/mcp_gateway/main.py +307 -127
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
- claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
- 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 +110 -121
- 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 +223 -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 +145 -65
- 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 +170 -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 +20 -534
- 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 +9 -0
- claude_mpm/storage/state_storage.py +552 -0
- 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.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/core/config_paths.py +0 -150
- 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/memory_guardian.py +0 -770
- claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
- 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.9.dist-info/RECORD +0 -293
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -1,269 +1,269 @@ | |
| 1 1 | 
             
            """
         | 
| 2 | 
            -
            MCP  | 
| 3 | 
            -
             | 
| 2 | 
            +
            MCP Gateway Implementation
         | 
| 3 | 
            +
            ==========================
         | 
| 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 Code and internal tools.
         | 
| 7 8 |  | 
| 8 | 
            -
             | 
| 9 | 
            +
            NOTE: MCP is ONLY for Claude Code - NOT for Claude Desktop.
         | 
| 10 | 
            +
            Claude Desktop uses a different system for agent deployment.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Part of ISS-0035: MCP Gateway Implementation - Core Gateway and Tool Registry
         | 
| 9 13 | 
             
            """
         | 
| 10 14 |  | 
| 11 15 | 
             
            import asyncio
         | 
| 12 16 | 
             
            import json
         | 
| 13 | 
            -
            import sys
         | 
| 14 | 
            -
            from typing import Any, Dict, List, Optional, Callable, Set
         | 
| 15 | 
            -
            from datetime import datetime
         | 
| 16 17 | 
             
            import traceback
         | 
| 18 | 
            +
            from datetime import datetime
         | 
| 19 | 
            +
            from typing import Any, Callable, Dict, List, Optional, Set, Union
         | 
| 17 20 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                 | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                )
         | 
| 28 | 
            -
            except ImportError as e:
         | 
| 29 | 
            -
                # If specific imports fail, we'll create mock implementations
         | 
| 30 | 
            -
                print(f"Warning: MCP imports failed: {e}")
         | 
| 31 | 
            -
                Server = None
         | 
| 32 | 
            -
                NotificationOptions = None
         | 
| 33 | 
            -
                InitializeResult = None
         | 
| 34 | 
            -
                Tool = None
         | 
| 35 | 
            -
                TextContent = None
         | 
| 36 | 
            -
                ImageContent = None
         | 
| 37 | 
            -
                EmbeddedResource = None
         | 
| 21 | 
            +
            # Import from the official MCP package
         | 
| 22 | 
            +
            from mcp.server import NotificationOptions, Server
         | 
| 23 | 
            +
            from mcp.types import (
         | 
| 24 | 
            +
                EmbeddedResource,
         | 
| 25 | 
            +
                ImageContent,
         | 
| 26 | 
            +
                InitializeResult,
         | 
| 27 | 
            +
                TextContent,
         | 
| 28 | 
            +
                Tool,
         | 
| 29 | 
            +
            )
         | 
| 38 30 |  | 
| 31 | 
            +
            from claude_mpm.services.mcp_gateway.core.base import BaseMCPService, MCPServiceState
         | 
| 39 32 | 
             
            from claude_mpm.services.mcp_gateway.core.interfaces import (
         | 
| 40 | 
            -
                IMCPServer,
         | 
| 41 | 
            -
                IMCPToolRegistry,
         | 
| 42 33 | 
             
                IMCPCommunication,
         | 
| 34 | 
            +
                IMCPGateway,
         | 
| 35 | 
            +
                IMCPToolRegistry,
         | 
| 43 36 | 
             
                MCPToolInvocation,
         | 
| 44 37 | 
             
                MCPToolResult,
         | 
| 45 38 | 
             
            )
         | 
| 46 | 
            -
            from claude_mpm.services.mcp_gateway.core.base import BaseMCPService, MCPServiceState
         | 
| 47 39 |  | 
| 48 40 |  | 
| 49 | 
            -
            class  | 
| 41 | 
            +
            class MCPGateway(BaseMCPService, IMCPGateway):
         | 
| 50 42 | 
             
                """
         | 
| 51 | 
            -
                 | 
| 52 | 
            -
             | 
| 43 | 
            +
                MCP Protocol Gateway implementation using Anthropic's official MCP package.
         | 
| 44 | 
            +
             | 
| 53 45 | 
             
                WHY: We use the official MCP package to ensure protocol compliance and
         | 
| 54 46 | 
             
                compatibility with Claude Code. The stdio-based communication model allows
         | 
| 55 | 
            -
                seamless integration with Claude  | 
| 56 | 
            -
             | 
| 47 | 
            +
                seamless integration with Claude Code's MCP client as a protocol bridge.
         | 
| 48 | 
            +
             | 
| 57 49 | 
             
                DESIGN DECISIONS:
         | 
| 58 50 | 
             
                - Use asyncio for all I/O operations to handle concurrent requests efficiently
         | 
| 59 51 | 
             
                - Maintain request handlers in a dictionary for extensibility
         | 
| 60 | 
            -
                - Implement comprehensive error handling to prevent  | 
| 52 | 
            +
                - Implement comprehensive error handling to prevent gateway crashes
         | 
| 61 53 | 
             
                - Use structured logging for debugging and monitoring
         | 
| 62 54 | 
             
                """
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                def __init__(self,  | 
| 55 | 
            +
             | 
| 56 | 
            +
                def __init__(self, gateway_name: str = "claude-mpm-mcp", version: str = "1.0.0"):
         | 
| 65 57 | 
             
                    """
         | 
| 66 | 
            -
                    Initialize MCP  | 
| 67 | 
            -
             | 
| 58 | 
            +
                    Initialize MCP Gateway.
         | 
| 59 | 
            +
             | 
| 68 60 | 
             
                    Args:
         | 
| 69 | 
            -
                         | 
| 70 | 
            -
                        version:  | 
| 61 | 
            +
                        gateway_name: Name of the MCP gateway
         | 
| 62 | 
            +
                        version: Gateway version
         | 
| 71 63 | 
             
                    """
         | 
| 72 | 
            -
                    super().__init__(f" | 
| 73 | 
            -
             | 
| 74 | 
            -
                    #  | 
| 75 | 
            -
                    self. | 
| 64 | 
            +
                    super().__init__(f"MCPGateway-{gateway_name}")
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    # Gateway configuration
         | 
| 67 | 
            +
                    self.gateway_name = gateway_name
         | 
| 68 | 
            +
                    self.server_name = gateway_name  # Keep for compatibility
         | 
| 76 69 | 
             
                    self.version = version
         | 
| 77 | 
            -
             | 
| 70 | 
            +
             | 
| 78 71 | 
             
                    # MCP Server instance from official package
         | 
| 79 | 
            -
                    self.mcp_server = Server( | 
| 80 | 
            -
             | 
| 72 | 
            +
                    self.mcp_server = Server(gateway_name)
         | 
| 73 | 
            +
             | 
| 81 74 | 
             
                    # Dependencies (injected via setters)
         | 
| 82 75 | 
             
                    self._tool_registry: Optional[IMCPToolRegistry] = None
         | 
| 83 76 | 
             
                    self._communication: Optional[IMCPCommunication] = None
         | 
| 84 | 
            -
             | 
| 77 | 
            +
             | 
| 85 78 | 
             
                    # Request handlers
         | 
| 86 79 | 
             
                    self._handlers: Dict[str, Callable] = {}
         | 
| 87 | 
            -
             | 
| 80 | 
            +
             | 
| 88 81 | 
             
                    # Server capabilities
         | 
| 89 82 | 
             
                    self._capabilities = {
         | 
| 90 83 | 
             
                        "tools": {},
         | 
| 91 84 | 
             
                        "prompts": {},
         | 
| 92 85 | 
             
                        "resources": {},
         | 
| 93 | 
            -
                        "experimental": {}
         | 
| 86 | 
            +
                        "experimental": {},
         | 
| 94 87 | 
             
                    }
         | 
| 95 | 
            -
             | 
| 88 | 
            +
             | 
| 96 89 | 
             
                    # Metrics
         | 
| 97 90 | 
             
                    self._metrics = {
         | 
| 98 91 | 
             
                        "requests_handled": 0,
         | 
| 99 92 | 
             
                        "errors": 0,
         | 
| 100 93 | 
             
                        "tool_invocations": 0,
         | 
| 101 94 | 
             
                        "start_time": None,
         | 
| 102 | 
            -
                        "last_request_time": None
         | 
| 95 | 
            +
                        "last_request_time": None,
         | 
| 103 96 | 
             
                    }
         | 
| 104 | 
            -
             | 
| 97 | 
            +
             | 
| 105 98 | 
             
                    # Running state
         | 
| 106 99 | 
             
                    self._run_task: Optional[asyncio.Task] = None
         | 
| 107 100 | 
             
                    self._shutdown_event = asyncio.Event()
         | 
| 108 | 
            -
             | 
| 101 | 
            +
             | 
| 109 102 | 
             
                    # Setup default handlers
         | 
| 110 103 | 
             
                    self._setup_default_handlers()
         | 
| 111 | 
            -
             | 
| 104 | 
            +
             | 
| 112 105 | 
             
                def _setup_default_handlers(self) -> None:
         | 
| 113 106 | 
             
                    """
         | 
| 114 107 | 
             
                    Setup default MCP protocol handlers.
         | 
| 115 | 
            -
             | 
| 108 | 
            +
             | 
| 116 109 | 
             
                    WHY: The MCP protocol requires specific handlers for initialization,
         | 
| 117 110 | 
             
                    tool discovery, and tool invocation. We set these up to ensure
         | 
| 118 111 | 
             
                    protocol compliance.
         | 
| 119 112 | 
             
                    """
         | 
| 113 | 
            +
             | 
| 120 114 | 
             
                    # Initialize handler
         | 
| 121 115 | 
             
                    @self.mcp_server.list_tools()
         | 
| 122 116 | 
             
                    async def handle_list_tools() -> List[Tool]:
         | 
| 123 117 | 
             
                        """Handle tools/list request."""
         | 
| 124 118 | 
             
                        self.log_info("Handling tools/list request")
         | 
| 125 | 
            -
             | 
| 119 | 
            +
             | 
| 126 120 | 
             
                        if not self._tool_registry:
         | 
| 127 121 | 
             
                            self.log_warning("No tool registry available")
         | 
| 128 122 | 
             
                            return []
         | 
| 129 | 
            -
             | 
| 123 | 
            +
             | 
| 130 124 | 
             
                        tools = []
         | 
| 131 125 | 
             
                        for tool_def in self._tool_registry.list_tools():
         | 
| 132 126 | 
             
                            tool = Tool(
         | 
| 133 127 | 
             
                                name=tool_def.name,
         | 
| 134 128 | 
             
                                description=tool_def.description,
         | 
| 135 | 
            -
                                inputSchema=tool_def.input_schema
         | 
| 129 | 
            +
                                inputSchema=tool_def.input_schema,
         | 
| 136 130 | 
             
                            )
         | 
| 137 131 | 
             
                            tools.append(tool)
         | 
| 138 | 
            -
             | 
| 132 | 
            +
             | 
| 139 133 | 
             
                        self.log_info(f"Returning {len(tools)} tools")
         | 
| 140 134 | 
             
                        return tools
         | 
| 141 | 
            -
             | 
| 135 | 
            +
             | 
| 142 136 | 
             
                    @self.mcp_server.call_tool()
         | 
| 143 | 
            -
                    async def handle_call_tool( | 
| 137 | 
            +
                    async def handle_call_tool(
         | 
| 138 | 
            +
                        name: str, arguments: Dict[str, Any]
         | 
| 139 | 
            +
                    ) -> List[Union[TextContent, ImageContent, EmbeddedResource]]:
         | 
| 144 140 | 
             
                        """Handle tools/call request."""
         | 
| 145 141 | 
             
                        self.log_info(f"Handling tools/call request for tool: {name}")
         | 
| 146 | 
            -
             | 
| 142 | 
            +
             | 
| 147 143 | 
             
                        if not self._tool_registry:
         | 
| 148 144 | 
             
                            error_msg = "No tool registry available"
         | 
| 149 145 | 
             
                            self.log_error(error_msg)
         | 
| 150 146 | 
             
                            return [TextContent(type="text", text=f"Error: {error_msg}")]
         | 
| 151 | 
            -
             | 
| 147 | 
            +
             | 
| 152 148 | 
             
                        # Create invocation request
         | 
| 153 149 | 
             
                        invocation = MCPToolInvocation(
         | 
| 154 150 | 
             
                            tool_name=name,
         | 
| 155 151 | 
             
                            parameters=arguments,
         | 
| 156 | 
            -
                            request_id=f"req_{datetime.now().timestamp()}"
         | 
| 152 | 
            +
                            request_id=f"req_{datetime.now().timestamp()}",
         | 
| 157 153 | 
             
                        )
         | 
| 158 | 
            -
             | 
| 154 | 
            +
             | 
| 159 155 | 
             
                        try:
         | 
| 160 156 | 
             
                            # Invoke tool through registry
         | 
| 161 157 | 
             
                            result = await self._tool_registry.invoke_tool(invocation)
         | 
| 162 | 
            -
             | 
| 158 | 
            +
             | 
| 163 159 | 
             
                            # Update metrics
         | 
| 164 160 | 
             
                            self._metrics["tool_invocations"] += 1
         | 
| 165 | 
            -
             | 
| 161 | 
            +
             | 
| 166 162 | 
             
                            # Log invocation
         | 
| 167 163 | 
             
                            self.log_tool_invocation(name, result.success, result.execution_time)
         | 
| 168 | 
            -
             | 
| 164 | 
            +
             | 
| 169 165 | 
             
                            if result.success:
         | 
| 170 166 | 
             
                                # Return successful result
         | 
| 171 167 | 
             
                                if isinstance(result.data, str):
         | 
| 172 168 | 
             
                                    return [TextContent(type="text", text=result.data)]
         | 
| 173 169 | 
             
                                else:
         | 
| 174 | 
            -
                                    return [ | 
| 170 | 
            +
                                    return [
         | 
| 171 | 
            +
                                        TextContent(
         | 
| 172 | 
            +
                                            type="text", text=json.dumps(result.data, indent=2)
         | 
| 173 | 
            +
                                        )
         | 
| 174 | 
            +
                                    ]
         | 
| 175 175 | 
             
                            else:
         | 
| 176 176 | 
             
                                # Return error
         | 
| 177 177 | 
             
                                return [TextContent(type="text", text=f"Error: {result.error}")]
         | 
| 178 | 
            -
             | 
| 178 | 
            +
             | 
| 179 179 | 
             
                        except Exception as e:
         | 
| 180 180 | 
             
                            error_msg = f"Failed to invoke tool {name}: {str(e)}"
         | 
| 181 181 | 
             
                            self.log_error(error_msg)
         | 
| 182 182 | 
             
                            self._metrics["errors"] += 1
         | 
| 183 183 | 
             
                            return [TextContent(type="text", text=f"Error: {error_msg}")]
         | 
| 184 | 
            -
             | 
| 184 | 
            +
             | 
| 185 185 | 
             
                def set_tool_registry(self, registry: IMCPToolRegistry) -> None:
         | 
| 186 186 | 
             
                    """
         | 
| 187 187 | 
             
                    Set the tool registry for the server.
         | 
| 188 | 
            -
             | 
| 188 | 
            +
             | 
| 189 189 | 
             
                    Args:
         | 
| 190 190 | 
             
                        registry: Tool registry to use
         | 
| 191 191 | 
             
                    """
         | 
| 192 192 | 
             
                    self._tool_registry = registry
         | 
| 193 193 | 
             
                    self.log_info("Tool registry set")
         | 
| 194 | 
            -
             | 
| 194 | 
            +
             | 
| 195 195 | 
             
                def set_communication(self, communication: IMCPCommunication) -> None:
         | 
| 196 196 | 
             
                    """
         | 
| 197 197 | 
             
                    Set the communication handler.
         | 
| 198 | 
            -
             | 
| 198 | 
            +
             | 
| 199 199 | 
             
                    Args:
         | 
| 200 200 | 
             
                        communication: Communication handler to use
         | 
| 201 201 | 
             
                    """
         | 
| 202 202 | 
             
                    self._communication = communication
         | 
| 203 203 | 
             
                    self.log_info("Communication handler set")
         | 
| 204 | 
            -
             | 
| 204 | 
            +
             | 
| 205 205 | 
             
                async def _do_initialize(self) -> bool:
         | 
| 206 206 | 
             
                    """
         | 
| 207 207 | 
             
                    Perform server initialization.
         | 
| 208 | 
            -
             | 
| 208 | 
            +
             | 
| 209 209 | 
             
                    Returns:
         | 
| 210 210 | 
             
                        True if initialization successful
         | 
| 211 211 | 
             
                    """
         | 
| 212 212 | 
             
                    try:
         | 
| 213 213 | 
             
                        self.log_info("Initializing MCP server components")
         | 
| 214 | 
            -
             | 
| 214 | 
            +
             | 
| 215 215 | 
             
                        # Validate dependencies
         | 
| 216 216 | 
             
                        if not self._tool_registry:
         | 
| 217 217 | 
             
                            self.log_warning("No tool registry set - server will have no tools")
         | 
| 218 | 
            -
             | 
| 218 | 
            +
             | 
| 219 219 | 
             
                        # Initialize metrics
         | 
| 220 220 | 
             
                        self._metrics["start_time"] = datetime.now().isoformat()
         | 
| 221 | 
            -
             | 
| 221 | 
            +
             | 
| 222 222 | 
             
                        # Update capabilities based on registry
         | 
| 223 223 | 
             
                        if self._tool_registry:
         | 
| 224 224 | 
             
                            tools = self._tool_registry.list_tools()
         | 
| 225 225 | 
             
                            self._capabilities["tools"]["available"] = len(tools)
         | 
| 226 226 | 
             
                            self._capabilities["tools"]["names"] = [t.name for t in tools]
         | 
| 227 | 
            -
             | 
| 227 | 
            +
             | 
| 228 228 | 
             
                        self.log_info("MCP server initialization complete")
         | 
| 229 229 | 
             
                        return True
         | 
| 230 | 
            -
             | 
| 230 | 
            +
             | 
| 231 231 | 
             
                    except Exception as e:
         | 
| 232 232 | 
             
                        self.log_error(f"Failed to initialize MCP server: {e}")
         | 
| 233 233 | 
             
                        return False
         | 
| 234 | 
            -
             | 
| 234 | 
            +
             | 
| 235 235 | 
             
                async def _do_start(self) -> bool:
         | 
| 236 236 | 
             
                    """
         | 
| 237 237 | 
             
                    Start the MCP server.
         | 
| 238 | 
            -
             | 
| 238 | 
            +
             | 
| 239 239 | 
             
                    Returns:
         | 
| 240 240 | 
             
                        True if startup successful
         | 
| 241 241 | 
             
                    """
         | 
| 242 242 | 
             
                    try:
         | 
| 243 243 | 
             
                        self.log_info("Starting MCP server")
         | 
| 244 | 
            -
             | 
| 244 | 
            +
             | 
| 245 245 | 
             
                        # Clear shutdown event
         | 
| 246 246 | 
             
                        self._shutdown_event.clear()
         | 
| 247 | 
            -
             | 
| 247 | 
            +
             | 
| 248 248 | 
             
                        # Start the run task
         | 
| 249 249 | 
             
                        self._run_task = asyncio.create_task(self.run())
         | 
| 250 | 
            -
             | 
| 250 | 
            +
             | 
| 251 251 | 
             
                        self.log_info("MCP server started successfully")
         | 
| 252 252 | 
             
                        return True
         | 
| 253 | 
            -
             | 
| 253 | 
            +
             | 
| 254 254 | 
             
                    except Exception as e:
         | 
| 255 255 | 
             
                        self.log_error(f"Failed to start MCP server: {e}")
         | 
| 256 256 | 
             
                        return False
         | 
| 257 | 
            -
             | 
| 257 | 
            +
             | 
| 258 258 | 
             
                async def _do_shutdown(self) -> None:
         | 
| 259 259 | 
             
                    """
         | 
| 260 260 | 
             
                    Shutdown the MCP server gracefully.
         | 
| 261 261 | 
             
                    """
         | 
| 262 262 | 
             
                    self.log_info("Shutting down MCP server")
         | 
| 263 | 
            -
             | 
| 263 | 
            +
             | 
| 264 264 | 
             
                    # Signal shutdown
         | 
| 265 265 | 
             
                    self._shutdown_event.set()
         | 
| 266 | 
            -
             | 
| 266 | 
            +
             | 
| 267 267 | 
             
                    # Cancel run task if active
         | 
| 268 268 | 
             
                    if self._run_task and not self._run_task.done():
         | 
| 269 269 | 
             
                        self._run_task.cancel()
         | 
| @@ -271,23 +271,23 @@ class MCPServer(BaseMCPService, IMCPServer): | |
| 271 271 | 
             
                            await self._run_task
         | 
| 272 272 | 
             
                        except asyncio.CancelledError:
         | 
| 273 273 | 
             
                            pass
         | 
| 274 | 
            -
             | 
| 274 | 
            +
             | 
| 275 275 | 
             
                    # Clean up resources
         | 
| 276 276 | 
             
                    if self._tool_registry:
         | 
| 277 277 | 
             
                        self.log_info("Cleaning up tool registry")
         | 
| 278 278 | 
             
                        # Tool registry cleanup if needed
         | 
| 279 | 
            -
             | 
| 279 | 
            +
             | 
| 280 280 | 
             
                    self.log_info("MCP server shutdown complete")
         | 
| 281 | 
            -
             | 
| 281 | 
            +
             | 
| 282 282 | 
             
                async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:
         | 
| 283 283 | 
             
                    """
         | 
| 284 284 | 
             
                    Handle an MCP request.
         | 
| 285 | 
            -
             | 
| 285 | 
            +
             | 
| 286 286 | 
             
                    This method routes requests to appropriate handlers based on the method.
         | 
| 287 | 
            -
             | 
| 287 | 
            +
             | 
| 288 288 | 
             
                    Args:
         | 
| 289 289 | 
             
                        request: MCP request message
         | 
| 290 | 
            -
             | 
| 290 | 
            +
             | 
| 291 291 | 
             
                    Returns:
         | 
| 292 292 | 
             
                        Response message
         | 
| 293 293 | 
             
                    """
         | 
| @@ -295,136 +295,132 @@ class MCPServer(BaseMCPService, IMCPServer): | |
| 295 295 | 
             
                        # Update metrics
         | 
| 296 296 | 
             
                        self._metrics["requests_handled"] += 1
         | 
| 297 297 | 
             
                        self._metrics["last_request_time"] = datetime.now().isoformat()
         | 
| 298 | 
            -
             | 
| 298 | 
            +
             | 
| 299 299 | 
             
                        # Extract request details
         | 
| 300 300 | 
             
                        method = request.get("method", "")
         | 
| 301 301 | 
             
                        params = request.get("params", {})
         | 
| 302 302 | 
             
                        request_id = request.get("id")
         | 
| 303 | 
            -
             | 
| 303 | 
            +
             | 
| 304 304 | 
             
                        self.log_debug(f"Handling request: {method}")
         | 
| 305 | 
            -
             | 
| 305 | 
            +
             | 
| 306 306 | 
             
                        # Check for custom handler
         | 
| 307 307 | 
             
                        if method in self._handlers:
         | 
| 308 308 | 
             
                            handler = self._handlers[method]
         | 
| 309 309 | 
             
                            result = await handler(params)
         | 
| 310 | 
            -
             | 
| 310 | 
            +
             | 
| 311 311 | 
             
                            # Build response
         | 
| 312 | 
            -
                            response = {
         | 
| 313 | 
            -
                                "jsonrpc": "2.0",
         | 
| 314 | 
            -
                                "id": request_id,
         | 
| 315 | 
            -
                                "result": result
         | 
| 316 | 
            -
                            }
         | 
| 312 | 
            +
                            response = {"jsonrpc": "2.0", "id": request_id, "result": result}
         | 
| 317 313 | 
             
                        else:
         | 
| 318 314 | 
             
                            # Unknown method
         | 
| 319 315 | 
             
                            self.log_warning(f"Unknown method: {method}")
         | 
| 320 316 | 
             
                            response = {
         | 
| 321 317 | 
             
                                "jsonrpc": "2.0",
         | 
| 322 318 | 
             
                                "id": request_id,
         | 
| 323 | 
            -
                                "error": {
         | 
| 324 | 
            -
                                    "code": -32601,
         | 
| 325 | 
            -
                                    "message": f"Method not found: {method}"
         | 
| 326 | 
            -
                                }
         | 
| 319 | 
            +
                                "error": {"code": -32601, "message": f"Method not found: {method}"},
         | 
| 327 320 | 
             
                            }
         | 
| 328 | 
            -
             | 
| 321 | 
            +
             | 
| 329 322 | 
             
                        return response
         | 
| 330 | 
            -
             | 
| 323 | 
            +
             | 
| 331 324 | 
             
                    except Exception as e:
         | 
| 332 325 | 
             
                        self.log_error(f"Error handling request: {e}")
         | 
| 333 326 | 
             
                        self._metrics["errors"] += 1
         | 
| 334 | 
            -
             | 
| 327 | 
            +
             | 
| 335 328 | 
             
                        return {
         | 
| 336 329 | 
             
                            "jsonrpc": "2.0",
         | 
| 337 330 | 
             
                            "id": request.get("id"),
         | 
| 338 | 
            -
                            "error": {
         | 
| 339 | 
            -
                                "code": -32603,
         | 
| 340 | 
            -
                                "message": f"Internal error: {str(e)}"
         | 
| 341 | 
            -
                            }
         | 
| 331 | 
            +
                            "error": {"code": -32603, "message": f"Internal error: {str(e)}"},
         | 
| 342 332 | 
             
                        }
         | 
| 343 | 
            -
             | 
| 333 | 
            +
             | 
| 344 334 | 
             
                async def run(self) -> None:
         | 
| 345 335 | 
             
                    """
         | 
| 346 336 | 
             
                    Run the MCP server main loop.
         | 
| 347 | 
            -
             | 
| 337 | 
            +
             | 
| 348 338 | 
             
                    This method uses the official MCP Server's stdio-based communication
         | 
| 349 339 | 
             
                    to handle incoming requests from Claude Code.
         | 
| 350 | 
            -
             | 
| 340 | 
            +
             | 
| 351 341 | 
             
                    WHY: We use stdio (stdin/stdout) as it's the standard communication
         | 
| 352 342 | 
             
                    method for MCP servers in Claude Desktop. This ensures compatibility
         | 
| 353 343 | 
             
                    and allows the server to be launched as a subprocess.
         | 
| 354 344 | 
             
                    """
         | 
| 355 345 | 
             
                    try:
         | 
| 356 346 | 
             
                        self.log_info("Starting MCP server main loop")
         | 
| 357 | 
            -
             | 
| 347 | 
            +
             | 
| 348 | 
            +
                        # Import the stdio server function
         | 
| 349 | 
            +
                        from mcp.server.lowlevel import NotificationOptions
         | 
| 350 | 
            +
                        from mcp.server.models import InitializationOptions
         | 
| 351 | 
            +
                        from mcp.server.stdio import stdio_server
         | 
| 352 | 
            +
             | 
| 358 353 | 
             
                        # Create initialization options
         | 
| 359 | 
            -
                        init_options =  | 
| 360 | 
            -
                             | 
| 361 | 
            -
                             | 
| 362 | 
            -
                             | 
| 363 | 
            -
                                 | 
| 364 | 
            -
                                 | 
| 365 | 
            -
                             | 
| 354 | 
            +
                        init_options = InitializationOptions(
         | 
| 355 | 
            +
                            server_name=self.server_name,
         | 
| 356 | 
            +
                            server_version=self.version,
         | 
| 357 | 
            +
                            capabilities=self.mcp_server.get_capabilities(
         | 
| 358 | 
            +
                                notification_options=NotificationOptions(),
         | 
| 359 | 
            +
                                experimental_capabilities={},
         | 
| 360 | 
            +
                            ),
         | 
| 366 361 | 
             
                        )
         | 
| 367 | 
            -
             | 
| 362 | 
            +
             | 
| 368 363 | 
             
                        # Run the MCP server with stdio transport
         | 
| 369 | 
            -
                        async with  | 
| 370 | 
            -
                             | 
| 371 | 
            -
             | 
| 372 | 
            -
             | 
| 373 | 
            -
                            self. | 
| 374 | 
            -
             | 
| 375 | 
            -
                            # Wait for shutdown signal
         | 
| 376 | 
            -
                            await self._shutdown_event.wait()
         | 
| 377 | 
            -
                            
         | 
| 364 | 
            +
                        async with stdio_server() as (read_stream, write_stream):
         | 
| 365 | 
            +
                            self.log_info("MCP server stdio connection established")
         | 
| 366 | 
            +
             | 
| 367 | 
            +
                            # Run the server
         | 
| 368 | 
            +
                            await self.mcp_server.run(read_stream, write_stream, init_options)
         | 
| 369 | 
            +
             | 
| 378 370 | 
             
                        self.log_info("MCP server main loop ended")
         | 
| 379 | 
            -
             | 
| 371 | 
            +
             | 
| 380 372 | 
             
                    except Exception as e:
         | 
| 381 373 | 
             
                        self.log_error(f"Error in MCP server main loop: {e}")
         | 
| 382 374 | 
             
                        self.log_error(f"Traceback: {traceback.format_exc()}")
         | 
| 383 375 | 
             
                        self._metrics["errors"] += 1
         | 
| 384 376 | 
             
                        raise
         | 
| 385 | 
            -
             | 
| 377 | 
            +
             | 
| 386 378 | 
             
                def register_handler(self, method: str, handler: Callable) -> None:
         | 
| 387 379 | 
             
                    """
         | 
| 388 380 | 
             
                    Register a custom request handler.
         | 
| 389 | 
            -
             | 
| 381 | 
            +
             | 
| 390 382 | 
             
                    Args:
         | 
| 391 383 | 
             
                        method: Method name to handle
         | 
| 392 384 | 
             
                        handler: Handler function
         | 
| 393 385 | 
             
                    """
         | 
| 394 386 | 
             
                    self._handlers[method] = handler
         | 
| 395 387 | 
             
                    self.log_info(f"Registered handler for method: {method}")
         | 
| 396 | 
            -
             | 
| 388 | 
            +
             | 
| 397 389 | 
             
                def get_capabilities(self) -> Dict[str, Any]:
         | 
| 398 390 | 
             
                    """
         | 
| 399 391 | 
             
                    Get server capabilities.
         | 
| 400 | 
            -
             | 
| 392 | 
            +
             | 
| 401 393 | 
             
                    Returns:
         | 
| 402 394 | 
             
                        Dictionary of server capabilities formatted for MCP protocol
         | 
| 403 395 | 
             
                    """
         | 
| 404 396 | 
             
                    capabilities = {}
         | 
| 405 | 
            -
             | 
| 397 | 
            +
             | 
| 406 398 | 
             
                    # Add tool capabilities if registry is available
         | 
| 407 399 | 
             
                    if self._tool_registry:
         | 
| 408 400 | 
             
                        capabilities["tools"] = {}
         | 
| 409 | 
            -
             | 
| 401 | 
            +
             | 
| 410 402 | 
             
                    # Add experimental features
         | 
| 411 403 | 
             
                    capabilities["experimental"] = {}
         | 
| 412 | 
            -
             | 
| 404 | 
            +
             | 
| 413 405 | 
             
                    return capabilities
         | 
| 414 | 
            -
             | 
| 406 | 
            +
             | 
| 415 407 | 
             
                def get_metrics(self) -> Dict[str, Any]:
         | 
| 416 408 | 
             
                    """
         | 
| 417 409 | 
             
                    Get server metrics.
         | 
| 418 | 
            -
             | 
| 410 | 
            +
             | 
| 419 411 | 
             
                    Returns:
         | 
| 420 412 | 
             
                        Server metrics dictionary
         | 
| 421 413 | 
             
                    """
         | 
| 422 414 | 
             
                    return self._metrics.copy()
         | 
| 423 | 
            -
             | 
| 415 | 
            +
             | 
| 424 416 | 
             
                async def stop(self) -> None:
         | 
| 425 417 | 
             
                    """
         | 
| 426 418 | 
             
                    Stop the MCP service gracefully.
         | 
| 427 | 
            -
             | 
| 419 | 
            +
             | 
| 428 420 | 
             
                    This implements the IMCPLifecycle interface method.
         | 
| 429 421 | 
             
                    """
         | 
| 430 | 
            -
                    await self.shutdown()
         | 
| 422 | 
            +
                    await self.shutdown()
         | 
| 423 | 
            +
             | 
| 424 | 
            +
             | 
| 425 | 
            +
            # Backward compatibility alias
         | 
| 426 | 
            +
            MCPServer = MCPGateway
         |