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
    
        claude_mpm/cli/commands/mcp.py
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            MCP Gateway command implementation for claude-mpm.
         | 
| 3 5 |  | 
| @@ -9,77 +11,90 @@ that dispatches to specific subcommand handlers, maintaining consistency | |
| 9 11 | 
             
            with other command modules like agents.py and memory.py.
         | 
| 10 12 | 
             
            """
         | 
| 11 13 |  | 
| 12 | 
            -
            import sys
         | 
| 13 | 
            -
            import json
         | 
| 14 14 | 
             
            import asyncio
         | 
| 15 | 
            +
            import json
         | 
| 16 | 
            +
            import sys
         | 
| 15 17 | 
             
            from pathlib import Path
         | 
| 16 | 
            -
            from typing import  | 
| 18 | 
            +
            from typing import Any, Dict, List, Optional
         | 
| 17 19 |  | 
| 18 | 
            -
            from ...core.logger import get_logger
         | 
| 19 20 | 
             
            from ...constants import MCPCommands
         | 
| 21 | 
            +
            from ...core.logger import get_logger
         | 
| 20 22 |  | 
| 21 23 |  | 
| 22 24 | 
             
            def manage_mcp(args):
         | 
| 23 25 | 
             
                """
         | 
| 24 26 | 
             
                Manage MCP Gateway server and tools.
         | 
| 25 | 
            -
             | 
| 27 | 
            +
             | 
| 26 28 | 
             
                WHY: The MCP Gateway provides Model Context Protocol integration for Claude MPM,
         | 
| 27 29 | 
             
                enabling tool invocation and external service integration. This command provides
         | 
| 28 30 | 
             
                a unified interface for all MCP-related operations.
         | 
| 29 | 
            -
             | 
| 31 | 
            +
             | 
| 30 32 | 
             
                DESIGN DECISION: When no subcommand is provided, we show the server status
         | 
| 31 33 | 
             
                as the default action, giving users a quick overview of the MCP system state.
         | 
| 32 | 
            -
             | 
| 34 | 
            +
             | 
| 33 35 | 
             
                Args:
         | 
| 34 36 | 
             
                    args: Parsed command line arguments with mcp_command attribute
         | 
| 35 37 | 
             
                """
         | 
| 36 38 | 
             
                logger = get_logger("cli.mcp")
         | 
| 37 | 
            -
             | 
| 39 | 
            +
             | 
| 40 | 
            +
                # First check if MCP package is installed for any command
         | 
| 41 | 
            +
                try:
         | 
| 42 | 
            +
                    import mcp
         | 
| 43 | 
            +
                except ImportError:
         | 
| 44 | 
            +
                    if args.mcp_command != MCPCommands.INSTALL.value:
         | 
| 45 | 
            +
                        print("\nMCP package is not installed.", file=sys.stderr)
         | 
| 46 | 
            +
                        print("Please install it first:", file=sys.stderr)
         | 
| 47 | 
            +
                        print("  claude-mpm mcp install", file=sys.stderr)
         | 
| 48 | 
            +
                        print("\nOr manually:", file=sys.stderr)
         | 
| 49 | 
            +
                        print("  pip install mcp", file=sys.stderr)
         | 
| 50 | 
            +
                        return 1
         | 
| 51 | 
            +
             | 
| 38 52 | 
             
                try:
         | 
| 39 | 
            -
                    # Import MCP Gateway services with  | 
| 40 | 
            -
                     | 
| 41 | 
            -
                         | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 53 | 
            +
                    # Import MCP Gateway services with error handling
         | 
| 54 | 
            +
                    try:
         | 
| 55 | 
            +
                        from ...services.mcp_gateway import (
         | 
| 56 | 
            +
                            MCPConfiguration,
         | 
| 57 | 
            +
                            MCPServiceRegistry,
         | 
| 58 | 
            +
                            ToolRegistry,
         | 
| 59 | 
            +
                        )
         | 
| 60 | 
            +
                        from ...services.mcp_gateway.server.mcp_gateway import MCPGateway
         | 
| 61 | 
            +
                    except ImportError as e:
         | 
| 62 | 
            +
                        # Provide minimal fallbacks for basic commands
         | 
| 63 | 
            +
                        logger.warning(f"Some MCP Gateway services not available: {e}")
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                        # Allow install command to proceed
         | 
| 66 | 
            +
                        if args.mcp_command == MCPCommands.INSTALL.value:
         | 
| 67 | 
            +
                            MCPConfiguration = None
         | 
| 68 | 
            +
                            MCPServiceRegistry = None
         | 
| 69 | 
            +
                            ToolRegistry = None
         | 
| 70 | 
            +
                            MCPGateway = None
         | 
| 71 | 
            +
                        else:
         | 
| 72 | 
            +
                            print(
         | 
| 73 | 
            +
                                f"\nError: MCP Gateway services not fully available",
         | 
| 74 | 
            +
                                file=sys.stderr,
         | 
| 75 | 
            +
                            )
         | 
| 76 | 
            +
                            print(f"Details: {e}", file=sys.stderr)
         | 
| 77 | 
            +
                            print("\nTry running:", file=sys.stderr)
         | 
| 78 | 
            +
                            print("  claude-mpm mcp install", file=sys.stderr)
         | 
| 79 | 
            +
                            return 1
         | 
| 80 | 
            +
             | 
| 47 81 | 
             
                    if not args.mcp_command:
         | 
| 48 82 | 
             
                        # No subcommand - show status by default
         | 
| 49 | 
            -
                        return _show_status( | 
| 50 | 
            -
             | 
| 83 | 
            +
                        return _show_status(
         | 
| 84 | 
            +
                            args,
         | 
| 85 | 
            +
                            logger,
         | 
| 86 | 
            +
                            MCPConfiguration,
         | 
| 87 | 
            +
                            MCPServiceRegistry,
         | 
| 88 | 
            +
                            ToolRegistry,
         | 
| 89 | 
            +
                            MCPGateway,
         | 
| 90 | 
            +
                        )
         | 
| 91 | 
            +
             | 
| 51 92 | 
             
                    # Route to specific command handlers
         | 
| 52 | 
            -
                     | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
                    
         | 
| 56 | 
            -
             | 
| 57 | 
            -
                        return _stop_server(args, logger)
         | 
| 58 | 
            -
                    
         | 
| 59 | 
            -
                    elif args.mcp_command == MCPCommands.STATUS.value:
         | 
| 60 | 
            -
                        return _show_status(args, logger)
         | 
| 61 | 
            -
                    
         | 
| 62 | 
            -
                    elif args.mcp_command == MCPCommands.TOOLS.value:
         | 
| 63 | 
            -
                        return _manage_tools(args, logger)
         | 
| 64 | 
            -
                    
         | 
| 65 | 
            -
                    elif args.mcp_command == MCPCommands.REGISTER.value:
         | 
| 66 | 
            -
                        return _register_tool(args, logger)
         | 
| 67 | 
            -
                    
         | 
| 68 | 
            -
                    elif args.mcp_command == MCPCommands.TEST.value:
         | 
| 69 | 
            -
                        return _test_tool(args, logger)
         | 
| 70 | 
            -
                    
         | 
| 71 | 
            -
                    elif args.mcp_command == MCPCommands.INSTALL.value:
         | 
| 72 | 
            -
                        return _install_gateway(args, logger)
         | 
| 73 | 
            -
                    
         | 
| 74 | 
            -
                    elif args.mcp_command == MCPCommands.CONFIG.value:
         | 
| 75 | 
            -
                        return _manage_config(args, logger)
         | 
| 76 | 
            -
                    
         | 
| 77 | 
            -
                    else:
         | 
| 78 | 
            -
                        logger.error(f"Unknown MCP command: {args.mcp_command}")
         | 
| 79 | 
            -
                        print(f"Unknown MCP command: {args.mcp_command}")
         | 
| 80 | 
            -
                        _show_help()
         | 
| 81 | 
            -
                        return 1
         | 
| 82 | 
            -
                    
         | 
| 93 | 
            +
                    from .mcp_command_router import MCPCommandRouter
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                    router = MCPCommandRouter(logger)
         | 
| 96 | 
            +
                    return router.route_command(args)
         | 
| 97 | 
            +
             | 
| 83 98 | 
             
                except ImportError as e:
         | 
| 84 99 | 
             
                    logger.error(f"MCP Gateway services not available: {e}")
         | 
| 85 100 | 
             
                    print("Error: MCP Gateway services not available")
         | 
| @@ -92,730 +107,96 @@ def manage_mcp(args): | |
| 92 107 | 
             
                    return 1
         | 
| 93 108 |  | 
| 94 109 |  | 
| 95 | 
            -
             | 
| 96 | 
            -
                """Show available MCP commands."""
         | 
| 97 | 
            -
                print("\nAvailable MCP commands:")
         | 
| 98 | 
            -
                print("  install  - Install and configure MCP Gateway")
         | 
| 99 | 
            -
                print("  start    - Start the MCP Gateway server")
         | 
| 100 | 
            -
                print("  stop     - Stop the MCP Gateway server")
         | 
| 101 | 
            -
                print("  status   - Check server and tool status")
         | 
| 102 | 
            -
                print("  tools    - List and manage registered tools")
         | 
| 103 | 
            -
                print("  register - Register a new tool")
         | 
| 104 | 
            -
                print("  test     - Test tool invocation")
         | 
| 105 | 
            -
                print("  config   - View and manage configuration")
         | 
| 106 | 
            -
                print()
         | 
| 107 | 
            -
                print("Use 'claude-mpm mcp <command> --help' for more information")
         | 
| 110 | 
            +
            # Command handlers moved to separate modules
         | 
| 108 111 |  | 
| 109 112 |  | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
                and external service integration in Claude sessions.
         | 
| 116 | 
            -
                
         | 
| 117 | 
            -
                Args:
         | 
| 118 | 
            -
                    args: Command arguments with optional port and configuration
         | 
| 119 | 
            -
                    logger: Logger instance
         | 
| 120 | 
            -
                    
         | 
| 121 | 
            -
                Returns:
         | 
| 122 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 123 | 
            -
                """
         | 
