claude-mpm 5.6.23__py3-none-any.whl → 5.6.73__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 (82) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/auth/__init__.py +35 -0
  3. claude_mpm/auth/callback_server.py +328 -0
  4. claude_mpm/auth/models.py +104 -0
  5. claude_mpm/auth/oauth_manager.py +266 -0
  6. claude_mpm/auth/providers/__init__.py +12 -0
  7. claude_mpm/auth/providers/base.py +165 -0
  8. claude_mpm/auth/providers/google.py +261 -0
  9. claude_mpm/auth/token_storage.py +252 -0
  10. claude_mpm/cli/commands/commander.py +6 -6
  11. claude_mpm/cli/commands/mcp.py +29 -17
  12. claude_mpm/cli/commands/mcp_command_router.py +39 -0
  13. claude_mpm/cli/commands/mcp_service_commands.py +304 -0
  14. claude_mpm/cli/commands/oauth.py +481 -0
  15. claude_mpm/cli/executor.py +9 -0
  16. claude_mpm/cli/helpers.py +1 -1
  17. claude_mpm/cli/parsers/base_parser.py +13 -0
  18. claude_mpm/cli/parsers/mcp_parser.py +79 -0
  19. claude_mpm/cli/parsers/oauth_parser.py +165 -0
  20. claude_mpm/cli/startup.py +150 -33
  21. claude_mpm/cli/startup_display.py +3 -2
  22. claude_mpm/commander/chat/cli.py +5 -2
  23. claude_mpm/commander/chat/commands.py +42 -16
  24. claude_mpm/commander/chat/repl.py +1581 -70
  25. claude_mpm/commander/events/manager.py +61 -1
  26. claude_mpm/commander/frameworks/base.py +87 -0
  27. claude_mpm/commander/frameworks/mpm.py +9 -14
  28. claude_mpm/commander/git/__init__.py +5 -0
  29. claude_mpm/commander/git/worktree_manager.py +212 -0
  30. claude_mpm/commander/instance_manager.py +428 -13
  31. claude_mpm/commander/models/events.py +6 -0
  32. claude_mpm/commander/persistence/state_store.py +95 -1
  33. claude_mpm/commander/tmux_orchestrator.py +3 -2
  34. claude_mpm/constants.py +5 -0
  35. claude_mpm/core/hook_manager.py +2 -1
  36. claude_mpm/core/logging_utils.py +4 -2
  37. claude_mpm/core/output_style_manager.py +5 -2
  38. claude_mpm/core/socketio_pool.py +34 -10
  39. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +1 -1
  40. claude_mpm/hooks/claude_hooks/event_handlers.py +206 -94
  41. claude_mpm/hooks/claude_hooks/hook_handler.py +115 -32
  42. claude_mpm/hooks/claude_hooks/installer.py +175 -51
  43. claude_mpm/hooks/claude_hooks/memory_integration.py +1 -1
  44. claude_mpm/hooks/claude_hooks/response_tracking.py +1 -1
  45. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  46. claude_mpm/hooks/claude_hooks/services/connection_manager.py +2 -2
  47. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +2 -2
  48. claude_mpm/hooks/claude_hooks/services/container.py +326 -0
  49. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  50. claude_mpm/hooks/claude_hooks/services/state_manager.py +2 -2
  51. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +2 -2
  52. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  53. claude_mpm/hooks/templates/pre_tool_use_template.py +6 -6
  54. claude_mpm/init.py +21 -14
  55. claude_mpm/mcp/__init__.py +9 -0
  56. claude_mpm/mcp/google_workspace_server.py +610 -0
  57. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  58. claude_mpm/services/command_deployment_service.py +44 -26
  59. claude_mpm/services/hook_installer_service.py +77 -8
  60. claude_mpm/services/mcp_config_manager.py +99 -19
  61. claude_mpm/services/mcp_service_registry.py +294 -0
  62. claude_mpm/services/monitor/server.py +6 -1
  63. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/METADATA +24 -1
  64. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/RECORD +69 -64
  65. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/WHEEL +1 -1
  66. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/entry_points.txt +2 -0
  67. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  68. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  69. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  70. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  71. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  72. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  73. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  74. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  75. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  76. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  77. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  78. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  79. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  80. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/licenses/LICENSE +0 -0
  81. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  82. {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.73.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,294 @@
1
+ """MCP Service Registry for claude-mpm.
2
+
3
+ This module provides a registry of known MCP services with their
4
+ installation, configuration, and runtime requirements.
5
+
6
+ WHY: Centralizes MCP service definitions to enable enable/disable/list
7
+ operations with automatic configuration generation.
8
+ """
9
+
10
+ from dataclasses import dataclass, field
11
+ from enum import Enum
12
+ from typing import ClassVar
13
+
14
+
15
+ class InstallMethod(str, Enum):
16
+ """Installation method for MCP services."""
17
+
18
+ UVX = "uvx"
19
+ PIPX = "pipx"
20
+ NPX = "npx"
21
+ PIP = "pip"
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class MCPServiceDefinition:
26
+ """Definition of an MCP service with all configuration requirements.
27
+
28
+ Attributes:
29
+ name: Unique service identifier (e.g., "kuzu-memory")
30
+ package: PyPI/npm package name for installation
31
+ install_method: How to install (uvx, pipx, npx, pip)
32
+ command: Command to run the service
33
+ args: Default command arguments
34
+ required_env: Environment variables that must be set
35
+ optional_env: Environment variables that may be set
36
+ description: Human-readable description
37
+ env_defaults: Default values for optional env vars
38
+ enabled_by_default: Whether service is enabled by default
39
+ """
40
+
41
+ name: str
42
+ package: str
43
+ install_method: InstallMethod
44
+ command: str
45
+ args: list[str] = field(default_factory=list)
46
+ required_env: list[str] = field(default_factory=list)
47
+ optional_env: list[str] = field(default_factory=list)
48
+ description: str = ""
49
+ env_defaults: dict[str, str] = field(default_factory=dict)
50
+ enabled_by_default: bool = False
51
+ oauth_provider: str | None = None # "google", "microsoft", etc.
52
+ oauth_scopes: list[str] = field(default_factory=list) # OAuth scopes if applicable
53
+
54
+
55
+ class MCPServiceRegistry:
56
+ """Registry of known MCP services.
57
+
58
+ Provides service lookup, configuration generation, and
59
+ enable/disable state management.
60
+ """
61
+
62
+ # Registry of all known MCP services
63
+ SERVICES: ClassVar[dict[str, MCPServiceDefinition]] = {}
64
+
65
+ @classmethod
66
+ def register(cls, service: MCPServiceDefinition) -> None:
67
+ """Register a service definition."""
68
+ cls.SERVICES[service.name] = service
69
+
70
+ @classmethod
71
+ def get(cls, name: str) -> MCPServiceDefinition | None:
72
+ """Get a service definition by name."""
73
+ return cls.SERVICES.get(name)
74
+
75
+ @classmethod
76
+ def list_all(cls) -> list[MCPServiceDefinition]:
77
+ """List all registered services."""
78
+ return list(cls.SERVICES.values())
79
+
80
+ @classmethod
81
+ def list_names(cls) -> list[str]:
82
+ """List all registered service names."""
83
+ return list(cls.SERVICES.keys())
84
+
85
+ @classmethod
86
+ def exists(cls, name: str) -> bool:
87
+ """Check if a service exists in the registry."""
88
+ return name in cls.SERVICES
89
+
90
+ @classmethod
91
+ def get_default_enabled(cls) -> list[MCPServiceDefinition]:
92
+ """Get services that are enabled by default."""
93
+ return [s for s in cls.SERVICES.values() if s.enabled_by_default]
94
+
95
+ @classmethod
96
+ def generate_config(
97
+ cls,
98
+ service: MCPServiceDefinition,
99
+ env_overrides: dict[str, str] | None = None,
100
+ ) -> dict:
101
+ """Generate MCP configuration for a service.
102
+
103
+ Args:
104
+ service: The service definition
105
+ env_overrides: Environment variable overrides
106
+
107
+ Returns:
108
+ Configuration dict suitable for .mcp.json or ~/.claude.json
109
+ """
110
+ env = {}
111
+
112
+ # Add required env vars (must be provided or have defaults)
113
+ for var in service.required_env:
114
+ if env_overrides and var in env_overrides:
115
+ env[var] = env_overrides[var]
116
+ elif var in service.env_defaults:
117
+ env[var] = service.env_defaults[var]
118
+ # If required and not provided, leave it out - caller should validate
119
+
120
+ # Add optional env vars if provided or have defaults
121
+ for var in service.optional_env:
122
+ if env_overrides and var in env_overrides:
123
+ env[var] = env_overrides[var]
124
+ elif var in service.env_defaults:
125
+ env[var] = service.env_defaults[var]
126
+
127
+ config: dict = {
128
+ "command": service.command,
129
+ "args": service.args.copy(),
130
+ }
131
+
132
+ if env:
133
+ config["env"] = env
134
+
135
+ return config
136
+
137
+ @classmethod
138
+ def validate_env(
139
+ cls, service: MCPServiceDefinition, env: dict[str, str]
140
+ ) -> tuple[bool, list[str]]:
141
+ """Validate that all required env vars are provided.
142
+
143
+ Args:
144
+ service: The service definition
145
+ env: Environment variables to validate
146
+
147
+ Returns:
148
+ Tuple of (is_valid, list of missing required vars)
149
+ """
150
+ missing = []
151
+ for var in service.required_env:
152
+ if var not in env and var not in service.env_defaults:
153
+ missing.append(var)
154
+ return len(missing) == 0, missing
155
+
156
+
157
+ # ============================================================================
158
+ # Service Definitions
159
+ # ============================================================================
160
+
161
+ # KuzuMemory - Project memory and context management
162
+ KUZU_MEMORY = MCPServiceDefinition(
163
+ name="kuzu-memory",
164
+ package="kuzu-memory",
165
+ install_method=InstallMethod.UVX,
166
+ command="uvx",
167
+ args=["kuzu-memory"],
168
+ required_env=[],
169
+ optional_env=["KUZU_DB_PATH", "KUZU_LOG_LEVEL"],
170
+ description="Project memory and context management with graph database",
171
+ env_defaults={},
172
+ enabled_by_default=True,
173
+ )
174
+
175
+ # MCP Ticketer - Ticket and project management
176
+ MCP_TICKETER = MCPServiceDefinition(
177
+ name="mcp-ticketer",
178
+ package="mcp-ticketer",
179
+ install_method=InstallMethod.UVX,
180
+ command="uvx",
181
+ args=["mcp-ticketer"],
182
+ required_env=[],
183
+ optional_env=["TICKETER_BACKEND", "GITHUB_TOKEN", "LINEAR_API_KEY"],
184
+ description="Ticket and project management integration",
185
+ env_defaults={},
186
+ enabled_by_default=True,
187
+ )
188
+
189
+ # MCP Vector Search - Code semantic search
190
+ MCP_VECTOR_SEARCH = MCPServiceDefinition(
191
+ name="mcp-vector-search",
192
+ package="mcp-vector-search",
193
+ install_method=InstallMethod.UVX,
194
+ command="uvx",
195
+ args=["mcp-vector-search"],
196
+ required_env=[],
197
+ optional_env=["VECTOR_SEARCH_INDEX_PATH"],
198
+ description="Semantic code search with vector embeddings",
199
+ env_defaults={},
200
+ enabled_by_default=True,
201
+ )
202
+
203
+ # Google Workspace MCP - Google Drive, Docs, Sheets integration
204
+ # Package: https://pypi.org/project/workspace-mcp/
205
+ GOOGLE_WORKSPACE_MCP = MCPServiceDefinition(
206
+ name="workspace-mcp",
207
+ package="workspace-mcp",
208
+ install_method=InstallMethod.UVX,
209
+ command="uvx",
210
+ args=["workspace-mcp", "--tool-tier", "core"],
211
+ required_env=["GOOGLE_OAUTH_CLIENT_ID", "GOOGLE_OAUTH_CLIENT_SECRET"],
212
+ optional_env=[
213
+ "OAUTHLIB_INSECURE_TRANSPORT",
214
+ "USER_GOOGLE_EMAIL",
215
+ "GOOGLE_PSE_API_KEY",
216
+ "GOOGLE_PSE_ENGINE_ID",
217
+ ],
218
+ description="Google Workspace integration (Gmail, Calendar, Drive, Docs, Sheets, Slides)",
219
+ env_defaults={"OAUTHLIB_INSECURE_TRANSPORT": "1"},
220
+ enabled_by_default=False,
221
+ oauth_provider="google",
222
+ oauth_scopes=[
223
+ "openid",
224
+ "email",
225
+ "profile",
226
+ "https://www.googleapis.com/auth/gmail.modify",
227
+ "https://www.googleapis.com/auth/calendar",
228
+ "https://www.googleapis.com/auth/drive",
229
+ "https://www.googleapis.com/auth/documents",
230
+ "https://www.googleapis.com/auth/spreadsheets",
231
+ ],
232
+ )
233
+
234
+ # MCP GitHub - GitHub repository integration (future)
235
+ MCP_GITHUB = MCPServiceDefinition(
236
+ name="mcp-github",
237
+ package="@modelcontextprotocol/server-github",
238
+ install_method=InstallMethod.NPX,
239
+ command="npx",
240
+ args=["-y", "@modelcontextprotocol/server-github"],
241
+ required_env=["GITHUB_PERSONAL_ACCESS_TOKEN"],
242
+ optional_env=[],
243
+ description="GitHub repository integration",
244
+ env_defaults={},
245
+ enabled_by_default=False,
246
+ )
247
+
248
+ # MCP Filesystem - Local filesystem access (future)
249
+ MCP_FILESYSTEM = MCPServiceDefinition(
250
+ name="mcp-filesystem",
251
+ package="@modelcontextprotocol/server-filesystem",
252
+ install_method=InstallMethod.NPX,
253
+ command="npx",
254
+ args=["-y", "@modelcontextprotocol/server-filesystem"],
255
+ required_env=[],
256
+ optional_env=["FILESYSTEM_ROOT_PATH"],
257
+ description="Local filesystem access and management",
258
+ env_defaults={},
259
+ enabled_by_default=False,
260
+ )
261
+
262
+ # MCP Skillset - Skills and knowledge management
263
+ MCP_SKILLSET = MCPServiceDefinition(
264
+ name="mcp-skillset",
265
+ package="mcp-skillset",
266
+ install_method=InstallMethod.UVX,
267
+ command="uvx",
268
+ args=["mcp-skillset"],
269
+ required_env=[],
270
+ optional_env=["SKILLSET_PATH", "SKILLSET_LOG_LEVEL"],
271
+ description="Skills and knowledge management for Claude",
272
+ env_defaults={},
273
+ enabled_by_default=True,
274
+ )
275
+
276
+
277
+ # Register all services
278
+ def _register_builtin_services() -> None:
279
+ """Register all built-in service definitions."""
280
+ services = [
281
+ KUZU_MEMORY,
282
+ MCP_TICKETER,
283
+ MCP_VECTOR_SEARCH,
284
+ GOOGLE_WORKSPACE_MCP,
285
+ MCP_GITHUB,
286
+ MCP_FILESYSTEM,
287
+ MCP_SKILLSET,
288
+ ]
289
+ for service in services:
290
+ MCPServiceRegistry.register(service)
291
+
292
+
293
+ # Auto-register on module import
294
+ _register_builtin_services()
@@ -576,8 +576,13 @@ class UnifiedMonitorServer:
576
576
  event = data.get("event", "claude_event")
577
577
  event_data = data.get("data", {})
578
578
 
579
+ # Extract actual event name from subtype or type within data
580
+ actual_event = (
581
+ event_data.get("subtype") or event_data.get("type") or event
582
+ )
583
+
579
584
  # Categorize event and wrap in expected format
580
- event_type = self._categorize_event(event)
585
+ event_type = self._categorize_event(actual_event)
581
586
  wrapped_event = {
582
587
  "type": event_type,
583
588
  "subtype": event,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 5.6.23
3
+ Version: 5.6.73
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -51,6 +51,10 @@ Requires-Dist: pyee>=13.0.0
51
51
  Requires-Dist: pathspec>=0.11.0
52
52
  Requires-Dist: fastapi>=0.100.0
53
53
  Requires-Dist: uvicorn>=0.20.0
54
+ Requires-Dist: httpx>=0.24.0
55
+ Requires-Dist: keyring>=24.0.0
56
+ Requires-Dist: cryptography>=41.0.0
57
+ Requires-Dist: mcp>=1.0.0
54
58
  Provides-Extra: mcp
55
59
  Requires-Dist: mcp>=0.1.0; extra == "mcp"
56
60
  Requires-Dist: mcp-vector-search>=0.1.0; extra == "mcp"
@@ -255,6 +259,25 @@ ls ~/.claude/agents/ # Should show 47+ agents
255
259
 
256
260
  [→ Learn more: MCP Gateway](docs/developer/13-mcp-gateway/README.md)
257
261
 
262
+ ### 🔐 OAuth & Google Workspace Integration
263
+ - **Browser-Based OAuth** for secure authentication with MCP services
264
+ - **Google Workspace MCP** built-in server for Gmail, Calendar, and Drive
265
+ - **Encrypted Token Storage** using Fernet encryption with system keychain
266
+ - **Automatic Token Refresh** handles expiration seamlessly
267
+
268
+ ```bash
269
+ # Set up Google Workspace OAuth
270
+ claude-mpm oauth setup workspace-mcp
271
+
272
+ # Check token status
273
+ claude-mpm oauth status workspace-mcp
274
+
275
+ # List OAuth-capable services
276
+ claude-mpm oauth list
277
+ ```
278
+
279
+ [→ Learn more: OAuth Setup Guide](docs/guides/oauth-setup.md)
280
+
258
281
  ### ⚡ Performance & Security
259
282
  - **Simplified Architecture** with ~3,700 lines removed for better performance
260
283
  - **Enhanced Security** with comprehensive input validation