diff --git a/src/mcpm/clients/__init__.py b/src/mcpm/clients/__init__.py index 0879eaa6..13b3c52d 100644 --- a/src/mcpm/clients/__init__.py +++ b/src/mcpm/clients/__init__.py @@ -9,6 +9,7 @@ from mcpm.clients.client_registry import ClientRegistry from mcpm.clients.managers.claude_desktop import ClaudeDesktopManager from mcpm.clients.managers.cursor import CursorManager +from mcpm.clients.managers.trae import TraeManager from mcpm.clients.managers.windsurf import WindsurfManager __all__ = [ @@ -16,6 +17,7 @@ "ClaudeDesktopManager", "WindsurfManager", "CursorManager", + "TraeManager", "ClientConfigManager", "ClientRegistry", ] diff --git a/src/mcpm/clients/client_registry.py b/src/mcpm/clients/client_registry.py index b5116499..2fa08453 100644 --- a/src/mcpm/clients/client_registry.py +++ b/src/mcpm/clients/client_registry.py @@ -16,6 +16,7 @@ from mcpm.clients.managers.cursor import CursorManager from mcpm.clients.managers.fiveire import FiveireManager from mcpm.clients.managers.goose import GooseClientManager +from mcpm.clients.managers.trae import TraeManager from mcpm.clients.managers.windsurf import WindsurfManager from mcpm.utils.config import ConfigManager from mcpm.utils.scope import CLIENT_PREFIX, PROFILE_PREFIX @@ -42,6 +43,7 @@ class ClientRegistry: "goose-cli": GooseClientManager(), "5ire": FiveireManager(), "roo-code": RooCodeManager(), + "trae": TraeManager(), } @classmethod diff --git a/src/mcpm/clients/managers/__init__.py b/src/mcpm/clients/managers/__init__.py index c783e93a..bd2d5d29 100644 --- a/src/mcpm/clients/managers/__init__.py +++ b/src/mcpm/clients/managers/__init__.py @@ -10,6 +10,7 @@ from mcpm.clients.managers.cursor import CursorManager from mcpm.clients.managers.fiveire import FiveireManager from mcpm.clients.managers.goose import GooseClientManager +from mcpm.clients.managers.trae import TraeManager from mcpm.clients.managers.windsurf import WindsurfManager __all__ = [ @@ -20,4 +21,5 @@ "ContinueManager", "FiveireManager", "GooseClientManager", + "TraeManager", ] diff --git a/src/mcpm/clients/managers/trae.py b/src/mcpm/clients/managers/trae.py new file mode 100644 index 00000000..f1a57e9d --- /dev/null +++ b/src/mcpm/clients/managers/trae.py @@ -0,0 +1,75 @@ +"""Trae integration utilities for MCP""" + +import logging +import os +from typing import Any, Dict + +from mcpm.clients.base import JSONClientManager +from mcpm.schemas.server_config import ServerConfig + +logger = logging.getLogger(__name__) + + +class TraeManager(JSONClientManager): + """Manages Trae MCP server configurations""" + + # Client information + client_key = "trae" + display_name = "Trae" + download_url = "https://trae.ai/" + + def __init__(self, config_path=None): + """Initialize the Trae 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: + # Set config path based on detected platform + if self._system == "Darwin": # macOS + self.config_path = os.path.expanduser("~/Library/Application Support/Trae/User/mcp.json") + elif self._system == "Windows": + self.config_path = os.path.join(os.environ.get("APPDATA", ""), "Trae", "User", "mcp.json") + else: + # Linux + self.config_path = os.path.expanduser("~/.config/trae/mcp.json") + logger.warning("Trae is not supported on Linux yet.") + + def _get_empty_config(self) -> Dict[str, Any]: + """Get empty config structure for Trae""" + return {"mcpServers": {}} + + def to_client_format(self, server_config: ServerConfig) -> Dict[str, Any]: + """Convert ServerConfig to Trae-specific format + + Args: + server_config: ServerConfig object + + Returns: + Dict containing Trae-specific configuration + """ + # Start with the standard conversion + result = super().to_client_format(server_config) + + # the fromGalleryId field is Trae-specific and not supported yet + + return result + + def from_client_format(self, server_name: str, client_config: Dict[str, Any]) -> ServerConfig: + """Convert Trae format to ServerConfig + + Args: + server_name: Name of the server + client_config: Trae-specific configuration + + Returns: + ServerConfig object + """ + # Make a copy of the config to avoid modifying the original + config_copy = client_config.copy() + + return super().from_client_format(server_name, config_copy)