claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,6 @@ MCP service installations.
12
12
  import json
13
13
  import subprocess
14
14
  import sys
15
- from datetime import datetime, timezone
16
15
  from enum import Enum
17
16
  from pathlib import Path
18
17
  from typing import Dict, Optional, Tuple
@@ -698,175 +697,106 @@ class MCPConfigManager:
698
697
 
699
698
  return config
700
699
 
701
- def ensure_mcp_services_configured(self) -> Tuple[bool, str]:
700
+ def check_mcp_services_available(self) -> Tuple[bool, str]:
702
701
  """
703
- Ensure MCP services are configured correctly in ~/.claude.json on startup.
702
+ Check if required MCP services are available in ~/.claude.json (READ-ONLY).
704
703
 
705
- This method checks ALL projects in ~/.claude.json and ensures each has
706
- the correct, static MCP service configurations. It will:
707
- 1. Add missing services
708
- 2. Fix incorrect configurations
709
- 3. Update all projects, not just the current one
704
+ This method performs a READ-ONLY check of MCP service availability.
705
+ It does NOT modify ~/.claude.json. Users should install and configure
706
+ MCP services themselves via pip, npx, or Claude Desktop.
710
707
 
711
708
  Returns:
712
- Tuple of (success, message)
709
+ Tuple of (all_available: bool, message: str)
713
710
  """
714
- updated = False
715
- fixed_services = []
716
- added_services = []
717
-
718
- # Load existing Claude config or create minimal structure
719
- claude_config = {}
720
- if self.claude_config_path.exists():
721
- try:
722
- with self.claude_config_path.open() as f:
723
- claude_config = json.load(f)
724
- except Exception as e:
725
- self.logger.error(f"Error reading {self.claude_config_path}: {e}")
726
- return False, f"Failed to read Claude config: {e}"
711
+ # Get services Claude MPM expects to use (from ~/.claude-mpm/config/)
712
+ expected_services = self.get_filtered_services()
727
713
 
728
- # Ensure projects structure exists
729
- if "projects" not in claude_config:
730
- claude_config["projects"] = {}
731
- updated = True
714
+ if not expected_services:
715
+ return True, "No MCP services configured in Claude MPM"
732
716
 
733
- # Note: fix_mcp_service_issues() is already called during CLI initialization
734
- # Calling it here would duplicate the service health checks
717
+ # Load Claude config (read-only)
718
+ if not self.claude_config_path.exists():
719
+ return False, f"Claude config not found at {self.claude_config_path}"
735
720
 
736
- # Process ALL projects in the config, not just current one
737
- projects_to_update = list(claude_config.get("projects", {}).keys())
721
+ try:
722
+ with self.claude_config_path.open() as f:
723
+ claude_config = json.load(f)
724
+ except Exception as e:
725
+ return False, f"Failed to read Claude config: {e}"
738
726
 
739
- # Also add the current project if not in list
727
+ # Check current project
740
728
  current_project_key = str(self.project_root)
