integrate-sdk 0.8.61-dev.0 → 0.8.62-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -10347,21 +10347,7 @@ var init_ai = __esm(() => {
10347
10347
  init_trigger_tools();
10348
10348
  });
10349
10349
 
10350
- // src/triggers/types.ts
10351
- var exports_types = {};
10352
- __export(exports_types, {
10353
- WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
10354
- MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
10355
- });
10356
- var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10357
-
10358
10350
  // src/triggers/webhooks.ts
10359
- var exports_webhooks = {};
10360
- __export(exports_webhooks, {
10361
- signPayload: () => signPayload,
10362
- deliverWebhooks: () => deliverWebhooks,
10363
- deliverWebhook: () => deliverWebhook
10364
- });
10365
10351
  async function signPayload(payload, secret) {
10366
10352
  const encoder = new TextEncoder;
10367
10353
  const data = encoder.encode(JSON.stringify(payload));
@@ -10410,6 +10396,155 @@ var init_webhooks = __esm(() => {
10410
10396
  logger30 = createLogger("Webhooks", "server");
10411
10397
  });
10412
10398
 
10399
+ // src/triggers/types.ts
10400
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10401
+
10402
+ // src/triggers/executor.ts
10403
+ var exports_executor = {};
10404
+ __export(exports_executor, {
10405
+ executeTrigger: () => executeTrigger
10406
+ });
10407
+ async function executeTrigger(trigger, config, context) {
10408
+ const steps = [];
10409
+ let currentToolName = trigger.toolName;
10410
+ let currentToolArguments = trigger.toolArguments;
10411
+ let currentProvider = trigger.provider;
10412
+ let stepIndex = 0;
10413
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10414
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10415
+ if (!stepValidation.valid) {
10416
+ logger31.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10417
+ break;
10418
+ }
10419
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10420
+ if (!providerToken) {
10421
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10422
+ logger31.error(`[Trigger ${trigger.id}] ${error}`);
10423
+ steps.push({
10424
+ stepIndex,
10425
+ toolName: currentToolName,
10426
+ success: false,
10427
+ error,
10428
+ duration: 0,
10429
+ executedAt: new Date().toISOString()
10430
+ });
10431
+ await config.triggers.update(trigger.id, {
10432
+ lastRunAt: new Date().toISOString(),
10433
+ runCount: (trigger.runCount || 0) + 1,
10434
+ lastError: error,
10435
+ status: "failed"
10436
+ }, context);
10437
+ return { success: false, steps, error };
10438
+ }
10439
+ const startTime = Date.now();
10440
+ let toolResult;
10441
+ let stepSuccess = true;
10442
+ let stepError;
10443
+ try {
10444
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10445
+ } catch (err) {
10446
+ stepSuccess = false;
10447
+ stepError = err.message || "Tool execution failed";
10448
+ logger31.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10449
+ }
10450
+ const duration = Date.now() - startTime;
10451
+ const executedAt = new Date().toISOString();
10452
+ steps.push({
10453
+ stepIndex,
10454
+ toolName: currentToolName,
10455
+ success: stepSuccess,
10456
+ result: stepSuccess ? toolResult : undefined,
10457
+ error: stepError,
10458
+ duration,
10459
+ executedAt
10460
+ });
10461
+ if (!config.triggers.onComplete || !stepSuccess) {
10462
+ const updates = {
10463
+ lastRunAt: executedAt,
10464
+ runCount: (trigger.runCount || 0) + 1
10465
+ };
10466
+ if (stepSuccess) {
10467
+ updates.lastResult = toolResult;
10468
+ updates.lastError = undefined;
10469
+ if (trigger.schedule.type === "once") {
10470
+ updates.status = "completed";
10471
+ }
10472
+ } else {
10473
+ updates.lastError = stepError;
10474
+ updates.status = "failed";
10475
+ }
10476
+ await config.triggers.update(trigger.id, updates, context);
10477
+ return { success: stepSuccess, steps, error: stepError };
10478
+ }
10479
+ const completeRequest = {
10480
+ success: stepSuccess,
10481
+ result: stepSuccess ? toolResult : undefined,
10482
+ error: stepError,
10483
+ executedAt,
10484
+ duration,
10485
+ stepIndex,
10486
+ previousResults: steps,
10487
+ final: false
10488
+ };
10489
+ const completeResponse = await config.triggers.onComplete({
10490
+ trigger,
10491
+ request: completeRequest,
10492
+ context
10493
+ });
10494
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10495
+ currentToolName = completeResponse.nextStep.toolName;
10496
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10497
+ currentProvider = completeResponse.nextStep.provider;
10498
+ stepIndex++;
10499
+ continue;
10500
+ }
10501
+ const finalUpdates = {
10502
+ lastRunAt: executedAt,
10503
+ runCount: (trigger.runCount || 0) + 1
10504
+ };
10505
+ if (stepSuccess) {
10506
+ finalUpdates.lastResult = toolResult;
10507
+ finalUpdates.lastError = undefined;
10508
+ if (trigger.schedule.type === "once") {
10509
+ finalUpdates.status = "completed";
10510
+ }
10511
+ } else {
10512
+ finalUpdates.lastError = stepError;
10513
+ finalUpdates.status = "failed";
10514
+ }
10515
+ await config.triggers.update(trigger.id, finalUpdates, context);
10516
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10517
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10518
+ const payload = {
10519
+ triggerId: trigger.id,
10520
+ success: steps.every((s) => s.success),
10521
+ steps,
10522
+ totalSteps: steps.length,
10523
+ totalDuration,
10524
+ executedAt
10525
+ };
10526
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10527
+ }
10528
+ return { success: stepSuccess, steps, error: stepError };
10529
+ }
10530
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10531
+ logger31.error(`[Trigger ${trigger.id}] ${limitError}`);
10532
+ await config.triggers.update(trigger.id, {
10533
+ lastRunAt: new Date().toISOString(),
10534
+ runCount: (trigger.runCount || 0) + 1,
10535
+ lastError: limitError,
10536
+ status: "failed"
10537
+ }, context);
10538
+ return { success: false, steps, error: limitError };
10539
+ }
10540
+ var logger31;
10541
+ var init_executor = __esm(() => {
10542
+ init_logger();
10543
+ init_utils2();
10544
+ init_webhooks();
10545
+ logger31 = createLogger("TriggerExecutor", "server");
10546
+ });
10547
+
10413
10548
  // src/server.ts