| 124 | 
            -
                from ...services.mcp_gateway import MCPServer, ToolRegistry, MCPConfiguration
         | 
| 125 | 
            -
                from ...services.mcp_gateway.server.stdio_handler import StdioHandler
         | 
| 126 | 
            -
                
         | 
| 127 | 
            -
                try:
         | 
| 128 | 
            -
                    print("Starting MCP Gateway server...")
         | 
| 129 | 
            -
                    
         | 
| 130 | 
            -
                    # Load configuration
         | 
| 131 | 
            -
                    config_path = getattr(args, 'config_file', None)
         | 
| 132 | 
            -
                    if config_path and Path(config_path).exists():
         | 
| 133 | 
            -
                        logger.info(f"Loading configuration from: {config_path}")
         | 
| 134 | 
            -
                        config = MCPConfiguration(config_path=Path(config_path))
         | 
| 135 | 
            -
                        await config.initialize()
         | 
| 136 | 
            -
                    else:
         | 
| 137 | 
            -
                        logger.info("Using default MCP configuration")
         | 
| 138 | 
            -
                        config = MCPConfiguration()
         | 
| 139 | 
            -
                        await config.initialize()
         | 
| 140 | 
            -
                    
         | 
| 141 | 
            -
                    # Initialize server components
         | 
| 142 | 
            -
                    server = MCPServer(
         | 
| 143 | 
            -
                        server_name=config.get("mcp.server.name", "claude-mpm-gateway"),
         | 
| 144 | 
            -
                        version=config.get("mcp.server.version", "1.0.0")
         | 
| 145 | 
            -
                    )
         | 
| 146 | 
            -
                    
         | 
| 147 | 
            -
                    # Initialize tool registry
         | 
| 148 | 
            -
                    tool_registry = ToolRegistry()
         | 
| 149 | 
            -
                    
         | 
| 150 | 
            -
                    # Load default tools if enabled
         | 
| 151 | 
            -
                    if config.get("mcp.tools.enabled", True):
         | 
| 152 | 
            -
                        logger.info("Loading default tools")
         | 
| 153 | 
            -
                        _load_default_tools(tool_registry, logger)
         | 
| 154 | 
            -
                    
         | 
| 155 | 
            -
                    # Set dependencies
         | 
| 156 | 
            -
                    server.set_tool_registry(tool_registry)
         | 
| 157 | 
            -
                    
         | 
| 158 | 
            -
                    # Start server based on mode
         | 
| 159 | 
            -
                    mode = getattr(args, 'mode', 'stdio')
         | 
| 160 | 
            -
                    
         | 
| 161 | 
            -
                    if mode == 'stdio':
         | 
| 162 | 
            -
                        # Standard I/O mode for Claude integration
         | 
| 163 | 
            -
                        logger.info("Starting MCP server in stdio mode")
         | 
| 164 | 
            -
                        stdio_handler = StdioHandler(server)
         | 
| 165 | 
            -
                        
         | 
| 166 | 
            -
                        # Run the server
         | 
| 167 | 
            -
                        asyncio.run(stdio_handler.run())
         | 
| 168 | 
            -
                        
         | 
| 169 | 
            -
                    elif mode == 'standalone':
         | 
| 170 | 
            -
                        # Standalone mode for testing
         | 
| 171 | 
            -
                        port = getattr(args, 'port', 8766)
         | 
| 172 | 
            -
                        logger.info(f"Starting MCP server in standalone mode on port {port}")
         | 
| 173 | 
            -
                        
         | 
| 174 | 
            -
                        # Create async event loop and run server
         | 
| 175 | 
            -
                        loop = asyncio.new_event_loop()
         | 
| 176 | 
            -
                        asyncio.set_event_loop(loop)
         | 
| 177 | 
            -
                        
         | 
| 178 | 
            -
                        async def run_standalone():
         | 
| 179 | 
            -
                            await server.start()
         | 
| 180 | 
            -
                            print(f"MCP Gateway server started on port {port}")
         | 
| 181 | 
            -
                            print("Press Ctrl+C to stop")
         | 
| 182 | 
            -
                            
         | 
| 183 | 
            -
                            # Keep server running
         | 
| 184 | 
            -
                            try:
         | 
| 185 | 
            -
                                await asyncio.Event().wait()
         | 
| 186 | 
            -
                            except KeyboardInterrupt:
         | 
