claude-mpm 3.9.9__py3-none-any.whl → 4.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +155 -0
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +1 -1
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +90 -49
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +21 -18
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +143 -762
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +203 -81
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +305 -197
  50. claude_mpm/cli/parser.py +24 -1150
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +104 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +217 -0
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +36 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  113. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  114. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  115. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  116. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  117. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  118. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  119. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  120. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  121. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  122. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  123. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  124. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  125. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  126. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  127. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  128. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  129. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  130. claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
  131. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  132. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
  133. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  134. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  135. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  136. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  137. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  138. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  139. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  140. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  141. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  142. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  143. claude_mpm/dashboard/static/js/socket-client.js +120 -54
  144. claude_mpm/dashboard/templates/index.html +40 -50
  145. claude_mpm/experimental/cli_enhancements.py +60 -58
  146. claude_mpm/generators/__init__.py +1 -1
  147. claude_mpm/generators/agent_profile_generator.py +75 -65
  148. claude_mpm/hooks/__init__.py +1 -1
  149. claude_mpm/hooks/base_hook.py +33 -28
  150. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  151. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  152. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  153. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  154. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  155. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  156. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  157. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  158. claude_mpm/hooks/memory_integration_hook.py +140 -100
  159. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  160. claude_mpm/hooks/validation_hooks.py +57 -49
  161. claude_mpm/init.py +145 -121
  162. claude_mpm/models/__init__.py +9 -9
  163. claude_mpm/models/agent_definition.py +33 -23
  164. claude_mpm/models/agent_session.py +228 -200
  165. claude_mpm/scripts/__init__.py +1 -1
  166. claude_mpm/scripts/socketio_daemon.py +192 -75
  167. claude_mpm/scripts/socketio_server_manager.py +328 -0
  168. claude_mpm/scripts/start_activity_logging.py +25 -22
  169. claude_mpm/services/__init__.py +68 -43
  170. claude_mpm/services/agent_capabilities_service.py +271 -0
  171. claude_mpm/services/agents/__init__.py +23 -32
  172. claude_mpm/services/agents/deployment/__init__.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  174. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  175. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  176. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  177. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  178. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  179. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  180. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  181. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  182. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  183. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  184. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  185. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  186. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  187. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  188. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  189. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  190. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  191. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  192. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  193. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  194. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  195. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  196. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  197. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  198. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  199. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  200. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  201. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  202. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  203. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  204. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  205. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  206. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  207. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  208. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  209. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  210. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  211. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  212. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  213. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  214. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  215. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  216. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  217. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  218. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  219. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  220. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  221. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  222. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  223. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  224. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  225. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  226. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  227. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  228. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  229. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  230. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  231. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  232. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  233. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  234. claude_mpm/services/agents/loading/__init__.py +2 -2
  235. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  236. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  237. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  238. claude_mpm/services/agents/management/__init__.py +2 -2
  239. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  240. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  241. claude_mpm/services/agents/memory/__init__.py +9 -6
  242. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  243. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  244. claude_mpm/services/agents/memory/analyzer.py +430 -0
  245. claude_mpm/services/agents/memory/content_manager.py +376 -0
  246. claude_mpm/services/agents/memory/template_generator.py +468 -0
  247. claude_mpm/services/agents/registry/__init__.py +7 -10
  248. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  249. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  250. claude_mpm/services/async_session_logger.py +187 -153
  251. claude_mpm/services/claude_session_logger.py +87 -72
  252. claude_mpm/services/command_handler_service.py +217 -0
  253. claude_mpm/services/communication/__init__.py +3 -2
  254. claude_mpm/services/core/__init__.py +50 -97
  255. claude_mpm/services/core/base.py +60 -53
  256. claude_mpm/services/core/interfaces/__init__.py +188 -0
  257. claude_mpm/services/core/interfaces/agent.py +351 -0
  258. claude_mpm/services/core/interfaces/communication.py +343 -0
  259. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  260. claude_mpm/services/core/interfaces/service.py +434 -0
  261. claude_mpm/services/core/interfaces.py +19 -944
  262. claude_mpm/services/event_aggregator.py +208 -170
  263. claude_mpm/services/exceptions.py +387 -308
  264. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  265. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  266. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  267. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  268. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  269. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  270. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  271. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  272. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  273. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  274. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  275. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  276. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  277. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  278. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  279. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  280. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  281. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  283. claude_mpm/services/hook_service.py +106 -114
  284. claude_mpm/services/infrastructure/__init__.py +7 -5
  285. claude_mpm/services/infrastructure/context_preservation.py +571 -0
  286. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  287. claude_mpm/services/infrastructure/logging.py +83 -76
  288. claude_mpm/services/infrastructure/monitoring.py +547 -404
  289. claude_mpm/services/mcp_gateway/__init__.py +40 -23
  290. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  291. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  292. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  293. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  294. claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
  295. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  296. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  297. claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
  298. claude_mpm/services/mcp_gateway/main.py +307 -127
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
  303. claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  309. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  310. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  311. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  312. claude_mpm/services/memory/__init__.py +2 -2
  313. claude_mpm/services/memory/builder.py +451 -362
  314. claude_mpm/services/memory/cache/__init__.py +2 -2
  315. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  316. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  317. claude_mpm/services/memory/indexed_memory.py +195 -193
  318. claude_mpm/services/memory/optimizer.py +267 -234
  319. claude_mpm/services/memory/router.py +571 -263
  320. claude_mpm/services/memory_hook_service.py +237 -0
  321. claude_mpm/services/port_manager.py +223 -0
  322. claude_mpm/services/project/__init__.py +3 -3
  323. claude_mpm/services/project/analyzer.py +451 -305
  324. claude_mpm/services/project/registry.py +262 -240
  325. claude_mpm/services/recovery_manager.py +287 -231
  326. claude_mpm/services/response_tracker.py +87 -67
  327. claude_mpm/services/runner_configuration_service.py +587 -0
  328. claude_mpm/services/session_management_service.py +304 -0
  329. claude_mpm/services/socketio/__init__.py +4 -4
  330. claude_mpm/services/socketio/client_proxy.py +174 -0
  331. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  332. claude_mpm/services/socketio/handlers/base.py +44 -30
  333. claude_mpm/services/socketio/handlers/connection.py +145 -65
  334. claude_mpm/services/socketio/handlers/file.py +123 -108
  335. claude_mpm/services/socketio/handlers/git.py +607 -373
  336. claude_mpm/services/socketio/handlers/hook.py +170 -0
  337. claude_mpm/services/socketio/handlers/memory.py +4 -4
  338. claude_mpm/services/socketio/handlers/project.py +4 -4
  339. claude_mpm/services/socketio/handlers/registry.py +53 -38
  340. claude_mpm/services/socketio/server/__init__.py +18 -0
  341. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  342. claude_mpm/services/socketio/server/core.py +399 -0
  343. claude_mpm/services/socketio/server/main.py +323 -0
  344. claude_mpm/services/socketio_client_manager.py +160 -133
  345. claude_mpm/services/socketio_server.py +36 -1885
  346. claude_mpm/services/subprocess_launcher_service.py +316 -0
  347. claude_mpm/services/system_instructions_service.py +258 -0
  348. claude_mpm/services/ticket_manager.py +20 -534
  349. claude_mpm/services/utility_service.py +285 -0
  350. claude_mpm/services/version_control/__init__.py +18 -21
  351. claude_mpm/services/version_control/branch_strategy.py +20 -10
  352. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  353. claude_mpm/services/version_control/git_operations.py +52 -21
  354. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  355. claude_mpm/services/version_control/version_parser.py +145 -125
  356. claude_mpm/services/version_service.py +270 -0
  357. claude_mpm/storage/__init__.py +9 -0
  358. claude_mpm/storage/state_storage.py +552 -0
  359. claude_mpm/ticket_wrapper.py +2 -2
  360. claude_mpm/utils/__init__.py +2 -2
  361. claude_mpm/utils/agent_dependency_loader.py +453 -243
  362. claude_mpm/utils/config_manager.py +157 -118
  363. claude_mpm/utils/console.py +1 -1
  364. claude_mpm/utils/dependency_cache.py +102 -107
  365. claude_mpm/utils/dependency_manager.py +52 -47
  366. claude_mpm/utils/dependency_strategies.py +131 -96
  367. claude_mpm/utils/environment_context.py +110 -102
  368. claude_mpm/utils/error_handler.py +75 -55
  369. claude_mpm/utils/file_utils.py +80 -67
  370. claude_mpm/utils/framework_detection.py +12 -11
  371. claude_mpm/utils/import_migration_example.py +12 -60
  372. claude_mpm/utils/imports.py +48 -45
  373. claude_mpm/utils/path_operations.py +100 -93
  374. claude_mpm/utils/robust_installer.py +172 -164
  375. claude_mpm/utils/session_logging.py +30 -23
  376. claude_mpm/utils/subprocess_utils.py +99 -61
  377. claude_mpm/validation/__init__.py +1 -1
  378. claude_mpm/validation/agent_validator.py +151 -111
  379. claude_mpm/validation/frontmatter_validator.py +92 -71
  380. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/config/memory_guardian_config.py +0 -325
  385. claude_mpm/core/config_paths.py +0 -150
  386. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  387. claude_mpm/deployment_paths.py +0 -261
  388. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  389. claude_mpm/models/state_models.py +0 -433
  390. claude_mpm/services/agent/__init__.py +0 -24
  391. claude_mpm/services/agent/deployment.py +0 -2548
  392. claude_mpm/services/agent/management.py +0 -598
  393. claude_mpm/services/agent/registry.py +0 -813
  394. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  395. claude_mpm/services/communication/socketio.py +0 -1935
  396. claude_mpm/services/communication/websocket.py +0 -479
  397. claude_mpm/services/framework_claude_md_generator.py +0 -624
  398. claude_mpm/services/health_monitor.py +0 -893
  399. claude_mpm/services/infrastructure/memory_guardian.py +0 -770
  400. claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
  401. claude_mpm/services/optimized_hook_service.py +0 -542
  402. claude_mpm/services/project_analyzer.py +0 -864
  403. claude_mpm/services/project_registry.py +0 -608
  404. claude_mpm/services/standalone_socketio_server.py +0 -1300
  405. claude_mpm/services/ticket_manager_di.py +0 -318
  406. claude_mpm/services/ticketing_service_original.py +0 -510
  407. claude_mpm/utils/paths.py +0 -395
  408. claude_mpm/utils/platform_memory.py +0 -524
  409. claude_mpm-3.9.9.dist-info/RECORD +0 -293
  410. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  411. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
