feat(models): Add MCP configuration models and loading logic

This commit is contained in:
2026-03-12 15:31:10 -04:00
parent 6090e0ad2b
commit 1c863f0f0c
2 changed files with 108 additions and 0 deletions

View File

@@ -37,6 +37,8 @@ See Also:
- src/project_manager.py for persistence layer
"""
from __future__ import annotations
import json
import os
import tomllib
import datetime
from dataclasses import dataclass, field
@@ -515,3 +517,56 @@ class Persona:
bias_profile=data.get("bias_profile"),
)
@dataclass
class MCPServerConfig:
name: str
command: Optional[str] = None
args: List[str] = field(default_factory=list)
url: Optional[str] = None
auto_start: bool = False
def to_dict(self) -> Dict[str, Any]:
res = {'auto_start': self.auto_start}
if self.command: res['command'] = self.command
if self.args: res['args'] = self.args
if self.url: res['url'] = self.url
return res
@classmethod
def from_dict(cls, name: str, data: Dict[str, Any]) -> 'MCPServerConfig':
return cls(
name=name,
command=data.get('command'),
args=data.get('args', []),
url=data.get('url'),
auto_start=data.get('auto_start', False),
)
@dataclass
class MCPConfiguration:
mcpServers: Dict[str, MCPServerConfig] = field(default_factory=dict)
def to_dict(self) -> Dict[str, Any]:
return {
'mcpServers': {name: cfg.to_dict() for name, cfg in self.mcpServers.items()}
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'MCPConfiguration':
raw_servers = data.get('mcpServers', {})
parsed_servers = {
name: MCPServerConfig.from_dict(name, cfg)
for name, cfg in raw_servers.items()
}
return cls(mcpServers=parsed_servers)
def load_mcp_config(path: str) -> MCPConfiguration:
if not os.path.exists(path):
return MCPConfiguration()
with open(path, 'r', encoding='utf-8') as f:
try:
data = json.load(f)
return MCPConfiguration.from_dict(data)
except Exception:
return MCPConfiguration()