| 187 | 
            -
                                print("\nStopping server...")
         | 
| 188 | 
            -
                                await server.stop()
         | 
| 189 | 
            -
                        
         | 
| 190 | 
            -
                        loop.run_until_complete(run_standalone())
         | 
| 191 | 
            -
                        
         | 
| 192 | 
            -
                    else:
         | 
| 193 | 
            -
                        logger.error(f"Unknown server mode: {mode}")
         | 
| 194 | 
            -
                        print(f"Error: Unknown server mode: {mode}")
         | 
| 195 | 
            -
                        return 1
         | 
| 196 | 
            -
                    
         | 
| 197 | 
            -
                    print("MCP Gateway server stopped")
         | 
| 198 | 
            -
                    return 0
         | 
| 199 | 
            -
                    
         | 
| 200 | 
            -
                except KeyboardInterrupt:
         | 
| 201 | 
            -
                    print("\nServer interrupted by user")
         | 
| 202 | 
            -
                    return 0
         | 
| 203 | 
            -
                except Exception as e:
         | 
| 204 | 
            -
                    logger.error(f"Failed to start MCP server: {e}", exc_info=True)
         | 
| 205 | 
            -
                    print(f"Error starting server: {e}")
         | 
| 206 | 
            -
                    return 1
         | 
| 113 | 
            +
            # All command handler functions moved to separate modules
         | 
| 114 | 
            +
            # - MCPServerCommands: start, stop, status, cleanup
         | 
| 115 | 
            +
            # - MCPToolCommands: tools, register, test
         | 
| 116 | 
            +
            # - MCPInstallCommands: install
         | 
| 117 | 
            +
            # - MCPConfigCommands: config
         | 
| 207 118 |  | 
| 208 119 |  | 
| 209 | 
            -
            def  | 
| 120 | 
            +
            def _show_status(
         | 
| 121 | 
            +
                args, logger, MCPConfiguration, MCPServiceRegistry, ToolRegistry, MCPGateway
         | 
| 122 | 
            +
            ):
         | 
| 210 123 | 
             
                """
         | 
| 211 | 
            -
                 | 
| 212 | 
            -
                
         | 
| 213 | 
            -
                WHY: Users need a clean way to stop the MCP server when it's no longer needed
         | 
| 214 | 
            -
                or when they need to restart it with different configuration.
         | 
| 215 | 
            -
                
         | 
| 216 | 
            -
                Args:
         | 
| 217 | 
            -
                    args: Command arguments
         | 
| 218 | 
            -
                    logger: Logger instance
         | 
| 219 | 
            -
                    
         | 
| 220 | 
            -
                Returns:
         | 
| 221 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 222 | 
            -
                """
         | 
| 223 | 
            -
                try:
         | 
| 224 | 
            -
                    # Check for running server process
         | 
| 225 | 
            -
                    pid_file = Path.home() / ".claude-mpm" / "mcp_server.pid"
         | 
| 226 | 
            -
                    
         | 
| 227 | 
            -
                    if not pid_file.exists():
         | 
| 228 | 
            -
                        print("No MCP server process found")
         | 
| 229 | 
            -
                        return 0
         | 
| 230 | 
            -
                    
         | 
| 231 | 
            -
                    # Read PID and attempt to stop
         | 
| 232 | 
            -
                    import signal
         | 
| 233 | 
            -
                    import os
         | 
| 234 | 
            -
                    
         | 
| 235 | 
            -
                    with open(pid_file, 'r') as f:
         | 
| 236 | 
            -
                        pid = int(f.read().strip())
         | 
| 237 | 
            -
                    
         | 
| 238 | 
            -
                    try:
         | 
| 239 | 
            -
                        # Send termination signal
         | 
| 240 | 
            -
                        os.kill(pid, signal.SIGTERM)
         | 
| 241 | 
            -
                        print(f"Sent stop signal to MCP server (PID: {pid})")
         | 
| 242 | 
            -
                        
         | 
| 243 | 
            -
                        # Wait for graceful shutdown
         | 
| 244 | 
            -
                        import time
         | 
| 245 | 
            -
                        for _ in range(10):
         | 
| 246 | 
            -
                            try:
         | 
| 247 | 
            -
                                os.kill(pid, 0)  # Check if process still exists
         | 
| 248 | 
            -
                                time.sleep(0.5)
         | 
| 249 | 
            -
                            except ProcessLookupError:
         | 
| 250 | 
            -
                                break
         | 
| 251 | 
            -
                        else:
         | 
| 252 | 
            -
                            # Force kill if still running
         | 
| 253 | 
            -
                            os.kill(pid, signal.SIGKILL)
         | 
| 254 | 
            -
                            print("Force stopped MCP server")
         | 
| 255 | 
            -
                        
         | 
| 256 | 
            -
                        # Clean up PID file
         | 
| 257 | 
            -
                        pid_file.unlink()
         | 
| 258 | 
            -
                        print("MCP server stopped successfully")
         | 
| 259 | 
            -
                        return 0
         | 
| 260 | 
            -
                        
         | 
| 261 | 
            -
                    except ProcessLookupError:
         | 
| 262 | 
            -
                        # Process already stopped
         | 
| 263 | 
            -
                        pid_file.unlink()
         | 
| 264 | 
            -
                        print("MCP server was not running")
         | 
| 265 | 
            -
                        return 0
         | 
| 266 | 
            -
                        
         | 
| 267 | 
            -
                except Exception as e:
         | 
| 268 | 
            -
                    logger.error(f"Failed to stop MCP server: {e}", exc_info=True)
         | 
| 269 | 
            -
                    print(f"Error stopping server: {e}")
         | 
| 270 | 
            -
                    return 1
         | 
| 124 | 
            +
                Show MCP Gateway status when no subcommand is provided.
         | 
| 271 125 |  | 
| 126 | 
            +
                WHY: Users often want a quick overview of the MCP system state.
         | 
| 127 | 
            +
                This provides server status, registered tools, and configuration info.
         | 
| 272 128 |  | 
| 273 | 
            -
             | 
| 129 | 
            +
                DESIGN DECISION: We show a comprehensive status including server state,
         | 
| 130 | 
            +
                tool count, and configuration path to give users a complete picture.
         | 
| 274 131 | 
             
                """
         | 
| 275 | 
            -
                 | 
| 276 | 
            -
                
         | 
| 277 | 
            -
                WHY: Users need visibility into the current state of the MCP system,
         | 
| 278 | 
            -
                including server status, registered tools, and configuration.
         | 
| 279 | 
            -
                
         | 
| 280 | 
            -
                Args:
         | 
| 281 | 
            -
                    args: Command arguments
         | 
| 282 | 
            -
                    logger: Logger instance
         | 
| 283 | 
            -
                    
         | 
| 284 | 
            -
                Returns:
         | 
| 285 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 286 | 
            -
                """
         | 
| 287 | 
            -
                from ...services.mcp_gateway import MCPServiceRegistry, ToolRegistry
         | 
| 288 | 
            -
                
         | 
| 289 | 
            -
                try:
         | 
| 290 | 
            -
                    print("MCP Gateway Status")
         | 
| 291 | 
            -
                    print("=" * 50)
         | 
| 292 | 
            -
                    
         | 