@@ -5,42 +5,35 @@ MCP Gateway Core Module
5
5
  Core interfaces and base classes for the MCP Gateway service.
6
6
  """
7
7
 
8
- from .interfaces import (
9
- IMCPServer,
10
- IMCPToolRegistry,
11
- IMCPConfiguration,
12
- IMCPToolAdapter,
13
- IMCPLifecycle,
14
- IMCPCommunication,
15
- )
16
-
17
- from .base import (
18
- BaseMCPService,
19
- MCPServiceState,
20
- )
21
-
8
+ from .base import BaseMCPService, MCPServiceState
22
9
  from .exceptions import (
23
- MCPException,
10
+ MCPCommunicationError,
24
11
  MCPConfigurationError,
25
- MCPToolNotFoundError,
12
+ MCPException,
26
13
  MCPServerError,
27
- MCPCommunicationError,
14
+ MCPToolNotFoundError,
28
15
  MCPValidationError,
29
16
  )
17
+ from .interfaces import (
18
+ IMCPCommunication,
19
+ IMCPConfiguration,
20
+ IMCPGateway,
21
+ IMCPLifecycle,
22
+ IMCPToolAdapter,
23
+ IMCPToolRegistry,
24
+ )
30
25
 
31
26
  __all__ = [
32
27
  # Interfaces
33
- "IMCPServer",
28
+ "IMCPGateway",
34
29
  "IMCPToolRegistry",
35
30
  "IMCPConfiguration",
36
31
  "IMCPToolAdapter",
37
32
  "IMCPLifecycle",
38
33
  "IMCPCommunication",
39
-
40
34
  # Base classes
41
35
  "BaseMCPService",
42
36
  "MCPServiceState",
43
-
44
37
  # Exceptions
45
38
  "MCPException",
46
39
  "MCPConfigurationError",
@@ -48,4 +41,4 @@ __all__ = [
48
41
  "MCPServerError",
49
42
  "MCPCommunicationError",
50
43
  "MCPValidationError",
51
- ]
44
+ ]
@@ -7,18 +7,18 @@ Base implementations for MCP Gateway services.
7
7
  Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
8
8
  """
