Skip to content

Commit c5a331b

Browse files
committed
Add Trae client support for issue #92
1 parent 25b7fa0 commit c5a331b

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

src/mcpm/clients/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
from mcpm.clients.client_registry import ClientRegistry
1010
from mcpm.clients.managers.claude_desktop import ClaudeDesktopManager
1111
from mcpm.clients.managers.cursor import CursorManager
12+
from mcpm.clients.managers.trae import TraeManager
1213
from mcpm.clients.managers.windsurf import WindsurfManager
1314

1415
__all__ = [
1516
"BaseClientManager",
1617
"ClaudeDesktopManager",
1718
"WindsurfManager",
1819
"CursorManager",
20+
"TraeManager",
1921
"ClientConfigManager",
2022
"ClientRegistry",
2123
]

src/mcpm/clients/client_registry.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from mcpm.clients.managers.cursor import CursorManager
1717
from mcpm.clients.managers.fiveire import FiveireManager
1818
from mcpm.clients.managers.goose import GooseClientManager
19+
from mcpm.clients.managers.trae import TraeManager
1920
from mcpm.clients.managers.windsurf import WindsurfManager
2021
from mcpm.utils.config import ConfigManager
2122
from mcpm.utils.scope import CLIENT_PREFIX, PROFILE_PREFIX
@@ -42,6 +43,7 @@ class ClientRegistry:
4243
"goose-cli": GooseClientManager(),
4344
"5ire": FiveireManager(),
4445
"roo-code": RooCodeManager(),
46+
"trae": TraeManager(),
4547
}
4648

4749
@classmethod

src/mcpm/clients/managers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from mcpm.clients.managers.cursor import CursorManager
1111
from mcpm.clients.managers.fiveire import FiveireManager
1212
from mcpm.clients.managers.goose import GooseClientManager
13+
from mcpm.clients.managers.trae import TraeManager
1314
from mcpm.clients.managers.windsurf import WindsurfManager
1415

1516
__all__ = [
@@ -20,4 +21,5 @@
2021
"ContinueManager",
2122
"FiveireManager",
2223
"GooseClientManager",
24+
"TraeManager",
2325
]

src/mcpm/clients/managers/trae.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
"""Trae integration utilities for MCP"""
2+
3+
import logging
4+
import os
5+
from typing import Any, Dict
6+
7+
from mcpm.clients.base import JSONClientManager
8+
from mcpm.schemas.server_config import ServerConfig
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
class TraeManager(JSONClientManager):
14+
"""Manages Trae MCP server configurations"""
15+
16+
# Client information
17+
client_key = "trae"
18+
display_name = "Trae"
19+
download_url = "https://trae.ai/"
20+
21+
def __init__(self, config_path=None):
22+
"""Initialize the Trae client manager
23+
24+
Args:
25+
config_path: Optional path to the config file. If not provided, uses default path.
26+
"""
27+
super().__init__()
28+
29+
if config_path:
30+
self.config_path = config_path
31+
else:
32+
# Set config path based on detected platform
33+
if self._system == "Darwin": # macOS
34+
self.config_path = os.path.expanduser("~/Library/Application Support/Trae/User/mcp.json")
35+
elif self._system == "Windows":
36+
self.config_path = os.path.join(os.environ.get("APPDATA", ""), "Trae", "User", "mcp.json")
37+
else:
38+
# Linux
39+
raise NotImplementedError("Trae on Linux is not supported yet")
40+
41+
def _get_empty_config(self) -> Dict[str, Any]:
42+
"""Get empty config structure for Trae"""
43+
return {"mcpServers": {}}
44+
45+
def to_client_format(self, server_config: ServerConfig) -> Dict[str, Any]:
46+
"""Convert ServerConfig to Trae-specific format
47+
48+
Args:
49+
server_config: ServerConfig object
50+
51+
Returns:
52+
Dict containing Trae-specific configuration
53+
"""
54+
# Start with the standard conversion
55+
result = super().to_client_format(server_config)
56+
57+
# the fromGalleryId field is Trae-specific and not supported yet
58+
59+
return result
60+
61+
def from_client_format(self, server_name: str, client_config: Dict[str, Any]) -> ServerConfig:
62+
"""Convert Trae format to ServerConfig
63+
64+
Args:
65+
server_name: Name of the server
66+
client_config: Trae-specific configuration
67+
68+
Returns:
69+
ServerConfig object
70+
"""
71+
# Make a copy of the config to avoid modifying the original
72+
config_copy = client_config.copy()
73+
74+
return super().from_client_format(server_name, config_copy)

0 commit comments

Comments
 (0)