| 293 | 
            -
                    # Check server status
         | 
| 294 | 
            -
                    pid_file = Path.home() / ".claude-mpm" / "mcp_server.pid"
         | 
| 295 | 
            -
                    
         | 
| 296 | 
            -
                    if pid_file.exists():
         | 
| 297 | 
            -
                        with open(pid_file, 'r') as f:
         | 
| 298 | 
            -
                            pid = int(f.read().strip())
         | 
| 299 | 
            -
                        
         | 
| 300 | 
            -
                        # Check if process is running
         | 
| 301 | 
            -
                        import os
         | 
| 302 | 
            -
                        try:
         | 
| 303 | 
            -
                            os.kill(pid, 0)
         | 
| 304 | 
            -
                            print(f"Server Status: ✅ Running (PID: {pid})")
         | 
| 305 | 
            -
                        except ProcessLookupError:
         | 
| 306 | 
            -
                            print("Server Status: ❌ Not running (stale PID file)")
         | 
| 307 | 
            -
                            pid_file.unlink()
         | 
| 308 | 
            -
                    else:
         | 
| 309 | 
            -
                        print("Server Status: ❌ Not running")
         | 
| 310 | 
            -
                    
         | 
| 311 | 
            -
                    print()
         | 
| 312 | 
            -
                    
         | 
| 313 | 
            -
                    # Show registered tools
         | 
| 314 | 
            -
                    print("Registered Tools:")
         | 
| 315 | 
            -
                    print("-" * 30)
         | 
| 316 | 
            -
                    
         | 
| 317 | 
            -
                    # Initialize tool registry to check tools
         | 
| 318 | 
            -
                    tool_registry = ToolRegistry()
         | 
| 319 | 
            -
                    
         | 
| 320 | 
            -
                    # Load configuration to check enabled tools
         | 
| 321 | 
            -
                    config_file = Path.home() / ".claude-mpm" / "mcp_config.yaml"
         | 
| 322 | 
            -
                    if config_file.exists():
         | 
| 323 | 
            -
                        # For now, just load default tools if config file exists
         | 
| 324 | 
            -
                        # TODO: Implement proper async config loading for CLI commands
         | 
| 325 | 
            -
                        _load_default_tools(tool_registry, logger)
         | 
| 326 | 
            -
                    
         | 
| 327 | 
            -
                    tools = tool_registry.list_tools()
         | 
| 328 | 
            -
                    if tools:
         | 
| 329 | 
            -
                        for tool in tools:
         | 
| 330 | 
            -
                            status = "✅" if tool.enabled else "❌"
         | 
| 331 | 
            -
                            print(f"  {status} {tool.name}: {tool.description}")
         | 
| 332 | 
            -
                    else:
         | 
| 333 | 
            -
                        print("  No tools registered")
         | 
| 334 | 
            -
                    
         | 
| 335 | 
            -
                    print()
         | 
| 336 | 
            -
                    
         | 
| 337 | 
            -
                    # Show configuration
         | 
| 338 | 
            -
                    print("Configuration:")
         | 
| 339 | 
            -
                    print("-" * 30)
         | 
| 340 | 
            -
                    
         | 
| 341 | 
            -
                    if config_file.exists():
         | 
| 342 | 
            -
                        print(f"  Config file: {config_file}")
         | 
| 343 | 
            -
                        print(f"  Server name: {config.get('mcp.server.name', 'claude-mpm-gateway')}")
         | 
| 344 | 
            -
                        print(f"  Version: {config.get('mcp.server.version', '1.0.0')}")
         | 
| 345 | 
            -
                        print(f"  Tools enabled: {'Yes' if config.get('mcp.tools.enabled', True) else 'No'}")
         | 
| 346 | 
            -
                    else:
         | 
| 347 | 
            -
                        print("  Using default configuration")
         | 
| 348 | 
            -
                    
         | 
| 349 | 
            -
                    # Show verbose details if requested
         | 
| 350 | 
            -
                    if getattr(args, 'verbose', False):
         | 
| 351 | 
            -
                        print()
         | 
| 352 | 
            -
                        print("Service Registry:")
         | 
| 353 | 
            -
                        print("-" * 30)
         | 
| 354 | 
            -
                        
         | 
| 355 | 
            -
                        registry = MCPServiceRegistry()
         | 
| 356 | 
            -
                        services = registry.list_services()
         | 
| 357 | 
            -
                        
         | 
| 358 | 
            -
                        for service_id, service_info in services.items():
         | 
| 359 | 
            -
                            print(f"  {service_id}:")
         | 
| 360 | 
            -
                            print(f"    State: {service_info['state']}")
         | 
| 361 | 
            -
                            print(f"    Type: {service_info['type']}")
         | 
| 362 | 
            -
                    
         | 
| 363 | 
            -
                    return 0
         | 
| 364 | 
            -
                    
         | 
| 365 | 
            -
                except Exception as e:
         | 
| 366 | 
            -
                    logger.error(f"Failed to show MCP status: {e}", exc_info=True)
         | 
| 367 | 
            -
                    print(f"Error checking status: {e}")
         | 
| 368 | 
            -
                    return 1
         | 
| 369 | 
            -
             | 
| 132 | 
            +
                print("📊 MCP Gateway Status")
         | 
| 133 | 
            +
                print("=" * 50)
         | 
| 370 134 |  | 
| 371 | 
            -
             | 
| 372 | 
            -
                """
         | 
| 373 | 
            -
                List and manage registered MCP tools.
         | 
| 374 | 
            -
                
         | 
| 375 | 
            -
                WHY: Users need to see what tools are available and manage their
         | 
| 376 | 
            -
                registration and configuration.
         | 
| 377 | 
            -
                
         | 
| 378 | 
            -
                Args:
         | 
| 379 | 
            -
                    args: Command arguments with optional filters
         | 
| 380 | 
            -
                    logger: Logger instance
         | 
| 381 | 
            -
                    
         | 
| 382 | 
            -
                Returns:
         | 
| 383 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 384 | 
            -
                """
         | 
| 385 | 
            -
                from ...services.mcp_gateway import ToolRegistry
         | 
| 386 | 
            -
                
         | 
| 135 | 
            +
                # Check if MCP package is installed
         | 
| 387 136 | 
             
                try:
         | 
| 388 | 
            -
                     | 
| 389 | 
            -
                    action = getattr(args, 'tool_action', 'list')
         | 
| 390 | 
            -
                    
         | 
| 391 | 
            -
                    # Initialize tool registry
         | 
| 392 | 
            -
                    tool_registry = ToolRegistry()
         | 
| 393 | 
            -
                    
         | 
| 394 | 
            -
                    # Load tools from configuration
         | 
| 395 | 
            -
                    config_file = Path.home() / ".claude-mcp" / "mcp_config.yaml"
         | 
| 396 | 
            -
                    if config_file.exists():
         | 
| 397 | 
            -
                        # For now, just load default tools if config file exists
         | 
| 398 | 
            -
                        # TODO: Implement proper async config loading for CLI commands
         | 
| 399 | 
            -
                        _load_default_tools(tool_registry, logger)
         | 
| 400 | 
            -
                    
         | 
| 401 | 
            -
                    if action == 'list':
         | 
| 402 | 
            -
                        # List all tools
         | 