9
9
 
10
- from enum import Enum
11
- from typing import Any, Dict, Optional
12
10
  import asyncio
13
11
  import logging
14
- from pathlib import Path
12
+ from enum import Enum
13
+ from typing import Any, Dict, Optional
15
14
 
16
- from claude_mpm.services.core.base import BaseService
17
15
  from claude_mpm.core.logger import get_logger
16
+ from claude_mpm.services.core.base import BaseService
18
17
 
19
18
 
20
19
  class MCPServiceState(Enum):
21
20
  """MCP service lifecycle states."""
21
+
22
22
  UNINITIALIZED = "uninitialized"
23
23
  INITIALIZING = "initializing"
24
24
  INITIALIZED = "initialized"
@@ -32,20 +32,24 @@ class MCPServiceState(Enum):
32
32
  class BaseMCPService(BaseService):
33
33
  """
34
34
  Base class for all MCP Gateway services.
35
-
35
+
36
36
  Extends the claude-mpm BaseService with MCP-specific functionality
37
37
  including state management, health monitoring, and async lifecycle support.
38
-
38
+
39
39
  WHY: We extend BaseService to maintain consistency with the claude-mpm
40
40
  architecture while adding MCP-specific capabilities. This ensures all
41
41
  MCP services integrate seamlessly with the existing service container
42
42
  and dependency injection system.
43
43
  """