741
- if current_project_key not in projects_to_update:
742
- projects_to_update.append(current_project_key)
743
- # Initialize new project structure
744
- claude_config["projects"][current_project_key] = {
745
- "allowedTools": [],
746
- "history": [],
747
- "mcpContextUris": [],
748
- "mcpServers": {},
749
- "enabledMcpjsonServers": [],
750
- "disabledMcpjsonServers": [],
751
- "hasTrustDialogAccepted": False,
752
- "projectOnboardingSeenCount": 0,
753
- "hasClaudeMdExternalIncludesApproved": False,
754
- "hasClaudeMdExternalIncludesWarningShown": False,
755
- }
756
- updated = True
757
-
758
- # Update each project's MCP configurations
759
- for project_key in projects_to_update:
760
- project_config = claude_config["projects"][project_key]
761
-
762
- # Ensure mcpServers section exists
763
- if "mcpServers" not in project_config:
764
- project_config["mcpServers"] = {}
765
- updated = True
766
-
767
- # Check and fix each service configuration - now filtered by startup config
768
- services_to_configure = self.get_filtered_services()
769
-
770
- for service_name, correct_config in services_to_configure.items():
771
- # Check if service exists and has correct configuration
772
- existing_config = project_config["mcpServers"].get(service_name)
773
-
774
- # Determine if we need to update
775
- needs_update = False
776
- if not existing_config:
777
- # Service is missing
778
- needs_update = True
779
- added_services.append(f"{service_name} in {Path(project_key).name}")
780
- # Service exists, check if configuration is correct
781
- # Compare command and args (the most critical parts)
782
- elif existing_config.get("command") != correct_config.get(
783
- "command"
784
- ) or existing_config.get("args") != correct_config.get("args"):
785
- needs_update = True
786
- fixed_services.append(f"{service_name} in {Path(project_key).name}")
787
-
788
- # Update configuration if needed
789
- if needs_update:
790
- project_config["mcpServers"][service_name] = correct_config
791
- updated = True
792
- self.logger.debug(
793
- f"Updated MCP service config for {service_name} in project {Path(project_key).name}"
794
- )
729
+ project_config = claude_config.get("projects", {}).get(current_project_key)
795
730
 
796
- # Remove disabled services from configuration
797
- if self.config is not None:
798
- # Import Config here to avoid circular import
799
- from ..core.config import Config
731
+ if not project_config:
732
+ missing = list(expected_services.keys())
733
+ return (
734
+ False,
735
+ f"Current project not configured in Claude. Missing services: {', '.join(missing)}",
736
+ )
800
737
 
801
- if isinstance(self.config, Config):
802
- enabled_services = self.config.get(
803
- "startup.enabled_mcp_services", None
804
- )
805
- if enabled_services is not None:
806
- # Remove services that are not in the enabled list
807
- services_to_remove = []
808
- for service_name in project_config["mcpServers"]:
809
- if service_name not in enabled_services:
810
- services_to_remove.append(service_name)
811
-
812
- for service_name in services_to_remove:
813
- del project_config["mcpServers"][service_name]
814
- updated = True
815
- self.logger.debug(
816
- f"Removed disabled service {service_name} from project {Path(project_key).name}"
817
- )
818
-
819
- # Write updated config if changes were made
820
- if updated:
821
- try:
822
- # Create backup if file exists and is large (> 100KB)
823
- if self.claude_config_path.exists():
824
- file_size = self.claude_config_path.stat().st_size
825
- if file_size > 100000: # 100KB
826
- backup_path = self.claude_config_path.with_suffix(
827
- f".backup.{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
828
- )
829
- import shutil
738
+ # Check which services are missing
739
+ mcp_servers = project_config.get("mcpServers", {})
740
+ missing_services = [
741
+ name for name in expected_services if name not in mcp_servers
742
+ ]
830
743
 
831
- shutil.copy2(self.claude_config_path, backup_path)
832
- self.logger.debug(f"Created backup: {backup_path}")
744
+ if missing_services:
745
+ msg = (
746
+ f"Missing MCP services: {', '.join(missing_services)}. "
747
+ f"Install via: pip install {' '.join(missing_services)} "
748
+ f"or configure in Claude Desktop"
749
+ )
750
+ return False, msg
833
751
 
834
- # Write updated config
835
- with self.claude_config_path.open("w") as f:
836
- json.dump(claude_config, f, indent=2)
752
+ return (
753
+ True,
754
+ f"All required MCP services available ({len(expected_services)} services)",
755
+ )
837
756
 