| 403 | 
            -
                        tools = tool_registry.list_tools()
         | 
| 404 | 
            -
                        
         | 
| 405 | 
            -
                        if not tools:
         | 
| 406 | 
            -
                            print("No tools registered")
         | 
| 407 | 
            -
                            return 0
         | 
| 408 | 
            -
                        
         | 
| 409 | 
            -
                        print("Registered MCP Tools:")
         | 
| 410 | 
            -
                        print("=" * 50)
         | 
| 411 | 
            -
                        
         | 
| 412 | 
            -
                        # Group tools by category if available
         | 
| 413 | 
            -
                        by_category = {}
         | 
| 414 | 
            -
                        for tool in tools:
         | 
| 415 | 
            -
                            category = getattr(tool, 'category', 'General')
         | 
| 416 | 
            -
                            if category not in by_category:
         | 
| 417 | 
            -
                                by_category[category] = []
         | 
| 418 | 
            -
                            by_category[category].append(tool)
         | 
| 419 | 
            -
                        
         | 
| 420 | 
            -
                        for category, category_tools in sorted(by_category.items()):
         | 
| 421 | 
            -
                            print(f"\n{category}:")
         | 
| 422 | 
            -
                            print("-" * 30)
         | 
| 423 | 
            -
                            
         | 
| 424 | 
            -
                            for tool in category_tools:
         | 
| 425 | 
            -
                                status = "✅" if tool.enabled else "❌"
         | 
| 426 | 
            -
                                print(f"  {status} {tool.name}")
         | 
| 427 | 
            -
                                print(f"      {tool.description}")
         | 
| 428 | 
            -
                                
         | 
| 429 | 
            -
                                if getattr(args, 'verbose', False):
         | 
| 430 | 
            -
                                    # Show input schema
         | 
| 431 | 
            -
                                    print(f"      Input Schema: {json.dumps(tool.input_schema, indent=8)}")
         | 
| 432 | 
            -
                        
         | 
| 433 | 
            -
                    elif action == 'enable':
         | 
| 434 | 
            -
                        # Enable a tool
         | 
| 435 | 
            -
                        tool_name = args.tool_name
         | 
| 436 | 
            -
                        if tool_registry.enable_tool(tool_name):
         | 
| 437 | 
            -
                            print(f"✅ Enabled tool: {tool_name}")
         | 
| 438 | 
            -
                            return 0
         | 
| 439 | 
            -
                        else:
         | 
| 440 | 
            -
                            print(f"❌ Failed to enable tool: {tool_name}")
         | 
| 441 | 
            -
                            return 1
         | 
| 442 | 
            -
                    
         | 
| 443 | 
            -
                    elif action == 'disable':
         | 
| 444 | 
            -
                        # Disable a tool
         | 
| 445 | 
            -
                        tool_name = args.tool_name
         | 
| 446 | 
            -
                        if tool_registry.disable_tool(tool_name):
         | 
| 447 | 
            -
                            print(f"✅ Disabled tool: {tool_name}")
         | 
| 448 | 
            -
                            return 0
         | 
| 449 | 
            -
                        else:
         | 
| 450 | 
            -
                            print(f"❌ Failed to disable tool: {tool_name}")
         | 
| 451 | 
            -
                            return 1
         | 
| 452 | 
            -
                    
         | 
| 453 | 
            -
                    else:
         | 
| 454 | 
            -
                        print(f"Unknown tool action: {action}")
         | 
| 455 | 
            -
                        return 1
         | 
| 456 | 
            -
                    
         | 
| 457 | 
            -
                    return 0
         | 
| 458 | 
            -
                    
         | 
| 459 | 
            -
                except Exception as e:
         | 
| 460 | 
            -
                    logger.error(f"Failed to manage tools: {e}", exc_info=True)
         | 
| 461 | 
            -
                    print(f"Error managing tools: {e}")
         | 
| 462 | 
            -
                    return 1
         | 
| 463 | 
            -
             | 
| 464 | 
            -
             | 
| 465 | 
            -
            def _register_tool(args, logger):
         | 
| 466 | 
            -
                """
         | 
| 467 | 
            -
                Register a new MCP tool.
         | 
| 468 | 
            -
                
         | 
| 469 | 
            -
                WHY: Users need to add custom tools to the MCP Gateway for use
         | 
| 470 | 
            -
                in Claude sessions.
         | 
| 471 | 
            -
                
         | 
| 472 | 
            -
                Args:
         | 
| 473 | 
            -
                    args: Command arguments with tool definition
         | 
| 474 | 
            -
                    logger: Logger instance
         | 
| 475 | 
            -
                    
         | 
| 476 | 
            -
                Returns:
         | 
| 477 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 478 | 
            -
                """
         | 
| 479 | 
            -
                from ...services.mcp_gateway import ToolRegistry
         | 
| 480 | 
            -
                from ...services.mcp_gateway.core.interfaces import MCPToolDefinition
         | 
| 481 | 
            -
                
         | 
| 482 | 
            -
                try:
         | 
| 483 | 
            -
                    # Get tool details from arguments
         | 
| 484 | 
            -
                    tool_name = args.name
         | 
| 485 | 
            -
                    tool_description = args.description
         | 
| 486 | 
            -
                    
         | 
| 487 | 
            -
                    # Parse input schema
         | 
| 488 | 
            -
                    if args.schema_file:
         | 
| 489 | 
            -
                        with open(args.schema_file, 'r') as f:
         | 
| 490 | 
            -
                            input_schema = json.load(f)
         | 
| 491 | 
            -
                    else:
         | 
| 492 | 
            -
                        # Basic schema
         | 
| 493 | 
            -
                        input_schema = {
         | 
| 494 | 
            -
                            "type": "object",
         | 
| 495 | 
            -
                            "properties": {},
         | 
| 496 | 
            -
                            "required": []
         | 
| 497 | 
            -
                        }
         | 
| 498 | 
            -
                    
         | 
| 499 | 
            -
                    # Create tool definition
         | 
| 500 | 
            -
                    tool_def = MCPToolDefinition(
         | 
| 501 | 
            -
                        name=tool_name,
         | 
| 502 | 
            -
                        description=tool_description,
         | 
| 503 | 
            -
                        input_schema=input_schema,
         | 
| 504 | 
            -
                        enabled=True
         | 
| 505 | 
            -
                    )
         | 
| 506 | 
            -
                    
         | 
| 507 | 
            -
                    # Register with tool registry
         | 
| 508 | 
            -
                    tool_registry = ToolRegistry()
         | 
| 509 | 
            -
                    
         | 
| 510 | 
            -
                    if args.adapter:
         | 
| 511 | 
            -
                        # Register with custom adapter
         | 
| 512 | 
            -
                        logger.info(f"Registering tool with adapter: {args.adapter}")
         | 
| 513 | 
            -
                        # Import and instantiate adapter
         | 
| 514 | 
            -
                        # This would be extended based on adapter framework
         | 
| 515 | 
            -
                        print(f"Custom adapter registration not yet implemented: {args.adapter}")
         | 
| 516 | 
            -
                        return 1
         | 
| 517 | 
            -
                    else:
         | 
| 518 | 
            -
                        # Register as a simple tool
         | 