44
-
45
- def __init__(self, service_name: Optional[str] = None, config: Optional[Dict[str, Any]] = None):
44
+
45
+ def __init__(
46
+ self,
47
+ service_name: Optional[str] = None,
48
+ config: Optional[Dict[str, Any]] = None,
49
+ ):
46
50
  """
47
51
  Initialize MCP service.
48
-
52
+
49
53
  Args:
50
54
  service_name: Name of the service for logging
51
55
  config: Service-specific configuration
@@ -56,34 +60,37 @@ class BaseMCPService(BaseService):
56
60
  "healthy": False,
57
61
  "state": self._state.value,
58
62
  "last_check": None,
59
- "details": {}
63
+ "details": {},
60
64
  }
61
65
  self._state_lock = asyncio.Lock()
62
66
  self._initialization_task = None
63
67
  self._shutdown_task = None
64
-
68
+
65
69
  async def initialize(self) -> bool:
66
70
  """
67
71
  Initialize the MCP service.
68
-
72
+
69
73
  This method manages state transitions and ensures thread-safe initialization.
70
74
  Subclasses should override _do_initialize() for custom initialization logic.
71
-
75
+
72
76
  Returns:
73
77
  True if initialization successful, False otherwise
74
78
  """
75
79
  async with self._state_lock:
76
- if self._state not in [MCPServiceState.UNINITIALIZED, MCPServiceState.STOPPED]:
80
+ if self._state not in [
81
+ MCPServiceState.UNINITIALIZED,
82
+ MCPServiceState.STOPPED,
83
+ ]:
77
84
  self.log_warning(f"Cannot initialize from state {self._state.value}")
78
85
  return False
79
-
86
+
80
87
  self._state = MCPServiceState.INITIALIZING
81
88
  self.log_info("Initializing MCP service")
82
-
89
+
83
90
  try:
84
91
  # Call subclass initialization
85
92
  success = await self._do_initialize()
86
-
93
+
87
94
  async with self._state_lock:
88
95
  if success:
89
96
  self._state = MCPServiceState.INITIALIZED
@@ -96,35 +103,35 @@ class BaseMCPService(BaseService):
96
103
  self._health_status["healthy"] = False
97
104
  self._health_status["state"] = self._state.value
98
105
  self.log_error("MCP service initialization failed")
99
-
106
+
100
107
  return success
101
-
108
+
102
109
  except Exception as e:
103
110
  async with self._state_lock:
104
111
  self._state = MCPServiceState.ERROR
105
112
  self._health_status["healthy"] = False
106
113
  self._health_status["state"] = self._state.value
107
114
  self._health_status["details"]["error"] = str(e)
108
-
115
+
109
116
  self.log_error(f"Exception during initialization: {e}")
110
117
  return False
111
-
118
+
112
119
  async def _do_initialize(self) -> bool:
113
120
  """