838
- messages = []
839
- if added_services:
840
- messages.append(
841
- f"Added MCP services: {', '.join(added_services[:3])}"
842
- )
843
- if fixed_services:
844
- messages.append(
845
- f"Fixed MCP services: {', '.join(fixed_services[:3])}"
846
- )
757
+ def ensure_mcp_services_configured(self) -> Tuple[bool, str]:
758
+ """
759
+ DEPRECATED: Auto-configuring ~/.claude.json is no longer supported.
847
760
 
848
- if messages:
849
- return True, "; ".join(messages)
850
- return True, "All MCP services already configured correctly"
851
- except Exception as e:
852
- self.logger.error(f"Failed to write Claude config: {e}")
853
- return False, f"Failed to write configuration: {e}"
761
+ As of v4.15.0+, MCP services are user-controlled. Users should install
762
+ and configure MCP services themselves via:
763
+ - pip install <service-name>
764
+ - npx @modelcontextprotocol/...
765
+ - Claude Desktop UI
854
766
 
855
- return True, "All MCP services already configured correctly"
767
+ This method now only performs a read-only check and logs a deprecation warning.
768
+ Use check_mcp_services_available() for read-only checks.
769
+
770
+ Returns:
771
+ Tuple of (success, message)
772
+ """
773
+ import warnings
774
+
775
+ warnings.warn(
776
+ "ensure_mcp_services_configured() is deprecated and will be removed in v6.0.0. "
777
+ "MCP services are now user-controlled. Use check_mcp_services_available() instead.",
778
+ DeprecationWarning,
779
+ stacklevel=2,
780
+ )
781
+
782
+ # Delegate to read-only check
783
+ return self.check_mcp_services_available()
856
784
 
857
785
  def update_mcp_config(self, force_pipx: bool = True) -> Tuple[bool, str]:
858
786
  """
859
- Update the MCP configuration in ~/.claude.json.
787
+ DEPRECATED: Check MCP configuration in ~/.claude.json (READ-ONLY).
788
+
789
+ This method no longer modifies ~/.claude.json. Users should install
790
+ and configure MCP services themselves.
860
791
 
861
792
  Args:
862
- force_pipx: If True, only use pipx installations
793
+ force_pipx: Ignored (kept for backward compatibility)
863
794
 
864
795
  Returns:
865
- Tuple of (success, message)
796
+ Tuple of (success, message) from read-only check
866
797
  """
867
- # This method now delegates to ensure_mcp_services_configured
868
- # since we're updating the Claude config directly
869
- return self.ensure_mcp_services_configured()
798
+ # Delegate to read-only check
799
+ return self.check_mcp_services_available()
870
800
 
871
801
  def update_project_mcp_config(self, force_pipx: bool = True) -> Tuple[bool, str]:
872
802
  """
@@ -163,17 +163,21 @@ class MCPAutoConfigurator:
163
163
  Returns:
164
164
  True if user agrees, False if declines, None if timeout
165
165
  """
166
- print("\n" + "=" * 60)
167
- print("🔧 MCP Gateway Configuration")
168
- print("=" * 60)
169
- print("\nClaude MPM can automatically configure MCP Gateway for")
170
- print("Claude Code integration. This enables advanced features:")
171
- print(" • File analysis and summarization")
172
- print(" • System diagnostics")
173
- print(" Ticket management")
174
- print(" • And more...")
175
- print("\nWould you like to configure it now? (y/n)")
176
- print(f"(Auto-declining in {timeout} seconds)")
166
+ print("\n" + "=" * 60, file=sys.stderr)
167
+ print("🔧 MCP Gateway Configuration", file=sys.stderr)
168
+ print("=" * 60, file=sys.stderr)
169
+ print(
170
+ "\nClaude MPM can automatically configure MCP Gateway for", file=sys.stderr
171
+ )
172
+ print(
173
+ "Claude Code integration. This enables advanced features:", file=sys.stderr
174
+ )
175
+ print(" File analysis and summarization", file=sys.stderr)
176
+ print(" System diagnostics", file=sys.stderr)
177
+ print(" • Ticket management", file=sys.stderr)
178
+ print(" • And more...", file=sys.stderr)
179
+ print("\nWould you like to configure it now? (y/n)", file=sys.stderr)
180
+ print(f"(Auto-declining in {timeout} seconds)", file=sys.stderr)
177
181
 
