claude-mpm 5.6.23__py3-none-any.whl → 5.6.72__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/auth/__init__.py +35 -0
- claude_mpm/auth/callback_server.py +328 -0
- claude_mpm/auth/models.py +104 -0
- claude_mpm/auth/oauth_manager.py +266 -0
- claude_mpm/auth/providers/__init__.py +12 -0
- claude_mpm/auth/providers/base.py +165 -0
- claude_mpm/auth/providers/google.py +261 -0
- claude_mpm/auth/token_storage.py +252 -0
- claude_mpm/cli/commands/commander.py +6 -6
- claude_mpm/cli/commands/mcp.py +29 -17
- claude_mpm/cli/commands/mcp_command_router.py +39 -0
- claude_mpm/cli/commands/mcp_service_commands.py +304 -0
- claude_mpm/cli/commands/oauth.py +481 -0
- claude_mpm/cli/executor.py +9 -0
- claude_mpm/cli/helpers.py +1 -1
- claude_mpm/cli/parsers/base_parser.py +13 -0
- claude_mpm/cli/parsers/mcp_parser.py +79 -0
- claude_mpm/cli/parsers/oauth_parser.py +165 -0
- claude_mpm/cli/startup.py +150 -33
- claude_mpm/cli/startup_display.py +3 -2
- claude_mpm/commander/chat/cli.py +5 -2
- claude_mpm/commander/chat/commands.py +42 -16
- claude_mpm/commander/chat/repl.py +1581 -70
- claude_mpm/commander/events/manager.py +61 -1
- claude_mpm/commander/frameworks/base.py +87 -0
- claude_mpm/commander/frameworks/mpm.py +9 -14
- claude_mpm/commander/git/__init__.py +5 -0
- claude_mpm/commander/git/worktree_manager.py +212 -0
- claude_mpm/commander/instance_manager.py +428 -13
- claude_mpm/commander/models/events.py +6 -0
- claude_mpm/commander/persistence/state_store.py +95 -1
- claude_mpm/commander/tmux_orchestrator.py +3 -2
- claude_mpm/constants.py +5 -0
- claude_mpm/core/hook_manager.py +2 -1
- claude_mpm/core/logging_utils.py +4 -2
- claude_mpm/core/output_style_manager.py +5 -2
- claude_mpm/core/socketio_pool.py +34 -10
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +1 -1
- claude_mpm/hooks/claude_hooks/event_handlers.py +206 -94
- claude_mpm/hooks/claude_hooks/hook_handler.py +115 -32
- claude_mpm/hooks/claude_hooks/installer.py +175 -51
- claude_mpm/hooks/claude_hooks/memory_integration.py +1 -1
- claude_mpm/hooks/claude_hooks/response_tracking.py +1 -1
- claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +2 -2
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +2 -2
- claude_mpm/hooks/claude_hooks/services/container.py +326 -0
- claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +2 -2
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +2 -2
- claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
- claude_mpm/hooks/templates/pre_tool_use_template.py +6 -6
- claude_mpm/init.py +21 -14
- claude_mpm/mcp/__init__.py +9 -0
- claude_mpm/mcp/google_workspace_server.py +610 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/services/command_deployment_service.py +44 -26
- claude_mpm/services/hook_installer_service.py +77 -8
- claude_mpm/services/mcp_config_manager.py +99 -19
- claude_mpm/services/mcp_service_registry.py +294 -0
- claude_mpm/services/monitor/server.py +6 -1
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.dist-info}/METADATA +24 -1
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.dist-info}/RECORD +80 -60
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.dist-info}/WHEEL +1 -1
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.dist-info}/entry_points.txt +2 -0
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.6.23.dist-info → claude_mpm-5.6.72.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(
|
|
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.
|
|
3
|
+
Version: 5.6.72
|
|
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
|