| 519 | 
            -
                        success = tool_registry.register_tool(tool_def)
         | 
| 520 | 
            -
                        
         | 
| 521 | 
            -
                        if success:
         | 
| 522 | 
            -
                            print(f"✅ Successfully registered tool: {tool_name}")
         | 
| 523 | 
            -
                            
         | 
| 524 | 
            -
                            # Save to configuration if requested
         | 
| 525 | 
            -
                            if args.save:
         | 
| 526 | 
            -
                                config_file = Path.home() / ".claude-mpm" / "mcp_config.yaml"
         | 
| 527 | 
            -
                                # Update configuration with new tool
         | 
| 528 | 
            -
                                print(f"Tool configuration saved to: {config_file}")
         | 
| 529 | 
            -
                            
         | 
| 530 | 
            -
                            return 0
         | 
| 531 | 
            -
                        else:
         | 
| 532 | 
            -
                            print(f"❌ Failed to register tool: {tool_name}")
         | 
| 533 | 
            -
                            return 1
         | 
| 534 | 
            -
                    
         | 
| 535 | 
            -
                except Exception as e:
         | 
| 536 | 
            -
                    logger.error(f"Failed to register tool: {e}", exc_info=True)
         | 
| 537 | 
            -
                    print(f"Error registering tool: {e}")
         | 
| 538 | 
            -
                    return 1
         | 
| 539 | 
            -
             | 
| 137 | 
            +
                    import mcp
         | 
| 540 138 |  | 
| 541 | 
            -
             | 
| 542 | 
            -
                 | 
| 543 | 
            -
             | 
| 544 | 
            -
             | 
| 545 | 
            -
                WHY: Users need to verify that tools are working correctly before
         | 
| 546 | 
            -
                using them in Claude sessions.
         | 
| 547 | 
            -
                
         | 
| 548 | 
            -
                Args:
         | 
| 549 | 
            -
                    args: Command arguments with tool name and test parameters
         | 
| 550 | 
            -
                    logger: Logger instance
         | 
| 551 | 
            -
                    
         | 
| 552 | 
            -
                Returns:
         | 
| 553 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 554 | 
            -
                """
         | 
| 555 | 
            -
                from ...services.mcp_gateway import ToolRegistry
         | 
| 556 | 
            -
                from ...services.mcp_gateway.core.interfaces import MCPToolInvocation
         | 
| 557 | 
            -
                
         | 
| 558 | 
            -
                try:
         | 
| 559 | 
            -
                    # Get tool name and arguments
         | 
| 560 | 
            -
                    tool_name = args.tool_name
         | 
| 561 | 
            -
                    
         | 
| 562 | 
            -
                    # Parse tool arguments
         | 
| 563 | 
            -
                    if args.args_file:
         | 
| 564 | 
            -
                        with open(args.args_file, 'r') as f:
         | 
| 565 | 
            -
                            tool_args = json.load(f)
         | 
| 566 | 
            -
                    elif args.args:
         | 
| 567 | 
            -
                        tool_args = json.loads(args.args)
         | 
| 568 | 
            -
                    else:
         | 
| 569 | 
            -
                        tool_args = {}
         | 
| 570 | 
            -
                    
         | 
| 571 | 
            -
                    print(f"Testing tool: {tool_name}")
         | 
| 572 | 
            -
                    print(f"Arguments: {json.dumps(tool_args, indent=2)}")
         | 
| 573 | 
            -
                    print("-" * 50)
         | 
| 574 | 
            -
                    
         | 
| 575 | 
            -
                    # Initialize tool registry
         | 
| 576 | 
            -
                    tool_registry = ToolRegistry()
         | 
| 577 | 
            -
                    
         | 
| 578 | 
            -
                    # Load tools
         | 
| 579 | 
            -
                    config_file = Path.home() / ".claude-mcp" / "mcp_config.yaml"
         | 
| 580 | 
            -
                    if config_file.exists():
         | 
| 581 | 
            -
                        # For now, just load default tools if config file exists
         | 
| 582 | 
            -
                        # TODO: Implement proper async config loading for CLI commands
         | 
| 583 | 
            -
                        _load_default_tools(tool_registry, logger)
         | 
| 584 | 
            -
                    
         | 
| 585 | 
            -
                    # Create invocation request
         | 
| 586 | 
            -
                    invocation = MCPToolInvocation(
         | 
| 587 | 
            -
                        tool_name=tool_name,
         | 
| 588 | 
            -
                        arguments=tool_args,
         | 
| 589 | 
            -
                        request_id=f"test-{tool_name}"
         | 
| 590 | 
            -
                    )
         | 
| 591 | 
            -
                    
         | 
| 592 | 
            -
                    # Invoke tool
         | 
| 593 | 
            -
                    result = asyncio.run(tool_registry.invoke_tool(invocation))
         | 
| 594 | 
            -
                    
         | 
| 595 | 
            -
                    if result.success:
         | 
| 596 | 
            -
                        print("✅ Tool invocation successful!")
         | 
| 597 | 
            -
                        print(f"Result: {json.dumps(result.result, indent=2)}")
         | 
| 598 | 
            -
                    else:
         | 
| 599 | 
            -
                        print("❌ Tool invocation failed!")
         | 
| 600 | 
            -
                        print(f"Error: {result.error}")
         | 
| 601 | 
            -
                    
         | 
| 602 | 
            -
                    return 0 if result.success else 1
         | 
| 603 | 
            -
                    
         | 
| 604 | 
            -
                except Exception as e:
         | 
| 605 | 
            -
                    logger.error(f"Failed to test tool: {e}", exc_info=True)
         | 
| 606 | 
            -
                    print(f"Error testing tool: {e}")
         | 
| 139 | 
            +
                    print("✅ MCP package installed")
         | 
| 140 | 
            +
                except ImportError:
         | 
| 141 | 
            +
                    print("❌ MCP package not installed")
         | 
| 142 | 
            +
                    print("   Run: claude-mpm mcp install")
         | 
| 607 143 | 
             
                    return 1
         | 
| 608 144 |  | 
| 609 | 
            -
             | 
| 610 | 
            -
             | 
| 611 | 
            -
                """
         | 
| 612 | 
            -
                 | 
| 613 | 
            -
             | 
| 614 | 
            -
                WHY: Users need a simple way to set up the MCP Gateway with
         | 
| 615 | 
            -
                default configuration and tools.
         | 
| 616 | 
            -
                
         | 
| 617 | 
            -
                Args:
         | 
| 618 | 
            -
                    args: Command arguments
         | 
| 619 | 
            -
                    logger: Logger instance
         | 
| 620 | 
            -
                    
         | 
| 621 | 
            -
                Returns:
         | 
| 622 | 
            -
                    int: Exit code (0 for success, non-zero for failure)
         | 