10414
10549
  var exports_server = {};
10415
10550
  __export(exports_server, {
@@ -10503,7 +10638,7 @@ function createMCPServer(config) {
10503
10638
  if (integration.oauth) {
10504
10639
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10505
10640
  if (!clientId || !clientSecret) {
10506
- logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10641
+ logger32.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10507
10642
  return integration;
10508
10643
  }
10509
10644
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10634,7 +10769,7 @@ function createMCPServer(config) {
10634
10769
  }
10635
10770
  return response2;
10636
10771
  } catch (error) {
10637
- logger31.error("[MCP Tool Call] Error:", error);
10772
+ logger32.error("[MCP Tool Call] Error:", error);
10638
10773
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10639
10774
  }
10640
10775
  }
@@ -10650,6 +10785,57 @@ function createMCPServer(config) {
10650
10785
  }));
10651
10786
  return Response.json({ integrations });
10652
10787
  }
10788
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10789
+ if (!config.triggers) {
10790
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10791
+ }
10792
+ try {
10793
+ const apiKey = webRequest.headers.get("x-api-key");
10794
+ if (!apiKey || apiKey !== config.apiKey) {
10795
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10796
+ }
10797
+ const body = await webRequest.json();
10798
+ const { triggerId } = body;
10799
+ if (!triggerId) {
10800
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10801
+ }
10802
+ const trigger = await config.triggers.get(triggerId);
10803
+ if (!trigger) {
10804
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10805
+ }
10806
+ if (!trigger.provider) {
10807
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10808
+ }
10809
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10810
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10811
+ const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10812
+ const oauthHandler = new OAuthHandler2({
10813
+ providers,
10814
+ serverUrl: config.serverUrl,
10815
+ apiKey: config.apiKey,
10816
+ setProviderToken: config.setProviderToken,
10817
+ removeProviderToken: config.removeProviderToken,
10818
+ getSessionContext: config.getSessionContext
10819
+ });
10820
+ const executionResult = await executeTrigger2(trigger, {
10821
+ triggers: config.triggers,
10822
+ getProviderToken: async (provider, email, ctx) => {
10823
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10824
+ },
10825
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10826
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10827
+ }
10828
+ }, triggerContext);
10829
+ return Response.json({
10830
+ success: executionResult.success,
10831
+ steps: executionResult.steps,
10832
+ error: executionResult.error
10833
+ });
10834
+ } catch (error) {
10835
+ logger32.error("[Trigger Notify] Error:", error);
10836
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10837
+ }
10838
+ }
10653
10839
  if (segments.length >= 1 && segments[0] === "triggers") {
10654
10840
  if (!config.triggers) {
10655
10841
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10690,8 +10876,9 @@ function createMCPServer(config) {
10690
10876
  };
10691
10877
  const created = await config.triggers.create(trigger, context2);
10692
10878
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10693
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10879
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10694
10880
  try {
10881
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10695
10882
  await fetch(`${schedulerUrl}/scheduler/register`, {
10696
10883
  method: "POST",
10697
10884
  headers: {
@@ -10701,8 +10888,7 @@ function createMCPServer(config) {
10701
10888
  body: JSON.stringify({
10702
10889
  triggerId: created.id,
10703
10890
  schedule: created.schedule,
10704
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10705
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10891
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10706
10892
  metadata: {
10707
10893
  userId: context2?.userId,
10708
10894
  provider: created.provider
@@ -10710,7 +10896,7 @@ function createMCPServer(config) {
10710
10896
  })
10711
10897
  });
10712
10898
  } catch (scheduleError) {
10713
- logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10899
+ logger32.error("[Trigger] Failed to register with scheduler:", scheduleError);
10714
10900
  }
10715
10901
  return Response.json(created, { status: 201 });
10716
10902
  }
@@ -10745,7 +10931,7 @@ function createMCPServer(config) {
10745
10931
  body: JSON.stringify({ triggerId })
10746
10932
  });
10747
10933
  } catch (error) {
10748
- logger31.error("[Trigger] Failed to pause in scheduler:", error);
10934
+ logger32.error("[Trigger] Failed to pause in scheduler:", error);
10749
10935
  }
10750
10936
  return Response.json(updated);
10751
10937
  } else if (subAction === "resume" && method === "POST") {
@@ -10773,7 +10959,7 @@ function createMCPServer(config) {
10773
10959
  body: JSON.stringify({ triggerId })
10774
10960
  });
10775
10961
  } catch (error) {
10776
- logger31.error("[Trigger] Failed to resume in scheduler:", error);
10962
+ logger32.error("[Trigger] Failed to resume in scheduler:", error);
10777
10963
  }
10778
10964
  return Response.json(updated);
10779
10965
  } else if (subAction === "run" && method === "POST") {
@@ -10784,10 +10970,7 @@ function createMCPServer(config) {
10784
10970
  if (!trigger.provider) {
10785
10971
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10786
10972
  }
10787
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10788
- if (!providerToken) {
10789
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10790
- }
10973
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10791
10974
  const { OAuthHandler: OAuthHandler2 } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10792
10975
  const oauthHandler = new OAuthHandler2({
10793
10976
  providers,
@@ -10797,145 +10980,23 @@ function createMCPServer(config) {
10797
10980
  removeProviderToken: config.removeProviderToken,
10798
10981
  getSessionContext: config.getSessionContext
10799
10982
  });
10800
- const startTime = Date.now();
10801
- try {
10802
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10803
- const duration = Date.now() - startTime;
10804
- const executionResult = {
10805
- success: true,
10806
- result,
10807
- executedAt: new Date().toISOString(),
10808
- duration
10809
- };
10810
- await config.triggers.update(triggerId, {
10811
- lastRunAt: executionResult.executedAt,
10812
- runCount: (trigger.runCount || 0) + 1,
10813
- lastResult: result,
10814
- lastError: undefined
10815
- }, context2);
10816
- return Response.json(executionResult);
10817
- } catch (error) {
10818
- const duration = Date.now() - startTime;
10819
- const executionResult = {
10820
- success: false,
10821
- error: error.message || "Tool execution failed",
10822
- executedAt: new Date().toISOString(),
10823
- duration
10824
- };
10825
- await config.triggers.update(triggerId, {
10826
- lastRunAt: executionResult.executedAt,
10827
- runCount: (trigger.runCount || 0) + 1,
10828
- lastError: error.message,
10829
- status: "failed"
10830
- }, context2);
10831
- return Response.json(executionResult, { status: 500 });
10832
- }
10833
- } else if (subAction === "execute" && method === "GET") {
10834
- const apiKey = webRequest.headers.get("x-api-key");
10835
- if (!apiKey || apiKey !== config.apiKey) {
10836
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10837
- }
10838
- const trigger = await config.triggers.get(triggerId, context2);
10839
- if (!trigger) {
10840
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10841
- }
10842
- if (!trigger.provider) {
10843
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10844
- }
10845
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10846
- if (!providerToken) {
10847
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10848
- }
10849
- return Response.json({
10850
- trigger: {
10851
- id: trigger.id,
10852
- toolName: trigger.toolName,
10853
- toolArguments: trigger.toolArguments,
10854
- provider: trigger.provider
10983
+ const executionResult = await executeTrigger2(trigger, {
10984
+ triggers: config.triggers,
10985
+ getProviderToken: async (provider, email, ctx) => {
10986
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10855
10987
  },
10856
- accessToken: providerToken.accessToken,
10857
- tokenType: providerToken.tokenType || "Bearer"
10858
- });
10859
- } else if (subAction === "complete" && method === "POST") {
10860
- const apiKey = webRequest.headers.get("x-api-key");
10861
- if (!apiKey || apiKey !== config.apiKey) {
10862
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10863
- }
10864
- const body = await webRequest.json();
10865
- const trigger = await config.triggers.get(triggerId, context2);
10866
- if (!trigger) {
10867
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10868
- }
10869
- if (body.stepIndex != null) {
10870
- const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
10871
- const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
10872
- const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
10873
- if (!stepValidation.valid) {
10874
- return Response.json({ error: stepValidation.error }, { status: 400 });
10988
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10989
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10875
10990
  }
10876
- }
10877
- if (config.triggers.onComplete) {
10878
- try {
10879
- const completeResponse = await config.triggers.onComplete({
10880
- trigger,
10881
- request: body,
10882
- context: context2
10883
- });
10884
- if (completeResponse.hasMore) {
10885
- return Response.json(completeResponse);
10886
- }
10887
- const updates2 = {
10888
- lastRunAt: body.executedAt,
10889
- runCount: (trigger.runCount || 0) + 1
10890
- };
10891
- if (body.success) {
10892
- updates2.lastResult = body.result;
10893
- updates2.lastError = undefined;
10894
- if (trigger.schedule.type === "once") {
10895
- updates2.status = "completed";
10896
- }
10897
- } else {
10898
- updates2.lastError = body.error;
10899
- updates2.status = "failed";
10900
- }
10901
- await config.triggers.update(triggerId, updates2, context2);
10902
- if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10903
- const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
10904
- const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
10905
- const steps = body.previousResults || [];
10906
- const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10907
- const payload = {
10908
- triggerId,
10909
- success: body.success,
10910
- steps,
10911
- totalSteps: steps.length,
10912
- totalDuration,
10913
- executedAt: body.executedAt
10914
- };
10915
- deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
10916
- }
10917
- return Response.json(completeResponse);
10918
- } catch (error) {
10919
- logger31.error("onComplete callback error:", error);
10920
- return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
10921
- }
10922
- }
10923
- const updates = {
10924
- lastRunAt: body.executedAt,
10925
- runCount: (trigger.runCount || 0) + 1
10926
- };
10927
- if (body.success) {
10928
- updates.lastResult = body.result;
10929
- updates.lastError = undefined;
10930
- if (trigger.schedule.type === "once") {
10931
- updates.status = "completed";
10932
- }
10933
- } else {
10934
- updates.lastError = body.error;
10935
- updates.status = "failed";
10936
- }
10937
- await config.triggers.update(triggerId, updates, context2);
10938
- return Response.json({ success: true });
10991
+ }, context2);
10992
+ return Response.json({
10993
+ success: executionResult.success,
10994
+ result: executionResult.steps[0]?.result,
10995
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
10996
+ duration: executionResult.steps[0]?.duration,
10997
+ error: executionResult.error,
10998
+ steps: executionResult.steps
10999
+ }, { status: executionResult.success ? 200 : 500 });
10939
11000
  } else if (!subAction && method === "GET") {
10940
11001
  const trigger = await config.triggers.get(triggerId, context2);
10941
11002
  if (!trigger) {
@@ -10968,7 +11029,7 @@ function createMCPServer(config) {
10968
11029
  })
10969
11030
  });
10970
11031
  } catch (error) {
10971
- logger31.error("[Trigger] Failed to update scheduler:", error);
11032
+ logger32.error("[Trigger] Failed to update scheduler:", error);
10972
11033
  }
