diff --git a/src/mcpm/clients/__init__.py b/src/mcpm/clients/__init__.py index 13b3c52d..8bb165dc 100644 --- a/src/mcpm/clients/__init__.py +++ b/src/mcpm/clients/__init__.py @@ -8,6 +8,7 @@ from mcpm.clients.client_config import ClientConfigManager from mcpm.clients.client_registry import ClientRegistry from mcpm.clients.managers.claude_desktop import ClaudeDesktopManager +from mcpm.clients.managers.claude_code import ClaudeCodeManager from mcpm.clients.managers.cursor import CursorManager from mcpm.clients.managers.trae import TraeManager from mcpm.clients.managers.windsurf import WindsurfManager @@ -15,6 +16,7 @@ __all__ = [ "BaseClientManager", "ClaudeDesktopManager", + "ClaudeCodeManager", "WindsurfManager", "CursorManager", "TraeManager", diff --git a/src/mcpm/clients/client_registry.py b/src/mcpm/clients/client_registry.py index cc94c575..c73f6940 100644 --- a/src/mcpm/clients/client_registry.py +++ b/src/mcpm/clients/client_registry.py @@ -10,6 +10,7 @@ from mcpm.clients.client_config import ClientConfigManager # Import all client managers +from mcpm.clients.managers.claude_code import ClaudeCodeManager from mcpm.clients.managers.claude_desktop import ClaudeDesktopManager from mcpm.clients.managers.cline import ClineManager, RooCodeManager from mcpm.clients.managers.continue_extension import ContinueManager @@ -34,6 +35,7 @@ class ClientRegistry: # Dictionary mapping client keys to manager instances _CLIENT_MANAGERS = { + "claude-code": ClaudeCodeManager(), "claude-desktop": ClaudeDesktopManager(), "windsurf": WindsurfManager(), "cursor": CursorManager(), diff --git a/src/mcpm/clients/managers/__init__.py b/src/mcpm/clients/managers/__init__.py index bd2d5d29..4a53577d 100644 --- a/src/mcpm/clients/managers/__init__.py +++ b/src/mcpm/clients/managers/__init__.py @@ -4,6 +4,7 @@ This package contains specific implementations of client managers for MCP clients. """ +from mcpm.clients.managers.claude_code import ClaudeCodeManager from mcpm.clients.managers.claude_desktop import ClaudeDesktopManager from mcpm.clients.managers.cline import ClineManager from mcpm.clients.managers.continue_extension import ContinueManager @@ -14,6 +15,7 @@ from mcpm.clients.managers.windsurf import WindsurfManager __all__ = [ + "ClaudeCodeManager", "ClaudeDesktopManager", "CursorManager", "WindsurfManager", diff --git a/src/mcpm/clients/managers/claude_code.py b/src/mcpm/clients/managers/claude_code.py new file mode 100644 index 00000000..bed4cc72 --- /dev/null +++ b/src/mcpm/clients/managers/claude_code.py @@ -0,0 +1,59 @@ +""" +Claude Code CLI integration utilities for MCP +""" + +import logging +import os +import shutil +from typing import Any, Dict + +from mcpm.clients.base import JSONClientManager + +logger = logging.getLogger(__name__) + + +class ClaudeCodeManager(JSONClientManager): + """Manages Claude Code CLI MCP server configurations""" + + # Client information + client_key = "claude-code" + display_name = "Claude Code" + download_url = "https://docs.anthropic.com/en/docs/claude-code" + + def __init__(self, config_path=None): + """Initialize the Claude Code client manager + + Args: + config_path: Optional path to the config file. If not provided, uses default path. + """ + super().__init__() + + if config_path: + self.config_path = config_path + else: + self.config_path = os.path.expanduser("~/.claude.json") + + def _get_empty_config(self) -> Dict[str, Any]: + """Get empty config structure for Claude Code""" + return {"mcpServers": {}} + + def is_client_installed(self) -> bool: + """Check if Claude Code CLI is installed + Returns: + bool: True if claude command is available, False otherwise + """ + claude_executable = "claude.exe" if self._system == "Windows" else "claude" + return shutil.which(claude_executable) is not None + + def get_client_info(self) -> Dict[str, str]: + """Get information about this client + + Returns: + Dict: Information about the client including display name, download URL, and config path + """ + return { + "name": self.display_name, + "download_url": self.download_url, + "config_file": self.config_path, + "description": "Anthropic's Claude Code CLI tool" + } diff --git a/src/mcpm/router/router.py b/src/mcpm/router/router.py index 96d6d62f..89f0fc8f 100644 --- a/src/mcpm/router/router.py +++ b/src/mcpm/router/router.py @@ -2,12 +2,12 @@ Router implementation for aggregating multiple MCP servers into a single server. """ +import asyncio import logging import typing as t from collections import defaultdict from contextlib import asynccontextmanager from typing import Literal, Optional, Sequence, TextIO -import asyncio import uvicorn from deprecated import deprecated