import json import uuid from datetime import datetime from sqlalchemy import String, Text, Boolean, DateTime, func from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base def gen_uuid() -> str: return str(uuid.uuid4()) class McpServer(Base): """用户从页面配置的 MCP 服务器(供对话 agent 调用外部工具)。 存放远程 MCP 服务的连接信息:传输协议、URL、附加请求头(含鉴权)。 启用中的服务器会在对话时向模型暴露其工具(mcp_ 前缀)。 """ __tablename__ = "mcp_servers" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=gen_uuid) name: Mapped[str] = mapped_column(String(200)) # 显示名,如 firecrawl transport: Mapped[str] = mapped_column(String(30), default="streamable-http") # streamable-http | sse url: Mapped[str] = mapped_column(String(2000)) # 远程端点 headers: Mapped[str] = mapped_column(Text, default="{}") # JSON dict,附加请求头(明文本地存储,与 ai_models 同级信任) enabled: Mapped[bool] = mapped_column(Boolean, default=True) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) def headers_dict(self) -> dict: try: data = json.loads(self.headers or "{}") return data if isinstance(data, dict) else {} except (json.JSONDecodeError, TypeError): return {}