| 623 | 
            -
                """
         | 
| 624 | 
            -
                try:
         | 
| 625 | 
            -
                    print("Installing MCP Gateway...")
         | 
| 626 | 
            -
                    print("=" * 50)
         | 
| 627 | 
            -
                    
         | 
| 628 | 
            -
                    # Create configuration directory
         | 
| 629 | 
            -
                    config_dir = Path.home() / ".claude-mpm"
         | 
| 630 | 
            -
                    config_dir.mkdir(exist_ok=True)
         | 
| 631 | 
            -
                    
         | 
| 632 | 
            -
                    # Create default configuration
         | 
| 633 | 
            -
                    config_file = config_dir / "mcp_config.yaml"
         | 
| 634 | 
            -
                    
         | 
| 635 | 
            -
                    if config_file.exists() and not getattr(args, 'force', False):
         | 
| 636 | 
            -
                        print(f"Configuration already exists: {config_file}")
         | 
| 637 | 
            -
                        print("Use --force to overwrite")
         | 
| 638 | 
            -
                        return 1
         | 
| 639 | 
            -
                    
         | 
| 640 | 
            -
                    # Default configuration
         | 
| 641 | 
            -
                    default_config = {
         | 
| 642 | 
            -
                        "server": {
         | 
| 643 | 
            -
                            "name": "claude-mpm-mcp",
         | 
| 644 | 
            -
                            "version": "1.0.0",
         | 
| 645 | 
            -
                            "port": 8766,
         | 
| 646 | 
            -
                            "mode": "stdio"
         | 
| 647 | 
            -
                        },
         | 
| 648 | 
            -
                        "tools": {
         | 
| 649 | 
            -
                            "load_defaults": True,
         | 
| 650 | 
            -
                            "custom_tools_dir": str(config_dir / "mcp_tools"),
         | 
| 651 | 
            -
                            "enabled": [
         | 
| 652 | 
            -
                                "echo",
         | 
| 653 | 
            -
                                "calculator",
         | 
| 654 | 
            -
                                "system_info"
         | 
| 655 | 
            -
                            ]
         | 
| 656 | 
            -
                        },
         | 
| 657 | 
            -
                        "logging": {
         | 
| 658 | 
            -
                            "level": "INFO",
         | 
| 659 | 
            -
                            "file": str(config_dir / "logs" / "mcp_server.log")
         | 
| 660 | 
            -
                        }
         | 
| 661 | 
            -
                    }
         | 
| 662 | 
            -
                    
         | 
| 663 | 
            -
                    # Write configuration
         | 
| 664 | 
            -
                    import yaml
         | 
| 665 | 
            -
                    with open(config_file, 'w') as f:
         | 
| 666 | 
            -
                        yaml.dump(default_config, f, default_flow_style=False)
         | 
| 667 | 
            -
                    
         | 
| 668 | 
            -
                    print(f"✅ Created configuration: {config_file}")
         | 
| 669 | 
            -
                    
         | 
| 670 | 
            -
                    # Create tools directory
         | 
| 671 | 
            -
                    tools_dir = config_dir / "mcp_tools"
         | 
| 672 | 
            -
                    tools_dir.mkdir(exist_ok=True)
         | 
| 673 | 
            -
                    print(f"✅ Created tools directory: {tools_dir}")
         | 
| 674 | 
            -
                    
         | 
| 675 | 
            -
                    # Create logs directory
         | 
| 676 | 
            -
                    logs_dir = config_dir / "logs"
         | 
| 677 | 
            -
                    logs_dir.mkdir(exist_ok=True)
         | 
| 678 | 
            -
                    print(f"✅ Created logs directory: {logs_dir}")
         | 
| 679 | 
            -
                    
         | 
| 680 | 
            -
                    # Test MCP package installation
         | 
| 145 | 
            +
                # Show configuration status
         | 
| 146 | 
            +
                print("\n📁 Configuration:")
         | 
| 147 | 
            +
                config_path = Path.home() / ".claude" / "mcp_config.json"
         | 
| 148 | 
            +
                if config_path.exists():
         | 
| 149 | 
            +
                    print(f"   Config file: {config_path}")
         | 
| 681 150 | 
             
                    try:
         | 
| 682 | 
            -
                         | 
| 683 | 
            -
             | 
| 684 | 
            -
             | 
| 685 | 
            -
             | 
| 686 | 
            -
             | 
| 687 | 
            -
                         | 
| 688 | 
            -
             | 
| 689 | 
            -
             | 
| 690 | 
            -
             | 
| 691 | 
            -
             | 
| 692 | 
            -
             | 
| 693 | 
            -
             | 
| 694 | 
            -
             | 
| 695 | 
            -
             | 
| 696 | 
            -
             | 
| 697 | 
            -
             | 
| 698 | 
            -
             | 
| 699 | 
            -
             | 
| 700 | 
            -
                    print(" | 
| 701 | 
            -
                     | 
| 702 | 
            -
             | 
| 703 | 
            -
             | 
| 704 | 
            -
             | 
| 705 | 
            -
             | 
| 706 | 
            -
             | 
| 707 | 
            -
             | 
| 708 | 
            -
             | 
| 709 | 
            -
             | 
| 710 | 
            -
                     | 
| 711 | 
            -
             | 
| 712 | 
            -
             | 
| 713 | 
            -
             | 
| 714 | 
            -
             | 
| 715 | 
            -
             | 
| 716 | 
            -
                 | 
| 717 | 
            -
                 | 
| 718 | 
            -
             | 
| 719 | 
            -
             | 
| 720 | 
            -
             | 
| 721 | 
            -
             | 
| 722 | 
            -
             | 
| 723 | 
            -
             | 
| 724 | 
            -
             | 
| 725 | 
            -
             | 
| 726 | 
            -
                 | 
| 727 | 
            -
             | 
| 728 | 
            -
                "" | 
| 729 | 
            -
                 | 
| 730 | 
            -
             | 
| 731 | 
            -
             | 
| 732 | 
            -
             | 
| 733 | 
            -
             | 
| 734 | 
            -
                    if action == 'view':
         | 
| 735 | 
            -
                        # View current configuration
         | 
| 736 | 
            -
                        if not config_file.exists():
         | 
| 737 | 
            -
                            print("No configuration file found")
         | 
| 738 | 
            -
                            print("Run 'claude-mpm mcp install' to create default configuration")
         | 
| 739 | 
            -
                            return 1
         | 
| 740 | 
            -
                        
         | 
| 741 | 
            -
                        import yaml
         | 
| 742 | 
            -
                        with open(config_file, 'r') as f:
         | 
| 743 | 
            -
                            config = yaml.safe_load(f)
         | 
| 744 | 
            -
                        
         | 
| 745 | 
            -
                        print("MCP Gateway Configuration")
         | 
| 746 | 
            -
                        print("=" * 50)
         | 
| 747 | 
            -
                        print(yaml.dump(config, default_flow_style=False))
         | 
| 748 | 
            -
                        
         | 
| 749 | 
            -
                    elif action == 'edit':
         | 
| 750 | 
            -
                        # Edit configuration
         | 
| 751 | 
            -
                        if not config_file.exists():
         | 
| 752 | 
            -
                            print("No configuration file found")
         | 
| 753 | 
            -
                            return 1
         | 
| 754 | 
            -
                        
         | 
| 755 | 
            -
                        # Open in default editor
         | 
| 756 | 
            -
                        import os
         | 
| 757 | 
            -
                        import subprocess
         | 
| 758 | 
            -
                        
         | 
| 759 | 
            -
                        editor = os.environ.get('EDITOR', 'nano')
         | 
| 760 | 
            -
                        subprocess.call([editor, str(config_file)])
         | 
| 761 | 
            -
                        
         | 
| 762 | 
            -
                        print("Configuration updated")
         | 
| 763 | 
            -
                        
         | 
| 764 | 
            -
                    elif action == 'reset':
         | 
| 765 | 
            -
                        # Reset to default configuration
         | 
| 766 | 
            -
                        if config_file.exists():
         | 
| 767 | 
            -
                            # Backup existing configuration
         | 
| 768 | 
            -
                            backup_file = config_file.with_suffix('.yaml.bak')
         | 
| 769 | 
            -
                            config_file.rename(backup_file)
         | 
| 770 | 
            -
                            print(f"Backed up existing configuration to: {backup_file}")
         | 
| 771 | 
            -
                        
         | 
| 772 | 
            -
                        # Run install to create default configuration
         | 
| 773 | 
            -
                        args.force = True
         | 
| 774 | 
            -
                        return _install_gateway(args, logger)
         | 
| 775 | 
            -
                    
         | 
| 776 | 
            -
                    else:
         | 
| 777 | 
            -
                        print(f"Unknown config action: {action}")
         | 
| 778 | 
            -
                        return 1
         | 
| 779 | 
            -
                    
         | 
| 780 | 
            -
                    return 0
         | 
| 781 | 
            -
                    
         | 
| 782 | 
            -
                except Exception as e:
         | 
| 783 | 
            -
                    logger.error(f"Failed to manage configuration: {e}", exc_info=True)
         | 
| 784 | 
            -
                    print(f"Error managing configuration: {e}")
         | 
| 785 | 
            -
                    return 1
         | 
| 786 | 
            -
             | 
| 787 | 
            -
             | 
| 788 | 
            -
            async def _load_default_tools(tool_registry, logger):
         | 
| 789 | 
            -
                """
         | 