114
121
  Perform actual initialization logic.
115
-
122
+
116
123
  Subclasses should override this method to implement custom initialization.
117
-
124
+
118
125
  Returns:
119
126
  True if initialization successful
120
127
  """
121
128
  # Default implementation - subclasses should override
122
129
  return True
123
-
130
+
124
131
  async def start(self) -> bool:
125
132
  """
126
133
  Start the MCP service.
127
-
134
+
128
135
  Returns:
129
136
  True if startup successful
130
137
  """
@@ -132,13 +139,13 @@ class BaseMCPService(BaseService):
132
139
  if self._state != MCPServiceState.INITIALIZED:
133
140
  self.log_warning(f"Cannot start from state {self._state.value}")
134
141
  return False
135
-
142
+
136
143
  self._state = MCPServiceState.STARTING
137
144
  self.log_info("Starting MCP service")
138
-
145
+
139
146
  try:
140
147
  success = await self._do_start()
141
-
148
+
142
149
  async with self._state_lock:
143
150
  if success:
144
151
  self._state = MCPServiceState.RUNNING
@@ -150,35 +157,35 @@ class BaseMCPService(BaseService):
150
157
  self._health_status["healthy"] = False
151
158
  self._health_status["state"] = self._state.value
152
159
  self.log_error("MCP service startup failed")
153
-
160
+
154
161
  return success
155
-
162
+
156
163
  except Exception as e:
157
164
  async with self._state_lock:
158
165
  self._state = MCPServiceState.ERROR
159
166
  self._health_status["healthy"] = False
160
167
  self._health_status["state"] = self._state.value
161
168
  self._health_status["details"]["error"] = str(e)
162
-
169
+
163
170
  self.log_error(f"Exception during startup: {e}")
164
171
  return False
165
-
172
+
166
173
  async def _do_start(self) -> bool:
167
174
  """
168
175
  Perform actual startup logic.
169
-
176
+
170
177
  Subclasses should override this method to implement custom startup.
171
-
178
+
172
179
  Returns:
173
180
  True if startup successful
174
181
  """
175
182
  # Default implementation - subclasses should override
176
183
  return True
177
-
184
+
178
185
  async def shutdown(self) -> None:
179
186
  """
180
187
  Shutdown the MCP service gracefully.
181
-
188
+
182
189
  This method manages state transitions and ensures clean shutdown.
183
190
  Subclasses should override _do_shutdown() for custom shutdown logic.
184
191
  """
@@ -186,106 +193,110 @@ class BaseMCPService(BaseService):
186
193
  if self._state in [MCPServiceState.STOPPED, MCPServiceState.STOPPING]:
187
194
  self.log_warning(f"Already in state {self._state.value}")
188
195
  return
189
-
196
+
190
197
  self._state = MCPServiceState.STOPPING
191
198
  self.log_info("Shutting down MCP service")
192
-
199
+
193
200
  try:
194
201
  await self._do_shutdown()
195
-
202
+
196
203
  async with self._state_lock:
197
204
  self._state = MCPServiceState.STOPPED
198
205
  self._shutdown = True
199
206
  self._health_status["healthy"] = False
200
207
  self._health_status["state"] = self._state.value
201
208
  self.log_info("MCP service shutdown complete")
202
-
209
+
203
210
  except Exception as e:
204
211
  async with self._state_lock:
205
212
  self._state = MCPServiceState.ERROR
206
213
  self._health_status["healthy"] = False
207
214
  self._health_status["state"] = self._state.value
208
215
  self._health_status["details"]["error"] = str(e)
209
-
216
+
210
217
  self.log_error(f"Exception during shutdown: {e}")
211
-
218
+
212
219
  async def _do_shutdown(self) -> None:
213
220
  """
