CREATE TABLE IF NOT EXISTS `openapi_source` (`id` text NOT NULL, `scope_id` text NOT NULL, `name` text NOT NULL, `spec` text NOT NULL, `source_url` text, `base_url` text, `oauth2` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `openapi_operation` (`id` text NOT NULL, `scope_id` text NOT NULL, `source_id` text NOT NULL, `binding` text NOT NULL);--> statement-breakpointCREATE TABLE IF NOT EXISTS `openapi_source_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `openapi_source_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `openapi_source_spec_fetch_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `openapi_source_spec_fetch_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `graphql_source` (`id` text NOT NULL, `scope_id` text NOT NULL, `name` text NOT NULL, `endpoint` text NOT NULL, `auth_kind` text NOT NULL DEFAULT 'none', `auth_connection_slot` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `graphql_source_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `graphql_source_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `graphql_operation` (`id` text NOT NULL, `scope_id` text NOT NULL, `source_id` text NOT NULL, `binding` text NOT NULL);--> statement-breakpointCREATE TABLE IF NOT EXISTS `mcp_source` (`id` text NOT NULL, `scope_id` text NOT NULL, `name` text NOT NULL, `config` text NOT NULL, `auth_kind` text NOT NULL DEFAULT 'none', `auth_header_name` text, `auth_header_slot` text, `auth_header_prefix` text, `auth_connection_slot` text, `auth_client_id_slot` text, `auth_client_secret_slot` text, `created_at` integer);--> statement-breakpointCREATE TABLE IF NOT EXISTS `mcp_source_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `mcp_source_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);--> statement-breakpointCREATE TABLE IF NOT EXISTS `mcp_binding` (`id` text NOT NULL, `scope_id` text NOT NULL, `source_id` text NOT NULL, `binding` text NOT NULL, `created_at` integer);--> statement-breakpointCREATE TABLE IF NOT EXISTS `plugin_storage` ( `id` text NOT NULL, `scope_id` text NOT NULL, `plugin_id` text NOT NULL, `collection` text NOT NULL, `key` text NOT NULL, `data` text NOT NULL, `created_at` integer NOT NULL, `updated_at` integer NOT NULL, PRIMARY KEY(`scope_id`, `id`));--> statement-breakpointCREATE INDEX IF NOT EXISTS `plugin_storage_scope_id_idx` ON `plugin_storage` (`scope_id`);--> statement-breakpointCREATE INDEX IF NOT EXISTS `plugin_storage_plugin_id_collection_idx` ON `plugin_storage` (`plugin_id`, `collection`);--> statement-breakpointCREATE INDEX IF NOT EXISTS `plugin_storage_key_idx` ON `plugin_storage` (`key`);--> statement-breakpointINSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)SELECT json_array('openapi', 'source', s.`id`), s.`scope_id`, 'openapi', 'source', s.`id`, json_object( 'namespace', s.`id`, 'scope', s.`scope_id`, 'name', s.`name`, 'config', json_patch( json_patch( json_patch( json_patch( json_patch( json_patch( json_object('spec', s.`spec`), CASE WHEN s.`source_url` IS NULL THEN json_object() ELSE json_object('sourceUrl', s.`source_url`) END ), CASE WHEN s.`base_url` IS NULL THEN json_object() ELSE json_object('baseUrl', s.`base_url`) END ), CASE WHEN h.`headers` IS NULL THEN json_object() ELSE json_object('headers', json(h.`headers`)) END ), CASE WHEN q.`queryParams` IS NULL THEN json_object() ELSE json_object('queryParams', json(q.`queryParams`)) END ), CASE WHEN sfh.`headers` IS NULL AND sfq.`queryParams` IS NULL THEN json_object() ELSE json_object('specFetchCredentials', json_patch( CASE WHEN sfh.`headers` IS NULL THEN json_object() ELSE json_object('headers', json(sfh.`headers`)) END, CASE WHEN sfq.`queryParams` IS NULL THEN json_object() ELSE json_object('queryParams', json(sfq.`queryParams`)) END )) END ), CASE WHEN s.`oauth2` IS NULL THEN json_object() ELSE json_object('oauth2', json(s.`oauth2`)) END ) ), unixepoch('now') * 1000, unixepoch('now') * 1000FROM `openapi_source` sLEFT JOIN ( SELECT `scope_id`, `source_id`, json_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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`;--> statement-breakpointINSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)SELECT json_array('openapi', 'operation', o.`id`), o.`scope_id`, 'openapi', 'operation', o.`id`, json_object('toolId', o.`id`, 'sourceId', o.`source_id`, 'binding', json(o.`binding`)), unixepoch('now') * 1000, unixepoch('now') * 1000FROM `openapi_operation` o;--> statement-breakpointINSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)SELECT json_array('graphql', 'source', s.`id`), s.`scope_id`, 'graphql', 'source', s.`id`, json_object( 'namespace', s.`id`, 'scope', s.`scope_id`, 'name', s.`name`, 'endpoint', s.`endpoint`, 'headers', COALESCE(json(h.`headers`), json_object()), 'queryParams', COALESCE(json(q.`queryParams`), json_object()), 'auth', CASE WHEN s.`auth_kind` = 'oauth2' AND s.`auth_connection_slot` IS NOT NULL THEN json_object('kind', 'oauth2', 'connectionSlot', s.`auth_connection_slot`) ELSE json_object('kind', 'none') END ), unixepoch('now') * 1000, unixepoch('now') * 1000FROM `graphql_source` sLEFT JOIN ( SELECT `scope_id`, `source_id`, json_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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`;--> statement-breakpointINSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)SELECT json_array('graphql', 'operation', o.`id`), o.`scope_id`, 'graphql', 'operation', o.`id`, json_object('toolId', o.`id`, 'sourceId', o.`source_id`, 'binding', json(o.`binding`)), unixepoch('now') * 1000, unixepoch('now') * 1000FROM `graphql_operation` o;--> statement-breakpointINSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)SELECT json_array('mcp', 'source', s.`id`), s.`scope_id`, 'mcp', 'source', s.`id`, json_object( 'namespace', s.`id`, 'scope', s.`scope_id`, 'name', s.`name`, 'config', CASE WHEN json_extract(s.`config`, '$.transport') = 'remote' THEN json_patch( json_patch( json_patch( json(s.`config`), CASE WHEN h.`headers` IS NULL THEN json_object() ELSE json_object('headers', json(h.`headers`)) END ), CASE WHEN q.`queryParams` IS NULL THEN json_object() ELSE json_object('queryParams', json(q.`queryParams`)) END ), json_object('auth', CASE WHEN s.`auth_kind` = 'header' THEN json_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_object('kind', 'oauth2', 'connectionSlot', s.`auth_connection_slot`, 'clientIdSlot', s.`auth_client_id_slot`, 'clientSecretSlot', s.`auth_client_secret_slot`) ELSE json_object('kind', 'none') END ) ) ELSE json(s.`config`) END ), unixepoch('now') * 1000, unixepoch('now') * 1000FROM `mcp_source` sLEFT JOIN ( SELECT `scope_id`, `source_id`, json_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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`;--> statement-breakpointINSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)SELECT json_array('mcp', 'binding', b.`id`), b.`scope_id`, 'mcp', 'binding', b.`id`, json_object('namespace', b.`source_id`, 'toolId', b.`id`, 'binding', json(b.`binding`)), COALESCE(b.`created_at`, unixepoch('now') * 1000), unixepoch('now') * 1000FROM `mcp_binding` b;--> 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 `openapi_source` (`id` text NOT NULL, `scope_id` text NOT NULL, `name` text NOT NULL, `spec` text NOT NULL, `source_url` text, `base_url` text, `oauth2` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `openapi_operation` (`id` text NOT NULL, `scope_id` text NOT NULL, `source_id` text NOT NULL, `binding` text NOT NULL);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `openapi_source_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `openapi_source_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `openapi_source_spec_fetch_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `openapi_source_spec_fetch_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `graphql_source` (`id` text NOT NULL, `scope_id` text NOT NULL, `name` text NOT NULL, `endpoint` text NOT NULL, `auth_kind` text NOT NULL DEFAULT 'none', `auth_connection_slot` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `graphql_source_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `graphql_source_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `graphql_operation` (`id` text NOT NULL, `scope_id` text NOT NULL, `source_id` text NOT NULL, `binding` text NOT NULL);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `mcp_source` (`id` text NOT NULL, `scope_id` text NOT NULL, `name` text NOT NULL, `config` text NOT NULL, `auth_kind` text NOT NULL DEFAULT 'none', `auth_header_name` text, `auth_header_slot` text, `auth_header_prefix` text, `auth_connection_slot` text, `auth_client_id_slot` text, `auth_client_secret_slot` text, `created_at` integer);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `mcp_source_header` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `mcp_source_query_param` (`id` text, `scope_id` text, `source_id` text, `name` text, `kind` text, `text_value` text, `slot_key` text, `prefix` text);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `mcp_binding` (`id` text NOT NULL, `scope_id` text NOT NULL, `source_id` text NOT NULL, `binding` text NOT NULL, `created_at` integer);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS `plugin_storage` (
`id` text NOT NULL,
`scope_id` text NOT NULL,
`plugin_id` text NOT NULL,
`collection` text NOT NULL,
`key` text NOT NULL,
`data` text NOT NULL,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL,
PRIMARY KEY(`scope_id`, `id`)
);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS `plugin_storage_scope_id_idx` ON `plugin_storage` (`scope_id`);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS `plugin_storage_plugin_id_collection_idx` ON `plugin_storage` (`plugin_id`, `collection`);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS `plugin_storage_key_idx` ON `plugin_storage` (`key`);
--> statement-breakpoint
INSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)
SELECT
json_array('openapi', 'source', s.`id`),
s.`scope_id`,
'openapi',
'source',
s.`id`,
json_object(
'namespace', s.`id`,
'scope', s.`scope_id`,
'name', s.`name`,
'config', json_patch(
json_patch(
json_patch(
json_patch(
json_patch(
json_patch(
json_object('spec', s.`spec`),
CASE WHEN s.`source_url` IS NULL THEN json_object() ELSE json_object('sourceUrl', s.`source_url`) END
),
CASE WHEN s.`base_url` IS NULL THEN json_object() ELSE json_object('baseUrl', s.`base_url`) END
),
CASE WHEN h.`headers` IS NULL THEN json_object() ELSE json_object('headers', json(h.`headers`)) END
),
CASE WHEN q.`queryParams` IS NULL THEN json_object() ELSE json_object('queryParams', json(q.`queryParams`)) END
),
CASE WHEN sfh.`headers` IS NULL AND sfq.`queryParams` IS NULL THEN json_object() ELSE json_object('specFetchCredentials', json_patch(
CASE WHEN sfh.`headers` IS NULL THEN json_object() ELSE json_object('headers', json(sfh.`headers`)) END,
CASE WHEN sfq.`queryParams` IS NULL THEN json_object() ELSE json_object('queryParams', json(sfq.`queryParams`)) END
)) END
),
CASE WHEN s.`oauth2` IS NULL THEN json_object() ELSE json_object('oauth2', json(s.`oauth2`)) END
)
),
unixepoch('now') * 1000,
unixepoch('now') * 1000
FROM `openapi_source` s
LEFT JOIN (
SELECT `scope_id`, `source_id`, json_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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`;
--> statement-breakpoint
INSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)
SELECT json_array('openapi', 'operation', o.`id`), o.`scope_id`, 'openapi', 'operation', o.`id`, json_object('toolId', o.`id`, 'sourceId', o.`source_id`, 'binding', json(o.`binding`)), unixepoch('now') * 1000, unixepoch('now') * 1000
FROM `openapi_operation` o;
--> statement-breakpoint
INSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)
SELECT
json_array('graphql', 'source', s.`id`),
s.`scope_id`,
'graphql',
'source',
s.`id`,
json_object(
'namespace', s.`id`,
'scope', s.`scope_id`,
'name', s.`name`,
'endpoint', s.`endpoint`,
'headers', COALESCE(json(h.`headers`), json_object()),
'queryParams', COALESCE(json(q.`queryParams`), json_object()),
'auth', CASE WHEN s.`auth_kind` = 'oauth2' AND s.`auth_connection_slot` IS NOT NULL THEN json_object('kind', 'oauth2', 'connectionSlot', s.`auth_connection_slot`) ELSE json_object('kind', 'none') END
),
unixepoch('now') * 1000,
unixepoch('now') * 1000
FROM `graphql_source` s
LEFT JOIN (
SELECT `scope_id`, `source_id`, json_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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`;
--> statement-breakpoint
INSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)
SELECT json_array('graphql', 'operation', o.`id`), o.`scope_id`, 'graphql', 'operation', o.`id`, json_object('toolId', o.`id`, 'sourceId', o.`source_id`, 'binding', json(o.`binding`)), unixepoch('now') * 1000, unixepoch('now') * 1000
FROM `graphql_operation` o;
--> statement-breakpoint
INSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)
SELECT
json_array('mcp', 'source', s.`id`),
s.`scope_id`,
'mcp',
'source',
s.`id`,
json_object(
'namespace', s.`id`,
'scope', s.`scope_id`,
'name', s.`name`,
'config', CASE WHEN json_extract(s.`config`, '$.transport') = 'remote' THEN json_patch(
json_patch(
json_patch(
json(s.`config`),
CASE WHEN h.`headers` IS NULL THEN json_object() ELSE json_object('headers', json(h.`headers`)) END
),
CASE WHEN q.`queryParams` IS NULL THEN json_object() ELSE json_object('queryParams', json(q.`queryParams`)) END
),
json_object('auth',
CASE
WHEN s.`auth_kind` = 'header' THEN json_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_object('kind', 'oauth2', 'connectionSlot', s.`auth_connection_slot`, 'clientIdSlot', s.`auth_client_id_slot`, 'clientSecretSlot', s.`auth_client_secret_slot`)
ELSE json_object('kind', 'none')
END
)
) ELSE json(s.`config`) END
),
unixepoch('now') * 1000,
unixepoch('now') * 1000
FROM `mcp_source` s
LEFT JOIN (
SELECT `scope_id`, `source_id`, json_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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_group_object(`name`, CASE WHEN `kind` = 'text' THEN json_quote(`text_value`) ELSE json_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`;
--> statement-breakpoint
INSERT OR REPLACE INTO `plugin_storage` (`id`, `scope_id`, `plugin_id`, `collection`, `key`, `data`, `created_at`, `updated_at`)
SELECT json_array('mcp', 'binding', b.`id`), b.`scope_id`, 'mcp', 'binding', b.`id`, json_object('namespace', b.`source_id`, 'toolId', b.`id`, 'binding', json(b.`binding`)), COALESCE(b.`created_at`, unixepoch('now') * 1000), unixepoch('now') * 1000
FROM `mcp_binding` b;
--> 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`;