From b023ef6a777f4e57a3ffdb57344914d6d55a734d Mon Sep 17 00:00:00 2001 From: Hanashi Date: Thu, 27 Aug 2026 09:20:10 -0400 Subject: [PATCH] mcp schema --- .../down.sql | 5 ++ .../up.sql | 60 +++++++++++++++++++ .../sql/migrations_squashed/mcp_sessions.sql | 60 +++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 _database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/down.sql create mode 100644 _database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/up.sql create mode 100644 _database/sql/migrations_squashed/mcp_sessions.sql diff --git a/_database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/down.sql b/_database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/down.sql new file mode 100644 index 0000000000..502f8c55cf --- /dev/null +++ b/_database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/down.sql @@ -0,0 +1,5 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +DROP TABLE IF EXISTS mcp_sessions; diff --git a/_database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/up.sql b/_database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/up.sql new file mode 100644 index 0000000000..bef3159475 --- /dev/null +++ b/_database/sql/migrations/2026-08-27-084409-0000_create_mcp_sessions/up.sql @@ -0,0 +1,60 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +-- Sessions for MCP and other non-human users. +-- These work like `user_sessions`, but are created and consumed by MCP clients. +CREATE TABLE mcp_sessions ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + + -- Non-private "primary key" for the session. + -- Used as a key to delete/manage sessions in the dashboard. + token VARCHAR(32) NOT NULL, + + -- Private entropy presented by clients; used for lookup of live sessions. + private_session_token VARCHAR(64) NOT NULL, + + -- The user that the session belongs to. + user_token VARCHAR(32) NOT NULL, + + -- ========== CLIENT INFO ========== + + -- Trimmed name of the MCP client, if any. + maybe_mcp_client_name VARCHAR(255) DEFAULT NULL, + + -- Trimmed version of the MCP client, if any. + maybe_mcp_client_version VARCHAR(255) DEFAULT NULL, + + -- Trimmed vendor of the MCP client, if any. + maybe_mcp_client_vendor VARCHAR(255) DEFAULT NULL, + + -- ========== IP ADDRESSES ========== + + -- IP address that created the session. Wide enough for IPv4/IPv6. + ip_address_creation VARCHAR(40) NOT NULL, + + -- IP address that last updated the session. Wide enough for IPv4/IPv6. + ip_address_update VARCHAR(40) NOT NULL, + + -- ========== TIMESTAMPS ========== + + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + -- When the session expires, if not refreshed. + -- This must be set by the server code, or the session is invalid. + expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + + -- Soft-delete timestamp. NULL means the session is live. + -- deletion = session termination + maybe_deleted_at TIMESTAMP NULL, + + -- INDICES -- + PRIMARY KEY (id), + UNIQUE KEY (token), + UNIQUE KEY (private_session_token), + KEY fk_user_token (user_token), + KEY index_ip_address_creation (ip_address_creation), + KEY index_maybe_deleted_at (maybe_deleted_at) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/_database/sql/migrations_squashed/mcp_sessions.sql b/_database/sql/migrations_squashed/mcp_sessions.sql new file mode 100644 index 0000000000..bef3159475 --- /dev/null +++ b/_database/sql/migrations_squashed/mcp_sessions.sql @@ -0,0 +1,60 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +-- Sessions for MCP and other non-human users. +-- These work like `user_sessions`, but are created and consumed by MCP clients. +CREATE TABLE mcp_sessions ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + + -- Non-private "primary key" for the session. + -- Used as a key to delete/manage sessions in the dashboard. + token VARCHAR(32) NOT NULL, + + -- Private entropy presented by clients; used for lookup of live sessions. + private_session_token VARCHAR(64) NOT NULL, + + -- The user that the session belongs to. + user_token VARCHAR(32) NOT NULL, + + -- ========== CLIENT INFO ========== + + -- Trimmed name of the MCP client, if any. + maybe_mcp_client_name VARCHAR(255) DEFAULT NULL, + + -- Trimmed version of the MCP client, if any. + maybe_mcp_client_version VARCHAR(255) DEFAULT NULL, + + -- Trimmed vendor of the MCP client, if any. + maybe_mcp_client_vendor VARCHAR(255) DEFAULT NULL, + + -- ========== IP ADDRESSES ========== + + -- IP address that created the session. Wide enough for IPv4/IPv6. + ip_address_creation VARCHAR(40) NOT NULL, + + -- IP address that last updated the session. Wide enough for IPv4/IPv6. + ip_address_update VARCHAR(40) NOT NULL, + + -- ========== TIMESTAMPS ========== + + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + -- When the session expires, if not refreshed. + -- This must be set by the server code, or the session is invalid. + expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + + -- Soft-delete timestamp. NULL means the session is live. + -- deletion = session termination + maybe_deleted_at TIMESTAMP NULL, + + -- INDICES -- + PRIMARY KEY (id), + UNIQUE KEY (token), + UNIQUE KEY (private_session_token), + KEY fk_user_token (user_token), + KEY index_ip_address_creation (ip_address_creation), + KEY index_maybe_deleted_at (maybe_deleted_at) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;