claude-mpm 5.1.9__py3-none-any.whl → 5.4.48__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 (248) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +1 -1
  5. claude_mpm/agents/MEMORY.md +1 -1
  6. claude_mpm/agents/PM_INSTRUCTIONS.md +843 -900
  7. claude_mpm/agents/WORKFLOW.md +5 -254
  8. claude_mpm/agents/agent_loader.py +13 -44
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/frontmatter_validator.py +2 -2
  11. claude_mpm/agents/templates/circuit-breakers.md +138 -1
  12. claude_mpm/cli/__main__.py +4 -0
  13. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  14. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  15. claude_mpm/cli/commands/agents.py +9 -40
  16. claude_mpm/cli/commands/auto_configure.py +210 -25
  17. claude_mpm/cli/commands/config.py +88 -2
  18. claude_mpm/cli/commands/configure.py +1098 -159
  19. claude_mpm/cli/commands/configure_agent_display.py +25 -6
  20. claude_mpm/cli/commands/mpm_init/core.py +225 -46
  21. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  22. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  23. claude_mpm/cli/commands/postmortem.py +1 -1
  24. claude_mpm/cli/commands/profile.py +277 -0
  25. claude_mpm/cli/commands/skills.py +218 -197
  26. claude_mpm/cli/commands/summarize.py +413 -0
  27. claude_mpm/cli/executor.py +21 -3
  28. claude_mpm/cli/interactive/agent_wizard.py +2 -2
  29. claude_mpm/cli/parsers/agents_parser.py +0 -9
  30. claude_mpm/cli/parsers/auto_configure_parser.py +0 -138
  31. claude_mpm/cli/parsers/base_parser.py +12 -0
  32. claude_mpm/cli/parsers/config_parser.py +153 -83
  33. claude_mpm/cli/parsers/profile_parser.py +148 -0
  34. claude_mpm/cli/parsers/skills_parser.py +0 -5
  35. claude_mpm/cli/startup.py +876 -149
  36. claude_mpm/commands/mpm-config.md +28 -0
  37. claude_mpm/commands/mpm-doctor.md +9 -22
  38. claude_mpm/commands/mpm-help.md +5 -287
  39. claude_mpm/commands/mpm-init.md +81 -507
  40. claude_mpm/commands/mpm-monitor.md +15 -402
  41. claude_mpm/commands/mpm-organize.md +120 -0
  42. claude_mpm/commands/mpm-postmortem.md +6 -108
  43. claude_mpm/commands/mpm-session-resume.md +12 -363
  44. claude_mpm/commands/mpm-status.md +5 -69
  45. claude_mpm/commands/mpm-ticket-view.md +52 -495
  46. claude_mpm/commands/mpm-version.md +5 -107
  47. claude_mpm/config/agent_sources.py +27 -0
  48. claude_mpm/core/config.py +2 -4
  49. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  50. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  51. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  52. claude_mpm/core/framework_loader.py +4 -2
  53. claude_mpm/core/logger.py +13 -0
  54. claude_mpm/core/optimized_startup.py +59 -0
  55. claude_mpm/core/shared/config_loader.py +1 -1
  56. claude_mpm/core/socketio_pool.py +3 -3
  57. claude_mpm/core/unified_agent_registry.py +5 -15
  58. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  59. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  60. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  74. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  75. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  76. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  77. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  78. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  79. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  80. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  85. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  86. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  87. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  88. claude_mpm/hooks/claude_hooks/memory_integration.py +26 -9
  89. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  92. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  93. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  97. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  98. claude_mpm/hooks/memory_integration_hook.py +46 -1
  99. claude_mpm/init.py +63 -19
  100. claude_mpm/models/git_repository.py +3 -3
  101. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  102. claude_mpm/scripts/launch_monitor.py +93 -13
  103. claude_mpm/services/agents/agent_builder.py +3 -3
  104. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  105. claude_mpm/services/agents/agent_review_service.py +280 -0
  106. claude_mpm/services/agents/cache_git_manager.py +6 -6
  107. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  108. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
  109. claude_mpm/services/agents/deployment/agent_format_converter.py +23 -13
  110. claude_mpm/services/agents/deployment/agent_template_builder.py +32 -20
  111. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  112. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  113. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  114. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +247 -35
  115. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +392 -87
  116. claude_mpm/services/agents/git_source_manager.py +53 -4
  117. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  118. claude_mpm/services/agents/recommender.py +5 -3
  119. claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
  120. claude_mpm/services/agents/sources/git_source_sync_service.py +120 -7
  121. claude_mpm/services/agents/startup_sync.py +22 -2
  122. claude_mpm/services/agents/toolchain_detector.py +10 -6
  123. claude_mpm/services/analysis/__init__.py +11 -1
  124. claude_mpm/services/analysis/clone_detector.py +1030 -0
  125. claude_mpm/services/command_deployment_service.py +81 -10
  126. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  127. claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
  128. claude_mpm/services/event_bus/config.py +3 -1
  129. claude_mpm/services/git/git_operations_service.py +101 -16
  130. claude_mpm/services/monitor/daemon.py +9 -2
  131. claude_mpm/services/monitor/daemon_manager.py +39 -3
  132. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  133. claude_mpm/services/monitor/server.py +698 -22
  134. claude_mpm/services/pm_skills_deployer.py +711 -0
  135. claude_mpm/services/profile_manager.py +331 -0
  136. claude_mpm/services/self_upgrade_service.py +120 -12
  137. claude_mpm/services/skills/__init__.py +3 -0
  138. claude_mpm/services/skills/git_skill_source_manager.py +130 -2
  139. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  140. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  141. claude_mpm/services/skills_deployer.py +127 -9
  142. claude_mpm/services/socketio/dashboard_server.py +1 -0
  143. claude_mpm/services/socketio/event_normalizer.py +51 -6
  144. claude_mpm/services/socketio/server/core.py +386 -108
  145. claude_mpm/services/version_control/git_operations.py +103 -0
  146. claude_mpm/skills/skill_manager.py +92 -3
  147. claude_mpm/utils/agent_dependency_loader.py +14 -2
  148. claude_mpm/utils/agent_filters.py +17 -44
  149. claude_mpm/utils/migration.py +4 -4
  150. claude_mpm/utils/robust_installer.py +47 -3
  151. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/METADATA +53 -87
  152. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/RECORD +157 -197
  153. claude_mpm-5.4.48.dist-info/entry_points.txt +5 -0
  154. claude_mpm-5.4.48.dist-info/licenses/LICENSE +94 -0
  155. claude_mpm-5.4.48.dist-info/licenses/LICENSE-FAQ.md +153 -0
  156. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  157. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  158. claude_mpm/agents/BASE_OPS.md +0 -219
  159. claude_mpm/agents/BASE_PM.md +0 -480
  160. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  161. claude_mpm/agents/BASE_QA.md +0 -167
  162. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  163. claude_mpm/agents/base_agent_loader.py +0 -601
  164. claude_mpm/cli/commands/agents_detect.py +0 -380
  165. claude_mpm/cli/commands/agents_recommend.py +0 -309
  166. claude_mpm/cli/ticket_cli.py +0 -35
  167. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  168. claude_mpm/commands/mpm-agents-detect.md +0 -177
  169. claude_mpm/commands/mpm-agents-list.md +0 -131
  170. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  171. claude_mpm/commands/mpm-config-view.md +0 -150
  172. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  173. claude_mpm/dashboard/analysis_runner.py +0 -455
  174. claude_mpm/dashboard/index.html +0 -13
  175. claude_mpm/dashboard/open_dashboard.py +0 -66
  176. claude_mpm/dashboard/static/css/activity.css +0 -1958
  177. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  178. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  179. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  180. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  181. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  182. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  183. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  184. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  185. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  186. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  187. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  188. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  189. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  190. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  191. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  192. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  193. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  194. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  195. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  196. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  197. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  198. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  199. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  200. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  201. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  202. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  203. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  204. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  205. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  206. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  207. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  208. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  209. claude_mpm/dashboard/templates/code_simple.html +0 -153
  210. claude_mpm/dashboard/templates/index.html +0 -606
  211. claude_mpm/dashboard/test_dashboard.html +0 -372
  212. claude_mpm/scripts/mcp_server.py +0 -75
  213. claude_mpm/scripts/mcp_wrapper.py +0 -39
  214. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  215. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  216. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  217. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  218. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  219. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  220. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  221. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  222. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  223. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  224. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  225. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  226. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  227. claude_mpm/services/mcp_gateway/main.py +0 -589
  228. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  229. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  230. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  231. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  232. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  233. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  235. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  236. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  237. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  238. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  239. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  240. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  241. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  242. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  243. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  244. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  245. claude_mpm-5.1.9.dist-info/entry_points.txt +0 -10
  246. claude_mpm-5.1.9.dist-info/licenses/LICENSE +0 -21
  247. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/WHEEL +0 -0
  248. {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/top_level.txt +0 -0
@@ -1,551 +0,0 @@
1
- """
2
- Hello World Tool for MCP Gateway Testing and Validation
3
- =========================================================
4
-
5
- Comprehensive Hello World tool that demonstrates all MCP capabilities.
6
- This tool serves as the primary validation for the MCP Gateway system.
7
-
8
- Part of ISS-0036: Hello World Tool - Testing and Validation Tool
9
-
10
- WHY: We need a comprehensive test tool that exercises all MCP features
11
- including async operations, input validation, error handling, multi-language
12
- support, and proper metrics tracking. This tool validates that our MCP
13
- Gateway is functioning correctly.
14
-
15
- DESIGN DECISIONS:
16
- - Multiple greeting variations to test different parameter combinations
17
- - Async operations to validate async tool support
18
- - Comprehensive input validation with detailed error messages
19
- - Multi-language support to test Unicode handling
20
- - Time-based greetings to test dynamic responses
21
- - Detailed metrics tracking for monitoring
22
- - Rich metadata in responses for debugging
23
- """
24
-
25
- import asyncio
26
- import json
27
- import platform
28
- import re
29
- import sys
30
- from datetime import datetime, timezone
31
- from typing import Any, Dict, List, Optional
32
-
33
- from claude_mpm.services.mcp_gateway.core.interfaces import (
34
- MCPToolDefinition,
35
- MCPToolInvocation,
36
- MCPToolResult,
37
- )
38
- from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter
39
-
40
-
41
- class HelloWorldTool(BaseToolAdapter):
42
- """
43
- Comprehensive Hello World tool for MCP Gateway testing.
44
-
45
- This tool provides multiple greeting variations to thoroughly test
46
- the MCP Gateway's tool execution capabilities.
47
-
48
- Features:
49
- - Simple greeting: Basic echo functionality
50
- - Personalized greeting: Name-based customization
51
- - Time-based greeting: Dynamic responses based on time of day
52
- - Multi-language greeting: Unicode and internationalization support
53
- - System info greeting: Integration with system information
54
- - Async greeting: Tests async operation support
55
- - Error scenarios: Validates error handling
56
-
57
- TRADE-OFFS:
58
- - Comprehensive testing vs simplicity: We chose comprehensive testing
59
- to ensure all MCP features work correctly
60
- - Multiple variations vs single greeting: Multiple variations allow
61
- testing different parameter combinations and edge cases
62
- """
63
-
64
- # Supported languages for multi-language greetings
65
- LANGUAGES = {
66
- "english": "Hello",
67
- "spanish": "Hola",
68
- "french": "Bonjour",
69
- "german": "Hallo",
70
- "italian": "Ciao",
71
- "portuguese": "Olá",
72
- "russian": "Привет",
73
- "japanese": "こんにちは",
74
- "chinese": "你好",
75
- "korean": "안녕하세요",
76
- "arabic": "مرحبا",
77
- "hindi": "नमस्ते",
78
- "hebrew": "שלום",
79
- "dutch": "Hallo",
80
- "polish": "Cześć",
81
- "swedish": "Hej",
82
- "norwegian": "Hei",
83
- "danish": "Hej",
84
- "finnish": "Hei",
85
- "greek": "Γειά σου",
86
- "turkish": "Merhaba",
87
- "thai": "สวัสดี",
88
- "vietnamese": "Xin chào",
89
- "indonesian": "Halo",
90
- "malay": "Hai",
91
- }
92
-
93
- # Time-based greeting thresholds
94
- TIME_GREETINGS = {
95
- (0, 5): "Good night",
96
- (5, 12): "Good morning",
97
- (12, 17): "Good afternoon",
98
- (17, 21): "Good evening",
99
- (21, 24): "Good night",
100
- }
101
-
102
- def __init__(self):
103
- """Initialize the Hello World tool with comprehensive schema."""
104
- definition = MCPToolDefinition(
105
- name="hello_world",
106
- description=(
107
- "A comprehensive Hello World tool for testing MCP Gateway functionality. "
108
- "Provides multiple greeting variations including simple, personalized, "
109
- "time-based, and multi-language greetings."
110
- ),
111
- input_schema={
112
- "type": "object",
113
- "properties": {
114
- "mode": {
115
- "type": "string",
116
- "enum": [
117
- "simple",
118
- "personalized",
119
- "time_based",
120
- "multi_language",
121
- "system_info",
122
- "async_test",
123
- "error_test",
124
- ],
125
- "description": "The greeting mode to use",
126
- "default": "simple",
127
- },
128
- "name": {
129
- "type": "string",
130
- "description": "Name for personalized greeting (required for personalized mode)",
131
- "minLength": 1,
132
- "maxLength": 100,
133
- },
134
- "language": {
135
- "type": "string",
136
- "description": "Language for multi-language greeting",
137
- "enum": list(self.LANGUAGES.keys()),
138
- "default": "english",
139
- },
140
- "delay_ms": {
141
- "type": "number",
142
- "description": "Delay in milliseconds for async test",
143
- "minimum": 0,
144
- "maximum": 5000,
145
- "default": 1000,
146
- },
147
- "error_type": {
148
- "type": "string",
149
- "enum": ["validation", "runtime", "timeout"],
150
- "description": "Type of error to simulate for error_test mode",
151
- "default": "validation",
152
- },
153
- "include_metadata": {
154
- "type": "boolean",
155
- "description": "Whether to include detailed metadata in response",
156
- "default": True,
157
- },
158
- "uppercase": {
159
- "type": "boolean",
160
- "description": "Convert greeting to uppercase",
161
- "default": False,
162
- },
163
- "repeat": {
164
- "type": "number",
165
- "description": "Number of times to repeat the greeting",
166
- "minimum": 1,
167
- "maximum": 10,
168
- "default": 1,
169
- },
170
- },
171
- "required": ["mode"],
172
- "additionalProperties": False,
173
- },
174
- output_schema={
175
- "type": "object",
176
- "properties": {
177
- "greeting": {
178
- "type": "string",
179
- "description": "The generated greeting message",
180
- },
181
- "mode": {"type": "string", "description": "The mode that was used"},
182
- "timestamp": {
183
- "type": "string",
184
- "description": "ISO timestamp when greeting was generated",
185
- },
186
- "metadata": {
187
- "type": "object",
188
- "description": "Additional metadata about the greeting",
189
- "properties": {
190
- "tool_version": {"type": "string"},
191
- "execution_environment": {"type": "object"},
192
- "parameters_used": {"type": "object"},
193
- },
194
- },
195
- },
196
- },
197
- )
198
- super().__init__(definition)
199
-
200
- # Tool version for tracking
201
- self.version = "1.0.0"
202
-
203
- # Track greeting history for analytics
204
- self.greeting_history: List[Dict[str, Any]] = []
205
- self.max_history_size = 100
206
-
207
- def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
208
- """
209
- Enhanced parameter validation with detailed error messages.
210
-
211
- Args:
212
- parameters: Parameters to validate
213
-
214
- Returns:
215
- True if parameters are valid, False otherwise
216
- """
217
- # First do base validation
218
- if not super().validate_parameters(parameters):
219
- return False
220
-
221
- mode = parameters.get("mode", "simple")
222
-
223
- # Validate mode is in allowed enum
224
- valid_modes = [
225
- "simple",
226
- "personalized",
227
- "time_based",
228
- "multi_language",
229
- "system_info",
230
- "async_test",
231
- "error_test",
232
- ]
233
- if mode not in valid_modes:
234
- self.log_error(f"Invalid mode: {mode}. Must be one of {valid_modes}")
235
- return False
236
-
237
- # Mode-specific validation
238
- if mode == "personalized":
239
- if "name" not in parameters or not parameters["name"]:
240
- self.log_error("Personalized mode requires 'name' parameter")
241
- return False
242
-
243
- # Validate name format (alphanumeric and basic punctuation)
244
- name = parameters["name"]
245
- if not re.match(r"^[a-zA-Z0-9\s\-\'\.]+$", name):
246
- self.log_error(f"Invalid name format: {name}")
247
- return False
248
-
249
- elif mode == "multi_language":
250
- language = parameters.get("language", "english")
251
- if language not in self.LANGUAGES:
252
- self.log_error(f"Unsupported language: {language}")
253
- return False
254
-
255
- elif mode == "async_test":
256
- delay = parameters.get("delay_ms", 1000)
257
- if not isinstance(delay, (int, float)) or delay < 0 or delay > 5000:
258
- self.log_error(f"Invalid delay_ms: {delay} (must be 0-5000)")
259
- return False
260
-
261
- elif mode == "error_test":
262
- error_type = parameters.get("error_type", "validation")
263
- if error_type not in ["validation", "runtime", "timeout"]:
264
- self.log_error(f"Invalid error_type: {error_type}")
265
- return False
266
-
267
- # Validate common parameters
268
- repeat = parameters.get("repeat", 1)
269
- if not isinstance(repeat, int) or repeat < 1 or repeat > 10:
270
- self.log_error(f"Invalid repeat value: {repeat} (must be 1-10)")
271
- return False
272
-
273
- return True
274
-
275
- async def initialize(self) -> bool:
276
- """
277
- Initialize the Hello World tool.
278
-
279
- Returns:
280
- True if initialization successful
281
- """
282
- try:
283
- self.log_info(f"Initializing Hello World Tool v{self.version}")
284
-
285
- # Clear greeting history
286
- self.greeting_history.clear()
287
-
288
- # Mark as initialized
289
- self._initialized = True
290
-
291
- self.log_info("Hello World Tool initialized successfully")
292
- return True
293
-
294
- except Exception as e:
295
- self.log_error(f"Failed to initialize Hello World Tool: {e}")
296
- return False
297
-
298
- async def invoke(self, invocation: MCPToolInvocation) -> MCPToolResult:
299
- """
300
- Invoke the Hello World tool with the specified mode.
301
-
302
- Args:
303
- invocation: Tool invocation request
304
-
305
- Returns:
306
- Tool execution result with greeting
307
- """
308
- start_time = datetime.now(timezone.utc)
309
-
310
- try:
311
- # Validate parameters
312
- if not self.validate_parameters(invocation.parameters):
313
- return MCPToolResult(
314
- success=False,
315
- error="Parameter validation failed",
316
- execution_time=0.0,
317
- )
318
-
319
- # Extract parameters
320
- mode = invocation.parameters.get("mode", "simple")
321
- include_metadata = invocation.parameters.get("include_metadata", True)
322
- uppercase = invocation.parameters.get("uppercase", False)
323
- repeat = invocation.parameters.get("repeat", 1)
324
-
325
- # Generate greeting based on mode
326
- if mode == "simple":
327
- greeting = await self._simple_greeting()
328
- elif mode == "personalized":
329
- name = invocation.parameters["name"]
330
- greeting = await self._personalized_greeting(name)
331
- elif mode == "time_based":
332
- greeting = await self._time_based_greeting()
333
- elif mode == "multi_language":
334
- language = invocation.parameters.get("language", "english")
335
- name = invocation.parameters.get("name")
336
- greeting = await self._multi_language_greeting(language, name)
337
- elif mode == "system_info":
338
- greeting = await self._system_info_greeting()
339
- elif mode == "async_test":
340
- delay_ms = invocation.parameters.get("delay_ms", 1000)
341
- greeting = await self._async_greeting(delay_ms)
342
- elif mode == "error_test":
343
- error_type = invocation.parameters.get("error_type", "validation")
344
- return await self._error_test(error_type)
345
- else:
346
- greeting = f"Hello World! (Unknown mode: {mode})"
347
-
348
- # Apply transformations
349
- if uppercase:
350
- greeting = greeting.upper()
351
-
352
- if repeat > 1:
353
- greeting = " ".join([greeting] * repeat)
354
-
355
- # Calculate execution time
356
- execution_time = (datetime.now(timezone.utc) - start_time).total_seconds()
357
-
358
- # Build response data
359
- response_data = {
360
- "greeting": greeting,
361
- "mode": mode,
362
- "timestamp": datetime.now(timezone.utc).isoformat(),
363
- }
364
-
365
- # Add metadata if requested
366
- if include_metadata:
367
- response_data["metadata"] = {
368
- "tool_version": self.version,
369
- "execution_environment": {
370
- "platform": platform.platform(),
371
- "python_version": sys.version,
372
- "processor": platform.processor() or "unknown",
373
- },
374
- "parameters_used": invocation.parameters,
375
- "execution_time_ms": execution_time * 1000,
376
- }
377
-
378
- # Track in history
379
- self._add_to_history(mode, greeting, execution_time)
380
-
381
- # Update metrics
382
- self._update_metrics(True, execution_time)
383
-
384
- return MCPToolResult(
385
- success=True,
386
- data=response_data,
387
- execution_time=execution_time,
388
- metadata={"tool": "hello_world", "version": self.version, "mode": mode},
389
- )
390
-
391
- except Exception as e:
392
- execution_time = (datetime.now(timezone.utc) - start_time).total_seconds()
393
- self._update_metrics(False, execution_time)
394
- self._metrics["last_error"] = str(e)
395
-
396
- return MCPToolResult(
397
- success=False,
398
- error=f"Hello World tool failed: {e!s}",
399
- execution_time=execution_time,
400
- )
401
-
402
- async def _simple_greeting(self) -> str:
403
- """Generate a simple greeting."""
404
- return "Hello World!"
405
-
406
- async def _personalized_greeting(self, name: str) -> str:
407
- """Generate a personalized greeting."""
408
- return f"Hello, {name}! Welcome to the MCP Gateway."
409
-
410
- async def _time_based_greeting(self) -> str:
411
- """Generate a greeting based on current time."""
412
- current_hour = datetime.now(timezone.utc).hour
413
-
414
- for (start, end), greeting in self.TIME_GREETINGS.items():
415
- if start <= current_hour < end:
416
- return f"{greeting}! It's {datetime.now(timezone.utc).strftime('%I:%M %p')}."
417
-
418
- return "Hello! Time is a curious thing."
419
-
420
- async def _multi_language_greeting(
421
- self, language: str, name: Optional[str] = None
422
- ) -> str:
423
- """Generate a greeting in the specified language."""
424
- greeting_word = self.LANGUAGES.get(language, "Hello")
425
-
426
- if name:
427
- # Add name if provided (works for most languages)
428
- return f"{greeting_word}, {name}!"
429
- return f"{greeting_word}, World!"
430
-
431
- async def _system_info_greeting(self) -> str:
432
- """Generate a greeting with system information."""
433
- system = platform.system()
434
- node = platform.node()
435
- py_version = platform.python_version()
436
-
437
- return (
438
- f"Hello from {system} on {node}! "
439
- f"Running Python {py_version} with MCP Gateway."
440
- )
441
-
442
- async def _async_greeting(self, delay_ms: int) -> str:
443
- """Generate a greeting after an async delay."""
444
- self.log_info(f"Starting async greeting with {delay_ms}ms delay")
445
-
446
- # Convert milliseconds to seconds for asyncio.sleep
447
- delay_seconds = delay_ms / 1000.0
448
- await asyncio.sleep(delay_seconds)
449
-
450
- return f"Hello World! (after {delay_ms}ms async delay)"
451
-
452
- async def _error_test(self, error_type: str) -> MCPToolResult:
453
- """Simulate various error conditions for testing."""
454
- if error_type == "validation":
455
- return MCPToolResult(
456
- success=False,
457
- error="Simulated validation error: Invalid input parameters",
458
- execution_time=0.001,
459
- )
460
- if error_type == "runtime":
461
- # Simulate a runtime error
462
- raise RuntimeError("Simulated runtime error during greeting generation")
463
- if error_type == "timeout":
464
- # Simulate a timeout by sleeping longer than reasonable
465
- await asyncio.sleep(10) # This would typically trigger a timeout
466
- return MCPToolResult(
467
- success=False, error="Operation timed out", execution_time=10.0
468
- )
469
- return MCPToolResult(
470
- success=False,
471
- error=f"Unknown error type: {error_type}",
472
- execution_time=0.001,
473
- )
474
-
475
- def _add_to_history(self, mode: str, greeting: str, execution_time: float) -> None:
476
- """
477
- Add greeting to history for analytics.
478
-
479
- Args:
480
- mode: Greeting mode used
481
- greeting: Generated greeting
482
- execution_time: Time taken to generate greeting
483
- """
484
- entry = {
485
- "timestamp": datetime.now(timezone.utc).isoformat(),
486
- "mode": mode,
487
- "greeting": greeting[:100], # Truncate long greetings
488
- "execution_time": execution_time,
489
- }
490
-
491
- self.greeting_history.append(entry)
492
-
493
- # Maintain history size limit
494
- if len(self.greeting_history) > self.max_history_size:
495
- self.greeting_history.pop(0)
496
-
497
- def get_analytics(self) -> Dict[str, Any]:
498
- """
499
- Get analytics about tool usage.
500
-
501
- Returns:
502
- Analytics dictionary with usage statistics
503
- """
504
- if not self.greeting_history:
505
- return {
506
- "total_greetings": 0,
507
- "modes_used": {},
508
- "average_execution_time": 0.0,
509
- "last_greeting": None,
510
- }
511
-
512
- # Calculate mode usage
513
- modes_used = {}
514
- total_time = 0.0
515
-
516
- for entry in self.greeting_history:
517
- mode = entry["mode"]
518
- modes_used[mode] = modes_used.get(mode, 0) + 1
519
- total_time += entry["execution_time"]
520
-
521
- return {
522
- "total_greetings": len(self.greeting_history),
523
- "modes_used": modes_used,
524
- "average_execution_time": total_time / len(self.greeting_history),
525
- "last_greeting": (
526
- self.greeting_history[-1] if self.greeting_history else None
527
- ),
528
- "metrics": self.get_metrics(),
529
- }
530
-
531
- async def shutdown(self) -> None:
532
- """
533
- Shutdown the Hello World tool and clean up resources.
534
- """
535
- try:
536
- self.log_info(f"Shutting down Hello World Tool v{self.version}")
537
-
538
- # Log final analytics
539
- analytics = self.get_analytics()
540
- self.log_info(f"Final analytics: {json.dumps(analytics, indent=2)}")
541
-
542
- # Clear history
543
- self.greeting_history.clear()
544
-
545
- # Mark as not initialized
546
- self._initialized = False
547
-
548
- self.log_info("Hello World Tool shutdown complete")
549
-
550
- except Exception as e:
551
- self.log_error(f"Error during Hello World Tool shutdown: {e}")