10973
11034
  }
10974
11035
  return Response.json(updated);
@@ -10985,14 +11046,14 @@ function createMCPServer(config) {
10985
11046
  body: JSON.stringify({ triggerId })
10986
11047
  });
10987
11048
  } catch (error) {
10988
- logger31.error("[Trigger] Failed to unregister from scheduler:", error);
11049
+ logger32.error("[Trigger] Failed to unregister from scheduler:", error);
10989
11050
  }
10990
11051
  return new Response(null, { status: 204 });
10991
11052
  }
10992
11053
  }
10993
11054
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10994
11055
  } catch (error) {
10995
- logger31.error("[Trigger] Error:", error);
11056
+ logger32.error("[Trigger] Error:", error);
10996
11057
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10997
11058
  }
10998
11059
  }
@@ -11018,11 +11079,11 @@ function createMCPServer(config) {
11018
11079
  const errorRedirectUrl = "/auth-error";
11019
11080
  if (error) {
11020
11081
  const errorMsg = errorDescription || error;
11021
- logger31.error("[OAuth Redirect] Error:", errorMsg);
11082
+ logger32.error("[OAuth Redirect] Error:", errorMsg);
11022
11083
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
11023
11084
  }
11024
11085
  if (!code || !state) {
11025
- logger31.error("[OAuth Redirect] Missing code or state parameter");
11086
+ logger32.error("[OAuth Redirect] Missing code or state parameter");
11026
11087
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
11027
11088
  }
11028
11089
  let returnUrl = defaultRedirectUrl;
@@ -11098,7 +11159,7 @@ function createMCPServer(config) {
11098
11159
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
11099
11160
  return Response.redirect(frontendUrl);
11100
11161
  } catch (error2) {
11101
- logger31.error("[OAuth Backend Callback] Error:", error2);
11162
+ logger32.error("[OAuth Backend Callback] Error:", error2);
11102
11163
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
11103
11164
  }
11104
11165
  } else {
@@ -11317,7 +11378,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
11317
11378
  }
