claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -1,654 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
External MCP Services Integration
|
|
3
|
-
==================================
|
|
4
|
-
|
|
5
|
-
Manages detection and setup of external MCP services like mcp-vector-search
|
|
6
|
-
and mcp-browser. These services run as separate MCP servers in Claude Code,
|
|
7
|
-
not as part of the Claude MPM MCP Gateway.
|
|
8
|
-
|
|
9
|
-
IMPORTANT: External services are NOT auto-installed. Users must manually install
|
|
10
|
-
them using pipx or pip. This gives users explicit control over which optional
|
|
11
|
-
services they want to enable.
|
|
12
|
-
|
|
13
|
-
Installation:
|
|
14
|
-
pipx install mcp-vector-search
|
|
15
|
-
pipx install mcp-browser
|
|
16
|
-
pipx install kuzu-memory
|
|
17
|
-
pipx install mcp-ticketer
|
|
18
|
-
|
|
19
|
-
Note: External services are registered as separate MCP servers in Claude Code
|
|
20
|
-
configuration, not as tools within the gateway.
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
import json
|
|
24
|
-
import subprocess
|
|
25
|
-
import sys
|
|
26
|
-
from pathlib import Path
|
|
27
|
-
from typing import Any, Dict, List
|
|
28
|
-
|
|
29
|
-
from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class ExternalMCPService(BaseToolAdapter):
|
|
33
|
-
"""Base class for external MCP service integration.
|
|
34
|
-
|
|
35
|
-
External services are detected if already installed but are NOT
|
|
36
|
-
automatically installed. Users must install them manually using
|
|
37
|
-
pipx or pip to enable these optional features.
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
def __init__(self, service_name: str, package_name: str):
|
|
41
|
-
"""
|
|
42
|
-
Initialize external MCP service.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
service_name: Name of the service for MCP
|
|
46
|
-
package_name: Python package name to install/run
|
|
47
|
-
"""
|
|
48
|
-
# Import here to avoid circular imports
|
|
49
|
-
from claude_mpm.services.mcp_gateway.core.interfaces import MCPToolDefinition
|
|
50
|
-
|
|
51
|
-
# Create a basic tool definition for the service
|
|
52
|
-
tool_def = MCPToolDefinition(
|
|
53
|
-
name=service_name,
|
|
54
|
-
description=f"External MCP service: {package_name}",
|
|
55
|
-
input_schema={
|
|
56
|
-
"type": "object",
|
|
57
|
-
"properties": {},
|
|
58
|
-
"required": [],
|
|
59
|
-
},
|
|
60
|
-
)
|
|
61
|
-
super().__init__(tool_def)
|
|
62
|
-
self.service_name = service_name
|
|
63
|
-
self.package_name = package_name
|
|
64
|
-
self.process = None
|
|
65
|
-
self._is_installed = False
|
|
66
|
-
|
|
67
|
-
async def invoke(self, invocation):
|
|
68
|
-
"""
|
|
69
|
-
Invoke method required by BaseToolAdapter interface.
|
|
70
|
-
|
|
71
|
-
This base implementation should be overridden by subclasses.
|
|
72
|
-
"""
|
|
73
|
-
# Import here to avoid circular imports
|
|
74
|
-
from claude_mpm.services.mcp_gateway.core.interfaces import MCPToolResult
|
|
75
|
-
|
|
76
|
-
return MCPToolResult(
|
|
77
|
-
success=False,
|
|
78
|
-
error="invoke method not implemented in base ExternalMCPService",
|
|
79
|
-
execution_time=0.0,
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
async def initialize(
|
|
83
|
-
self, auto_install: bool = False, interactive: bool = False
|
|
84
|
-
) -> bool:
|
|
85
|
-
"""Initialize the external service.
|
|
86
|
-
|
|
87
|
-
NOTE: Auto-installation is disabled by default (v4.9.0+). Users must
|
|
88
|
-
manually install external services using pipx or pip.
|
|
89
|
-
|
|
90
|
-
Args:
|
|
91
|
-
auto_install: Whether to automatically install if not found (default: False)
|
|
92
|
-
Deprecated - will be removed in future versions
|
|
93
|
-
interactive: Whether to prompt user for installation preferences (default: False)
|
|
94
|
-
Only used if auto_install=True
|
|
95
|
-
"""
|
|
96
|
-
try:
|
|
97
|
-
# Check if package is installed
|
|
98
|
-
self._is_installed = await self._check_installation()
|
|
99
|
-
|
|
100
|
-
if not self._is_installed and auto_install:
|
|
101
|
-
# This path is deprecated but kept for backward compatibility
|
|
102
|
-
self.logger.warning(
|
|
103
|
-
f"Auto-installation is deprecated. Please install {self.package_name} manually: "
|
|
104
|
-
f"pipx install {self.package_name}"
|
|
105
|
-
)
|
|
106
|
-
await self._install_package(interactive=interactive)
|
|
107
|
-
self._is_installed = await self._check_installation()
|
|
108
|
-
|
|
109
|
-
if not self._is_installed:
|
|
110
|
-
self.logger.debug(
|
|
111
|
-
f"{self.package_name} is not available. "
|
|
112
|
-
f"Install manually with: pipx install {self.package_name}"
|
|
113
|
-
)
|
|
114
|
-
return False
|
|
115
|
-
|
|
116
|
-
self.logger.info(f"{self.package_name} is available")
|
|
117
|
-
return True
|
|
118
|
-
|
|
119
|
-
except Exception as e:
|
|
120
|
-
self.logger.error(f"Failed to initialize {self.service_name}: {e}")
|
|
121
|
-
return False
|
|
122
|
-
|
|
123
|
-
async def _check_installation(self) -> bool:
|
|
124
|
-
"""Check if the package is installed."""
|
|
125
|
-
# First check if importable (faster and more reliable)
|
|
126
|
-
import_name = self.package_name.replace("-", "_")
|
|
127
|
-
try:
|
|
128
|
-
import importlib.util
|
|
129
|
-
|
|
130
|
-
spec = importlib.util.find_spec(import_name)
|
|
131
|
-
if spec is not None:
|
|
132
|
-
return True
|
|
133
|
-
except (ImportError, ModuleNotFoundError, ValueError):
|
|
134
|
-
pass
|
|
135
|
-
|
|
136
|
-
# Fallback: try running as module
|
|
137
|
-
try:
|
|
138
|
-
result = subprocess.run(
|
|
139
|
-
[sys.executable, "-m", import_name, "--help"],
|
|
140
|
-
capture_output=True,
|
|
141
|
-
text=True,
|
|
142
|
-
timeout=5,
|
|
143
|
-
check=False,
|
|
144
|
-
)
|
|
145
|
-
return result.returncode == 0
|
|
146
|
-
except (
|
|
147
|
-
subprocess.TimeoutExpired,
|
|
148
|
-
FileNotFoundError,
|
|
149
|
-
subprocess.CalledProcessError,
|
|
150
|
-
):
|
|
151
|
-
return False
|
|
152
|
-
|
|
153
|
-
async def _install_package(self, interactive: bool = True) -> bool:
|
|
154
|
-
"""Install the package using pip or pipx.
|
|
155
|
-
|
|
156
|
-
Args:
|
|
157
|
-
interactive: Whether to prompt user for installation method choice
|
|
158
|
-
"""
|
|
159
|
-
try:
|
|
160
|
-
install_method = None
|
|
161
|
-
|
|
162
|
-
if interactive:
|
|
163
|
-
# Show user-friendly installation prompt
|
|
164
|
-
print(f"\n⚠️ {self.package_name} not found", file=sys.stderr)
|
|
165
|
-
print(
|
|
166
|
-
"This package enables enhanced functionality (optional).",
|
|
167
|
-
file=sys.stderr,
|
|
168
|
-
)
|
|
169
|
-
print("\nInstallation options:", file=sys.stderr)
|
|
170
|
-
print(
|
|
171
|
-
"1. Install via pip (recommended for this project)", file=sys.stderr
|
|
172
|
-
)
|
|
173
|
-
print("2. Install via pipx (isolated, system-wide)", file=sys.stderr)
|
|
174
|
-
print("3. Skip (continue without this package)", file=sys.stderr)
|
|
175
|
-
|
|
176
|
-
try:
|
|
177
|
-
choice = input("\nChoose option (1/2/3) [1]: ").strip() or "1"
|
|
178
|
-
if choice == "1":
|
|
179
|
-
install_method = "pip"
|
|
180
|
-
elif choice == "2":
|
|
181
|
-
install_method = "pipx"
|
|
182
|
-
else:
|
|
183
|
-
self.logger.info(
|
|
184
|
-
f"Skipping installation of {self.package_name}"
|
|
185
|
-
)
|
|
186
|
-
return False
|
|
187
|
-
except (EOFError, KeyboardInterrupt):
|
|
188
|
-
print("\nInstallation cancelled", file=sys.stderr)
|
|
189
|
-
return False
|
|
190
|
-
else:
|
|
191
|
-
# Non-interactive: default to pip
|
|
192
|
-
install_method = "pip"
|
|
193
|
-
|
|
194
|
-
# Install using selected method
|
|
195
|
-
if install_method == "pip":
|
|
196
|
-
return await self._install_via_pip()
|
|
197
|
-
if install_method == "pipx":
|
|
198
|
-
return await self._install_via_pipx()
|
|
199
|
-
|
|
200
|
-
return False
|
|
201
|
-
|
|
202
|
-
except Exception as e:
|
|
203
|
-
self.logger.error(f"Error installing {self.package_name}: {e}")
|
|
204
|
-
return False
|
|
205
|
-
|
|
206
|
-
async def _install_via_pip(self) -> bool:
|
|
207
|
-
"""Install package via pip."""
|
|
208
|
-
try:
|
|
209
|
-
print(f"\n📦 Installing {self.package_name} via pip...", file=sys.stderr)
|
|
210
|
-
result = subprocess.run(
|
|
211
|
-
[sys.executable, "-m", "pip", "install", self.package_name],
|
|
212
|
-
capture_output=True,
|
|
213
|
-
text=True,
|
|
214
|
-
timeout=120,
|
|
215
|
-
check=False,
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
if result.returncode == 0:
|
|
219
|
-
print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
|
|
220
|
-
self.logger.info(f"Successfully installed {self.package_name} via pip")
|
|
221
|
-
return True
|
|
222
|
-
|
|
223
|
-
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
|
224
|
-
print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
|
|
225
|
-
self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
|
|
226
|
-
return False
|
|
227
|
-
|
|
228
|
-
except subprocess.TimeoutExpired:
|
|
229
|
-
print("✗ Installation timed out", file=sys.stderr)
|
|
230
|
-
self.logger.error(f"Installation of {self.package_name} timed out")
|
|
231
|
-
return False
|
|
232
|
-
except Exception as e:
|
|
233
|
-
print(f"✗ Installation error: {e}", file=sys.stderr)
|
|
234
|
-
self.logger.error(f"Error installing {self.package_name}: {e}")
|
|
235
|
-
return False
|
|
236
|
-
|
|
237
|
-
async def _install_via_pipx(self) -> bool:
|
|
238
|
-
"""Install package via pipx."""
|
|
239
|
-
try:
|
|
240
|
-
# Check if pipx is available
|
|
241
|
-
pipx_check = subprocess.run(
|
|
242
|
-
["pipx", "--version"],
|
|
243
|
-
capture_output=True,
|
|
244
|
-
text=True,
|
|
245
|
-
timeout=5,
|
|
246
|
-
check=False,
|
|
247
|
-
)
|
|
248
|
-
|
|
249
|
-
if pipx_check.returncode != 0:
|
|
250
|
-
print("✗ pipx is not installed", file=sys.stderr)
|
|
251
|
-
print("Install pipx first: python -m pip install pipx", file=sys.stderr)
|
|
252
|
-
self.logger.error("pipx not available for installation")
|
|
253
|
-
return False
|
|
254
|
-
|
|
255
|
-
print(f"\n📦 Installing {self.package_name} via pipx...", file=sys.stderr)
|
|
256
|
-
result = subprocess.run(
|
|
257
|
-
["pipx", "install", self.package_name],
|
|
258
|
-
capture_output=True,
|
|
259
|
-
text=True,
|
|
260
|
-
timeout=120,
|
|
261
|
-
check=False,
|
|
262
|
-
)
|
|
263
|
-
|
|
264
|
-
if result.returncode == 0:
|
|
265
|
-
print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
|
|
266
|
-
self.logger.info(f"Successfully installed {self.package_name} via pipx")
|
|
267
|
-
return True
|
|
268
|
-
|
|
269
|
-
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
|
270
|
-
print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
|
|
271
|
-
self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
|
|
272
|
-
return False
|
|
273
|
-
|
|
274
|
-
except FileNotFoundError:
|
|
275
|
-
print("✗ pipx command not found", file=sys.stderr)
|
|
276
|
-
print("Install pipx first: python -m pip install pipx", file=sys.stderr)
|
|
277
|
-
self.logger.error("pipx command not found")
|
|
278
|
-
return False
|
|
279
|
-
except subprocess.TimeoutExpired:
|
|
280
|
-
print("✗ Installation timed out", file=sys.stderr)
|
|
281
|
-
self.logger.error(f"Installation of {self.package_name} timed out")
|
|
282
|
-
return False
|
|
283
|
-
except Exception as e:
|
|
284
|
-
print(f"✗ Installation error: {e}", file=sys.stderr)
|
|
285
|
-
self.logger.error(f"Error installing {self.package_name}: {e}")
|
|
286
|
-
return False
|
|
287
|
-
|
|
288
|
-
def get_definition(self) -> Dict[str, Any]:
|
|
289
|
-
"""Get service definition for MCP registration."""
|
|
290
|
-
return {
|
|
291
|
-
"name": self.service_name,
|
|
292
|
-
"description": f"External MCP service: {self.package_name}",
|
|
293
|
-
"type": "external_service",
|
|
294
|
-
"package": self.package_name,
|
|
295
|
-
"installed": self._is_installed,
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
class MCPVectorSearchService(ExternalMCPService):
|
|
300
|
-
"""MCP Vector Search service integration."""
|
|
301
|
-
|
|
302
|
-
def __init__(self):
|
|
303
|
-
"""Initialize MCP Vector Search service."""
|
|
304
|
-
super().__init__("mcp-vector-search", "mcp-vector-search")
|
|
305
|
-
|
|
306
|
-
def get_definition(self) -> Dict[str, Any]:
|
|
307
|
-
"""Get tool definition for MCP registration."""
|
|
308
|
-
base_def = super().get_definition()
|
|
309
|
-
base_def.update(
|
|
310
|
-
{
|
|
311
|
-
"description": "Semantic code search powered by vector embeddings",
|
|
312
|
-
"tools": [
|
|
313
|
-
{
|
|
314
|
-
"name": "mcp__mcp-vector-search__search_code",
|
|
315
|
-
"description": "Search for code using semantic similarity",
|
|
316
|
-
"inputSchema": {
|
|
317
|
-
"type": "object",
|
|
318
|
-
"properties": {
|
|
319
|
-
"query": {
|
|
320
|
-
"type": "string",
|
|
321
|
-
"description": "The search query",
|
|
322
|
-
},
|
|
323
|
-
"limit": {"type": "integer", "default": 10},
|
|
324
|
-
"similarity_threshold": {
|
|
325
|
-
"type": "number",
|
|
326
|
-
"default": 0.3,
|
|
327
|
-
},
|
|
328
|
-
"language": {"type": "string"},
|
|
329
|
-
"file_extensions": {
|
|
330
|
-
"type": "array",
|
|
331
|
-
"items": {"type": "string"},
|
|
332
|
-
},
|
|
333
|
-
"files": {"type": "string"},
|
|
334
|
-
"class_name": {"type": "string"},
|
|
335
|
-
"function_name": {"type": "string"},
|
|
336
|
-
},
|
|
337
|
-
"required": ["query"],
|
|
338
|
-
},
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
"name": "mcp__mcp-vector-search__search_similar",
|
|
342
|
-
"description": "Find code similar to a specific file or function",
|
|
343
|
-
"inputSchema": {
|
|
344
|
-
"type": "object",
|
|
345
|
-
"properties": {
|
|
346
|
-
"file_path": {
|
|
347
|
-
"type": "string",
|
|
348
|
-
"description": "Path to the file",
|
|
349
|
-
},
|
|
350
|
-
"function_name": {"type": "string"},
|
|
351
|
-
"limit": {"type": "integer", "default": 10},
|
|
352
|
-
"similarity_threshold": {
|
|
353
|
-
"type": "number",
|
|
354
|
-
"default": 0.3,
|
|
355
|
-
},
|
|
356
|
-
},
|
|
357
|
-
"required": ["file_path"],
|
|
358
|
-
},
|
|
359
|
-
},
|
|
360
|
-
{
|
|
361
|
-
"name": "mcp__mcp-vector-search__search_context",
|
|
362
|
-
"description": "Search for code based on contextual description",
|
|
363
|
-
"inputSchema": {
|
|
364
|
-
"type": "object",
|
|
365
|
-
"properties": {
|
|
366
|
-
"description": {
|
|
367
|
-
"type": "string",
|
|
368
|
-
"description": "Contextual description",
|
|
369
|
-
},
|
|
370
|
-
"focus_areas": {
|
|
371
|
-
"type": "array",
|
|
372
|
-
"items": {"type": "string"},
|
|
373
|
-
},
|
|
374
|
-
"limit": {"type": "integer", "default": 10},
|
|
375
|
-
},
|
|
376
|
-
"required": ["description"],
|
|
377
|
-
},
|
|
378
|
-
},
|
|
379
|
-
{
|
|
380
|
-
"name": "mcp__mcp-vector-search__get_project_status",
|
|
381
|
-
"description": "Get project indexing status and statistics",
|
|
382
|
-
"inputSchema": {
|
|
383
|
-
"type": "object",
|
|
384
|
-
"properties": {},
|
|
385
|
-
"required": [],
|
|
386
|
-
},
|
|
387
|
-
},
|
|
388
|
-
{
|
|
389
|
-
"name": "mcp__mcp-vector-search__index_project",
|
|
390
|
-
"description": "Index or reindex the project codebase",
|
|
391
|
-
"inputSchema": {
|
|
392
|
-
"type": "object",
|
|
393
|
-
"properties": {
|
|
394
|
-
"force": {"type": "boolean", "default": False},
|
|
395
|
-
"file_extensions": {
|
|
396
|
-
"type": "array",
|
|
397
|
-
"items": {"type": "string"},
|
|
398
|
-
},
|
|
399
|
-
},
|
|
400
|
-
"required": [],
|
|
401
|
-
},
|
|
402
|
-
},
|
|
403
|
-
],
|
|
404
|
-
}
|
|
405
|
-
)
|
|
406
|
-
return base_def
|
|
407
|
-
|
|
408
|
-
async def invoke(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:
|
|
409
|
-
"""Invoke a tool from mcp-vector-search."""
|
|
410
|
-
try:
|
|
411
|
-
# Extract the actual tool name (remove prefix)
|
|
412
|
-
actual_tool = tool_name.replace("mcp__mcp-vector-search__", "")
|
|
413
|
-
|
|
414
|
-
# Prepare the command
|
|
415
|
-
cmd = [
|
|
416
|
-
sys.executable,
|
|
417
|
-
"-m",
|
|
418
|
-
"mcp_vector_search",
|
|
419
|
-
"--tool",
|
|
420
|
-
actual_tool,
|
|
421
|
-
"--args",
|
|
422
|
-
json.dumps(arguments),
|
|
423
|
-
]
|
|
424
|
-
|
|
425
|
-
# Run the command
|
|
426
|
-
result = subprocess.run(
|
|
427
|
-
cmd,
|
|
428
|
-
capture_output=True,
|
|
429
|
-
text=True,
|
|
430
|
-
timeout=30,
|
|
431
|
-
cwd=Path.cwd(),
|
|
432
|
-
check=False, # Use current working directory for project context
|
|
433
|
-
)
|
|
434
|
-
|
|
435
|
-
if result.returncode == 0:
|
|
436
|
-
try:
|
|
437
|
-
return json.loads(result.stdout)
|
|
438
|
-
except json.JSONDecodeError:
|
|
439
|
-
return {"result": result.stdout}
|
|
440
|
-
else:
|
|
441
|
-
return {"error": result.stderr or "Tool invocation failed"}
|
|
442
|
-
|
|
443
|
-
except subprocess.TimeoutExpired:
|
|
444
|
-
return {"error": "Tool invocation timed out"}
|
|
445
|
-
except Exception as e:
|
|
446
|
-
return {"error": str(e)}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
class MCPBrowserService(ExternalMCPService):
|
|
450
|
-
"""MCP Browser service integration."""
|
|
451
|
-
|
|
452
|
-
def __init__(self):
|
|
453
|
-
"""Initialize MCP Browser service."""
|
|
454
|
-
super().__init__("mcp-browser", "mcp-browser")
|
|
455
|
-
|
|
456
|
-
def get_definition(self) -> Dict[str, Any]:
|
|
457
|
-
"""Get tool definition for MCP registration."""
|
|
458
|
-
base_def = super().get_definition()
|
|
459
|
-
base_def.update(
|
|
460
|
-
{
|
|
461
|
-
"description": "Web browsing and content extraction capabilities",
|
|
462
|
-
"tools": [
|
|
463
|
-
{
|
|
464
|
-
"name": "mcp__mcp-browser__browse",
|
|
465
|
-
"description": "Browse a webpage and extract content",
|
|
466
|
-
"inputSchema": {
|
|
467
|
-
"type": "object",
|
|
468
|
-
"properties": {
|
|
469
|
-
"url": {
|
|
470
|
-
"type": "string",
|
|
471
|
-
"description": "URL to browse",
|
|
472
|
-
},
|
|
473
|
-
"extract": {
|
|
474
|
-
"type": "string",
|
|
475
|
-
"description": "What to extract",
|
|
476
|
-
},
|
|
477
|
-
},
|
|
478
|
-
"required": ["url"],
|
|
479
|
-
},
|
|
480
|
-
},
|
|
481
|
-
{
|
|
482
|
-
"name": "mcp__mcp-browser__search",
|
|
483
|
-
"description": "Search the web",
|
|
484
|
-
"inputSchema": {
|
|
485
|
-
"type": "object",
|
|
486
|
-
"properties": {
|
|
487
|
-
"query": {
|
|
488
|
-
"type": "string",
|
|
489
|
-
"description": "Search query",
|
|
490
|
-
},
|
|
491
|
-
"num_results": {"type": "integer", "default": 10},
|
|
492
|
-
},
|
|
493
|
-
"required": ["query"],
|
|
494
|
-
},
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
"name": "mcp__mcp-browser__screenshot",
|
|
498
|
-
"description": "Take a screenshot of a webpage",
|
|
499
|
-
"inputSchema": {
|
|
500
|
-
"type": "object",
|
|
501
|
-
"properties": {
|
|
502
|
-
"url": {
|
|
503
|
-
"type": "string",
|
|
504
|
-
"description": "URL to screenshot",
|
|
505
|
-
},
|
|
506
|
-
"full_page": {"type": "boolean", "default": False},
|
|
507
|
-
},
|
|
508
|
-
"required": ["url"],
|
|
509
|
-
},
|
|
510
|
-
},
|
|
511
|
-
],
|
|
512
|
-
}
|
|
513
|
-
)
|
|
514
|
-
return base_def
|
|
515
|
-
|
|
516
|
-
async def invoke(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:
|
|
517
|
-
"""Invoke a tool from mcp-browser."""
|
|
518
|
-
try:
|
|
519
|
-
# Extract the actual tool name (remove prefix)
|
|
520
|
-
actual_tool = tool_name.replace("mcp__mcp-browser__", "")
|
|
521
|
-
|
|
522
|
-
# Prepare the command
|
|
523
|
-
cmd = [
|
|
524
|
-
sys.executable,
|
|
525
|
-
"-m",
|
|
526
|
-
"mcp_browser",
|
|
527
|
-
"--tool",
|
|
528
|
-
actual_tool,
|
|
529
|
-
"--args",
|
|
530
|
-
json.dumps(arguments),
|
|
531
|
-
]
|
|
532
|
-
|
|
533
|
-
# Run the command
|
|
534
|
-
result = subprocess.run(
|
|
535
|
-
cmd, capture_output=True, text=True, timeout=30, check=False
|
|
536
|
-
)
|
|
537
|
-
|
|
538
|
-
if result.returncode == 0:
|
|
539
|
-
try:
|
|
540
|
-
return json.loads(result.stdout)
|
|
541
|
-
except json.JSONDecodeError:
|
|
542
|
-
return {"result": result.stdout}
|
|
543
|
-
else:
|
|
544
|
-
return {"error": result.stderr or "Tool invocation failed"}
|
|
545
|
-
|
|
546
|
-
except subprocess.TimeoutExpired:
|
|
547
|
-
return {"error": "Tool invocation timed out"}
|
|
548
|
-
except Exception as e:
|
|
549
|
-
return {"error": str(e)}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
class ExternalMCPServiceManager:
|
|
553
|
-
"""Manager for external MCP services.
|
|
554
|
-
|
|
555
|
-
This manager is responsible for detecting (but NOT installing) Python packages
|
|
556
|
-
for external MCP services. The actual registration of these services happens
|
|
557
|
-
in Claude Code configuration as separate MCP servers.
|
|
558
|
-
|
|
559
|
-
IMPORTANT: As of v4.9.0, this manager NO LONGER auto-installs missing services.
|
|
560
|
-
Users must manually install external services using pipx or pip:
|
|
561
|
-
- pipx install mcp-vector-search
|
|
562
|
-
- pipx install mcp-browser
|
|
563
|
-
- pipx install kuzu-memory
|
|
564
|
-
- pipx install mcp-ticketer
|
|
565
|
-
|
|
566
|
-
Note: This class is maintained for backward compatibility and service detection.
|
|
567
|
-
The actual tool registration is handled by separate MCP server instances in
|
|
568
|
-
Claude Code.
|
|
569
|
-
"""
|
|
570
|
-
|
|
571
|
-
def __init__(self):
|
|
572
|
-
"""Initialize the service manager."""
|
|
573
|
-
self.services: List[ExternalMCPService] = []
|
|
574
|
-
self.logger = None
|
|
575
|
-
|
|
576
|
-
async def initialize_services(self) -> List[ExternalMCPService]:
|
|
577
|
-
"""Initialize all external MCP services.
|
|
578
|
-
|
|
579
|
-
This method checks if external service packages are already installed
|
|
580
|
-
and registers them if available. It does NOT auto-install missing services.
|
|
581
|
-
|
|
582
|
-
External MCP services (mcp-vector-search, mcp-browser, kuzu-memory, mcp-ticketer)
|
|
583
|
-
must be manually installed by users. This gives users explicit control over
|
|
584
|
-
which services they want to use.
|
|
585
|
-
|
|
586
|
-
Installation instructions:
|
|
587
|
-
- mcp-vector-search: pipx install mcp-vector-search
|
|
588
|
-
- mcp-browser: pipx install mcp-browser
|
|
589
|
-
- kuzu-memory: pipx install kuzu-memory
|
|
590
|
-
- mcp-ticketer: pipx install mcp-ticketer
|
|
591
|
-
|
|
592
|
-
Services run as separate MCP servers in Claude Code, not as tools within
|
|
593
|
-
the gateway.
|
|
594
|
-
"""
|
|
595
|
-
# Create service instances
|
|
596
|
-
# Note: kuzu-memory and mcp-ticketer are configured via MCPConfigManager
|
|
597
|
-
# and run as separate MCP servers. They don't need to be included here
|
|
598
|
-
# since they're already set up through the MCP config.
|
|
599
|
-
services = [MCPVectorSearchService(), MCPBrowserService()]
|
|
600
|
-
|
|
601
|
-
# Initialize each service (check if installed, but DO NOT auto-install)
|
|
602
|
-
initialized_services = []
|
|
603
|
-
for service in services:
|
|
604
|
-
try:
|
|
605
|
-
# Pass auto_install=False to prevent automatic installation
|
|
606
|
-
if await service.initialize(auto_install=False, interactive=False):
|
|
607
|
-
initialized_services.append(service)
|
|
608
|
-
if self.logger:
|
|
609
|
-
self.logger.info(
|
|
610
|
-
f"Initialized external service: {service.service_name}"
|
|
611
|
-
)
|
|
612
|
-
elif self.logger:
|
|
613
|
-
self.logger.debug(
|
|
614
|
-
f"Service not available (optional): {service.service_name}. "
|
|
615
|
-
f"Install manually with: pipx install {service.package_name}"
|
|
616
|
-
)
|
|
617
|
-
except Exception as e:
|
|
618
|
-
if self.logger:
|
|
619
|
-
self.logger.error(f"Error initializing {service.service_name}: {e}")
|
|
620
|
-
|
|
621
|
-
self.services = initialized_services
|
|
622
|
-
return initialized_services
|
|
623
|
-
|
|
624
|
-
def get_all_tools(self) -> List[Dict[str, Any]]:
|
|
625
|
-
"""Get all tool definitions from external services."""
|
|
626
|
-
all_tools = []
|
|
627
|
-
for service in self.services:
|
|
628
|
-
service_def = service.get_definition()
|
|
629
|
-
if "tools" in service_def:
|
|
630
|
-
all_tools.extend(service_def["tools"])
|
|
631
|
-
return all_tools
|
|
632
|
-
|
|
633
|
-
async def invoke_tool(
|
|
634
|
-
self, tool_name: str, arguments: Dict[str, Any]
|
|
635
|
-
) -> Dict[str, Any]:
|
|
636
|
-
"""Invoke a tool from any registered external service."""
|
|
637
|
-
# Find the service that handles this tool
|
|
638
|
-
for service in self.services:
|
|
639
|
-
if tool_name.startswith(f"mcp__{service.service_name}__"):
|
|
640
|
-
if isinstance(service, (MCPVectorSearchService, MCPBrowserService)):
|
|
641
|
-
return await service.invoke(tool_name, arguments)
|
|
642
|
-
|
|
643
|
-
return {"error": f"No service found for tool: {tool_name}"}
|
|
644
|
-
|
|
645
|
-
async def shutdown(self):
|
|
646
|
-
"""Shutdown all external services."""
|
|
647
|
-
for service in self.services:
|
|
648
|
-
try:
|
|
649
|
-
await service.shutdown()
|
|
650
|
-
except Exception as e:
|
|
651
|
-
if self.logger:
|
|
652
|
-
self.logger.warning(
|
|
653
|
-
f"Error shutting down {service.service_name}: {e}"
|
|
654
|
-
)
|