214
221
  Perform actual shutdown logic.
215
-
222
+
216
223
  Subclasses should override this method to implement custom shutdown.
217
224
  """
218
225
  # Default implementation - subclasses should override
219
226
  pass
220
-
227
+
221
228
  async def restart(self) -> bool:
222
229
  """
223
230
  Restart the MCP service.
224
-
231
+
225
232
  Returns:
226
233
  True if restart successful
227
234
  """
228
235
  self.log_info("Restarting MCP service")
229
-
236
+
230
237
  # Shutdown if running
231
238
  if self._state == MCPServiceState.RUNNING:
232
239
  await self.shutdown()
233
-
240
+
234
241
  # Re-initialize
235
242
  if not await self.initialize():
236
243
  return False
237
-
244
+
238
245
  # Start again
239
246
  return await self.start()
240
-
247
+
241
248
  def get_state(self) -> str:
242
249
  """
243
250
  Get current service state.
244
-
251
+
245
252
  Returns:
246
253
  Service state string
247
254
  """
248
255
  return self._state.value
249
-
256
+
250
257
  def is_healthy(self) -> bool:
251
258
  """
252
259
  Check if service is healthy.
253
-
260
+
254
261
  Returns:
255
262
  True if service is healthy
256
263
  """
257
264
  return self._health_status["healthy"]
258
-
265
+
259
266
  def get_health_status(self) -> Dict[str, Any]:
260
267
  """
261
268
  Get detailed health status.
262
-
269
+
263
270
  Returns:
264
271
  Health status information
265
272
  """
266
273
  return self._health_status.copy()
267
-
268
- def update_health_status(self, healthy: bool, details: Optional[Dict[str, Any]] = None) -> None:
274
+
275
+ def update_health_status(
276
+ self, healthy: bool, details: Optional[Dict[str, Any]] = None
277
+ ) -> None:
269
278
  """
270
279
  Update health status.
271
-
280
+
272
281
  Args:
273
282
  healthy: Whether service is healthy
274
283
  details: Additional health details
275
284
  """
276
285
  from datetime import datetime
277
-
286
+
278
287
  self._health_status["healthy"] = healthy
279
288
  self._health_status["last_check"] = datetime.now().isoformat()
280
-
289
+
281
290
  if details:
282
291
  self._health_status["details"].update(details)
283
-
292
+
284
293
  # Additional logging methods for MCP-specific events
285
- def log_mcp_event(self, event_type: str, data: Optional[Dict[str, Any]] = None) -> None:
294
+ def log_mcp_event(
295
+ self, event_type: str, data: Optional[Dict[str, Any]] = None
296
+ ) -> None:
286
297
  """
287
298
  Log an MCP-specific event.
288
-
299
+
289
300
  Args:
290
301
  event_type: Type of MCP event
291
302
  data: Event data
@@ -294,11 +305,13 @@ class BaseMCPService(BaseService):
294
305
  if data:
295
306
  message += f" - {data}"
296
307
  self.log_info(message)
297
-
298
- def log_tool_invocation(self, tool_name: str, success: bool, duration: Optional[float] = None) -> None:
308
+
309
+ def log_tool_invocation(
310
+ self, tool_name: str, success: bool, duration: Optional[float] = None
311
+ ) -> None:
299
312
  """
300
313
  Log a tool invocation.
301
-
314
+
302
315
  Args:
303
316
  tool_name: Name of the tool invoked
304
317
  success: Whether invocation was successful
@@ -308,8 +321,8 @@ class BaseMCPService(BaseService):
308
321
  message = f"Tool invocation: {tool_name} {status}"
309
322
  if duration:
310
323
  message += f" ({duration:.3f}s)"
311
-
324
+
312
325
  if success:
313
326
  self.log_info(message)
314
327
  else:
315
- self.log_warning(message)
328
+ self.log_warning(message)
@@ -7,22 +7,22 @@ Custom exceptions for MCP Gateway operations.
7
7
  Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
8
8
  """
9
9
 
