Files
my_bookmate/backend/app/models/mcp_server.py
T
gavindiazandClaude Code 8cd390b3ed feat: 接入 MCP 外部工具服务,AI 可调用外部工具获取书外信息
- 后端新增 MCP 客户端(Streamable HTTP / 老式 SSE)与流式 agent 工具循环
- 新增 /api/mcp/servers 管理接口与 mcp_servers 表
- 对话中 OpenAI 兼容模型可调用启用服务器的工具,SSE 推送 tool 事件
- 前端新增 MCP 服务管理弹窗与侧栏入口,流式回答展示工具调用状态
- 修复用户消息气泡缺少删除按钮,并级联删除其名下回答版本

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-24 04:29:34 +08:00

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 {}