mirror of
https://github.com/aljazceru/mcp-python-sdk.git
synced 2025-12-18 22:44:20 +01:00
Fix: Use absolute path to uv executable in Claude Desktop config (#440)
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
@@ -30,6 +31,16 @@ def get_claude_config_path() -> Path | None:
|
||||
return path
|
||||
return None
|
||||
|
||||
def get_uv_path() -> str:
|
||||
"""Get the full path to the uv executable."""
|
||||
uv_path = shutil.which("uv")
|
||||
if not uv_path:
|
||||
logger.error(
|
||||
"uv executable not found in PATH, falling back to 'uv'. "
|
||||
"Please ensure uv is installed and in your PATH"
|
||||
)
|
||||
return "uv" # Fall back to just "uv" if not found
|
||||
return uv_path
|
||||
|
||||
def update_claude_config(
|
||||
file_spec: str,
|
||||
@@ -54,6 +65,7 @@ def update_claude_config(
|
||||
Claude Desktop may not be installed or properly set up.
|
||||
"""
|
||||
config_dir = get_claude_config_path()
|
||||
uv_path = get_uv_path()
|
||||
if not config_dir:
|
||||
raise RuntimeError(
|
||||
"Claude Desktop config directory not found. Please ensure Claude Desktop"
|
||||
@@ -117,7 +129,7 @@ def update_claude_config(
|
||||
# Add fastmcp run command
|
||||
args.extend(["mcp", "run", file_spec])
|
||||
|
||||
server_config: dict[str, Any] = {"command": "uv", "args": args}
|
||||
server_config: dict[str, Any] = {"command": uv_path, "args": args}
|
||||
|
||||
# Add environment variables if specified
|
||||
if env_vars:
|
||||
|
||||
@@ -48,3 +48,28 @@ def test_command_execution(mock_config_path: Path):
|
||||
|
||||
assert result.returncode == 0
|
||||
assert "usage" in result.stdout.lower()
|
||||
|
||||
|
||||
def test_absolute_uv_path(mock_config_path: Path):
|
||||
"""Test that the absolute path to uv is used when available."""
|
||||
# Mock the shutil.which function to return a fake path
|
||||
mock_uv_path = "/usr/local/bin/uv"
|
||||
|
||||
with patch("mcp.cli.claude.get_uv_path", return_value=mock_uv_path):
|
||||
# Setup
|
||||
server_name = "test_server"
|
||||
file_spec = "test_server.py:app"
|
||||
|
||||
# Update config
|
||||
success = update_claude_config(file_spec=file_spec, server_name=server_name)
|
||||
assert success
|
||||
|
||||
# Read the generated config
|
||||
config_file = mock_config_path / "claude_desktop_config.json"
|
||||
config = json.loads(config_file.read_text())
|
||||
|
||||
# Verify the command is the absolute path
|
||||
server_config = config["mcpServers"][server_name]
|
||||
command = server_config["command"]
|
||||
|
||||
assert command == mock_uv_path
|
||||
Reference in New Issue
Block a user