Ctrl K
ComunidadGuías…

migrations/versions/d3f8a1c6b904_bind_mcp_registration_auth.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""bind MCP registrations to encrypted credentials

Revision ID: d3f8a1c6b904
Revises: a4d7e6b9c2f1
Create Date: 2026-09-27

Auth-1B adds authentication metadata and an indirect credential reference.
No raw third-party credential material is stored on MCP registrations.
"""

from collections.abc import Sequence

import sqlalchemy as sa
from alembic import op

from migrations.utils.safe_ddl import (
    add_column_if_missing,
    create_index_if_not_exists,
    drop_column_if_exists,
    drop_fk_if_exists,
    drop_index_if_exists,
)

revision: str = "d3f8a1c6b904"
down_revision: str | None = "a4d7e6b9c2f1"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None

_FK_NAME = "fk_mcp_registration_credential_id"


def _has_fk(table_name: str, constraint_name: str) -> bool:
    inspector = sa.inspect(op.get_bind())

    return any(
        foreign_key.get("name") == constraint_name
        for foreign_key in inspector.get_foreign_keys(table_name)
    )


def upgrade() -> None:
    add_column_if_missing(
        "mcp_server_registrations",
        sa.Column(
            "auth_type",
            sa.String(length=32),
            server_default="none",
            nullable=False,
        ),
    )

    add_column_if_missing(
        "mcp_server_registrations",
        sa.Column(
            "credential_id",
            sa.String(length=64),
            nullable=True,
        ),
    )

    if not _has_fk(
        "mcp_server_registrations",
        _FK_NAME,
    ):
        op.create_foreign_key(
            _FK_NAME,
            "mcp_server_registrations",
            "credentials",
            ["credential_id"],
            ["id"],
            ondelete="RESTRICT",
        )

    create_index_if_not_exists(
        op.f("ix_mcp_server_registrations_credential_id"),
        "mcp_server_registrations",
        ["credential_id"],
        unique=False,
    )


def downgrade() -> None:
    drop_fk_if_exists(
        "mcp_server_registrations",
        _FK_NAME,
    )

    drop_index_if_exists(
        op.f("ix_mcp_server_registrations_credential_id"),
        "mcp_server_registrations",
    )

    drop_column_if_exists(
        "mcp_server_registrations",
        "credential_id",
    )

    drop_column_if_exists(
        "mcp_server_registrations",
        "auth_type",
    )