diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 82aa376d34..8f390e13b8 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -2142,11 +2142,22 @@ CREATE TABLE mcp_server_configs ( model_intent boolean DEFAULT false NOT NULL, allow_in_plan_mode boolean DEFAULT false NOT NULL, forward_coder_headers boolean DEFAULT false NOT NULL, + custom_headers_user_keys text[] DEFAULT '{}'::text[] NOT NULL, CONSTRAINT mcp_server_configs_auth_type_check CHECK ((auth_type = ANY (ARRAY['none'::text, 'oauth2'::text, 'api_key'::text, 'custom_headers'::text, 'user_oidc'::text]))), CONSTRAINT mcp_server_configs_availability_check CHECK ((availability = ANY (ARRAY['force_on'::text, 'default_on'::text, 'default_off'::text]))), CONSTRAINT mcp_server_configs_transport_check CHECK ((transport = ANY (ARRAY['streamable_http'::text, 'sse'::text]))) ); +CREATE TABLE mcp_server_user_header_values ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + mcp_server_config_id uuid NOT NULL, + user_id uuid NOT NULL, + header_values text DEFAULT '{}'::text NOT NULL, + header_values_key_id text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + CREATE TABLE mcp_server_user_tokens ( id uuid DEFAULT gen_random_uuid() NOT NULL, mcp_server_config_id uuid NOT NULL, @@ -3895,6 +3906,12 @@ ALTER TABLE ONLY mcp_server_configs ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_slug_key UNIQUE (slug); +ALTER TABLE ONLY mcp_server_user_header_values + ADD CONSTRAINT mcp_server_user_header_values_mcp_server_config_id_user_id_key UNIQUE (mcp_server_config_id, user_id); + +ALTER TABLE ONLY mcp_server_user_header_values + ADD CONSTRAINT mcp_server_user_header_values_pkey PRIMARY KEY (id); + ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_mcp_server_config_id_user_id_key UNIQUE (mcp_server_config_id, user_id); @@ -4309,6 +4326,8 @@ CREATE INDEX idx_mcp_server_configs_enabled ON mcp_server_configs USING btree (e CREATE INDEX idx_mcp_server_configs_forced ON mcp_server_configs USING btree (enabled, availability) WHERE ((enabled = true) AND (availability = 'force_on'::text)); +CREATE INDEX idx_mcp_server_user_header_values_user_id ON mcp_server_user_header_values USING btree (user_id); + CREATE INDEX idx_mcp_server_user_tokens_user_id ON mcp_server_user_tokens USING btree (user_id); CREATE INDEX idx_notification_messages_status ON notification_messages USING btree (status); @@ -4713,6 +4732,15 @@ ALTER TABLE ONLY mcp_server_configs ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL; +ALTER TABLE ONLY mcp_server_user_header_values + ADD CONSTRAINT mcp_server_user_header_values_header_values_key_id_fkey FOREIGN KEY (header_values_key_id) REFERENCES dbcrypt_keys(active_key_digest); + +ALTER TABLE ONLY mcp_server_user_header_values + ADD CONSTRAINT mcp_server_user_header_values_mcp_server_config_id_fkey FOREIGN KEY (mcp_server_config_id) REFERENCES mcp_server_configs(id) ON DELETE CASCADE; + +ALTER TABLE ONLY mcp_server_user_header_values + ADD CONSTRAINT mcp_server_user_header_values_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; + ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_access_token_key_id_fkey FOREIGN KEY (access_token_key_id) REFERENCES dbcrypt_keys(active_key_digest); diff --git a/coderd/database/foreign_key_constraint.go b/coderd/database/foreign_key_constraint.go index 5eeb24587a..41353c9baa 100644 --- a/coderd/database/foreign_key_constraint.go +++ b/coderd/database/foreign_key_constraint.go @@ -60,6 +60,9 @@ const ( ForeignKeyMcpServerConfigsCustomHeadersKeyID ForeignKeyConstraint = "mcp_server_configs_custom_headers_key_id_fkey" // ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_custom_headers_key_id_fkey FOREIGN KEY (custom_headers_key_id) REFERENCES dbcrypt_keys(active_key_digest); ForeignKeyMcpServerConfigsOauth2ClientSecretKeyID ForeignKeyConstraint = "mcp_server_configs_oauth2_client_secret_key_id_fkey" // ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_oauth2_client_secret_key_id_fkey FOREIGN KEY (oauth2_client_secret_key_id) REFERENCES dbcrypt_keys(active_key_digest); ForeignKeyMcpServerConfigsUpdatedBy ForeignKeyConstraint = "mcp_server_configs_updated_by_fkey" // ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL; + ForeignKeyMcpServerUserHeaderValuesHeaderValuesKeyID ForeignKeyConstraint = "mcp_server_user_header_values_header_values_key_id_fkey" // ALTER TABLE ONLY mcp_server_user_header_values ADD CONSTRAINT mcp_server_user_header_values_header_values_key_id_fkey FOREIGN KEY (header_values_key_id) REFERENCES dbcrypt_keys(active_key_digest); + ForeignKeyMcpServerUserHeaderValuesMcpServerConfigID ForeignKeyConstraint = "mcp_server_user_header_values_mcp_server_config_id_fkey" // ALTER TABLE ONLY mcp_server_user_header_values ADD CONSTRAINT mcp_server_user_header_values_mcp_server_config_id_fkey FOREIGN KEY (mcp_server_config_id) REFERENCES mcp_server_configs(id) ON DELETE CASCADE; + ForeignKeyMcpServerUserHeaderValuesUserID ForeignKeyConstraint = "mcp_server_user_header_values_user_id_fkey" // ALTER TABLE ONLY mcp_server_user_header_values ADD CONSTRAINT mcp_server_user_header_values_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; ForeignKeyMcpServerUserTokensAccessTokenKeyID ForeignKeyConstraint = "mcp_server_user_tokens_access_token_key_id_fkey" // ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_access_token_key_id_fkey FOREIGN KEY (access_token_key_id) REFERENCES dbcrypt_keys(active_key_digest); ForeignKeyMcpServerUserTokensMcpServerConfigID ForeignKeyConstraint = "mcp_server_user_tokens_mcp_server_config_id_fkey" // ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_mcp_server_config_id_fkey FOREIGN KEY (mcp_server_config_id) REFERENCES mcp_server_configs(id) ON DELETE CASCADE; ForeignKeyMcpServerUserTokensRefreshTokenKeyID ForeignKeyConstraint = "mcp_server_user_tokens_refresh_token_key_id_fkey" // ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_refresh_token_key_id_fkey FOREIGN KEY (refresh_token_key_id) REFERENCES dbcrypt_keys(active_key_digest); diff --git a/coderd/database/migrations/000510_mcp_server_custom_headers_user_keys.down.sql b/coderd/database/migrations/000510_mcp_server_custom_headers_user_keys.down.sql new file mode 100644 index 0000000000..483774a76f --- /dev/null +++ b/coderd/database/migrations/000510_mcp_server_custom_headers_user_keys.down.sql @@ -0,0 +1,5 @@ +DROP INDEX IF EXISTS idx_mcp_server_user_header_values_user_id; +DROP TABLE IF EXISTS mcp_server_user_header_values; + +ALTER TABLE mcp_server_configs + DROP COLUMN IF EXISTS custom_headers_user_keys; diff --git a/coderd/database/migrations/000510_mcp_server_custom_headers_user_keys.up.sql b/coderd/database/migrations/000510_mcp_server_custom_headers_user_keys.up.sql new file mode 100644 index 0000000000..f44a08b6cc --- /dev/null +++ b/coderd/database/migrations/000510_mcp_server_custom_headers_user_keys.up.sql @@ -0,0 +1,22 @@ +ALTER TABLE mcp_server_configs + ADD COLUMN custom_headers_user_keys TEXT[] NOT NULL DEFAULT '{}'; + +CREATE TABLE mcp_server_user_header_values ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + mcp_server_config_id UUID NOT NULL REFERENCES mcp_server_configs(id) ON DELETE CASCADE, + user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, + + -- JSON object {header: value} of values supplied by the user for the + -- headers listed in mcp_server_configs.custom_headers_user_keys. Stored + -- encrypted at rest via dbcrypt (the key id is header_values_key_id). + header_values TEXT NOT NULL DEFAULT '{}', + header_values_key_id TEXT REFERENCES dbcrypt_keys(active_key_digest), + + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), + + UNIQUE (mcp_server_config_id, user_id) +); + +CREATE INDEX idx_mcp_server_user_header_values_user_id + ON mcp_server_user_header_values(user_id); diff --git a/coderd/database/migrations/testdata/fixtures/000510_mcp_server_custom_headers_user_keys.up.sql b/coderd/database/migrations/testdata/fixtures/000510_mcp_server_custom_headers_user_keys.up.sql new file mode 100644 index 0000000000..40642ab4b9 --- /dev/null +++ b/coderd/database/migrations/testdata/fixtures/000510_mcp_server_custom_headers_user_keys.up.sql @@ -0,0 +1,51 @@ +-- Migration 500 adds custom_headers_user_keys to mcp_server_configs and +-- creates mcp_server_user_header_values. Insert a fixture row exercising +-- the user-set header values flow. + +INSERT INTO mcp_server_configs ( + id, + display_name, + slug, + url, + transport, + auth_type, + custom_headers, + custom_headers_user_keys, + availability, + enabled, + created_by, + updated_by, + created_at, + updated_at +) VALUES ( + 'c3d4e5f6-a7b8-9012-cdef-123456789012', + 'Fixture User-Set Headers MCP Server', + 'fixture-user-set-headers-mcp-server', + 'https://mcp.example.com/streamable', + 'streamable_http', + 'custom_headers', + '{"X-Org-ID":"acme"}', + ARRAY['X-User-Token'], + 'default_off', + TRUE, + '30095c71-380b-457a-8995-97b8ee6e5307', -- admin@coder.com + '30095c71-380b-457a-8995-97b8ee6e5307', -- admin@coder.com + '2024-01-01 00:00:00+00', + '2024-01-01 00:00:00+00' +); + +INSERT INTO mcp_server_user_header_values ( + id, + mcp_server_config_id, + user_id, + header_values, + created_at, + updated_at +) VALUES ( + 'd4e5f6a7-b8c9-0123-defa-234567890123', + 'c3d4e5f6-a7b8-9012-cdef-123456789012', + '30095c71-380b-457a-8995-97b8ee6e5307', -- admin@coder.com + '{"X-User-Token":"user-supplied-token"}', + '2024-01-01 00:00:00+00', + '2024-01-01 00:00:00+00' +); diff --git a/coderd/database/models.go b/coderd/database/models.go index ebfaa7a051..17c2588e93 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -5001,6 +5001,7 @@ type MCPServerConfig struct { ModelIntent bool `db:"model_intent" json:"model_intent"` AllowInPlanMode bool `db:"allow_in_plan_mode" json:"allow_in_plan_mode"` ForwardCoderHeaders bool `db:"forward_coder_headers" json:"forward_coder_headers"` + CustomHeadersUserKeys []string `db:"custom_headers_user_keys" json:"custom_headers_user_keys"` } type MCPServerUserToken struct { @@ -5017,6 +5018,16 @@ type MCPServerUserToken struct { UpdatedAt time.Time `db:"updated_at" json:"updated_at"` } +type McpServerUserHeaderValue struct { + ID uuid.UUID `db:"id" json:"id"` + MCPServerConfigID uuid.UUID `db:"mcp_server_config_id" json:"mcp_server_config_id"` + UserID uuid.UUID `db:"user_id" json:"user_id"` + HeaderValues string `db:"header_values" json:"header_values"` + HeaderValuesKeyID sql.NullString `db:"header_values_key_id" json:"header_values_key_id"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` +} + type NotificationMessage struct { ID uuid.UUID `db:"id" json:"id"` NotificationTemplateID uuid.UUID `db:"notification_template_id" json:"notification_template_id"` diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index dc646121dc..2876d79d2d 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -15059,7 +15059,7 @@ func (q *sqlQuerier) DeleteMCPServerUserToken(ctx context.Context, arg DeleteMCP const getEnabledMCPServerConfigs = `-- name: GetEnabledMCPServerConfigs :many SELECT - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys FROM mcp_server_configs WHERE @@ -15108,6 +15108,7 @@ func (q *sqlQuerier) GetEnabledMCPServerConfigs(ctx context.Context) ([]MCPServe &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ); err != nil { return nil, err } @@ -15124,7 +15125,7 @@ func (q *sqlQuerier) GetEnabledMCPServerConfigs(ctx context.Context) ([]MCPServe const getForcedMCPServerConfigs = `-- name: GetForcedMCPServerConfigs :many SELECT - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys FROM mcp_server_configs WHERE @@ -15174,6 +15175,7 @@ func (q *sqlQuerier) GetForcedMCPServerConfigs(ctx context.Context) ([]MCPServer &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ); err != nil { return nil, err } @@ -15190,7 +15192,7 @@ func (q *sqlQuerier) GetForcedMCPServerConfigs(ctx context.Context) ([]MCPServer const getMCPServerConfigByID = `-- name: GetMCPServerConfigByID :one SELECT - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys FROM mcp_server_configs WHERE @@ -15231,13 +15233,14 @@ func (q *sqlQuerier) GetMCPServerConfigByID(ctx context.Context, id uuid.UUID) ( &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ) return i, err } const getMCPServerConfigBySlug = `-- name: GetMCPServerConfigBySlug :one SELECT - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys FROM mcp_server_configs WHERE @@ -15278,13 +15281,14 @@ func (q *sqlQuerier) GetMCPServerConfigBySlug(ctx context.Context, slug string) &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ) return i, err } const getMCPServerConfigs = `-- name: GetMCPServerConfigs :many SELECT - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys FROM mcp_server_configs ORDER BY @@ -15331,6 +15335,7 @@ func (q *sqlQuerier) GetMCPServerConfigs(ctx context.Context) ([]MCPServerConfig &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ); err != nil { return nil, err } @@ -15347,7 +15352,7 @@ func (q *sqlQuerier) GetMCPServerConfigs(ctx context.Context) ([]MCPServerConfig const getMCPServerConfigsByIDs = `-- name: GetMCPServerConfigsByIDs :many SELECT - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys FROM mcp_server_configs WHERE @@ -15396,6 +15401,7 @@ func (q *sqlQuerier) GetMCPServerConfigsByIDs(ctx context.Context, ids []uuid.UU &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ); err != nil { return nil, err } @@ -15547,7 +15553,7 @@ INSERT INTO mcp_server_configs ( $27::uuid ) RETURNING - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys ` type InsertMCPServerConfigParams struct { @@ -15642,6 +15648,7 @@ func (q *sqlQuerier) InsertMCPServerConfig(ctx context.Context, arg InsertMCPSer &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ) return i, err } @@ -15680,7 +15687,7 @@ SET WHERE id = $27::uuid RETURNING - id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers + id, display_name, slug, description, icon_url, transport, url, auth_type, oauth2_client_id, oauth2_client_secret, oauth2_client_secret_key_id, oauth2_auth_url, oauth2_token_url, oauth2_scopes, api_key_header, api_key_value, api_key_value_key_id, custom_headers, custom_headers_key_id, tool_allow_list, tool_deny_list, availability, enabled, created_by, updated_by, created_at, updated_at, model_intent, allow_in_plan_mode, forward_coder_headers, custom_headers_user_keys ` type UpdateMCPServerConfigParams struct { @@ -15775,6 +15782,7 @@ func (q *sqlQuerier) UpdateMCPServerConfig(ctx context.Context, arg UpdateMCPSer &i.ModelIntent, &i.AllowInPlanMode, &i.ForwardCoderHeaders, + pq.Array(&i.CustomHeadersUserKeys), ) return i, err } diff --git a/coderd/database/unique_constraint.go b/coderd/database/unique_constraint.go index 3d5e5dabcf..a83e6064c7 100644 --- a/coderd/database/unique_constraint.go +++ b/coderd/database/unique_constraint.go @@ -51,6 +51,8 @@ const ( UniqueLicensesPkey UniqueConstraint = "licenses_pkey" // ALTER TABLE ONLY licenses ADD CONSTRAINT licenses_pkey PRIMARY KEY (id); UniqueMcpServerConfigsPkey UniqueConstraint = "mcp_server_configs_pkey" // ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_pkey PRIMARY KEY (id); UniqueMcpServerConfigsSlugKey UniqueConstraint = "mcp_server_configs_slug_key" // ALTER TABLE ONLY mcp_server_configs ADD CONSTRAINT mcp_server_configs_slug_key UNIQUE (slug); + UniqueMcpServerUserHeaderValuesMcpServerConfigIDUserIDKey UniqueConstraint = "mcp_server_user_header_values_mcp_server_config_id_user_id_key" // ALTER TABLE ONLY mcp_server_user_header_values ADD CONSTRAINT mcp_server_user_header_values_mcp_server_config_id_user_id_key UNIQUE (mcp_server_config_id, user_id); + UniqueMcpServerUserHeaderValuesPkey UniqueConstraint = "mcp_server_user_header_values_pkey" // ALTER TABLE ONLY mcp_server_user_header_values ADD CONSTRAINT mcp_server_user_header_values_pkey PRIMARY KEY (id); UniqueMcpServerUserTokensMcpServerConfigIDUserIDKey UniqueConstraint = "mcp_server_user_tokens_mcp_server_config_id_user_id_key" // ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_mcp_server_config_id_user_id_key UNIQUE (mcp_server_config_id, user_id); UniqueMcpServerUserTokensPkey UniqueConstraint = "mcp_server_user_tokens_pkey" // ALTER TABLE ONLY mcp_server_user_tokens ADD CONSTRAINT mcp_server_user_tokens_pkey PRIMARY KEY (id); UniqueNotificationMessagesPkey UniqueConstraint = "notification_messages_pkey" // ALTER TABLE ONLY notification_messages ADD CONSTRAINT notification_messages_pkey PRIMARY KEY (id);