From c5a331bca480165cb40c9593baa5538760720558 Mon Sep 17 00:00:00 2001 From: Chen Nie Date: Tue, 22 Apr 2025 13:12:14 +0800 Subject: [PATCH 1/2] Add Trae client support for issue #92 --- src/mcpm/clients/__init__.py | 2 + src/mcpm/clients/client_registry.py | 2 + src/mcpm/clients/managers/__init__.py | 2 + src/mcpm/clients/managers/trae.py | 74 +++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 src/mcpm/clients/managers/trae.py 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..ddb12a99 --- /dev/null +++ b/src/mcpm/clients/managers/trae.py @@ -0,0 +1,74 @@ +"""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 + raise NotImplementedError("Trae on Linux is not supported 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) From 88e21c4e6e2e44b3203ce55cf0d750e14f775b2f Mon Sep 17 00:00:00 2001 From: Chen Nie Date: Tue, 22 Apr 2025 13:25:41 +0800 Subject: [PATCH 2/2] change raise to warning to unblock test on linux --- src/mcpm/clients/managers/trae.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mcpm/clients/managers/trae.py b/src/mcpm/clients/managers/trae.py index ddb12a99..f1a57e9d 100644 --- a/src/mcpm/clients/managers/trae.py +++ b/src/mcpm/clients/managers/trae.py @@ -36,7 +36,8 @@ def __init__(self, config_path=None): self.config_path = os.path.join(os.environ.get("APPDATA", ""), "Trae", "User", "mcp.json") else: # Linux - raise NotImplementedError("Trae on Linux is not supported yet") + 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"""