| 790 | 
            -
                Load default MCP tools into the registry.
         | 
| 791 | 
            -
                
         | 
| 792 | 
            -
                WHY: We provide a set of default tools for common operations
         | 
| 793 | 
            -
                to get users started quickly.
         | 
| 794 | 
            -
                
         | 
| 795 | 
            -
                Args:
         | 
| 796 | 
            -
                    tool_registry: ToolRegistry instance
         | 
| 797 | 
            -
                    logger: Logger instance
         | 
| 798 | 
            -
                """
         | 
| 799 | 
            -
                try:
         | 
| 800 | 
            -
                    # Import default tool adapters
         | 
| 801 | 
            -
                    from ...services.mcp_gateway.tools.base_adapter import (
         | 
| 802 | 
            -
                        EchoToolAdapter,
         | 
| 803 | 
            -
                        CalculatorToolAdapter,
         | 
| 804 | 
            -
                        SystemInfoToolAdapter
         | 
| 805 | 
            -
                    )
         | 
| 806 | 
            -
                    
         | 
| 807 | 
            -
                    # Register default tools
         | 
| 808 | 
            -
                    default_tools = [
         | 
| 809 | 
            -
                        EchoToolAdapter(),
         | 
| 810 | 
            -
                        CalculatorToolAdapter(),
         | 
| 811 | 
            -
                        SystemInfoToolAdapter()
         | 
| 812 | 
            -
                    ]
         | 
| 813 | 
            -
                    
         | 
| 814 | 
            -
                    for adapter in default_tools:
         | 
| 815 | 
            -
                        await adapter.initialize()
         | 
| 816 | 
            -
                        tool_registry.register_tool(adapter)
         | 
| 817 | 
            -
                        tool_def = adapter.get_definition()
         | 
| 818 | 
            -
                        logger.debug(f"Loaded default tool: {tool_def.name}")
         | 
| 819 | 
            -
                    
         | 
| 820 | 
            -
                except Exception as e:
         | 
| 821 | 
            -
                    logger.error(f"Failed to load default tools: {e}", exc_info=True)
         | 
| 151 | 
            +
                        with open(config_path) as f:
         | 
| 152 | 
            +
                            config = json.load(f)
         | 
| 153 | 
            +
                            if "servers" in config:
         | 
| 154 | 
            +
                                print(f"   Configured servers: {len(config.get('servers', {}))}")
         | 
| 155 | 
            +
                    except Exception as e:
         | 
| 156 | 
            +
                        print(f"   ⚠️  Error reading config: {e}")
         | 
| 157 | 
            +
                else:
         | 
| 158 | 
            +
                    print(f"   No config file at {config_path}")
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                # Show Claude Desktop configuration
         | 
| 161 | 
            +
                claude_config = (
         | 
| 162 | 
            +
                    Path.home()
         | 
| 163 | 
            +
                    / "Library"
         | 
| 164 | 
            +
                    / "Application Support"
         | 
| 165 | 
            +
                    / "Claude"
         | 
| 166 | 
            +
                    / "claude_desktop_config.json"
         | 
| 167 | 
            +
                )
         | 
| 168 | 
            +
                if claude_config.exists():
         | 
| 169 | 
            +
                    print(f"\n🖥️  Claude Desktop Config: {claude_config}")
         | 
| 170 | 
            +
                    try:
         | 
| 171 | 
            +
                        with open(claude_config) as f:
         | 
| 172 | 
            +
                            config = json.load(f)
         | 
| 173 | 
            +
                            mcp_servers = config.get("mcpServers", {})
         | 
| 174 | 
            +
                            if "claude-mpm" in mcp_servers:
         | 
| 175 | 
            +
                                print("   ✅ claude-mpm server configured")
         | 
| 176 | 
            +
                            else:
         | 
| 177 | 
            +
                                print("   ⚠️  claude-mpm server not configured")
         | 
| 178 | 
            +
                                print("   Run: claude-mpm mcp start (for instructions)")
         | 
| 179 | 
            +
                    except Exception as e:
         | 
| 180 | 
            +
                        print(f"   ⚠️  Error reading config: {e}")
         | 
| 181 | 
            +
                else:
         | 
| 182 | 
            +
                    print("\n🖥️  Claude Desktop not configured for MCP")
         | 
| 183 | 
            +
                    print("   Run: claude-mpm mcp start (for instructions)")
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                # Show available tools count
         | 
| 186 | 
            +
                if ToolRegistry:
         | 
| 187 | 
            +
                    try:
         | 
| 188 | 
            +
                        registry = ToolRegistry()
         | 
| 189 | 
            +
                        # Don't initialize fully, just check
         | 
| 190 | 
            +
                        print(f"\n🔧 Tools: Check with 'claude-mpm mcp tools'")
         | 
| 191 | 
            +
                    except:
         | 
| 192 | 
            +
                        print("\n🔧 Tools: Registry not available")
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                print("\n💡 Available Commands:")
         | 
| 195 | 
            +
                print("   claude-mpm mcp install    - Install MCP dependencies")
         | 
| 196 | 
            +
                print("   claude-mpm mcp start      - Start MCP server (stdio mode)")
         | 
| 197 | 
            +
                print("   claude-mpm mcp start --instructions - Show setup instructions")
         | 
| 198 | 
            +
                print("   claude-mpm mcp tools      - List available tools")
         | 
| 199 | 
            +
                print("   claude-mpm mcp test       - Test tool invocation")
         | 
| 200 | 
            +
                print("   claude-mpm mcp config     - Manage configuration")
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                return 0
         |