CREATE TABLE IF NOT EXISTS "plugin_storage" ( "row_id" varchar(255) PRIMARY KEY NOT NULL, "id" varchar(255) NOT NULL, "scope_id" varchar(255) NOT NULL, "plugin_id" text NOT NULL, "collection" text NOT NULL, "key" text NOT NULL, "data" json NOT NULL, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL);--> statement-breakpointCREATE UNIQUE INDEX IF NOT EXISTS "plugin_storage_scope_id_id_uidx" ON "plugin_storage" USING btree ("scope_id","id");--> statement-breakpointINSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")SELECT 'plugin_storage_' || md5('openapi:source:' || s."scope_id" || ':' || s."id"), '["openapi","source",' || to_json(s."id")::text || ']', s."scope_id", 'openapi', 'source', s."id", json_build_object( 'namespace', s."id", 'scope', s."scope_id", 'name', s."name", 'config', json_strip_nulls(json_build_object( 'spec', s."spec", 'sourceUrl', s."source_url", 'baseUrl', s."base_url", 'headers', h."headers", 'queryParams', q."queryParams", 'specFetchCredentials', CASE WHEN sfh."headers" IS NULL AND sfq."queryParams" IS NULL THEN NULL ELSE json_strip_nulls(json_build_object('headers', sfh."headers", 'queryParams', sfq."queryParams")) END, 'oauth2', s."oauth2" )) ), now(), now()FROM "openapi_source" sLEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers" FROM "openapi_source_header" GROUP BY "scope_id", "source_id") h ON h."scope_id" = s."scope_id" AND h."source_id" = s."id"LEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams" FROM "openapi_source_query_param" GROUP BY "scope_id", "source_id") q ON q."scope_id" = s."scope_id" AND q."source_id" = s."id"LEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers" FROM "openapi_source_spec_fetch_header" GROUP BY "scope_id", "source_id") sfh ON sfh."scope_id" = s."scope_id" AND sfh."source_id" = s."id"LEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams" FROM "openapi_source_spec_fetch_query_param" GROUP BY "scope_id", "source_id") sfq ON sfq."scope_id" = s."scope_id" AND sfq."source_id" = s."id"ON CONFLICT DO NOTHING;--> statement-breakpointINSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")SELECT 'plugin_storage_' || md5('openapi:operation:' || o."scope_id" || ':' || o."id"), '["openapi","operation",' || to_json(o."id")::text || ']', o."scope_id", 'openapi', 'operation', o."id", json_build_object('toolId', o."id", 'sourceId', o."source_id", 'binding', o."binding"), now(), now()FROM "openapi_operation" oON CONFLICT DO NOTHING;--> statement-breakpointINSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")SELECT 'plugin_storage_' || md5('graphql:source:' || s."scope_id" || ':' || s."id"), '["graphql","source",' || to_json(s."id")::text || ']', s."scope_id", 'graphql', 'source', s."id", json_build_object( 'namespace', s."id", 'scope', s."scope_id", 'name', s."name", 'endpoint', s."endpoint", 'headers', COALESCE(h."headers", '{}'::json), 'queryParams', COALESCE(q."queryParams", '{}'::json), 'auth', CASE WHEN s."auth_kind" = 'oauth2' AND s."auth_connection_slot" IS NOT NULL THEN json_build_object('kind', 'oauth2', 'connectionSlot', s."auth_connection_slot") ELSE json_build_object('kind', 'none') END ), now(), now()FROM "graphql_source" sLEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers" FROM "graphql_source_header" GROUP BY "scope_id", "source_id") h ON h."scope_id" = s."scope_id" AND h."source_id" = s."id"LEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams" FROM "graphql_source_query_param" GROUP BY "scope_id", "source_id") q ON q."scope_id" = s."scope_id" AND q."source_id" = s."id"ON CONFLICT DO NOTHING;--> statement-breakpointINSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")SELECT 'plugin_storage_' || md5('graphql:operation:' || o."scope_id" || ':' || o."id"), '["graphql","operation",' || to_json(o."id")::text || ']', o."scope_id", 'graphql', 'operation', o."id", json_build_object('toolId', o."id", 'sourceId', o."source_id", 'binding', o."binding"), now(), now()FROM "graphql_operation" oON CONFLICT DO NOTHING;--> statement-breakpointINSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")SELECT 'plugin_storage_' || md5('mcp:source:' || s."scope_id" || ':' || s."id"), '["mcp","source",' || to_json(s."id")::text || ']', s."scope_id", 'mcp', 'source', s."id", json_build_object( 'namespace', s."id", 'scope', s."scope_id", 'name', s."name", 'config', CASE WHEN s."config"->>'transport' = 'remote' THEN jsonb_strip_nulls(s."config"::jsonb || jsonb_build_object( 'headers', h."headers", 'queryParams', q."queryParams", 'auth', CASE WHEN s."auth_kind" = 'header' THEN json_build_object('kind', 'header', 'headerName', COALESCE(s."auth_header_name", ''), 'secretSlot', s."auth_header_slot", 'prefix', s."auth_header_prefix") WHEN s."auth_kind" = 'oauth2' THEN json_build_object('kind', 'oauth2', 'connectionSlot', s."auth_connection_slot", 'clientIdSlot', s."auth_client_id_slot", 'clientSecretSlot', s."auth_client_secret_slot") ELSE json_build_object('kind', 'none') END )) ELSE s."config"::jsonb END ), now(), now()FROM "mcp_source" sLEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers" FROM "mcp_source_header" GROUP BY "scope_id", "source_id") h ON h."scope_id" = s."scope_id" AND h."source_id" = s."id"LEFT JOIN ( SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams" FROM "mcp_source_query_param" GROUP BY "scope_id", "source_id") q ON q."scope_id" = s."scope_id" AND q."source_id" = s."id"ON CONFLICT DO NOTHING;--> statement-breakpointINSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")SELECT 'plugin_storage_' || md5('mcp:binding:' || b."scope_id" || ':' || b."id"), '["mcp","binding",' || to_json(b."id")::text || ']', b."scope_id", 'mcp', 'binding', b."id", json_build_object('namespace', b."source_id", 'toolId', b."id", 'binding', b."binding"), b."created_at", now()FROM "mcp_binding" bON CONFLICT DO NOTHING;--> statement-breakpointDROP TABLE IF EXISTS "openapi_source";--> statement-breakpointDROP TABLE IF EXISTS "openapi_operation";--> statement-breakpointDROP TABLE IF EXISTS "openapi_source_header";--> statement-breakpointDROP TABLE IF EXISTS "openapi_source_query_param";--> statement-breakpointDROP TABLE IF EXISTS "openapi_source_spec_fetch_header";--> statement-breakpointDROP TABLE IF EXISTS "openapi_source_spec_fetch_query_param";--> statement-breakpointDROP TABLE IF EXISTS "graphql_source";--> statement-breakpointDROP TABLE IF EXISTS "graphql_source_header";--> statement-breakpointDROP TABLE IF EXISTS "graphql_source_query_param";--> statement-breakpointDROP TABLE IF EXISTS "graphql_operation";--> statement-breakpointDROP TABLE IF EXISTS "mcp_source";--> statement-breakpointDROP TABLE IF EXISTS "mcp_source_header";--> statement-breakpointDROP TABLE IF EXISTS "mcp_source_query_param";--> statement-breakpointDROP TABLE IF EXISTS "mcp_binding";
CREATE TABLE IF NOT EXISTS "plugin_storage" (
"row_id" varchar(255) PRIMARY KEY NOT NULL,
"id" varchar(255) NOT NULL,
"scope_id" varchar(255) NOT NULL,
"plugin_id" text NOT NULL,
"collection" text NOT NULL,
"key" text NOT NULL,
"data" json NOT NULL,
"created_at" timestamp NOT NULL,
"updated_at" timestamp NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX IF NOT EXISTS "plugin_storage_scope_id_id_uidx" ON "plugin_storage" USING btree ("scope_id","id");
--> statement-breakpoint
INSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")
SELECT
'plugin_storage_' || md5('openapi:source:' || s."scope_id" || ':' || s."id"),
'["openapi","source",' || to_json(s."id")::text || ']',
s."scope_id",
'openapi',
'source',
s."id",
json_build_object(
'namespace', s."id",
'scope', s."scope_id",
'name', s."name",
'config', json_strip_nulls(json_build_object(
'spec', s."spec",
'sourceUrl', s."source_url",
'baseUrl', s."base_url",
'headers', h."headers",
'queryParams', q."queryParams",
'specFetchCredentials', CASE WHEN sfh."headers" IS NULL AND sfq."queryParams" IS NULL THEN NULL ELSE json_strip_nulls(json_build_object('headers', sfh."headers", 'queryParams', sfq."queryParams")) END,
'oauth2', s."oauth2"
))
),
now(),
now()
FROM "openapi_source" s
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers"
FROM "openapi_source_header"
GROUP BY "scope_id", "source_id"
) h ON h."scope_id" = s."scope_id" AND h."source_id" = s."id"
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams"
FROM "openapi_source_query_param"
GROUP BY "scope_id", "source_id"
) q ON q."scope_id" = s."scope_id" AND q."source_id" = s."id"
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers"
FROM "openapi_source_spec_fetch_header"
GROUP BY "scope_id", "source_id"
) sfh ON sfh."scope_id" = s."scope_id" AND sfh."source_id" = s."id"
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams"
FROM "openapi_source_spec_fetch_query_param"
GROUP BY "scope_id", "source_id"
) sfq ON sfq."scope_id" = s."scope_id" AND sfq."source_id" = s."id"
ON CONFLICT DO NOTHING;
--> statement-breakpoint
INSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")
SELECT 'plugin_storage_' || md5('openapi:operation:' || o."scope_id" || ':' || o."id"), '["openapi","operation",' || to_json(o."id")::text || ']', o."scope_id", 'openapi', 'operation', o."id", json_build_object('toolId', o."id", 'sourceId', o."source_id", 'binding', o."binding"), now(), now()
FROM "openapi_operation" o
ON CONFLICT DO NOTHING;
--> statement-breakpoint
INSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")
SELECT
'plugin_storage_' || md5('graphql:source:' || s."scope_id" || ':' || s."id"),
'["graphql","source",' || to_json(s."id")::text || ']',
s."scope_id",
'graphql',
'source',
s."id",
json_build_object(
'namespace', s."id",
'scope', s."scope_id",
'name', s."name",
'endpoint', s."endpoint",
'headers', COALESCE(h."headers", '{}'::json),
'queryParams', COALESCE(q."queryParams", '{}'::json),
'auth', CASE WHEN s."auth_kind" = 'oauth2' AND s."auth_connection_slot" IS NOT NULL THEN json_build_object('kind', 'oauth2', 'connectionSlot', s."auth_connection_slot") ELSE json_build_object('kind', 'none') END
),
now(),
now()
FROM "graphql_source" s
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers"
FROM "graphql_source_header"
GROUP BY "scope_id", "source_id"
) h ON h."scope_id" = s."scope_id" AND h."source_id" = s."id"
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams"
FROM "graphql_source_query_param"
GROUP BY "scope_id", "source_id"
) q ON q."scope_id" = s."scope_id" AND q."source_id" = s."id"
ON CONFLICT DO NOTHING;
--> statement-breakpoint
INSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")
SELECT 'plugin_storage_' || md5('graphql:operation:' || o."scope_id" || ':' || o."id"), '["graphql","operation",' || to_json(o."id")::text || ']', o."scope_id", 'graphql', 'operation', o."id", json_build_object('toolId', o."id", 'sourceId', o."source_id", 'binding', o."binding"), now(), now()
FROM "graphql_operation" o
ON CONFLICT DO NOTHING;
--> statement-breakpoint
INSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")
SELECT
'plugin_storage_' || md5('mcp:source:' || s."scope_id" || ':' || s."id"),
'["mcp","source",' || to_json(s."id")::text || ']',
s."scope_id",
'mcp',
'source',
s."id",
json_build_object(
'namespace', s."id",
'scope', s."scope_id",
'name', s."name",
'config', CASE WHEN s."config"->>'transport' = 'remote' THEN jsonb_strip_nulls(s."config"::jsonb || jsonb_build_object(
'headers', h."headers",
'queryParams', q."queryParams",
'auth', CASE
WHEN s."auth_kind" = 'header' THEN json_build_object('kind', 'header', 'headerName', COALESCE(s."auth_header_name", ''), 'secretSlot', s."auth_header_slot", 'prefix', s."auth_header_prefix")
WHEN s."auth_kind" = 'oauth2' THEN json_build_object('kind', 'oauth2', 'connectionSlot', s."auth_connection_slot", 'clientIdSlot', s."auth_client_id_slot", 'clientSecretSlot', s."auth_client_secret_slot")
ELSE json_build_object('kind', 'none')
END
)) ELSE s."config"::jsonb END
),
now(),
now()
FROM "mcp_source" s
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "headers"
FROM "mcp_source_header"
GROUP BY "scope_id", "source_id"
) h ON h."scope_id" = s."scope_id" AND h."source_id" = s."id"
LEFT JOIN (
SELECT "scope_id", "source_id", json_object_agg("name", CASE WHEN "kind" = 'text' THEN to_json("text_value") ELSE json_build_object('kind', 'binding', 'slot', "slot_key", 'prefix', "prefix") END) AS "queryParams"
FROM "mcp_source_query_param"
GROUP BY "scope_id", "source_id"
) q ON q."scope_id" = s."scope_id" AND q."source_id" = s."id"
ON CONFLICT DO NOTHING;
--> statement-breakpoint
INSERT INTO "plugin_storage" ("row_id", "id", "scope_id", "plugin_id", "collection", "key", "data", "created_at", "updated_at")
SELECT 'plugin_storage_' || md5('mcp:binding:' || b."scope_id" || ':' || b."id"), '["mcp","binding",' || to_json(b."id")::text || ']', b."scope_id", 'mcp', 'binding', b."id", json_build_object('namespace', b."source_id", 'toolId', b."id", 'binding', b."binding"), b."created_at", now()
FROM "mcp_binding" b
ON CONFLICT DO NOTHING;
--> statement-breakpoint
DROP TABLE IF EXISTS "openapi_source";
--> statement-breakpoint
DROP TABLE IF EXISTS "openapi_operation";
--> statement-breakpoint
DROP TABLE IF EXISTS "openapi_source_header";
--> statement-breakpoint
DROP TABLE IF EXISTS "openapi_source_query_param";
--> statement-breakpoint
DROP TABLE IF EXISTS "openapi_source_spec_fetch_header";
--> statement-breakpoint
DROP TABLE IF EXISTS "openapi_source_spec_fetch_query_param";
--> statement-breakpoint
DROP TABLE IF EXISTS "graphql_source";
--> statement-breakpoint
DROP TABLE IF EXISTS "graphql_source_header";
--> statement-breakpoint
DROP TABLE IF EXISTS "graphql_source_query_param";
--> statement-breakpoint
DROP TABLE IF EXISTS "graphql_operation";
--> statement-breakpoint
DROP TABLE IF EXISTS "mcp_source";
--> statement-breakpoint
DROP TABLE IF EXISTS "mcp_source_header";
--> statement-breakpoint
DROP TABLE IF EXISTS "mcp_source_query_param";
--> statement-breakpoint
DROP TABLE IF EXISTS "mcp_binding";