claude-mpm 4.4.11__py3-none-any.whl → 4.4.12__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 CHANGED
@@ -1 +1 @@
1
- 4.4.11
1
+ 4.4.12
@@ -222,6 +222,32 @@ def _check_mcp_auto_configuration():
222
222
  logger = get_logger("cli")
223
223
  logger.debug(f"MCP auto-configuration check failed: {e}")
224
224
 
225
+ # Also ensure MCP services are properly configured in ~/.claude.json
226
+ # This fixes incorrect paths and adds missing services
227
+ try:
228
+ from ..services.mcp_config_manager import MCPConfigManager
229
+ from ..core.logger import get_logger
230
+
231
+ logger = get_logger("cli")
232
+ mcp_manager = MCPConfigManager()
233
+
234
+ # Fix any corrupted installations first
235
+ fix_success, fix_message = mcp_manager.fix_mcp_service_issues()
236
+ if fix_message and "Fixed:" in fix_message:
237
+ logger.info(f"MCP service fixes applied: {fix_message}")
238
+
239
+ # Ensure all services are configured correctly
240
+ config_success, config_message = mcp_manager.ensure_mcp_services_configured()
241
+ if config_message and "Added MCP services" in config_message:
242
+ logger.info(f"MCP services configured: {config_message}")
243
+
244
+ except Exception as e:
245
+ # Non-critical - log but don't fail
246
+ from ..core.logger import get_logger
247
+
248
+ logger = get_logger("cli")
249
+ logger.debug(f"MCP services configuration update failed: {e}")
250
+
225
251
 
226
252
  def _verify_mcp_gateway_startup():
