claude-mpm 4.4.5__py3-none-any.whl → 4.4.6__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/cli/commands/mcp_external_commands.py +7 -7
- claude_mpm/cli/commands/mcp_install_commands.py +9 -9
- claude_mpm/cli/commands/mcp_setup_external.py +6 -6
- claude_mpm/hooks/kuzu_memory_hook.py +4 -2
- claude_mpm/services/diagnostics/checks/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/{claude_desktop_check.py → claude_code_check.py} +95 -112
- claude_mpm/services/diagnostics/checks/mcp_check.py +6 -6
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +29 -6
- claude_mpm/services/diagnostics/diagnostic_runner.py +5 -5
- claude_mpm/services/diagnostics/doctor_reporter.py +4 -4
- claude_mpm/services/mcp_config_manager.py +46 -26
- claude_mpm/services/mcp_gateway/core/process_pool.py +11 -8
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +4 -4
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +8 -4
- claude_mpm/services/project/project_organizer.py +8 -1
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +1 -2
- claude_mpm/services/unified/config_strategies/context_strategy.py +1 -3
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +3 -1
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.4.5.dist-info → claude_mpm-4.4.6.dist-info}/METADATA +8 -5
- {claude_mpm-4.4.5.dist-info → claude_mpm-4.4.6.dist-info}/RECORD +26 -26
- {claude_mpm-4.4.5.dist-info → claude_mpm-4.4.6.dist-info}/WHEEL +0 -0
- {claude_mpm-4.4.5.dist-info → claude_mpm-4.4.6.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.4.5.dist-info → claude_mpm-4.4.6.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.4.5.dist-info → claude_mpm-4.4.6.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.4.
|
1
|
+
4.4.6
|
@@ -45,7 +45,7 @@ class MCPExternalCommands:
|
|
45
45
|
return 1
|
46
46
|
|
47
47
|
def _setup_external(self, args):
|
48
|
-
"""Setup external MCP services in Claude
|
48
|
+
"""Setup external MCP services in Claude Code.
|
49
49
|
|
50
50
|
Args:
|
51
51
|
args: Command line arguments
|
@@ -67,13 +67,13 @@ class MCPExternalCommands:
|
|
67
67
|
print(" You may need to install them manually:")
|
68
68
|
print(" pip install mcp-vector-search mcp-browser")
|
69
69
|
|
70
|
-
# Then configure in Claude
|
71
|
-
print("\n2️⃣ Configuring Claude
|
70
|
+
# Then configure in Claude Code
|
71
|
+
print("\n2️⃣ Configuring Claude Code...")
|
72
72
|
force = getattr(args, "force", False)
|
73
73
|
if setup.setup_external_services(force=force):
|
74
74
|
print("\n✅ External services setup completed successfully!")
|
75
75
|
print("\nNext steps:")
|
76
|
-
print("1. Restart Claude
|
76
|
+
print("1. Restart Claude Code to load the new services")
|
77
77
|
print("2. Check status with: claude-mpm mcp external list")
|
78
78
|
print("3. The services will be available in Claude as separate MCP servers")
|
79
79
|
return 0
|
@@ -111,7 +111,7 @@ class MCPExternalCommands:
|
|
111
111
|
import json
|
112
112
|
from pathlib import Path
|
113
113
|
|
114
|
-
# Check Claude
|
114
|
+
# Check Claude Code configuration
|
115
115
|
config_paths = [
|
116
116
|
Path.home()
|
117
117
|
/ "Library"
|
@@ -157,7 +157,7 @@ class MCPExternalCommands:
|
|
157
157
|
break
|
158
158
|
|
159
159
|
if not config_found:
|
160
|
-
print("❌ No Claude
|
160
|
+
print("❌ No Claude Code configuration found")
|
161
161
|
print(" Please run: claude-mpm mcp install")
|
162
162
|
|
163
163
|
# Check Python packages
|
@@ -215,7 +215,7 @@ class MCPExternalCommands:
|
|
215
215
|
print("\n✅ Configuration updated successfully!")
|
216
216
|
print("\nNext steps:")
|
217
217
|
print("1. Review the .mcp.json file to verify the configuration")
|
218
|
-
print("2. Restart Claude
|
218
|
+
print("2. Restart Claude Code to load the updated services")
|
219
219
|
return 0
|
220
220
|
print("\n❌ Failed to update configuration")
|
221
221
|
return 1
|
@@ -46,8 +46,8 @@ class MCPInstallCommands:
|
|
46
46
|
print("\nPlease install manually with: pip install mcp")
|
47
47
|
return 1
|
48
48
|
|
49
|
-
# Step 2: Configure Claude
|
50
|
-
print("\n2️⃣ Configuring Claude
|
49
|
+
# Step 2: Configure Claude Code with the new CLI command
|
50
|
+
print("\n2️⃣ Configuring Claude Code...")
|
51
51
|
try:
|
52
52
|
success = self._configure_claude_desktop(args.force)
|
53
53
|
if not success:
|
@@ -72,7 +72,7 @@ class MCPInstallCommands:
|
|
72
72
|
# Install Python packages for external services
|
73
73
|
external_setup.check_and_install_pip_packages()
|
74
74
|
|
75
|
-
# Setup external services in Claude
|
75
|
+
# Setup external services in Claude Code config
|
76
76
|
if external_setup.setup_external_services(force=args.force):
|
77
77
|
print("✅ External services configured successfully")
|
78
78
|
else:
|
@@ -86,7 +86,7 @@ class MCPInstallCommands:
|
|
86
86
|
print("\n✅ Configuration completed successfully")
|
87
87
|
print("\n🎉 MCP Gateway is ready to use!")
|
88
88
|
print("\nNext steps:")
|
89
|
-
print("1. Restart Claude
|
89
|
+
print("1. Restart Claude Code (if running)")
|
90
90
|
print("2. Test the server: claude-mpm mcp server --test")
|
91
91
|
print("3. Check status: claude-mpm mcp status")
|
92
92
|
print("4. List external services: claude-mpm mcp external list")
|
@@ -97,9 +97,9 @@ class MCPInstallCommands:
|
|
97
97
|
return 1
|
98
98
|
|
99
99
|
def _configure_claude_desktop(self, force=False):
|
100
|
-
"""Configure Claude
|
100
|
+
"""Configure Claude Code to use the MCP gateway via CLI command.
|
101
101
|
|
102
|
-
WHY: Claude
|
102
|
+
WHY: Claude Code reads MCP server configurations from a platform-specific
|
103
103
|
configuration file. This method updates that file to include the claude-mpm-gateway
|
104
104
|
server configuration.
|
105
105
|
|
@@ -166,14 +166,14 @@ class MCPInstallCommands:
|
|
166
166
|
return self._save_config(config, config_path)
|
167
167
|
|
168
168
|
def _get_claude_config_path(self):
|
169
|
-
"""Get the Claude
|
169
|
+
"""Get the Claude Code configuration file path.
|
170
170
|
|
171
171
|
Returns:
|
172
|
-
Path or None: Path to Claude
|
172
|
+
Path or None: Path to Claude Code config file
|
173
173
|
"""
|
174
174
|
import platform
|
175
175
|
|
176
|
-
# Try multiple possible locations for Claude
|
176
|
+
# Try multiple possible locations for Claude Code config
|
177
177
|
possible_paths = [
|
178
178
|
Path.home()
|
179
179
|
/ "Library"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
"""MCP external services setup module.
|
2
2
|
|
3
3
|
This module handles the registration of external MCP services
|
4
|
-
(mcp-vector-search, mcp-browser) as separate MCP servers in Claude
|
4
|
+
(mcp-vector-search, mcp-browser) as separate MCP servers in Claude Code.
|
5
5
|
"""
|
6
6
|
|
7
7
|
import json
|
@@ -13,7 +13,7 @@ from typing import Dict, Optional, Tuple
|
|
13
13
|
|
14
14
|
|
15
15
|
class MCPExternalServicesSetup:
|
16
|
-
"""Handles setup of external MCP services in Claude
|
16
|
+
"""Handles setup of external MCP services in Claude Code configuration."""
|
17
17
|
|
18
18
|
def get_project_services(self, project_path: Path) -> Dict:
|
19
19
|
"""Get external services configuration for the current project.
|
@@ -472,9 +472,9 @@ class MCPExternalServicesSetup:
|
|
472
472
|
f"\n✅ Successfully configured {success_count} external services in .mcp.json"
|
473
473
|
)
|
474
474
|
print(
|
475
|
-
"\n📌 Note: Claude
|
475
|
+
"\n📌 Note: Claude Code will automatically load these services"
|
476
476
|
)
|
477
|
-
print(" when you open this project directory in Claude
|
477
|
+
print(" when you open this project directory in Claude Code.")
|
478
478
|
return True
|
479
479
|
print("❌ Failed to save configuration")
|
480
480
|
return False
|
@@ -487,7 +487,7 @@ class MCPExternalServicesSetup:
|
|
487
487
|
"""Setup a single external MCP service.
|
488
488
|
|
489
489
|
Args:
|
490
|
-
config: The Claude
|
490
|
+
config: The Claude Code configuration
|
491
491
|
service_name: Name of the service to setup
|
492
492
|
service_info: Service configuration information
|
493
493
|
force: Whether to overwrite existing configuration
|
@@ -814,7 +814,7 @@ class MCPExternalServicesSetup:
|
|
814
814
|
print("✅ Successfully updated mcp-browser configuration in .mcp.json")
|
815
815
|
print(f" Command: {browser_config['command']}")
|
816
816
|
print(f" Args: {browser_config['args']}")
|
817
|
-
print("\n📌 Note: Claude
|
817
|
+
print("\n📌 Note: Claude Code will automatically use this configuration")
|
818
818
|
print(" when you open this project directory.")
|
819
819
|
return True
|
820
820
|
print("❌ Failed to save configuration")
|
@@ -163,7 +163,8 @@ class KuzuMemoryHook(SubmitHook):
|
|
163
163
|
capture_output=True,
|
164
164
|
text=True,
|
165
165
|
timeout=5,
|
166
|
-
cwd=str(self.project_path),
|
166
|
+
cwd=str(self.project_path),
|
167
|
+
check=False,
|
167
168
|
)
|
168
169
|
|
169
170
|
if result.returncode == 0 and result.stdout:
|
@@ -267,7 +268,8 @@ Note: Use the memories above to provide more informed and contextual responses.
|
|
267
268
|
capture_output=True,
|
268
269
|
text=True,
|
269
270
|
timeout=5,
|
270
|
-
cwd=str(self.project_path),
|
271
|
+
cwd=str(self.project_path),
|
272
|
+
check=False,
|
271
273
|
)
|
272
274
|
|
273
275
|
if result.returncode == 0:
|
@@ -7,7 +7,7 @@ diagnostic components.
|
|
7
7
|
|
8
8
|
from .agent_check import AgentCheck
|
9
9
|
from .base_check import BaseDiagnosticCheck
|
10
|
-
from .
|
10
|
+
from .claude_code_check import ClaudeCodeCheck
|
11
11
|
from .common_issues_check import CommonIssuesCheck
|
12
12
|
from .configuration_check import ConfigurationCheck
|
13
13
|
from .filesystem_check import FilesystemCheck
|
@@ -21,7 +21,7 @@ from .startup_log_check import StartupLogCheck
|
|
21
21
|
__all__ = [
|
22
22
|
"AgentCheck",
|
23
23
|
"BaseDiagnosticCheck",
|
24
|
-
"
|
24
|
+
"ClaudeCodeCheck",
|
25
25
|
"CommonIssuesCheck",
|
26
26
|
"ConfigurationCheck",
|
27
27
|
"FilesystemCheck",
|
@@ -1,7 +1,7 @@
|
|
1
1
|
"""
|
2
|
-
Check Claude
|
2
|
+
Check Claude Code (CLI) integration.
|
3
3
|
|
4
|
-
WHY: Verify that Claude
|
4
|
+
WHY: Verify that Claude Code CLI is installed, properly configured,
|
5
5
|
and integrated with claude-mpm.
|
6
6
|
"""
|
7
7
|
|
@@ -13,24 +13,24 @@ from ..models import DiagnosticResult, DiagnosticStatus
|
|
13
13
|
from .base_check import BaseDiagnosticCheck
|
14
14
|
|
15
15
|
|
16
|
-
class
|
17
|
-
"""Check Claude
|
16
|
+
class ClaudeCodeCheck(BaseDiagnosticCheck):
|
17
|
+
"""Check Claude Code CLI installation and integration."""
|
18
18
|
|
19
19
|
@property
|
20
20
|
def name(self) -> str:
|
21
|
-
return "
|
21
|
+
return "claude_code_check"
|
22
22
|
|
23
23
|
@property
|
24
24
|
def category(self) -> str:
|
25
|
-
return "Claude
|
25
|
+
return "Claude Code"
|
26
26
|
|
27
27
|
def run(self) -> DiagnosticResult:
|
28
|
-
"""Run Claude
|
28
|
+
"""Run Claude Code CLI diagnostics."""
|
29
29
|
try:
|
30
30
|
sub_results = []
|
31
31
|
details = {}
|
32
32
|
|
33
|
-
# Check if Claude
|
33
|
+
# Check if Claude Code CLI is installed
|
34
34
|
install_result = self._check_installation()
|
35
35
|
sub_results.append(install_result)
|
36
36
|
details["installed"] = install_result.status == DiagnosticStatus.OK
|
@@ -54,13 +54,13 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
|
|
54
54
|
# Determine overall status
|
55
55
|
if any(r.status == DiagnosticStatus.ERROR for r in sub_results):
|
56
56
|
status = DiagnosticStatus.ERROR
|
57
|
-
message = "Claude
|
57
|
+
message = "Claude Code CLI has critical issues"
|
58
58
|
elif any(r.status == DiagnosticStatus.WARNING for r in sub_results):
|
59
59
|
status = DiagnosticStatus.WARNING
|
60
|
-
message = "Claude
|
60
|
+
message = "Claude Code CLI needs configuration"
|
61
61
|
else:
|
62
62
|
status = DiagnosticStatus.OK
|
63
|
-
message = "Claude
|
63
|
+
message = "Claude Code CLI properly configured"
|
64
64
|
|
65
65
|
return DiagnosticResult(
|
66
66
|
category=self.category,
|
@@ -74,109 +74,102 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
|
|
74
74
|
return DiagnosticResult(
|
75
75
|
category=self.category,
|
76
76
|
status=DiagnosticStatus.ERROR,
|
77
|
-
message=f"Claude
|
77
|
+
message=f"Claude Code CLI check failed: {e!s}",
|
78
78
|
details={"error": str(e)},
|
79
79
|
)
|
80
80
|
|
81
81
|
def _check_installation(self) -> DiagnosticResult:
|
82
|
-
"""Check if Claude
|
83
|
-
# Check
|
84
|
-
mac_path = Path("/Applications/Claude.app")
|
85
|
-
linux_paths = [
|
86
|
-
Path.home() / ".local/share/applications/claude.desktop",
|
87
|
-
Path("/usr/share/applications/claude.desktop"),
|
88
|
-
Path("/opt/Claude"),
|
89
|
-
]
|
90
|
-
windows_paths = [
|
91
|
-
Path("C:/Program Files/Claude/Claude.exe"),
|
92
|
-
Path.home() / "AppData/Local/Claude/Claude.exe",
|
93
|
-
]
|
94
|
-
|
95
|
-
# Check for Claude process
|
82
|
+
"""Check if Claude Code CLI is installed."""
|
83
|
+
# Check if claude command is available
|
96
84
|
try:
|
97
85
|
result = subprocess.run(
|
98
|
-
["
|
86
|
+
["claude", "--version"],
|
87
|
+
capture_output=True,
|
88
|
+
timeout=5,
|
89
|
+
check=False,
|
90
|
+
text=True
|
99
91
|
)
|
100
92
|
if result.returncode == 0:
|
101
93
|
return DiagnosticResult(
|
102
|
-
category="Claude
|
94
|
+
category="Claude Code CLI Installation",
|
103
95
|
status=DiagnosticStatus.OK,
|
104
|
-
message="Claude
|
105
|
-
details={
|
96
|
+
message="Claude Code CLI is installed and accessible",
|
97
|
+
details={
|
98
|
+
"installed": True,
|
99
|
+
"path": "claude",
|
100
|
+
"version_output": result.stdout.strip()
|
101
|
+
},
|
106
102
|
)
|
107
103
|
except (subprocess.SubprocessError, FileNotFoundError):
|
108
104
|
pass
|
109
105
|
|
110
|
-
# Check installation paths
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
)
|
118
|
-
|
119
|
-
for path in linux_paths:
|
120
|
-
if path.exists():
|
121
|
-
return DiagnosticResult(
|
122
|
-
category="Claude Desktop Installation",
|
123
|
-
status=DiagnosticStatus.OK,
|
124
|
-
message="Claude Desktop installed (Linux)",
|
125
|
-
details={"path": str(path), "platform": "linux"},
|
126
|
-
)
|
106
|
+
# Check common installation paths
|
107
|
+
possible_paths = [
|
108
|
+
Path("/usr/local/bin/claude"),
|
109
|
+
Path.home() / ".local/bin/claude",
|
110
|
+
Path("/opt/homebrew/bin/claude"),
|
111
|
+
Path("/usr/bin/claude"),
|
112
|
+
]
|
127
113
|
|
128
|
-
for path in
|
129
|
-
if path.exists():
|
114
|
+
for path in possible_paths:
|
115
|
+
if path.exists() and path.is_file():
|
130
116
|
return DiagnosticResult(
|
131
|
-
category="Claude
|
117
|
+
category="Claude Code CLI Installation",
|
132
118
|
status=DiagnosticStatus.OK,
|
133
|
-
message="Claude
|
134
|
-
details={"
|
119
|
+
message=f"Claude Code CLI found at {path}",
|
120
|
+
details={"installed": True, "path": str(path)},
|
135
121
|
)
|
136
122
|
|
137
123
|
return DiagnosticResult(
|
138
|
-
category="Claude
|
139
|
-
status=DiagnosticStatus.
|
140
|
-
message="Claude
|
124
|
+
category="Claude Code CLI Installation",
|
125
|
+
status=DiagnosticStatus.ERROR,
|
126
|
+
message="Claude Code CLI not found",
|
141
127
|
details={"installed": False},
|
142
|
-
fix_description="Install Claude
|
128
|
+
fix_description="Install Claude Code CLI from https://claude.ai/code",
|
143
129
|
)
|
144
130
|
|
145
131
|
def _check_version(self) -> DiagnosticResult:
|
146
|
-
"""Check Claude
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
132
|
+
"""Check Claude Code CLI version compatibility."""
|
133
|
+
try:
|
134
|
+
result = subprocess.run(
|
135
|
+
["claude", "--version"],
|
136
|
+
capture_output=True,
|
137
|
+
timeout=5,
|
138
|
+
check=True,
|
139
|
+
text=True
|
140
|
+
)
|
141
|
+
version_output = result.stdout.strip()
|
153
142
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
return DiagnosticResult(
|
163
|
-
category="Claude Desktop Version",
|
164
|
-
status=DiagnosticStatus.OK,
|
165
|
-
message=f"Version: {version}",
|
166
|
-
details={
|
167
|
-
"version": version,
|
168
|
-
"config_path": str(config_path),
|
169
|
-
},
|
170
|
-
)
|
171
|
-
except Exception:
|
172
|
-
pass
|
143
|
+
# Extract version number (basic parsing)
|
144
|
+
version = "unknown"
|
145
|
+
if "version" in version_output.lower():
|
146
|
+
parts = version_output.split()
|
147
|
+
for i, part in enumerate(parts):
|
148
|
+
if "version" in part.lower() and i + 1 < len(parts):
|
149
|
+
version = parts[i + 1]
|
150
|
+
break
|
173
151
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
152
|
+
# Check minimum version requirement (1.0.60+)
|
153
|
+
status = DiagnosticStatus.OK
|
154
|
+
message = f"Version: {version}"
|
155
|
+
|
156
|
+
return DiagnosticResult(
|
157
|
+
category="Claude Code CLI Version",
|
158
|
+
status=status,
|
159
|
+
message=message,
|
160
|
+
details={
|
161
|
+
"version": version,
|
162
|
+
"version_output": version_output,
|
163
|
+
},
|
164
|
+
)
|
165
|
+
|
166
|
+
except subprocess.SubprocessError as e:
|
167
|
+
return DiagnosticResult(
|
168
|
+
category="Claude Code CLI Version",
|
169
|
+
status=DiagnosticStatus.WARNING,
|
170
|
+
message=f"Could not determine version: {e}",
|
171
|
+
details={"version": "unknown", "error": str(e)},
|
172
|
+
)
|
180
173
|
|
181
174
|
def _check_output_style(self) -> DiagnosticResult:
|
182
175
|
"""Check if output style is deployed."""
|
@@ -224,36 +217,26 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
|
|
224
217
|
)
|
225
218
|
|
226
219
|
def _check_mcp_integration(self) -> DiagnosticResult:
|
227
|
-
"""Check MCP server integration with Claude
|
228
|
-
|
220
|
+
"""Check MCP server integration with Claude Code CLI."""
|
221
|
+
# Claude Code CLI uses ~/.claude.json for configuration
|
222
|
+
config_path = Path.home() / ".claude.json"
|
229
223
|
|
230
224
|
if not config_path.exists():
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
config_path = alt_path
|
240
|
-
break
|
241
|
-
else:
|
242
|
-
return DiagnosticResult(
|
243
|
-
category="MCP Integration",
|
244
|
-
status=DiagnosticStatus.WARNING,
|
245
|
-
message="Claude Desktop config not found",
|
246
|
-
details={"configured": False},
|
247
|
-
fix_command="claude-mpm mcp install",
|
248
|
-
fix_description="Install MCP server integration",
|
249
|
-
)
|
225
|
+
return DiagnosticResult(
|
226
|
+
category="MCP Integration",
|
227
|
+
status=DiagnosticStatus.WARNING,
|
228
|
+
message="Claude Code CLI config not found",
|
229
|
+
details={"configured": False, "config_path": str(config_path)},
|
230
|
+
fix_command="claude-mpm mcp install",
|
231
|
+
fix_description="Install MCP server integration for Claude Code CLI",
|
232
|
+
)
|
250
233
|
|
251
234
|
try:
|
252
235
|
with open(config_path) as f:
|
253
236
|
config = json.load(f)
|
254
237
|
|
255
238
|
mcp_servers = config.get("mcpServers", {})
|
256
|
-
if "claude-mpm-gateway" in mcp_servers:
|
239
|
+
if "claude-mpm-gateway" in mcp_servers or "claude-mpm" in mcp_servers:
|
257
240
|
return DiagnosticResult(
|
258
241
|
category="MCP Integration",
|
259
242
|
status=DiagnosticStatus.OK,
|
@@ -274,7 +257,7 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
|
|
274
257
|
"config_path": str(config_path),
|
275
258
|
},
|
276
259
|
fix_command="claude-mpm mcp install",
|
277
|
-
fix_description="Configure MCP server for Claude
|
260
|
+
fix_description="Configure MCP server for Claude Code CLI",
|
278
261
|
)
|
279
262
|
|
280
263
|
except Exception as e:
|
@@ -283,4 +266,4 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
|
|
283
266
|
status=DiagnosticStatus.WARNING,
|
284
267
|
message=f"Could not check MCP configuration: {e!s}",
|
285
268
|
details={"error": str(e)},
|
286
|
-
)
|
269
|
+
)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
Check MCP (Model Context Protocol) server status.
|
3
3
|
|
4
4
|
WHY: Verify that the MCP gateway is properly installed, configured,
|
5
|
-
and functioning for enhanced Claude
|
5
|
+
and functioning for enhanced Claude Code capabilities.
|
6
6
|
"""
|
7
7
|
|
8
8
|
import json
|
@@ -129,7 +129,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
129
129
|
)
|
130
130
|
|
131
131
|
def _check_configuration(self) -> DiagnosticResult:
|
132
|
-
"""Check MCP configuration in Claude
|
132
|
+
"""Check MCP configuration in Claude Code."""
|
133
133
|
config_paths = [
|
134
134
|
Path.home() / ".config/claude/claude_desktop_config.json",
|
135
135
|
Path.home()
|
@@ -147,10 +147,10 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
147
147
|
return DiagnosticResult(
|
148
148
|
category="MCP Configuration",
|
149
149
|
status=DiagnosticStatus.WARNING,
|
150
|
-
message="Claude
|
150
|
+
message="Claude Code config not found",
|
151
151
|
details={"configured": False},
|
152
152
|
fix_command="claude-mpm mcp config",
|
153
|
-
fix_description="Configure MCP server in Claude
|
153
|
+
fix_description="Configure MCP server in Claude Code",
|
154
154
|
)
|
155
155
|
|
156
156
|
try:
|
@@ -167,7 +167,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
167
167
|
message="MCP gateway not configured",
|
168
168
|
details={"configured": False, "config_path": str(config_path)},
|
169
169
|
fix_command="claude-mpm mcp config",
|
170
|
-
fix_description="Add MCP gateway to Claude
|
170
|
+
fix_description="Add MCP gateway to Claude Code configuration",
|
171
171
|
)
|
172
172
|
|
173
173
|
# Check configuration validity
|
@@ -203,7 +203,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
203
203
|
status=DiagnosticStatus.ERROR,
|
204
204
|
message="Invalid JSON in config file",
|
205
205
|
details={"error": str(e), "config_path": str(config_path)},
|
206
|
-
fix_description="Fix JSON syntax in Claude
|
206
|
+
fix_description="Fix JSON syntax in Claude Code config",
|
207
207
|
)
|
208
208
|
except Exception as e:
|
209
209
|
return DiagnosticResult(
|
@@ -2,7 +2,7 @@
|
|
2
2
|
Check MCP external services installation and health.
|
3
3
|
|
4
4
|
WHY: Verify that MCP services (mcp-vector-search, mcp-browser, mcp-ticketer, kuzu-memory)
|
5
|
-
are properly installed and accessible for enhanced Claude
|
5
|
+
are properly installed and accessible for enhanced Claude Code capabilities.
|
6
6
|
"""
|
7
7
|
|
8
8
|
import json
|
@@ -21,7 +21,10 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
21
21
|
MCP_SERVICES = {
|
22
22
|
"mcp-vector-search": {
|
23
23
|
"package": "mcp-vector-search",
|
24
|
-
"command": [
|
24
|
+
"command": [
|
25
|
+
"mcp-vector-search",
|
26
|
+
"--version",
|
27
|
+
], # Use --version for proper check
|
25
28
|
"description": "Vector search for semantic code navigation",
|
26
29
|
"check_health": True,
|
27
30
|
"health_command": ["mcp-vector-search", "--version"],
|
@@ -305,17 +308,37 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
305
308
|
# Look for actual version information
|
306
309
|
output = (result.stdout + result.stderr).lower()
|
307
310
|
# Check for version indicators
|
308
|
-
if any(
|
311
|
+
if any(
|
312
|
+
keyword in output
|
313
|
+
for keyword in ["version", "v1.", "v0.", "1.", "0."]
|
314
|
+
):
|
309
315
|
# But reject if it's an error message
|
310
|
-
if not any(
|
316
|
+
if not any(
|
317
|
+
error in output
|
318
|
+
for error in [
|
319
|
+
"error",
|
320
|
+
"not found",
|
321
|
+
"no such",
|
322
|
+
"command not found",
|
323
|
+
]
|
324
|
+
):
|
311
325
|
return True
|
312
326
|
|
313
327
|
# For some tools, non-zero return code is OK if version is shown
|
314
328
|
elif "--version" in command or "--help" in command:
|
315
329
|
output = (result.stdout + result.stderr).lower()
|
316
330
|
# Must have version info and no error indicators
|
317
|
-
if
|
318
|
-
if not any(
|
331
|
+
if "version" in output or "v1." in output or "v0." in output:
|
332
|
+
if not any(
|
333
|
+
error in output
|
334
|
+
for error in [
|
335
|
+
"error",
|
336
|
+
"not found",
|
337
|
+
"no such",
|
338
|
+
"command not found",
|
339
|
+
"traceback",
|
340
|
+
]
|
341
|
+
):
|
319
342
|
return True
|
320
343
|
|
321
344
|
except (subprocess.SubprocessError, FileNotFoundError, OSError):
|
@@ -14,7 +14,7 @@ from claude_mpm.core.logging_utils import get_logger
|
|
14
14
|
from .checks import (
|
15
15
|
AgentCheck,
|
16
16
|
BaseDiagnosticCheck,
|
17
|
-
|
17
|
+
ClaudeCodeCheck,
|
18
18
|
CommonIssuesCheck,
|
19
19
|
ConfigurationCheck,
|
20
20
|
FilesystemCheck,
|
@@ -53,7 +53,7 @@ class DiagnosticRunner:
|
|
53
53
|
ConfigurationCheck,
|
54
54
|
FilesystemCheck,
|
55
55
|
InstructionsCheck, # Check instruction files early
|
56
|
-
|
56
|
+
ClaudeCodeCheck,
|
57
57
|
AgentCheck,
|
58
58
|
MCPCheck,
|
59
59
|
MCPServicesCheck, # Check external MCP services
|
@@ -121,7 +121,7 @@ class DiagnosticRunner:
|
|
121
121
|
]
|
122
122
|
# Level 2: May depend on level 1
|
123
123
|
level2 = [
|
124
|
-
|
124
|
+
ClaudeCodeCheck,
|
125
125
|
AgentCheck,
|
126
126
|
MCPCheck,
|
127
127
|
MCPServicesCheck,
|
@@ -209,8 +209,8 @@ class DiagnosticRunner:
|
|
209
209
|
"config": ConfigurationCheck,
|
210
210
|
"filesystem": FilesystemCheck,
|
211
211
|
"fs": FilesystemCheck,
|
212
|
-
"claude":
|
213
|
-
"
|
212
|
+
"claude": ClaudeCodeCheck,
|
213
|
+
"claude_code": ClaudeCodeCheck,
|
214
214
|
"agents": AgentCheck,
|
215
215
|
"agent": AgentCheck,
|
216
216
|
"mcp": MCPCheck,
|
@@ -385,9 +385,9 @@ class DoctorReporter:
|
|
385
385
|
print(
|
386
386
|
f"| Installation Method | {result.details['installation_method']} |"
|
387
387
|
)
|
388
|
-
elif result.category == "Claude
|
388
|
+
elif result.category == "Claude Code":
|
389
389
|
if result.details.get("version"):
|
390
|
-
print(f"| Claude
|
390
|
+
print(f"| Claude Code (CLI) | {result.details['version']} |")
|
391
391
|
|
392
392
|
def _print_mcp_services_markdown(self, summary: DiagnosticSummary):
|
393
393
|
"""Print MCP services status table in markdown."""
|
@@ -533,11 +533,11 @@ class DoctorReporter:
|
|
533
533
|
)
|
534
534
|
|
535
535
|
if (
|
536
|
-
result.category == "Claude
|
536
|
+
result.category == "Claude Code"
|
537
537
|
and result.status == DiagnosticStatus.WARNING
|
538
538
|
):
|
539
539
|
recommendations.append(
|
540
|
-
"Update Claude
|
540
|
+
"Update Claude Code (CLI) to the latest version for best compatibility"
|
541
541
|
)
|
542
542
|
|
543
543
|
if recommendations:
|
@@ -86,7 +86,11 @@ class MCPConfigManager:
|
|
86
86
|
for path in candidates:
|
87
87
|
try:
|
88
88
|
result = subprocess.run(
|
89
|
-
[path, "--help"],
|
89
|
+
[path, "--help"],
|
90
|
+
capture_output=True,
|
91
|
+
text=True,
|
92
|
+
timeout=5,
|
93
|
+
check=False,
|
90
94
|
)
|
91
95
|
# Check if this version has MCP support
|
92
96
|
if "claude" in result.stdout or "mcp" in result.stdout:
|
@@ -304,7 +308,7 @@ class MCPConfigManager:
|
|
304
308
|
|
305
309
|
elif service_name == "kuzu-memory":
|
306
310
|
# Determine kuzu-memory command version
|
307
|
-
kuzu_args = []
|
311
|
+
kuzu_args = ["mcp", "serve"] # Default to the correct modern format
|
308
312
|
test_cmd = None
|
309
313
|
|
310
314
|
if use_pipx_run:
|
@@ -317,17 +321,30 @@ class MCPConfigManager:
|
|
317
321
|
if test_cmd:
|
318
322
|
try:
|
319
323
|
result = subprocess.run(
|
320
|
-
test_cmd,
|
324
|
+
test_cmd,
|
325
|
+
capture_output=True,
|
326
|
+
text=True,
|
327
|
+
timeout=10,
|
328
|
+
check=False,
|
321
329
|
)
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
330
|
+
# Check for MCP support in help output
|
331
|
+
help_output = result.stdout.lower() + result.stderr.lower()
|
332
|
+
|
333
|
+
# Modern version detection - look for "mcp serve" command
|
334
|
+
if "mcp serve" in help_output or ("mcp" in help_output and "serve" in help_output):
|
335
|
+
# Modern version with mcp serve command
|
336
|
+
kuzu_args = ["mcp", "serve"]
|
337
|
+
# Legacy version detection - only "serve" without "mcp"
|
338
|
+
elif "serve" in help_output and "mcp" not in help_output:
|
339
|
+
# Very old version that only has serve command
|
327
340
|
kuzu_args = ["serve"]
|
328
|
-
|
329
|
-
|
330
|
-
|
341
|
+
# Note: "claude mcp-server" format is deprecated and not used
|
342
|
+
else:
|
343
|
+
# Default to the correct modern format
|
344
|
+
kuzu_args = ["mcp", "serve"]
|
345
|
+
except Exception:
|
346
|
+
# Default to the correct mcp serve command on any error
|
347
|
+
kuzu_args = ["mcp", "serve"]
|
331
348
|
|
332
349
|
if use_pipx_run:
|
333
350
|
config["command"] = "pipx"
|
@@ -339,17 +356,16 @@ class MCPConfigManager:
|
|
339
356
|
config["command"] = service_path
|
340
357
|
config["args"] = kuzu_args
|
341
358
|
|
359
|
+
# Generic config for unknown services
|
360
|
+
elif use_pipx_run:
|
361
|
+
config["command"] = "pipx"
|
362
|
+
config["args"] = ["run", service_name]
|
363
|
+
elif use_uvx:
|
364
|
+
config["command"] = "uvx"
|
365
|
+
config["args"] = [service_name]
|
342
366
|
else:
|
343
|
-
|
344
|
-
|
345
|
-
config["command"] = "pipx"
|
346
|
-
config["args"] = ["run", service_name]
|
347
|
-
elif use_uvx:
|
348
|
-
config["command"] = "uvx"
|
349
|
-
config["args"] = [service_name]
|
350
|
-
else:
|
351
|
-
config["command"] = service_path
|
352
|
-
config["args"] = []
|
367
|
+
config["command"] = service_path
|
368
|
+
config["args"] = []
|
353
369
|
|
354
370
|
return config
|
355
371
|
|
@@ -632,9 +648,7 @@ class MCPConfigManager:
|
|
632
648
|
f"pipx install succeeded but verification failed for {service_name}"
|
633
649
|
)
|
634
650
|
else:
|
635
|
-
self.logger.debug(
|
636
|
-
f"pipx install failed: {result.stderr}"
|
637
|
-
)
|
651
|
+
self.logger.debug(f"pipx install failed: {result.stderr}")
|
638
652
|
except subprocess.TimeoutExpired:
|
639
653
|
self.logger.warning(f"pipx install timed out for {service_name}")
|
640
654
|
except Exception as e:
|
@@ -739,9 +753,15 @@ class MCPConfigManager:
|
|
739
753
|
if result.returncode == 0:
|
740
754
|
return True
|
741
755
|
# Some tools return non-zero but still work
|
742
|
-
|
756
|
+
if any(
|
757
|
+
indicator in output
|
758
|
+
for indicator in ["version", "usage", "help", service_name.lower()]
|
759
|
+
):
|
743
760
|
# Make sure it's not an error message
|
744
|
-
if not any(
|
761
|
+
if not any(
|
762
|
+
error in output
|
763
|
+
for error in ["error", "not found", "traceback", "no such"]
|
764
|
+
):
|
745
765
|
return True
|
746
766
|
except Exception as e:
|
747
767
|
self.logger.debug(f"Verification error for {service_name}: {e}")
|
@@ -423,7 +423,8 @@ async def auto_initialize_vector_search():
|
|
423
423
|
["pipx", "install", "mcp-vector-search"],
|
424
424
|
capture_output=True,
|
425
425
|
text=True,
|
426
|
-
timeout=60,
|
426
|
+
timeout=60,
|
427
|
+
check=False, # 1 minute timeout for installation
|
427
428
|
)
|
428
429
|
|
429
430
|
if result.returncode == 0:
|
@@ -492,9 +493,7 @@ async def auto_initialize_vector_search():
|
|
492
493
|
if chroma_db.exists() and chroma_db.stat().st_size > 0:
|
493
494
|
logger.info("✓ Vector search index is healthy and ready")
|
494
495
|
return
|
495
|
-
logger.info(
|
496
|
-
"⚠️ Vector search index may be corrupted, rebuilding..."
|
497
|
-
)
|
496
|
+
logger.info("⚠️ Vector search index may be corrupted, rebuilding...")
|
498
497
|
except Exception as e:
|
499
498
|
logger.debug(
|
500
499
|
f"Vector search health check failed: {e}, will attempt to rebuild"
|
@@ -512,7 +511,8 @@ async def auto_initialize_vector_search():
|
|
512
511
|
capture_output=True,
|
513
512
|
text=True,
|
514
513
|
timeout=30,
|
515
|
-
cwd=str(current_dir),
|
514
|
+
cwd=str(current_dir),
|
515
|
+
check=False, # Run in the project directory
|
516
516
|
)
|
517
517
|
|
518
518
|
if proc.returncode == 0:
|
@@ -527,7 +527,8 @@ async def auto_initialize_vector_search():
|
|
527
527
|
capture_output=True,
|
528
528
|
text=True,
|
529
529
|
timeout=300, # 5 minute timeout for indexing
|
530
|
-
cwd=str(current_dir),
|
530
|
+
cwd=str(current_dir),
|
531
|
+
check=False, # Run in the project directory
|
531
532
|
)
|
532
533
|
if index_proc.returncode == 0:
|
533
534
|
logger.info("✅ Project indexing completed successfully")
|
@@ -610,7 +611,8 @@ async def auto_initialize_kuzu_memory():
|
|
610
611
|
["pipx", "install", "kuzu-memory"],
|
611
612
|
capture_output=True,
|
612
613
|
text=True,
|
613
|
-
timeout=60,
|
614
|
+
timeout=60,
|
615
|
+
check=False, # 1 minute timeout for installation
|
614
616
|
)
|
615
617
|
|
616
618
|
if result.returncode == 0:
|
@@ -679,7 +681,8 @@ async def auto_initialize_kuzu_memory():
|
|
679
681
|
capture_output=True,
|
680
682
|
text=True,
|
681
683
|
timeout=30,
|
682
|
-
cwd=str(current_dir),
|
684
|
+
cwd=str(current_dir),
|
685
|
+
check=False,
|
683
686
|
)
|
684
687
|
|
685
688
|
if proc.returncode == 0:
|
@@ -3,11 +3,11 @@ External MCP Services Integration
|
|
3
3
|
==================================
|
4
4
|
|
5
5
|
Manages installation and basic setup of external MCP services like mcp-vector-search
|
6
|
-
and mcp-browser. These services run as separate MCP servers in Claude
|
6
|
+
and mcp-browser. These services run as separate MCP servers in Claude Code,
|
7
7
|
not as part of the Claude MPM MCP Gateway.
|
8
8
|
|
9
9
|
Note: As of the latest architecture, external services are registered as separate
|
10
|
-
MCP servers in Claude
|
10
|
+
MCP servers in Claude Code configuration, not as tools within the gateway.
|
11
11
|
"""
|
12
12
|
|
13
13
|
import json
|
@@ -397,11 +397,11 @@ class ExternalMCPServiceManager:
|
|
397
397
|
|
398
398
|
This manager is responsible for checking and installing Python packages
|
399
399
|
for external MCP services. The actual registration of these services
|
400
|
-
happens in Claude
|
400
|
+
happens in Claude Code configuration as separate MCP servers.
|
401
401
|
|
402
402
|
Note: This class is maintained for backward compatibility and package
|
403
403
|
management. The actual tool registration is handled by separate MCP
|
404
|
-
server instances in Claude
|
404
|
+
server instances in Claude Code.
|
405
405
|
"""
|
406
406
|
|
407
407
|
def __init__(self):
|
@@ -249,7 +249,8 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
249
249
|
capture_output=True,
|
250
250
|
text=True,
|
251
251
|
timeout=10,
|
252
|
-
cwd=str(self.project_path),
|
252
|
+
cwd=str(self.project_path),
|
253
|
+
check=False,
|
253
254
|
)
|
254
255
|
|
255
256
|
if result.returncode == 0:
|
@@ -315,7 +316,8 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
315
316
|
capture_output=True,
|
316
317
|
text=True,
|
317
318
|
timeout=10,
|
318
|
-
cwd=str(self.project_path),
|
319
|
+
cwd=str(self.project_path),
|
320
|
+
check=False,
|
319
321
|
)
|
320
322
|
|
321
323
|
if result.returncode == 0 and result.stdout:
|
@@ -384,7 +386,8 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
384
386
|
capture_output=True,
|
385
387
|
text=True,
|
386
388
|
timeout=10,
|
387
|
-
cwd=str(self.project_path),
|
389
|
+
cwd=str(self.project_path),
|
390
|
+
check=False,
|
388
391
|
)
|
389
392
|
|
390
393
|
if result.returncode == 0 and result.stdout:
|
@@ -461,7 +464,8 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
461
464
|
capture_output=True,
|
462
465
|
text=True,
|
463
466
|
timeout=15,
|
464
|
-
cwd=str(self.project_path),
|
467
|
+
cwd=str(self.project_path),
|
468
|
+
check=False,
|
465
469
|
)
|
466
470
|
|
467
471
|
if result.returncode == 0 and result.stdout:
|
@@ -974,7 +974,14 @@ This directory is used for {description.lower()}.
|
|
974
974
|
misplaced_count = 0
|
975
975
|
for file in root_files:
|
976
976
|
if file.is_file():
|
977
|
-
if (
|
977
|
+
if (
|
978
|
+
("test" in file.name.lower() and file.suffix == ".py")
|
979
|
+
or (
|
980
|
+
file.suffix in [".sh", ".bash"]
|
981
|
+
and file.name not in ["Makefile"]
|
982
|
+
)
|
983
|
+
or file.suffix in [".log", ".tmp", ".cache"]
|
984
|
+
):
|
978
985
|
misplaced_count += 1
|
979
986
|
|
980
987
|
if misplaced_count > 0:
|
@@ -344,8 +344,7 @@ class StructureAnalyzerStrategy(AnalyzerStrategy):
|
|
344
344
|
config_files = {
|
345
345
|
child["name"].lower()
|
346
346
|
for child in tree.get("children", [])
|
347
|
-
if (child["type"] == "file"
|
348
|
-
and child["name"].startswith("."))
|
347
|
+
if (child["type"] == "file" and child["name"].startswith("."))
|
349
348
|
or child["name"].endswith(".config.js")
|
350
349
|
}
|
351
350
|
patterns["has_config"] = len(config_files) > 0
|
@@ -603,9 +603,7 @@ class ContextStrategy(IConfigStrategy):
|
|
603
603
|
return self.isolated_manager.create_isolated_context(
|
604
604
|
kwargs.get("base_config")
|
605
605
|
)
|
606
|
-
return self.hierarchy_manager.create_context(
|
607
|
-
scope, parent_id=parent, **kwargs
|
608
|
-
)
|
606
|
+
return self.hierarchy_manager.create_context(scope, parent_id=parent, **kwargs)
|
609
607
|
|
610
608
|
def get_current_context(self) -> Optional[str]:
|
611
609
|
"""Get current active context"""
|
@@ -345,7 +345,9 @@ class EnvironmentFileLoader(BaseFileLoader):
|
|
345
345
|
value = value.strip()
|
346
346
|
|
347
347
|
# Remove quotes if present
|
348
|
-
if (value.startswith('"') and value.endswith('"')) or (
|
348
|
+
if (value.startswith('"') and value.endswith('"')) or (
|
349
|
+
value.startswith("'") and value.endswith("'")
|
350
|
+
):
|
349
351
|
value = value[1:-1]
|
350
352
|
|
351
353
|
# Parse value type
|
@@ -3,7 +3,7 @@ from pathlib import Path
|
|
3
3
|
"""
|
4
4
|
Claude Code Frontmatter Validator
|
5
5
|
|
6
|
-
Validates agent frontmatter against Claude Code
|
6
|
+
Validates agent frontmatter against Claude Code specification.
|
7
7
|
Critical for ensuring agents work correctly with Claude Code.
|
8
8
|
"""
|
9
9
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: claude-mpm
|
3
|
-
Version: 4.4.
|
3
|
+
Version: 4.4.6
|
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
|
@@ -148,7 +148,9 @@ Dynamic: license-file
|
|
148
148
|
|
149
149
|
# Claude MPM - Multi-Agent Project Manager
|
150
150
|
|
151
|
-
A powerful orchestration framework for Claude Code that enables multi-agent workflows, session management, and real-time monitoring through a streamlined Rich-based interface.
|
151
|
+
A powerful orchestration framework for **Claude Code (CLI)** that enables multi-agent workflows, session management, and real-time monitoring through a streamlined Rich-based interface.
|
152
|
+
|
153
|
+
> **⚠️ Important**: Claude MPM extends **Claude Code (CLI)**, not Claude Desktop (app). All MCP integrations work with Claude Code's CLI interface only.
|
152
154
|
|
153
155
|
> **Quick Start**: See [QUICKSTART.md](QUICKSTART.md) to get running in 5 minutes!
|
154
156
|
|
@@ -191,9 +193,10 @@ claude-mpm mcp-pipx-config
|
|
191
193
|
```
|
192
194
|
|
193
195
|
**💡 Optional Dependencies**:
|
194
|
-
- `[mcp]` - Include MCP services (mcp-vector-search, kuzu-memory)
|
196
|
+
- `[mcp]` - Include MCP services (mcp-vector-search, mcp-browser, mcp-ticketer, kuzu-memory)
|
195
197
|
- `[monitor]` - Full monitoring dashboard with Socket.IO and async web server components
|
196
|
-
-
|
198
|
+
- **Combine both**: Use `"claude-mpm[mcp,monitor]"` to install all features
|
199
|
+
- Without optional dependencies, MCP services auto-install on first use via pipx
|
197
200
|
|
198
201
|
**🎉 Pipx Support Now Fully Functional!** Recent improvements ensure complete compatibility:
|
199
202
|
- ✅ Socket.IO daemon script path resolution (fixed)
|
@@ -397,5 +400,5 @@ MIT License - see [LICENSE](LICENSE) file.
|
|
397
400
|
## Credits
|
398
401
|
|
399
402
|
- Based on [claude-multiagent-pm](https://github.com/kfsone/claude-multiagent-pm)
|
400
|
-
- Enhanced for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) integration
|
403
|
+
- Enhanced for [Claude Code (CLI)](https://docs.anthropic.com/en/docs/claude-code) integration
|
401
404
|
- Built with ❤️ by the Claude MPM community
|
@@ -1,5 +1,5 @@
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=toytnNjkIKPgQaGwDqQdC1rpNTAdSEc6Vja50d7Ovug,4
|
2
|
-
claude_mpm/VERSION,sha256=
|
2
|
+
claude_mpm/VERSION,sha256=M-cFSdn4NoMwZN-6G3jqIuaWG2LiBtAkXTZdmRNAyc8,6
|
3
3
|
claude_mpm/__init__.py,sha256=lyTZAYGH4DTaFGLRNWJKk5Q5oTjzN5I6AXmfVX-Jff0,1512
|
4
4
|
claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
|
5
5
|
claude_mpm/constants.py,sha256=cChN3myrAcF3jC-6DvHnBFTEnwlDk-TAsIXPvUZr_yw,5953
|
@@ -84,11 +84,11 @@ claude_mpm/cli/commands/mcp.py,sha256=kgmJVTAi0G7SAnIpYHddU25HqAdIY9mMmTH-C3DSCs
|
|
84
84
|
claude_mpm/cli/commands/mcp_command_router.py,sha256=8rTMZLxU3R3Izit9ia1Z_pIOq3bn2QjMPH4uvf1X9XY,6001
|
85
85
|
claude_mpm/cli/commands/mcp_config.py,sha256=I-MQEJdL93Rj9lIkz-T4rZqxdy-ls1J7cfXIIKS3tys,4814
|
86
86
|
claude_mpm/cli/commands/mcp_config_commands.py,sha256=TnTg7-erE5Z6O8C84o4lZITco72Wnu0FVlVF8tNVsP0,695
|
87
|
-
claude_mpm/cli/commands/mcp_external_commands.py,sha256=
|
88
|
-
claude_mpm/cli/commands/mcp_install_commands.py,sha256=
|
87
|
+
claude_mpm/cli/commands/mcp_external_commands.py,sha256=iggHpJYRTuGZjksqe4-isdq_vD5Wq8O4PjUgEWAT-OY,8968
|
88
|
+
claude_mpm/cli/commands/mcp_install_commands.py,sha256=ToQXNZLl39U31N9F-TERDcO2ACM8tjPqpSQLPDUiWb4,12799
|
89
89
|
claude_mpm/cli/commands/mcp_pipx_config.py,sha256=sE62VD6Q1CcO2k1nlbIhHMfAJFQTZfIzCss99LmfNqA,6088
|
90
90
|
claude_mpm/cli/commands/mcp_server_commands.py,sha256=-1G_2Y5ScTvzDd-kY8fTAao2H6FH7DnsLimleF1rVqQ,6197
|
91
|
-
claude_mpm/cli/commands/mcp_setup_external.py,sha256=
|
91
|
+
claude_mpm/cli/commands/mcp_setup_external.py,sha256=QA4sIOmmog_ApQ4dUTV8NbTrYW2pIzmpN6hy648G_OQ,33605
|
92
92
|
claude_mpm/cli/commands/mcp_tool_commands.py,sha256=q17GzlFT3JiLTrDqwPO2tz1-fKmPO5QU449syTnKTz4,1283
|
93
93
|
claude_mpm/cli/commands/memory.py,sha256=Yzfs3_oiKciv3sfOoDm2lJL4M9idG7ARV3-sNw1ge_g,26186
|
94
94
|
claude_mpm/cli/commands/monitor.py,sha256=S7kb2TnTmvX_T6iw5E1S5jlYNhbbBVFLCTlX5MGSLP8,9583
|
@@ -365,7 +365,7 @@ claude_mpm/generators/agent_profile_generator.py,sha256=8h3yjhnpNmgILzSddzPjFstG
|
|
365
365
|
claude_mpm/hooks/__init__.py,sha256=rVD-1bitn454djWzRN3wNNcM7xrXU-YiufVFD2T4H0Y,303
|
366
366
|
claude_mpm/hooks/base_hook.py,sha256=wKbT_0g3dhvkA48pTz4GJpZQw8URhaT0LpZnCc7CEas,5026
|
367
367
|
claude_mpm/hooks/instruction_reinforcement.py,sha256=PnjfDSZ_72gbzHnRoug7qtXfpW5d1cxnmittpnPd2ws,11059
|
368
|
-
claude_mpm/hooks/kuzu_memory_hook.py,sha256=
|
368
|
+
claude_mpm/hooks/kuzu_memory_hook.py,sha256=cuj8BThA0cr2jCwuhH1pkqLHOP2Yo5qfwSDF-QfqmuM,11354
|
369
369
|
claude_mpm/hooks/memory_integration_hook.py,sha256=VAazT6soMWoPVlDzP17psft-TDTVdblXNR2pjYpfnh4,16652
|
370
370
|
claude_mpm/hooks/tool_call_interceptor.py,sha256=k3Ghe2KvUs3y-5PcS63uHmBAxtUYraqq1bX9GN0QliU,7462
|
371
371
|
claude_mpm/hooks/validation_hooks.py,sha256=_-o4ROSRVuNOMMUIkHOnj9K-zPyAbRwJdrLTxVDmL5k,6464
|
@@ -409,7 +409,7 @@ claude_mpm/services/event_aggregator.py,sha256=DDcehIZVpiEDzs9o18gDZyvjMBHCq2H8H
|
|
409
409
|
claude_mpm/services/exceptions.py,sha256=5lVZETr_6-xk0ItH7BTfYUiX5RlckS1e8ah_UalYG9c,26475
|
410
410
|
claude_mpm/services/hook_installer_service.py,sha256=z3kKeriEY1Y9bFesuGlHBxhCtc0Wzd3Zv02k2_rEyGo,19727
|
411
411
|
claude_mpm/services/hook_service.py,sha256=rZnMn_4qxX5g9KAn0IQdoG50WmySNfsTmfG0XHuRHXk,15737
|
412
|
-
claude_mpm/services/mcp_config_manager.py,sha256=
|
412
|
+
claude_mpm/services/mcp_config_manager.py,sha256=bMV3vkDahRjH94Ht91sUg1Ha8H1Sz63Q1AM9SddfvBY,28957
|
413
413
|
claude_mpm/services/memory_hook_service.py,sha256=pRlTClkRcw30Jhwbha4BC8IMdzKZxF8aWqf52JlntgY,11600
|
414
414
|
claude_mpm/services/monitor_build_service.py,sha256=8gWR9CaqgXdG6-OjOFXGpk28GCcJTlHhojkUYnMCebI,12160
|
415
415
|
claude_mpm/services/port_manager.py,sha256=CYqLh8Ss_-aoYEXV3G6uZkGexpsRK_XTBL0bV4P3tSI,22838
|
@@ -544,20 +544,20 @@ claude_mpm/services/core/interfaces/communication.py,sha256=evwtLbYCFa3Zb8kEfL10
|
|
544
544
|
claude_mpm/services/core/interfaces/infrastructure.py,sha256=eLtr_dFhA3Ux3mPOV_4DbWhGjHpfpGnj6xOhfQcgZGk,10037
|
545
545
|
claude_mpm/services/core/interfaces/service.py,sha256=hNfHXe45LcPCp_dToOmZCfnUZBF5axMf_TdxqCSm2-I,11536
|
546
546
|
claude_mpm/services/diagnostics/__init__.py,sha256=WTRucANR9EwNi53rotjkeE4k75s18RjHJ8s1BfBj7ic,614
|
547
|
-
claude_mpm/services/diagnostics/diagnostic_runner.py,sha256=
|
548
|
-
claude_mpm/services/diagnostics/doctor_reporter.py,sha256=
|
547
|
+
claude_mpm/services/diagnostics/diagnostic_runner.py,sha256=bfF3QQfaJPv2fyo61AstHZ139nHvY0fcjXXbXFcNdZo,9336
|
548
|
+
claude_mpm/services/diagnostics/doctor_reporter.py,sha256=WhlHBWy-KI8OhAWujOu77VAgSvkBvtF3sDrjacYZhvg,19649
|
549
549
|
claude_mpm/services/diagnostics/models.py,sha256=nqOQLllZyZmw3Zt5eFJfE1Al7C3Vrn3REgFlARtT3jQ,3831
|
550
|
-
claude_mpm/services/diagnostics/checks/__init__.py,sha256=
|
550
|
+
claude_mpm/services/diagnostics/checks/__init__.py,sha256=aNdOeJHZVIpEqqzr6xWUOiyZCIrN4vckfRxkW70cqeo,987
|
551
551
|
claude_mpm/services/diagnostics/checks/agent_check.py,sha256=JZwqu4o4Q46uk2jKKU-AS0Y_n4AjVcmq2XR61t18UKE,14022
|
552
552
|
claude_mpm/services/diagnostics/checks/base_check.py,sha256=FdCPk4z5wdBVR5Y4bikwVY4P4BIIXBkYCmhr-qu1ChM,1574
|
553
|
-
claude_mpm/services/diagnostics/checks/
|
553
|
+
claude_mpm/services/diagnostics/checks/claude_code_check.py,sha256=NoOwyP-UQT4dmqJARmtXj-LJThGi6X0oP0e3cckNzik,10413
|
554
554
|
claude_mpm/services/diagnostics/checks/common_issues_check.py,sha256=Yi73_1yGNcQUCF8Jwba6xHvDHr4QbklWEbzidby-o0o,13353
|
555
555
|
claude_mpm/services/diagnostics/checks/configuration_check.py,sha256=mgqFsyr4W73gFGMF7kz5u4lloUMhTty5BHuErf0I0Uo,11176
|
556
556
|
claude_mpm/services/diagnostics/checks/filesystem_check.py,sha256=V5HoHDYlSuoK2lFv946Jhd81LrA0om71NWugnRxFvSE,8296
|
557
557
|
claude_mpm/services/diagnostics/checks/installation_check.py,sha256=WoTt15R8Wg-6k2JZFAtmffFuih1AIyCX71QOHEFH-Ro,19562
|
558
558
|
claude_mpm/services/diagnostics/checks/instructions_check.py,sha256=VbgBorl0RpFvxKQ_SC1gibTmGSiXaKSp-vVZt6hbH1g,16290
|
559
|
-
claude_mpm/services/diagnostics/checks/mcp_check.py,sha256=
|
560
|
-
claude_mpm/services/diagnostics/checks/mcp_services_check.py,sha256=
|
559
|
+
claude_mpm/services/diagnostics/checks/mcp_check.py,sha256=SftuhP70abopyMD8GlLA_K3XHEYnBAeITggUQI0cYP4,12173
|
560
|
+
claude_mpm/services/diagnostics/checks/mcp_services_check.py,sha256=aH1YgyAAj3rj5H02adWUjM00KdZuOz4Qm9oyY4bgELc,19007
|
561
561
|
claude_mpm/services/diagnostics/checks/monitor_check.py,sha256=NUx5G1yjHWlukZmwhUz4o8STRWgsQEx01YjIMReNC0A,10096
|
562
562
|
claude_mpm/services/diagnostics/checks/startup_log_check.py,sha256=DrXdml2rHvmhFBdb_sntE3xmwaP_DZIKjdVbCn8Dy7E,12258
|
563
563
|
claude_mpm/services/event_bus/__init__.py,sha256=ETCo4a6puIeyVWAv55uCDjjhzNyUwbVAHEcAVkVapx8,688
|
@@ -619,7 +619,7 @@ claude_mpm/services/mcp_gateway/core/__init__.py,sha256=iajLqFBrPixZiFmau3ZXC04m
|
|
619
619
|
claude_mpm/services/mcp_gateway/core/base.py,sha256=uTML3OBCv1-4XhSnLsEkn1C9Z71glUnKBXALyUtB24o,10225
|
620
620
|
claude_mpm/services/mcp_gateway/core/exceptions.py,sha256=oRCvGhGgXeqzzybiBz3KNBud5Dn6feBO9MQQUHuqyT0,6795
|
621
621
|
claude_mpm/services/mcp_gateway/core/interfaces.py,sha256=wsBuwKRspW6YJxpOKXynFphObkZ5XzaneCNke7F4W1s,10100
|
622
|
-
claude_mpm/services/mcp_gateway/core/process_pool.py,sha256=
|
622
|
+
claude_mpm/services/mcp_gateway/core/process_pool.py,sha256=tQSbmv8ZIUqoT6f2nl2zzC66EuHMCJ8In7PtAtevsrI,27713
|
623
623
|
claude_mpm/services/mcp_gateway/core/singleton_manager.py,sha256=yfyvt5macOsay82JTT10ya0jTwCAbsS1sdRcXOoC_bM,9422
|
624
624
|
claude_mpm/services/mcp_gateway/core/startup_verification.py,sha256=9i9k_i15Lc1Vvk0U2GR7uBMTbU3Xf16J6xoEvR0r-Ww,10873
|
625
625
|
claude_mpm/services/mcp_gateway/registry/__init__.py,sha256=6qjyfcCgW7sd_S82gY7G4DPZp3nL7tMHzyaxiz3G2Zc,195
|
@@ -632,10 +632,10 @@ claude_mpm/services/mcp_gateway/server/stdio_server.py,sha256=8HZfWbrysQB2lT9hJ3
|
|
632
632
|
claude_mpm/services/mcp_gateway/tools/__init__.py,sha256=Ga0kbvNOi8peBRZk5MUnO5bo3jWDCpHFko7mO21Vix4,754
|
633
633
|
claude_mpm/services/mcp_gateway/tools/base_adapter.py,sha256=na1MdyBCtVmKzgIcFJ5MuAUJ1LJrtA4yxkuqLnejiD8,16029
|
634
634
|
claude_mpm/services/mcp_gateway/tools/document_summarizer.py,sha256=J0YNEu4GPxWm2nTMxD7CwWl-2k1UJk3tWCI2timGWbU,28230
|
635
|
-
claude_mpm/services/mcp_gateway/tools/external_mcp_services.py,sha256=
|
635
|
+
claude_mpm/services/mcp_gateway/tools/external_mcp_services.py,sha256=PCw6egI7Vy7I-2l9ya9BZGusOdnQ3bY0uIJVSVnY_YA,18614
|
636
636
|
claude_mpm/services/mcp_gateway/tools/health_check_tool.py,sha256=P9fjHO63_yG58z4OB36OuBTakYgzLgfhjhbCcX0t-mU,16456
|
637
637
|
claude_mpm/services/mcp_gateway/tools/hello_world.py,sha256=NFtcz_lPu_55YQjugvYkFA5W7Fv_7iwxuWWS_uFlVzE,20308
|
638
|
-
claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py,sha256=
|
638
|
+
claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py,sha256=Js2YI_jOd8lOlMYifeVzVwQEwVOViK1iIQNqpY6XXKs,16830
|
639
639
|
claude_mpm/services/memory/__init__.py,sha256=vOZrdDfYdgjV5jhUyqGiICoywAwUNGcE_d7z1XfKTyE,472
|
640
640
|
claude_mpm/services/memory/builder.py,sha256=GyqyJAiOYuYZ2rULKunNf2Rf4C1slAKkUnELBy8pZV0,34365
|
641
641
|
claude_mpm/services/memory/indexed_memory.py,sha256=aK5Fo1_P87kHVex7H2FE3mLquZsw1OKdtreIigymWJ0,19538
|
@@ -668,7 +668,7 @@ claude_mpm/services/project/documentation_manager.py,sha256=pa8AjP94O4G-3wwt6RD3
|
|
668
668
|
claude_mpm/services/project/enhanced_analyzer.py,sha256=vt9K-M7e5LWMO7c6cFmQQGotceF9WRnfALZZpD3nY_g,18540
|
669
669
|
claude_mpm/services/project/language_analyzer.py,sha256=KnbwHLtUcnzdMY6bseZk90bMo0yI9n_pXP5Mj4tLDgg,9209
|
670
670
|
claude_mpm/services/project/metrics_collector.py,sha256=nqsf2zcVVQU785dYmZ45cex3PByk56NCFC93mr4McIM,12873
|
671
|
-
claude_mpm/services/project/project_organizer.py,sha256=
|
671
|
+
claude_mpm/services/project/project_organizer.py,sha256=sTxwlsHpVhjYvP4x6gDXjAGESVbwwinuOEn2qm4EPWE,37497
|
672
672
|
claude_mpm/services/project/registry.py,sha256=XhPmkuEz9tKKKnT9Ca1zsUuNgZJQy40WFHJERj09-40,24166
|
673
673
|
claude_mpm/services/shared/__init__.py,sha256=9sL2GHHGg8-lboHTZ8mzIfhcCWiFCQyWbpC27jkBRI0,597
|
674
674
|
claude_mpm/services/shared/async_service_base.py,sha256=46Z-ATX5N0FhugNsF6byJ42frs4Rw5ZWfhw3Paf2788,7010
|
@@ -717,12 +717,12 @@ claude_mpm/services/unified/analyzer_strategies/code_analyzer.py,sha256=tnr6NYEq
|
|
717
717
|
claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py,sha256=XDGkLdes8T4EJ4wjF8lqZN8RdwXglbPiZMOZ_xfmNik,24150
|
718
718
|
claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py,sha256=s0r7sMQl5yIhvUOFFBkkcIAPwGx4m2x0JcwzaURryeU,33630
|
719
719
|
claude_mpm/services/unified/analyzer_strategies/security_analyzer.py,sha256=r2xQsVw8wQ2r6RnG088DgNuPZX0sT6y72xtTw3Om3bA,26496
|
720
|
-
claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py,sha256=
|
720
|
+
claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py,sha256=qmo1uwo4fOxqP6Y4E0X502pe9-RxMBnSWNpPtpECQNU,25249
|
721
721
|
claude_mpm/services/unified/config_strategies/__init__.py,sha256=FamM4maazbaaGdfWSOh26dXmFCCPA3T4FY55xjcUexI,4298
|
722
722
|
claude_mpm/services/unified/config_strategies/config_schema.py,sha256=Ub0V7MZbMoPv4_E6XKVsBhalU36MoXuO_0WJtwvYrmE,24813
|
723
|
-
claude_mpm/services/unified/config_strategies/context_strategy.py,sha256=
|
723
|
+
claude_mpm/services/unified/config_strategies/context_strategy.py,sha256=s2fDagOWd137E-ooMvy-CneNO76zDtpB3Ey7meUtUgg,25248
|
724
724
|
claude_mpm/services/unified/config_strategies/error_handling_strategy.py,sha256=qsGxBnGF0TDTKZFTPKUApwB9coXpWXdVz92q-z84VX0,35794
|
725
|
-
claude_mpm/services/unified/config_strategies/file_loader_strategy.py,sha256=
|
725
|
+
claude_mpm/services/unified/config_strategies/file_loader_strategy.py,sha256=SezFF0yqQMaNDMRz3sIbZa-P66Vbim2WAMgHMyCGZSw,29543
|
726
726
|
claude_mpm/services/unified/config_strategies/unified_config_service.py,sha256=DPClh8rKOC_rXoVezYYpWaFLDhf9XmKhrF5WKQqudAE,29513
|
727
727
|
claude_mpm/services/unified/config_strategies/validation_strategy.py,sha256=iewOimV4gtj6wo6HKahCXC8Jczzt8cCGut0gq5jPAZY,38862
|
728
728
|
claude_mpm/services/unified/deployment_strategies/__init__.py,sha256=nOaXf2mlFItXiNOBzizl8QxNWVEVBNIDq6uBw0gatpw,2986
|
@@ -769,10 +769,10 @@ claude_mpm/utils/session_logging.py,sha256=_6eoyCvVKhu2OhgRzC5FvMfFnD9et75lzCqAR
|
|
769
769
|
claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalNmfX9KlM,10443
|
770
770
|
claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
|
771
771
|
claude_mpm/validation/agent_validator.py,sha256=Nm2WmcbCb0EwOG4nFcikc3wVdiiAfjGBBI3YoR6ainQ,20915
|
772
|
-
claude_mpm/validation/frontmatter_validator.py,sha256=
|
773
|
-
claude_mpm-4.4.
|
774
|
-
claude_mpm-4.4.
|
775
|
-
claude_mpm-4.4.
|
776
|
-
claude_mpm-4.4.
|
777
|
-
claude_mpm-4.4.
|
778
|
-
claude_mpm-4.4.
|
772
|
+
claude_mpm/validation/frontmatter_validator.py,sha256=IDBOCBweO6umydSnUJjBh81sKk3cy9hRFYm61DCiXbI,7020
|
773
|
+
claude_mpm-4.4.6.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
|
774
|
+
claude_mpm-4.4.6.dist-info/METADATA,sha256=31bVYfdqk4nEHGwBEE4wdir7O7A2MVEjtKyJiNr-Sew,17264
|
775
|
+
claude_mpm-4.4.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
776
|
+
claude_mpm-4.4.6.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
|
777
|
+
claude_mpm-4.4.6.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
|
778
|
+
claude_mpm-4.4.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|