11318
11379
  };
11319
11380
  }
11320
- var SERVER_LOG_CONTEXT2 = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11381
+ var SERVER_LOG_CONTEXT2 = "server", logger32, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11321
11382
  if (!globalServerConfig) {
11322
11383
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
11323
11384
  }
@@ -11365,7 +11426,7 @@ var init_server = __esm(() => {
11365
11426
  init_anthropic();
11366
11427
  init_google();
11367
11428
  init_ai();
11368
- logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11429
+ logger32 = createLogger("MCPServer", SERVER_LOG_CONTEXT2);
11369
11430
  codeVerifierStorage = new Map;
11370
11431
  });
11371
11432
 
@@ -11716,7 +11777,7 @@ class OAuthHandler {
11716
11777
  url.searchParams.set("state", authorizeRequest.state);
11717
11778
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11718
11779
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11719
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11780
+ const redirectUri = providerConfig.redirectUri;
11720
11781
  if (redirectUri) {
11721
11782
  url.searchParams.set("redirect_uri", redirectUri);
11722
11783
  }
@@ -11828,7 +11889,7 @@ class OAuthHandler {
11828
11889
  tokenType: result.tokenType,
11829
11890
  expiresIn: result.expiresIn,
11830
11891
  expiresAt: result.expiresAt,
11831
- scopes: result.scopes
11892
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11832
11893
  };
11833
11894
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11834
11895
  } catch (error) {}