178
182
  # Use threading for cross-platform timeout support
179
183
  # Python 3.7+ has queue built-in - no need to check, we require 3.10+
@@ -203,7 +207,7 @@ class MCPAutoConfigurator:
203
207
 
204
208
  if input_thread.is_alive():
205
209
  # Timed out
206
- print("\n(Timed out - declining)")
210
+ print("\n(Timed out - declining)", file=sys.stderr)
207
211
  return None
208
212
  # Got input
209
213
  return user_input in ["y", "yes"]
@@ -220,7 +224,7 @@ class MCPAutoConfigurator:
220
224
  if self.claude_config_path.exists():
221
225
  backup_path = self._create_backup()
222
226
  if backup_path:
223
- print(f"✅ Backup created: {backup_path}")
227
+ print(f"✅ Backup created: {backup_path}", file=sys.stderr)
224
228
 
225
229
  # Load or create configuration
226
230
  config = self._load_or_create_config()
@@ -232,7 +236,7 @@ class MCPAutoConfigurator:
232
236
  # Find claude-mpm executable
233
237
  executable = self._find_claude_mpm_executable()
234
238
  if not executable:
235
- print("❌ Could not find claude-mpm executable")
239
+ print("❌ Could not find claude-mpm executable", file=sys.stderr)
236
240
  return False
237
241
 
238
242
  # Configure MCP server
@@ -246,20 +250,22 @@ class MCPAutoConfigurator:
246
250
  with self.claude_config_path.open("w") as f:
247
251
  json.dump(config, f, indent=2)
248
252
 
249
- print(f"✅ Configuration saved to: {self.claude_config_path}")
250
- print("\n🎉 MCP Gateway configured successfully!")
251
- print("\nNext steps:")
252
- print("1. Restart Claude Code (if running)")
253
- print("2. Look for the MCP icon in the interface")
254
- print("3. Try @claude-mpm-gateway in a conversation")
253
+ print(
254
+ f" Configuration saved to: {self.claude_config_path}", file=sys.stderr
255
+ )
256
+ print("\n🎉 MCP Gateway configured successfully!", file=sys.stderr)
257
+ print("\nNext steps:", file=sys.stderr)
258
+ print("1. Restart Claude Code (if running)", file=sys.stderr)
259
+ print("2. Look for the MCP icon in the interface", file=sys.stderr)
260
+ print("3. Try @claude-mpm-gateway in a conversation", file=sys.stderr)
255
261
 
256
262
  return True
257
263
 
258
264
  except Exception as e:
259
265
  self.logger.error(f"Auto-configuration failed: {e}")
260
- print(f"❌ Configuration failed: {e}")
261
- print("\nYou can configure manually with:")
262
- print(" claude-mpm mcp install")
266
+ print(f"❌ Configuration failed: {e}", file=sys.stderr)
267
+ print("\nYou can configure manually with:", file=sys.stderr)
268
+ print(" claude-mpm mcp install", file=sys.stderr)
263
269
  return False
264
270
 
265
271
  def _create_backup(self) -> Optional[Path]:
@@ -344,8 +350,8 @@ class MCPAutoConfigurator:
344
350
  if user_choice:
345
351
  return self.auto_configure()
346
352
  if user_choice is False: # User explicitly said no
347
- print("\n📝 You can configure MCP later with:")
348
- print(" claude-mpm mcp install")
353
+ print("\n📝 You can configure MCP later with:", file=sys.stderr)
354
+ print(" claude-mpm mcp install", file=sys.stderr)
349
355
  # If timeout (None), don't show additional message
350
356
  return False
351
357
 
@@ -215,7 +215,7 @@ class MCPConfiguration(BaseMCPService, IMCPConfiguration):
215
215
  current[part] = {}
216
216
  elif not isinstance(current[part], dict):
