Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mcpm/clients/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
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__ = [
"BaseClientManager",
"ClaudeDesktopManager",
"WindsurfManager",
"CursorManager",
"TraeManager",
"ClientConfigManager",
"ClientRegistry",
]
2 changes: 2 additions & 0 deletions src/mcpm/clients/client_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -42,6 +43,7 @@ class ClientRegistry:
"goose-cli": GooseClientManager(),
"5ire": FiveireManager(),
"roo-code": RooCodeManager(),
"trae": TraeManager(),
}

@classmethod
Expand Down
2 changes: 2 additions & 0 deletions src/mcpm/clients/managers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__ = [
Expand All @@ -20,4 +21,5 @@
"ContinueManager",
"FiveireManager",
"GooseClientManager",
"TraeManager",
]
75 changes: 75 additions & 0 deletions src/mcpm/clients/managers/trae.py
Original file line number Diff line number Diff line change
@@ -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)