10
- from typing import Optional, Any, Dict
10
+ from typing import Any, Dict, Optional
11
11
 
12
12
 
13
13
  class MCPException(Exception):
14
14
  """
15
15
  Base exception for all MCP Gateway errors.
16
-
16
+
17
17
  WHY: We create a base exception to allow catching all MCP-related
18
18
  errors in a single except block while still being able to handle
19
19
  specific error types when needed.
20
20
  """
21
-
21
+
22
22
  def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
23
23
  """
24
24
  Initialize MCP exception.
25
-
25
+
26
26
  Args:
27
27
  message: Error message
28
28
  details: Additional error details
@@ -30,7 +30,7 @@ class MCPException(Exception):
30
30
  super().__init__(message)
31
31
  self.message = message
32
32
  self.details = details or {}
33
-
33
+
34
34
  def __str__(self) -> str:
35
35
  """String representation of the exception."""
36
36
  if self.details:
@@ -41,19 +41,23 @@ class MCPException(Exception):
41
41
  class MCPConfigurationError(MCPException):
42
42
  """
43
43
  Raised when MCP configuration is invalid or cannot be loaded.
44
-
44
+
45
45
  Common scenarios:
46
46
  - Missing required configuration fields
47
47
  - Invalid configuration values
48
48
  - Configuration file not found
49
49
  - YAML parsing errors
50
50
  """
51
-
52
- def __init__(self, message: str, config_key: Optional[str] = None,
53
- expected_type: Optional[str] = None):
51
+
52
+ def __init__(
53
+ self,
54
+ message: str,
55
+ config_key: Optional[str] = None,
56
+ expected_type: Optional[str] = None,
57
+ ):
54
58
  """
55
59
  Initialize configuration error.
56
-
60
+
57
61
  Args:
58
62
  message: Error message
59
63
  config_key: Configuration key that caused the error
@@ -64,54 +68,58 @@ class MCPConfigurationError(MCPException):
64
68
  details["config_key"] = config_key
65
69
  if expected_type:
66
70
  details["expected_type"] = expected_type
67
-
71
+
68
72
  super().__init__(message, details)
69
73
 
70
74
 
71
75
  class MCPToolNotFoundError(MCPException):
72
76
  """
73
77
  Raised when a requested tool is not found in the registry.
74
-
78
+
75
79
  This error occurs when:
76
80
  - Attempting to invoke a non-existent tool
77
81
  - Trying to unregister a tool that isn't registered
78
82
  - Searching for a tool that doesn't exist
79
83
  """
80
-
84
+
81
85
  def __init__(self, tool_name: str, available_tools: Optional[list] = None):
82
86
  """
83
87
  Initialize tool not found error.
84
-
88
+
85
89
  Args:
86
90
  tool_name: Name of the tool that wasn't found
87
91
  available_tools: List of available tool names for reference
88
92
  """
89
93
  message = f"Tool '{tool_name}' not found in registry"
90
94
  details = {"tool_name": tool_name}
91
-
95
+
92
96
  if available_tools:
93
97
  details["available_tools"] = available_tools
94
98
  message += f". Available tools: {', '.join(available_tools)}"
95
-
99
+
96
100
  super().__init__(message, details)
97
101
 
98
102
 
99
103
  class MCPServerError(MCPException):
100
104
  """
101
105
  Raised when MCP server encounters an error.
102
-
106
+
103
107
  Common scenarios:
104
108
  - Server initialization failure
105
109
  - Port binding issues
106
110
  - Server crash during operation
107
111
  - Invalid server state transitions
108
112
  """
109
-
110
- def __init__(self, message: str, server_state: Optional[str] = None,
111
- error_code: Optional[int] = None):
113
+
114
+ def __init__(
115
+ self,
116
+ message: str,
117
+ server_state: Optional[str] = None,
118
+ error_code: Optional[int] = None,
119
+ ):
112
120
  """
113
121
  Initialize server error.
114
-
122
+
115
123
  Args:
116
124
  message: Error message
117
125
  server_state: Current server state when error occurred
@@ -122,26 +130,30 @@ class MCPServerError(MCPException):
122
130
  details["server_state"] = server_state
123
131
  if error_code:
124
132
  details["error_code"] = error_code
125
-
133
+
126
134
  super().__init__(message, details)
127
135
 
128
136
 
129
137
  class MCPCommunicationError(MCPException):
130
138
  """
