"""MCP 相关 数据库表"""
from datetime import UTC, datetime
from enum import Enum as PyEnum
from typing import Any
from sqlalchemy import BigInteger, DateTime, Enum, ForeignKey, String, Text
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base
class MCPInstallStatus(str, PyEnum):
"""MCP 服务状态"""
INIT = "init"
INSTALLING = "installing"
CANCELLED = "cancelled"
READY = "ready"
FAILED = "failed"
class MCPType(str, PyEnum):
"""MCP 类型"""
SSE = "sse"
STDIO = "stdio"
STREAMABLE = "stream"
class MCPInfo(Base):
"""MCP"""
__tablename__ = "framework_mcp"
name: Mapped[str] = mapped_column(String(255), nullable=False)
"""MCP 名称"""
overview: Mapped[str] = mapped_column(String(2000), nullable=False)
"""MCP 概述"""
description: Mapped[str] = mapped_column(Text, nullable=False)
"""MCP 描述"""
authorId: Mapped[str] = mapped_column(String(50), nullable=False)
"""MCP 创建者ID"""
id: Mapped[str] = mapped_column(String(255), primary_key=True)
"""MCP ID"""
updatedAt: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default_factory=lambda: datetime.now(tz=UTC),
onupdate=lambda: datetime.now(tz=UTC),
nullable=False,
index=True,
)
"""MCP 更新时间"""
status: Mapped[MCPInstallStatus] = mapped_column(
Enum(MCPInstallStatus), default=MCPInstallStatus.INIT, nullable=False,
)
"""MCP 状态"""
mcpType: Mapped[MCPType] = mapped_column(
Enum(MCPType), default=MCPType.STDIO, nullable=False,
)
"""MCP 类型"""
class MCPActivated(Base):
"""MCP 激活用户"""
__tablename__ = "framework_mcp_activated"
mcpId: Mapped[str] = mapped_column(
String(255), ForeignKey("framework_mcp.id"), index=True, nullable=False,
)
"""MCP ID"""
userId: Mapped[str] = mapped_column(String(50), ForeignKey("framework_user.id"), nullable=False)
"""用户ID"""
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True, init=False)
"""主键ID"""
class MCPTools(Base):
"""MCP 工具"""
__tablename__ = "framework_mcp_tools"
mcpId: Mapped[str] = mapped_column(
String(255), ForeignKey("framework_mcp.id"), index=True, nullable=False,
)
"""MCP ID"""
toolName: Mapped[str] = mapped_column(String(255), nullable=False)
"""MCP 工具名称"""
description: Mapped[str] = mapped_column(Text, nullable=False)
"""MCP 工具描述"""
inputSchema: Mapped[dict[str, Any]] = mapped_column(JSONB, nullable=False)
"""MCP 工具输入参数"""
outputSchema: Mapped[dict[str, Any]] = mapped_column(JSONB, nullable=False)
"""MCP 工具输出参数"""
id: Mapped[int] = mapped_column(
BigInteger,
primary_key=True,
autoincrement=True,
init=False,
)
"""主键ID"""