217
217
  self.log_warning(
218
- f"Cannot override non-dict config at {'.'.join(config_path[:i+1])}"
218
+ f"Cannot override non-dict config at {'.'.join(config_path[: i + 1])}"
219
219
  )
220
220
  break
221
221
  current = current[part]
@@ -440,15 +440,18 @@ async def auto_initialize_vector_search():
440
440
  )
441
441
  return
442
442
 
443
- # Update the Claude configuration to include the newly installed service
444
- logger.info("📝 Updating Claude configuration...")
445
- config_success, config_msg = (
446
- config_manager.ensure_mcp_services_configured()
447
- )
448
- if config_success:
449
- logger.info(f"✅ {config_msg}")
443
+ # Verify the newly installed service is available
444
+ logger.info("📝 Verifying installation...")
445
+ available, msg = config_manager.check_mcp_services_available()
446
+ if available:
447
+ logger.info(f"✅ {msg}")
450
448
  else:
451
- logger.warning(f"⚠️ Configuration update issue: {config_msg}")
449
+ logger.warning(
450
+ f"⚠️ Service installed but not configured in Claude: {msg}"
451
+ )
452
+ logger.info(
453
+ "💡 Configure via: Claude Desktop > Settings > Developer > Model Context Protocol"
454
+ )
452
455
  else:
453
456
  logger.warning(
454
457
  f"Failed to install mcp-vector-search: {result.stderr}"
@@ -658,15 +661,18 @@ async def auto_initialize_kuzu_memory():
658
661
  )
659
662
  return
660
663
 
661
- # Update the Claude configuration to include the newly installed service
662
- logger.info("📝 Updating Claude configuration...")
663
- config_success, config_msg = (
664
- config_manager.ensure_mcp_services_configured()
665
- )
666
- if config_success:
667
- logger.info(f"✅ {config_msg}")
664
+ # Verify the newly installed service is available
665
+ logger.info("📝 Verifying installation...")
666
+ available, msg = config_manager.check_mcp_services_available()
667
+ if available:
668
+ logger.info(f"✅ {msg}")
668
669
  else:
669
- logger.warning(f"⚠️ Configuration update issue: {config_msg}")
670
+ logger.warning(
671
+ f"⚠️ Service installed but not configured in Claude: {msg}"
672
+ )
673
+ logger.info(
674
+ "💡 Configure via: Claude Desktop > Settings > Developer > Model Context Protocol"
675
+ )
670
676
  else:
671
677
  logger.warning(f"Failed to install kuzu-memory: {result.stderr}")
672
678
  return
@@ -864,7 +870,7 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
864
870
  # Check if running in a non-interactive context
865
871
  try:
866
872
  if confirm_operation(message):
867
- print("🚀 Updating kuzu-memory...")
873
+ print("🚀 Updating kuzu-memory...", file=sys.stderr)
868
874
  try:
869
875
  result = subprocess.run(
870
876
  ["pipx", "upgrade", "kuzu-memory"],
@@ -874,28 +880,37 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
874
880
  check=False,
875
881
  )
876
882
  if result.returncode == 0:
877
- print("✅ Successfully updated kuzu-memory!")
883
+ print("✅ Successfully updated kuzu-memory!", file=sys.stderr)
878
884
  logger.info(f"Updated kuzu-memory from {current} to {latest}")
879
885
  else:
880
- print(f"⚠️ Update failed: {result.stderr}")
886
+ print(f"⚠️ Update failed: {result.stderr}", file=sys.stderr)
881
887
  logger.warning(f"kuzu-memory update failed: {result.stderr}")
882
888
  except subprocess.TimeoutExpired:
883
- print("⚠️ Update timed out. Please try again later.")
889
+ print("⚠️ Update timed out. Please try again later.", file=sys.stderr)
884
890
  logger.warning("kuzu-memory update timed out")
885
891
  except Exception as e:
886
- print(f"⚠️ Update failed: {e}")
892
+ print(f"⚠️ Update failed: {e}", file=sys.stderr)
887
893
  logger.warning(f"kuzu-memory update error: {e}")