131
139
  Raised when communication with MCP client fails.
132
-
140
+
133
141
  This includes:
134
142
  - Stdio communication failures
135
143
  - Message parsing errors
136
144
  - Protocol violations
137
145
  - Timeout errors
138
146
  """
139
-
140
- def __init__(self, message: str, direction: Optional[str] = None,
141
- raw_data: Optional[str] = None):
147
+
148
+ def __init__(
149
+ self,
150
+ message: str,
151
+ direction: Optional[str] = None,
152
+ raw_data: Optional[str] = None,
153
+ ):
142
154
  """
143
155
  Initialize communication error.
144
-
156
+
145
157
  Args:
146
158
  message: Error message
147
159
  direction: Direction of communication ("send" or "receive")
@@ -154,26 +166,31 @@ class MCPCommunicationError(MCPException):
154
166
  details["raw_data"] = raw_data
155
167
  elif raw_data:
156
168
  details["raw_data"] = raw_data[:1000] + "... (truncated)"
157
-
169
+
158
170
  super().__init__(message, details)
159
171
 
160
172
 
161
173
  class MCPValidationError(MCPException):
162
174
  """
163
175
  Raised when validation fails.
164
-
176
+
165
177
  Used for:
166
178
  - Tool parameter validation
167
179
  - Schema validation
168
180
  - Input validation
169
181
  - Response validation
170
182
  """
171
-
172
- def __init__(self, message: str, field: Optional[str] = None,
173
- expected: Optional[Any] = None, actual: Optional[Any] = None):
183
+
184
+ def __init__(
185
+ self,
186
+ message: str,
187
+ field: Optional[str] = None,
188
+ expected: Optional[Any] = None,
189
+ actual: Optional[Any] = None,
190
+ ):
174
191
  """
175
192
  Initialize validation error.
176
-
193
+
177
194
  Args:
178
195
  message: Error message
179
196
  field: Field that failed validation
@@ -187,47 +204,44 @@ class MCPValidationError(MCPException):
187
204
  details["expected"] = str(expected)
188
205
  if actual is not None:
189
206
  details["actual"] = str(actual)
190
-
207
+
191
208
  super().__init__(message, details)
192
209
 
193
210
 
194
211
  class MCPTimeoutError(MCPException):
195
212
  """
196
213
  Raised when an operation times out.
197
-
214
+
198
215
  Common scenarios:
199
216
  - Tool invocation timeout
200
217
  - Server startup timeout
201
218
  - Communication timeout
202
219
  """
203
-
220
+
204
221
  def __init__(self, operation: str, timeout_seconds: float):
205
222
  """
206
223
  Initialize timeout error.
207
-
224
+
208
225
  Args:
209
226
  operation: Operation that timed out
210
227
  timeout_seconds: Timeout duration in seconds
211
228
  """
212
229
  message = f"Operation '{operation}' timed out after {timeout_seconds} seconds"
213
- details = {
214
- "operation": operation,
215
- "timeout_seconds": timeout_seconds
216
- }
230
+ details = {"operation": operation, "timeout_seconds": timeout_seconds}
217
231
  super().__init__(message, details)
218
232
 
219
233
 
220
234
  class MCPAuthenticationError(MCPException):
221
235
  """
222
236
  Raised when authentication fails.
223
-
237
+
224
238
  For future use when MCP supports authentication.
225
239
  """
226
-
240
+
227
241
  def __init__(self, message: str, auth_method: Optional[str] = None):
228
242
  """
229
243
  Initialize authentication error.
230
-
244
+
231
245
  Args:
232
246
  message: Error message
233
247
  auth_method: Authentication method that failed
@@ -235,5 +249,5 @@ class MCPAuthenticationError(MCPException):
235
249
  details = {}
236
250
  if auth_method:
237
251
  details["auth_method"] = auth_method
238
-
239
- super().__init__(message, details)
252
+
253
+ super().__init__(message, details)