@@ -11878,11 +11939,11 @@ class OAuthHandler {
11878
11939
  try {
11879
11940
  await this.config.removeProviderToken(request.provider, undefined, context);
11880
11941
  } catch (error) {
11881
- logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11942
+ logger33.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11882
11943
  }
11883
11944
  }
11884
11945
  } catch (error) {
11885
- logger32.error(`Failed to extract context for disconnect:`, error);
11946
+ logger33.error(`Failed to extract context for disconnect:`, error);
11886
11947
  }
11887
11948
  }
11888
11949
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11942,10 +12003,10 @@ class OAuthHandler {
11942
12003
  return jsonRpcResponse.result;
11943
12004
  }
11944
12005
  }
11945
- var SERVER_LOG_CONTEXT3 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
12006
+ var SERVER_LOG_CONTEXT3 = "server", logger33, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11946
12007
  var init_base_handler = __esm(() => {
11947
12008
  init_logger();
11948
- logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
12009
+ logger33 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT3);
11949
12010
  });
11950
12011
 
11951
12012
  // src/index.ts
@@ -11958,7 +12019,7 @@ init_nextjs();
11958
12019
  // src/adapters/nextjs-oauth-redirect.ts
11959
12020
  init_logger();
11960
12021
  var SERVER_LOG_CONTEXT4 = "server";
11961
- var logger33 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
12022
+ var logger34 = createLogger("OAuthRedirect", SERVER_LOG_CONTEXT4);
11962
12023
  function createOAuthRedirectHandler(config) {
11963
12024
  const defaultRedirectUrl = config?.redirectUrl || "/";
11964
12025
  const errorRedirectUrl = config?.errorRedirectUrl || "/auth-error";
@@ -11970,11 +12031,11 @@ function createOAuthRedirectHandler(config) {
11970
12031
  const errorDescription = searchParams.get("error_description");
11971
12032
  if (error) {
11972
12033
  const errorMsg = errorDescription || error;
11973
- logger33.error("[OAuth Redirect] Error:", errorMsg);
12034
+ logger34.error("[OAuth Redirect] Error:", errorMsg);
11974
12035
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11975
12036
  }
11976
12037
  if (!code || !state) {
11977
- logger33.error("[OAuth Redirect] Missing code or state parameter");
12038
+ logger34.error("[OAuth Redirect] Missing code or state parameter");
11978
12039
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11979
12040
  }
11980
12041
  let returnUrl = defaultRedirectUrl;