888
894
  else:
889
895
  # User declined update
890
- print("\n To skip this version permanently, run:")
891
- print(f" claude-mpm config set-skip-version kuzu-memory {latest}")
892
- print(" To disable update checks for kuzu-memory:")
893
- print(" claude-mpm config disable-update-checks kuzu-memory")
896
+ print("\n To skip this version permanently, run:", file=sys.stderr)
897
+ print(
898
+ f" claude-mpm config set-skip-version kuzu-memory {latest}",
899
+ file=sys.stderr,
900
+ )
901
+ print(" To disable update checks for kuzu-memory:", file=sys.stderr)
902
+ print(
903
+ " claude-mpm config disable-update-checks kuzu-memory",
904
+ file=sys.stderr,
905
+ )
894
906
 
895
907
  # Ask if user wants to skip this version
896
908
  if confirm_operation("\n Skip this version in future checks?"):
897
909
  UpdatePreferences.set_skip_version("kuzu-memory", latest)
898
- print(f" Version {latest} will be skipped in future checks.")
910
+ print(
911
+ f" Version {latest} will be skipped in future checks.",
912
+ file=sys.stderr,
913
+ )
899
914
  except (KeyboardInterrupt, EOFError):
900
915
  # User interrupted or input not available
901
916
  pass
@@ -21,12 +21,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
21
21
 
22
22
  # Import from the official MCP package
23
23
  from mcp.server import Server
24
- from mcp.types import (
25
- EmbeddedResource,
26
- ImageContent,
27
- TextContent,
28
- Tool,
29
- )
24
+ from mcp.types import EmbeddedResource, ImageContent, TextContent, Tool
30
25
 
31
26
  from claude_mpm.services.mcp_gateway.core.base import BaseMCPService
32
27
  from claude_mpm.services.mcp_gateway.core.interfaces import (
@@ -65,7 +65,6 @@ def apply_backward_compatibility_patches():
65
65
  and hasattr(request, "params")
66
66
  and request.params is not None
67
67
  ):
68
-
69
68
  # Convert params to dict to check for clientInfo
70
69
  params_dict = request.params
71
70
  if hasattr(params_dict, "model_dump"):
@@ -542,7 +541,6 @@ class SimpleMCPServer:
542
541
 
543
542
  result = f"Python: {sys.version}"
544
543
  elif info_type == "cwd":
545
-
546
544
  result = f"Working Directory: {Path.cwd()}"
547
545
  elif info_type == "all":
548
546
  import datetime
@@ -73,7 +73,7 @@ class LRUCache:
73
73
  if not self.cache:
74
74
  break
75
75
  # Remove least recently used item
76
- removed_key, removed_value = self.cache.popitem(last=False)
76
+ _removed_key, removed_value = self.cache.popitem(last=False)
77
77
  self.current_memory -= removed_value.get("size_bytes", 0)
78
78
 
79
79
  # Add new item
@@ -161,12 +161,17 @@ class ExternalMCPService(BaseToolAdapter):
161
161
 
162
162
  if interactive:
163
163
  # Show user-friendly installation prompt
164
- print(f"\n⚠️ {self.package_name} not found")
165
- print("This package enables enhanced functionality (optional).")
166
- print("\nInstallation options:")
167
- print("1. Install via pip (recommended for this project)")
168
- print("2. Install via pipx (isolated, system-wide)")
169
- print("3. Skip (continue without this package)")
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)
170
175
 
171
176
  try:
172
177
  choice = input("\nChoose option (1/2/3) [1]: ").strip() or "1"
@@ -180,7 +185,7 @@ class ExternalMCPService(BaseToolAdapter):
180
185
  )
181
186
  return False
182
187
  except (EOFError, KeyboardInterrupt):
183
- print("\nInstallation cancelled")
188
+ print("\nInstallation cancelled", file=sys.stderr)
184
189
  return False
185
190
  else:
186
191
  # Non-interactive: default to pip
@@ -201,7 +206,7 @@ class ExternalMCPService(BaseToolAdapter):
201
206
  async def _install_via_pip(self) -> bool:
202
207
  """Install package via pip."""
203
208
  try:
204
- print(f"\n📦 Installing {self.package_name} via pip...")
209
+ print(f"\n📦 Installing {self.package_name} via pip...", file=sys.stderr)
205
210
  result = subprocess.run(
206
211
  [sys.executable, "-m", "pip", "install", self.package_name],
207
212
  capture_output=True,
@@ -211,21 +216,21 @@ class ExternalMCPService(BaseToolAdapter):
211
216
  )
212
217
 
213
218
  if result.returncode == 0:
214
- print(f"✓ Successfully installed {self.package_name}")
219
+ print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
215
220
  self.logger.info(f"Successfully installed {self.package_name} via pip")
216
221
  return True
217
222
 
218
223
  error_msg = result.stderr.strip() if result.stderr else "Unknown error"
219
- print(f"✗ Installation failed: {error_msg}")
224
+ print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
220
225
  self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
221
226
  return False
222
227
 
223
228
  except subprocess.TimeoutExpired:
224
- print("✗ Installation timed out")
229
+ print("✗ Installation timed out", file=sys.stderr)
225
230
  self.logger.error(f"Installation of {self.package_name} timed out")
226
231
  return False
227
232
  except Exception as e:
228
- print(f"✗ Installation error: {e}")
233
+ print(f"✗ Installation error: {e}", file=sys.stderr)
229
234
  self.logger.error(f"Error installing {self.package_name}: {e}")
230
235
  return False
231
236
 
@@ -242,12 +247,12 @@ class ExternalMCPService(BaseToolAdapter):
242
247
  )
243
248
 
244
249
  if pipx_check.returncode != 0:
245
- print("✗ pipx is not installed")
246
- print("Install pipx first: python -m pip install pipx")
250
+ print("✗ pipx is not installed", file=sys.stderr)
251
+ print("Install pipx first: python -m pip install pipx", file=sys.stderr)
247
252
  self.logger.error("pipx not available for installation")
248
253
  return False
249
254
 
250
- print(f"\n📦 Installing {self.package_name} via pipx...")
255
+ print(f"\n📦 Installing {self.package_name} via pipx...", file=sys.stderr)
251
256
  result = subprocess.run(
252
257
  ["pipx", "install", self.package_name],
253
258
  capture_output=True,
@@ -257,26 +262,26 @@ class ExternalMCPService(BaseToolAdapter):
257
262
  )
258
263
 
259
264
  if result.returncode == 0:
260
- print(f"✓ Successfully installed {self.package_name}")
265
+ print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
261
266
  self.logger.info(f"Successfully installed {self.package_name} via pipx")
262
267
  return True
263
268
 
264
269
  error_msg = result.stderr.strip() if result.stderr else "Unknown error"
265
- print(f"✗ Installation failed: {error_msg}")
270
+ print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
266
271
  self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
267
272
  return False
268
273
 
269
274
  except FileNotFoundError:
270
- print("✗ pipx command not found")
271
- print("Install pipx first: python -m pip install pipx")
275
+ print("✗ pipx command not found", file=sys.stderr)
276
+ print("Install pipx first: python -m pip install pipx", file=sys.stderr)
272
277
  self.logger.error("pipx command not found")
273
278
  return False
274
279
  except subprocess.TimeoutExpired:
275
- print("✗ Installation timed out")
280
+ print("✗ Installation timed out", file=sys.stderr)
276
281
  self.logger.error(f"Installation of {self.package_name} timed out")
277
282
  return False
278
283
  except Exception as e:
279
- print(f"✗ Installation error: {e}")
284
+ print(f"✗ Installation error: {e}", file=sys.stderr)
280
285
  self.logger.error(f"Error installing {self.package_name}: {e}")
281
286
  return False
282
287