227
253
  """
@@ -871,38 +871,51 @@ class MCPServicesCheck(BaseDiagnosticCheck):
871
871
  def _check_gateway_configuration(self) -> DiagnosticResult:
872
872
  """Check if MCP services are configured in the gateway."""
873
873
  try:
874
- # Check MCP config file
875
- config_dir = Path.home() / ".claude" / "mcp"
876
- config_file = config_dir / "config.json"
874
+ # Check Claude config file (the correct location for Claude Code)
875
+ config_file = Path.home() / ".claude.json"
877
876
 
878
877
  if not config_file.exists():
879
878
  return DiagnosticResult(
880
879
  category="MCP Gateway Configuration",
881
880
  status=DiagnosticStatus.WARNING,
882
- message="MCP configuration file not found",
881
+ message="Claude configuration file not found",
883
882
  details={"config_path": str(config_file), "exists": False},
884
883
  fix_command="claude-mpm configure --mcp",
885
- fix_description="Initialize MCP configuration",
884
+ fix_description="Initialize Claude configuration",
886
885
  )
887
886
 
888
887
  with open(config_file) as f:
889
888
  config = json.load(f)
890
889
 
891
- # Check for external services configuration
892
- external_services = config.get("external_services", {})
890
+ # Get the current project configuration
891
+ from pathlib import Path
892
+ import os
893
+
894
+ current_project = str(Path.cwd())
895
+
896
+ # Check if current project has MCP servers configured
897
+ projects = config.get("projects", {})
898
+ if current_project not in projects:
899
+ return DiagnosticResult(
900
+ category="MCP Gateway Configuration",
901
+ status=DiagnosticStatus.WARNING,
902
+ message="Current project not configured in Claude",
903
+ details={"config_path": str(config_file), "project": current_project},
904
+ fix_command="claude-mpm configure --mcp",
905
+ fix_description="Configure MCP services for current project",
906
+ )
907
+
908
+ project_config = projects[current_project]
909
+ mcp_servers = project_config.get("mcpServers", {})
910
+
893
911
  configured_services = []
894
912
  missing_services = []
895
913
 
896
914
  for service_name in self.MCP_SERVICES:
897
- if service_name in external_services:
915
+ if service_name in mcp_servers:
898
916
  configured_services.append(service_name)
899
917
  else:
900
- # Also check if it's in the services list directly
901
- services = config.get("services", [])
902
- if any(s.get("name") == service_name for s in services):
903
- configured_services.append(service_name)
904
- else:
905
- missing_services.append(service_name)
918
+ missing_services.append(service_name)
906
919
 
907
920
  details = {
908
921
  "config_path": str(config_file),
@@ -43,27 +43,28 @@ class MCPConfigManager:
43
43
 
44
44
  # Static known-good MCP service configurations
45
45
  # These are the correct, tested configurations that work reliably
46
+ # Note: Commands will be resolved to full paths dynamically in get_static_service_config()
46
47
  STATIC_MCP_CONFIGS = {
47
48
  "kuzu-memory": {
48
49
  "type": "stdio",
49
- "command": "kuzu-memory", # Use direct binary, will be resolved to full path
50
+ "command": "kuzu-memory", # Will be resolved to full path
50
51
  "args": ["mcp", "serve"] # v1.1.0+ uses 'mcp serve' command
51
52
  },
52
53
  "mcp-ticketer": {
53
54
  "type": "stdio",
54
- "command": "mcp-ticketer", # Use direct binary to preserve injected dependencies
55
+ "command": "mcp-ticketer", # Will be resolved to full path
55
56
  "args": ["mcp"]
56
57
  },
57
58
  "mcp-browser": {
58
59
  "type": "stdio",
59
- "command": "mcp-browser", # Use direct binary
60
+ "command": "mcp-browser", # Will be resolved to full path
60
61
  "args": ["mcp"],
61
62
  "env": {"MCP_BROWSER_HOME": str(Path.home() / ".mcp-browser")}
62
63
  },
63
64
  "mcp-vector-search": {
64
65
  "type": "stdio",
65
- # Use pipx venv's Python directly for module execution
66
- "command": str(Path.home() / ".local" / "pipx" / "venvs" / "mcp-vector-search" / "bin" / "python"),
66
+ # Special handling: needs Python interpreter from pipx venv
67
+ "command": "python", # Will be resolved to pipx venv Python
67
68
  "args": ["-m", "mcp_vector_search.mcp.server", "{project_root}"],
68
69
  "env": {}
69
70
  }
@@ -326,42 +327,51 @@ class MCPConfigManager:
326
327
  if service_name in ["kuzu-memory", "mcp-ticketer", "mcp-browser"]:
327
328
  # Try to find the full path of the binary
328
329
  binary_name = config["command"]
329
- binary_path = shutil.which(binary_name)
330
-
331
- if not binary_path:
332
- # Try common installation locations
333
- possible_paths = [
334
- f"/opt/homebrew/bin/{binary_name}",
335
- f"/usr/local/bin/{binary_name}",
336
- str(Path.home() / ".local" / "bin" / binary_name),
337
- ]
338
- for path in possible_paths:
339
- if Path(path).exists():
340
- binary_path = path
341
- break
330
+
331
+ # First check pipx location
332
+ pipx_bin = Path.home() / ".local" / "pipx" / "venvs" / service_name / "bin" / binary_name
333
+ if pipx_bin.exists():
334
+ binary_path = str(pipx_bin)
335
+ else:
336
+ # Try which command
337
+ binary_path = shutil.which(binary_name)
338
+
339
+ if not binary_path:
340
+ # Try common installation locations
341
+ possible_paths = [
342
+ Path.home() / ".local" / "bin" / binary_name,
343
+ Path("/opt/homebrew/bin") / binary_name,
344
+ Path("/usr/local/bin") / binary_name,
345
+ ]
346
+ for path in possible_paths:
347
+ if path.exists():
348
+ binary_path = str(path)
349
+ break
342
350
 
343
351
  if binary_path:
344
352
  config["command"] = binary_path
345
- # If still not found, keep the binary name and hope it's in PATH
353
+ else:
354
+ # Fall back to pipx run method if binary not found
355
+ self.logger.debug(f"Could not find {binary_name}, using pipx run fallback")
356
+ config["command"] = "pipx"
357
+ config["args"] = ["run", service_name] + config["args"]
346
358
 
347
- # Resolve pipx command to full path if needed
348
- elif config.get("command") == "pipx":
359
+ # Resolve pipx command to full path if needed (for fallback configs)
360
+ if config.get("command") == "pipx":
349
361
  pipx_path = shutil.which("pipx")
350
362
  if not pipx_path:
351
363
  # Try common pipx locations
352
- for possible_path in [
353
- "/opt/homebrew/bin/pipx",
354
- "/usr/local/bin/pipx",
355
- str(Path.home() / ".local" / "bin" / "pipx"),
356
- ]:
357
- if Path(possible_path).exists():
358
- pipx_path = possible_path
364
+ possible_pipx_paths = [
365
+ Path.home() / ".local" / "bin" / "pipx",
366
+ Path("/opt/homebrew/bin/pipx"),
367
+ Path("/usr/local/bin/pipx"),
368
+ ]
369
+ for path in possible_pipx_paths:
370
+ if path.exists():
371
+ pipx_path = str(path)
359
372
  break
360
373
  if pipx_path:
361
374
  config["command"] = pipx_path
362
- else:
363
- # Keep as "pipx" and hope it's in PATH when executed
364
- config["command"] = "pipx"
365
375
 
366
376
  # Handle user-specific paths for mcp-vector-search
367
377
  if service_name == "mcp-vector-search":
@@ -369,25 +379,31 @@ class MCPConfigManager:
369
379
  home = Path.home()
370
380
  python_path = home / ".local" / "pipx" / "venvs" / "mcp-vector-search" / "bin" / "python"
371
381
 
372
- # Check if the Python interpreter exists, if not fallback to pipx run
382
+ # Check if the Python interpreter exists
373
383
  if python_path.exists():
374
384
  config["command"] = str(python_path)
375
385
  else:
376
386
  # Fallback to pipx run method
377
- import shutil
378
387
  pipx_path = shutil.which("pipx")
379
388
  if not pipx_path:
380
389
  # Try common pipx locations
381
- for possible_path in [
382
- "/opt/homebrew/bin/pipx",
383
- "/usr/local/bin/pipx",
384
- str(Path.home() / ".local" / "bin" / "pipx"),
385
- ]:
386
- if Path(possible_path).exists():
387
- pipx_path = possible_path
390
+ possible_pipx_paths = [
391
+ Path.home() / ".local" / "bin" / "pipx",
392
+ Path("/opt/homebrew/bin/pipx"),
393
+ Path("/usr/local/bin/pipx"),
394
+ ]
395
+ for path in possible_pipx_paths:
396
+ if path.exists():
397
+ pipx_path = str(path)
388
398
  break
389
- config["command"] = pipx_path if pipx_path else "pipx"
390
- config["args"] = ["run", "--spec", "mcp-vector-search", "python"] + config["args"]
399
+
400
+ if pipx_path:
401
+ config["command"] = pipx_path
402
+ else:
403
+ config["command"] = "pipx" # Hope it's in PATH
404
+
405
+ # Use pipx run with the spec argument
406
+ config["args"] = ["run", "--spec", "mcp-vector-search", "python", "-m", "mcp_vector_search.mcp.server", "{project_root}"]
391
407
 
392
408
  # Use provided project path or current project
393
409
  project_root = project_path if project_path else str(self.project_root)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.4.11
3
+ Version: 4.4.12
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
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=toytnNjkIKPgQaGwDqQdC1rpNTAdSEc6Vja50d7Ovug,4
2
- claude_mpm/VERSION,sha256=wsjLXi1090mCdeXOCOer2wlQEWPDV51wB6VBJvhb3hw,7
2
+ claude_mpm/VERSION,sha256=-NhDVOKMNRngJz_F0f4LJhvjU2fK5Bea3S1dC9bmkLk,7
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
@@ -61,7 +61,7 @@ claude_mpm/agents/templates/.claude-mpm/memories/README.md,sha256=vEiG7cPjHRZfwX
61
61
  claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md,sha256=KMZSJrQi-wHOwfl2C0m3A4PpC4QuBtDolAtVybGahKc,77
62
62
  claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md,sha256=UBm4BycXtdaa-_l1VCh0alTGGOUSsnCbpKwbFuI-mUY,2219
63
63
  claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md,sha256=oPvFSYFnmJ4TkbTe4AZnNHWaJMJ-xqZP2WM6scUKQKo,13089
64
- claude_mpm/cli/__init__.py,sha256=TTtZNHx70miCIk-6ekKZiawOA9a0q1-HmVDecljZ3ZA,19317
64
+ claude_mpm/cli/__init__.py,sha256=F9t78ZqT0g_DB5ay1BB93mkyxdM0De_Z6aRs3k-wOyM,20396
65
65
  claude_mpm/cli/__main__.py,sha256=WnVGBwe10InxuZjJRFdwuMF6Gh16aXox6zFgxr0sRXk,847
66
66
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
67
67
  claude_mpm/cli/startup_logging.py,sha256=xtgAmTirhpk2B-dIS9YKcesPprXTukfu24gJSmGt8y8,29357
@@ -411,7 +411,7 @@ claude_mpm/services/event_aggregator.py,sha256=DDcehIZVpiEDzs9o18gDZyvjMBHCq2H8H
411
411
  claude_mpm/services/exceptions.py,sha256=5lVZETr_6-xk0ItH7BTfYUiX5RlckS1e8ah_UalYG9c,26475
412
412
  claude_mpm/services/hook_installer_service.py,sha256=z3kKeriEY1Y9bFesuGlHBxhCtc0Wzd3Zv02k2_rEyGo,19727
413
413
  claude_mpm/services/hook_service.py,sha256=rZnMn_4qxX5g9KAn0IQdoG50WmySNfsTmfG0XHuRHXk,15737
414
- claude_mpm/services/mcp_config_manager.py,sha256=Rsbk9Ygq7tJWqZI67VnYWSW30_9ptmLjyX7xf-rJcho,50465
414
+ claude_mpm/services/mcp_config_manager.py,sha256=M1wSWEwOYvzoLajAAFtoKQmeQ64lh-zBe5IaFK_XGnw,51143
415
415
  claude_mpm/services/mcp_service_verifier.py,sha256=ngiegCngX18AFehfyJdvqQAvscoIBvFN_DeOoGTjxj0,25164
416
416
  claude_mpm/services/memory_hook_service.py,sha256=pRlTClkRcw30Jhwbha4BC8IMdzKZxF8aWqf52JlntgY,11600
417
417
  claude_mpm/services/monitor_build_service.py,sha256=8gWR9CaqgXdG6-OjOFXGpk28GCcJTlHhojkUYnMCebI,12160
@@ -560,7 +560,7 @@ claude_mpm/services/diagnostics/checks/filesystem_check.py,sha256=V5HoHDYlSuoK2l
560
560
  claude_mpm/services/diagnostics/checks/installation_check.py,sha256=WoTt15R8Wg-6k2JZFAtmffFuih1AIyCX71QOHEFH-Ro,19562
561
561
  claude_mpm/services/diagnostics/checks/instructions_check.py,sha256=VbgBorl0RpFvxKQ_SC1gibTmGSiXaKSp-vVZt6hbH1g,16290
562
562
  claude_mpm/services/diagnostics/checks/mcp_check.py,sha256=SftuhP70abopyMD8GlLA_K3XHEYnBAeITggUQI0cYP4,12173
563
- claude_mpm/services/diagnostics/checks/mcp_services_check.py,sha256=ESE5ITzNjkCWWKMQdQoTBDLK8pZQ9MJY4x-E_nVuRww,42278
563
+ claude_mpm/services/diagnostics/checks/mcp_services_check.py,sha256=HYXVGJchYsQ__7S757bXjjLklXODHL4yfrIV257D6A4,42760
564
564
  claude_mpm/services/diagnostics/checks/monitor_check.py,sha256=NUx5G1yjHWlukZmwhUz4o8STRWgsQEx01YjIMReNC0A,10096
565
565
  claude_mpm/services/diagnostics/checks/startup_log_check.py,sha256=DrXdml2rHvmhFBdb_sntE3xmwaP_DZIKjdVbCn8Dy7E,12258
566
566
  claude_mpm/services/event_bus/__init__.py,sha256=ETCo4a6puIeyVWAv55uCDjjhzNyUwbVAHEcAVkVapx8,688
@@ -773,9 +773,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
773
773
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
774
774
  claude_mpm/validation/agent_validator.py,sha256=Nm2WmcbCb0EwOG4nFcikc3wVdiiAfjGBBI3YoR6ainQ,20915
775
775
  claude_mpm/validation/frontmatter_validator.py,sha256=IDBOCBweO6umydSnUJjBh81sKk3cy9hRFYm61DCiXbI,7020
776
- claude_mpm-4.4.11.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
777
- claude_mpm-4.4.11.dist-info/METADATA,sha256=GfGvZ-4PutVAH_2DAeQ7S5E-KubU1gqXSwbqnB2yh2Y,17518
778
- claude_mpm-4.4.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
779
- claude_mpm-4.4.11.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
780
- claude_mpm-4.4.11.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
781
- claude_mpm-4.4.11.dist-info/RECORD,,
776
+ claude_mpm-4.4.12.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
777
+ claude_mpm-4.4.12.dist-info/METADATA,sha256=d6CUgpr-Rb2uuk4UkukX91y23VYDRXiX2TPeQt3k5cU,17518
778
+ claude_mpm-4.4.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
779
+ claude_mpm-4.4.12.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
780
+ claude_mpm-4.4.12.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
781
+ claude_mpm-4.4.12.dist-info/RECORD,,