- 后端新增 MCP 客户端(Streamable HTTP / 老式 SSE)与流式 agent 工具循环 - 新增 /api/mcp/servers 管理接口与 mcp_servers 表 - 对话中 OpenAI 兼容模型可调用启用服务器的工具,SSE 推送 tool 事件 - 前端新增 MCP 服务管理弹窗与侧栏入口,流式回答展示工具调用状态 - 修复用户消息气泡缺少删除按钮,并级联删除其名下回答版本 Co-Authored-By: Claude Code <noreply@anthropic.com>
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
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 {} |