Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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",
]
74 changes: 74 additions & 0 deletions src/mcpm/clients/managers/trae.py
Original file line number Diff line number Diff line change
@@ -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)
Loading