"""add MCP server connections and discovered tools Revision ID: 20260717_0008 Revises: 20260712_0007 """ from collections.abc import Sequence from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql revision: str = "20260717_0008" down_revision: str | Sequence[str] | None = "20260712_0007" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.create_table( "mcp_servers", sa.Column("id", sa.String(length=40), nullable=False), sa.Column("name", sa.String(length=128), nullable=False), sa.Column( "description", sa.String(length=2048), server_default="", nullable=False, ), sa.Column( "transport", sa.String(length=32), server_default="streamable_http", nullable=False, ), sa.Column("url", sa.String(length=2048), nullable=False), sa.Column( "config", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column( "secrets", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column( "status", sa.String(length=16), server_default="active", nullable=False, ), sa.Column("last_synced_at", sa.DateTime(timezone=True), nullable=True), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.Column( "updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.PrimaryKeyConstraint("id"), ) op.create_index("ix_mcp_servers_status", "mcp_servers", ["status"]) op.add_column( "tools", sa.Column("mcp_server_id", sa.String(length=40), nullable=True), ) op.add_column( "tools", sa.Column("remote_tool_name", sa.String(length=255), nullable=True), ) op.create_index("ix_tools_mcp_server_id", "tools", ["mcp_server_id"]) op.create_foreign_key( "fk_tools_mcp_server_id", "tools", "mcp_servers", ["mcp_server_id"], ["id"], ondelete="CASCADE", ) op.create_unique_constraint( "uq_tools_mcp_server_remote_name", "tools", ["mcp_server_id", "remote_tool_name"], ) def downgrade() -> None: op.drop_constraint( "uq_tools_mcp_server_remote_name", "tools", type_="unique", ) op.drop_constraint("fk_tools_mcp_server_id", "tools", type_="foreignkey") op.drop_index("ix_tools_mcp_server_id", table_name="tools") op.drop_column("tools", "remote_tool_name") op.drop_column("tools", "mcp_server_id") op.drop_index("ix_mcp_servers_status", table_name="mcp_servers") op.drop_table("mcp_servers")