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.
@@ -9968,21 +9968,7 @@ var init_ai = __esm(() => {
9968
9968
  init_trigger_tools();
9969
9969
  });
9970
9970
 
9971
- // ../triggers/types.ts
9972
- var exports_types = {};
9973
- __export(exports_types, {
9974
- WEBHOOK_DELIVERY_TIMEOUT_MS: () => WEBHOOK_DELIVERY_TIMEOUT_MS,
9975
- MAX_TRIGGER_STEPS: () => MAX_TRIGGER_STEPS
9976
- });
9977
- var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
9978
-
9979
9971
  // ../triggers/webhooks.ts
9980
- var exports_webhooks = {};
9981
- __export(exports_webhooks, {
9982
- signPayload: () => signPayload,
9983
- deliverWebhooks: () => deliverWebhooks,
9984
- deliverWebhook: () => deliverWebhook
9985
- });
9986
9972
  async function signPayload(payload, secret) {
9987
9973
  const encoder = new TextEncoder;
9988
9974
  const data = encoder.encode(JSON.stringify(payload));
@@ -10031,6 +10017,155 @@ var init_webhooks = __esm(() => {
10031
10017
  logger29 = createLogger("Webhooks", "server");
10032
10018
  });
10033
10019
 
10020
+ // ../triggers/types.ts
10021
+ var MAX_TRIGGER_STEPS = 20, WEBHOOK_DELIVERY_TIMEOUT_MS = 1e4;
10022
+
10023
+ // ../triggers/executor.ts
10024
+ var exports_executor = {};
10025
+ __export(exports_executor, {
10026
+ executeTrigger: () => executeTrigger
10027
+ });
10028
+ async function executeTrigger(trigger, config, context) {
10029
+ const steps = [];
10030
+ let currentToolName = trigger.toolName;
10031
+ let currentToolArguments = trigger.toolArguments;
10032
+ let currentProvider = trigger.provider;
10033
+ let stepIndex = 0;
10034
+ while (stepIndex < MAX_TRIGGER_STEPS) {
10035
+ const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
10036
+ if (!stepValidation.valid) {
10037
+ logger30.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
10038
+ break;
10039
+ }
10040
+ const providerToken = await config.getProviderToken(currentProvider, undefined, context);
10041
+ if (!providerToken) {
10042
+ const error = `No OAuth token available for provider '${currentProvider}'`;
10043
+ logger30.error(`[Trigger ${trigger.id}] ${error}`);
10044
+ steps.push({
10045
+ stepIndex,
10046
+ toolName: currentToolName,
10047
+ success: false,
10048
+ error,
10049
+ duration: 0,
10050
+ executedAt: new Date().toISOString()
10051
+ });
10052
+ await config.triggers.update(trigger.id, {
10053
+ lastRunAt: new Date().toISOString(),
10054
+ runCount: (trigger.runCount || 0) + 1,
10055
+ lastError: error,
10056
+ status: "failed"
10057
+ }, context);
10058
+ return { success: false, steps, error };
10059
+ }
10060
+ const startTime = Date.now();
10061
+ let toolResult;
10062
+ let stepSuccess = true;
10063
+ let stepError;
10064
+ try {
10065
+ toolResult = await config.handleToolCall({ name: currentToolName, arguments: currentToolArguments }, `${providerToken.tokenType || "Bearer"} ${providerToken.accessToken}`, null);
10066
+ } catch (err) {
10067
+ stepSuccess = false;
10068
+ stepError = err.message || "Tool execution failed";
10069
+ logger30.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
10070
+ }
10071
+ const duration = Date.now() - startTime;
10072
+ const executedAt = new Date().toISOString();
10073
+ steps.push({
10074
+ stepIndex,
10075
+ toolName: currentToolName,
10076
+ success: stepSuccess,
10077
+ result: stepSuccess ? toolResult : undefined,
10078
+ error: stepError,
10079
+ duration,
10080
+ executedAt
10081
+ });
10082
+ if (!config.triggers.onComplete || !stepSuccess) {
10083
+ const updates = {
10084
+ lastRunAt: executedAt,
10085
+ runCount: (trigger.runCount || 0) + 1
10086
+ };
10087
+ if (stepSuccess) {
10088
+ updates.lastResult = toolResult;
10089
+ updates.lastError = undefined;
10090
+ if (trigger.schedule.type === "once") {
10091
+ updates.status = "completed";
10092
+ }
10093
+ } else {
10094
+ updates.lastError = stepError;
10095
+ updates.status = "failed";
10096
+ }
10097
+ await config.triggers.update(trigger.id, updates, context);
10098
+ return { success: stepSuccess, steps, error: stepError };
10099
+ }
10100
+ const completeRequest = {
10101
+ success: stepSuccess,
10102
+ result: stepSuccess ? toolResult : undefined,
10103
+ error: stepError,
10104
+ executedAt,
10105
+ duration,
10106
+ stepIndex,
10107
+ previousResults: steps,
10108
+ final: false
10109
+ };
10110
+ const completeResponse = await config.triggers.onComplete({
10111
+ trigger,
10112
+ request: completeRequest,
10113
+ context
10114
+ });
10115
+ if (completeResponse.hasMore && completeResponse.nextStep) {
10116
+ currentToolName = completeResponse.nextStep.toolName;
10117
+ currentToolArguments = completeResponse.nextStep.toolArguments;
10118
+ currentProvider = completeResponse.nextStep.provider;
10119
+ stepIndex++;
10120
+ continue;
10121
+ }
10122
+ const finalUpdates = {
10123
+ lastRunAt: executedAt,
10124
+ runCount: (trigger.runCount || 0) + 1
10125
+ };
10126
+ if (stepSuccess) {
10127
+ finalUpdates.lastResult = toolResult;
10128
+ finalUpdates.lastError = undefined;
10129
+ if (trigger.schedule.type === "once") {
10130
+ finalUpdates.status = "completed";
10131
+ }
10132
+ } else {
10133
+ finalUpdates.lastError = stepError;
10134
+ finalUpdates.status = "failed";
10135
+ }
10136
+ await config.triggers.update(trigger.id, finalUpdates, context);
10137
+ if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10138
+ const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10139
+ const payload = {
10140
+ triggerId: trigger.id,
10141
+ success: steps.every((s) => s.success),
10142
+ steps,
10143
+ totalSteps: steps.length,
10144
+ totalDuration,
10145
+ executedAt
10146
+ };
10147
+ deliverWebhooks(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS).catch(() => {});
10148
+ }
10149
+ return { success: stepSuccess, steps, error: stepError };
10150
+ }
10151
+ const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
10152
+ logger30.error(`[Trigger ${trigger.id}] ${limitError}`);
10153
+ await config.triggers.update(trigger.id, {
10154
+ lastRunAt: new Date().toISOString(),
10155
+ runCount: (trigger.runCount || 0) + 1,
10156
+ lastError: limitError,
10157
+ status: "failed"
10158
+ }, context);
10159
+ return { success: false, steps, error: limitError };
10160
+ }
10161
+ var logger30;
10162
+ var init_executor = __esm(() => {
10163
+ init_logger();
10164
+ init_utils2();
10165
+ init_webhooks();
10166
+ logger30 = createLogger("TriggerExecutor", "server");
10167
+ });
10168
+
10034
10169
  // ../server.ts
10035
10170
  var exports_server = {};
10036
10171
  __export(exports_server, {
@@ -10124,7 +10259,7 @@ function createMCPServer(config) {
10124
10259
  if (integration.oauth) {
10125
10260
  const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
10126
10261
  if (!clientId || !clientSecret) {
10127
- logger30.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10262
+ logger31.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
10128
10263
  return integration;
10129
10264
  }
10130
10265
  const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
@@ -10255,7 +10390,7 @@ function createMCPServer(config) {
10255
10390
  }
10256
10391
  return response2;
10257
10392
  } catch (error) {
10258
- logger30.error("[MCP Tool Call] Error:", error);
10393
+ logger31.error("[MCP Tool Call] Error:", error);
10259
10394
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
10260
10395
  }
10261
10396
  }
@@ -10271,6 +10406,57 @@ function createMCPServer(config) {
10271
10406
  }));
10272
10407
  return Response.json({ integrations });
10273
10408
  }
10409
+ if (segments.length === 2 && segments[0] === "triggers" && segments[1] === "notify" && method === "POST") {
10410
+ if (!config.triggers) {
10411
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
10412
+ }
10413
+ try {
10414
+ const apiKey = webRequest.headers.get("x-api-key");
10415
+ if (!apiKey || apiKey !== config.apiKey) {
10416
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
10417
+ }
10418
+ const body = await webRequest.json();
10419
+ const { triggerId } = body;
10420
+ if (!triggerId) {
10421
+ return Response.json({ error: "triggerId is required" }, { status: 400 });
10422
+ }
10423
+ const trigger = await config.triggers.get(triggerId);
10424
+ if (!trigger) {
10425
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
10426
+ }
10427
+ if (!trigger.provider) {
10428
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10429
+ }
10430
+ const triggerContext = trigger.userId ? { userId: trigger.userId } : undefined;
10431
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10432
+ const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10433
+ const oauthHandler = new OAuthHandler({
10434
+ providers,
10435
+ serverUrl: config.serverUrl,
10436
+ apiKey: config.apiKey,
10437
+ setProviderToken: config.setProviderToken,
10438
+ removeProviderToken: config.removeProviderToken,
10439
+ getSessionContext: config.getSessionContext
10440
+ });
10441
+ const executionResult = await executeTrigger2(trigger, {
10442
+ triggers: config.triggers,
10443
+ getProviderToken: async (provider, email, ctx) => {
10444
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10445
+ },
10446
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10447
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10448
+ }
10449
+ }, triggerContext);
10450
+ return Response.json({
10451
+ success: executionResult.success,
10452
+ steps: executionResult.steps,
10453
+ error: executionResult.error
10454
+ });
10455
+ } catch (error) {
10456
+ logger31.error("[Trigger Notify] Error:", error);
10457
+ return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
10458
+ }
10459
+ }
10274
10460
  if (segments.length >= 1 && segments[0] === "triggers") {
10275
10461
  if (!config.triggers) {
10276
10462
  return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
@@ -10311,8 +10497,9 @@ function createMCPServer(config) {
10311
10497
  };
10312
10498
  const created = await config.triggers.create(trigger, context2);
10313
10499
  const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
10314
- const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10500
+ const defaultCallbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
10315
10501
  try {
10502
+ const callbackBaseUrl = config.triggers.getCallbackUrl ? await config.triggers.getCallbackUrl(context2) : defaultCallbackBaseUrl;
10316
10503
  await fetch(`${schedulerUrl}/scheduler/register`, {
10317
10504
  method: "POST",
10318
10505
  headers: {
@@ -10322,8 +10509,7 @@ function createMCPServer(config) {
10322
10509
  body: JSON.stringify({
10323
10510
  triggerId: created.id,
10324
10511
  schedule: created.schedule,
10325
- callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
10326
- completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
10512
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/notify`,
10327
10513
  metadata: {
10328
10514
  userId: context2?.userId,
10329
10515
  provider: created.provider
@@ -10331,7 +10517,7 @@ function createMCPServer(config) {
10331
10517
  })
10332
10518
  });
10333
10519
  } catch (scheduleError) {
10334
- logger30.error("[Trigger] Failed to register with scheduler:", scheduleError);
10520
+ logger31.error("[Trigger] Failed to register with scheduler:", scheduleError);
10335
10521
  }
10336
10522
  return Response.json(created, { status: 201 });
10337
10523
  }
@@ -10366,7 +10552,7 @@ function createMCPServer(config) {
10366
10552
  body: JSON.stringify({ triggerId })
10367
10553
  });
10368
10554
  } catch (error) {
10369
- logger30.error("[Trigger] Failed to pause in scheduler:", error);
10555
+ logger31.error("[Trigger] Failed to pause in scheduler:", error);
10370
10556
  }
10371
10557
  return Response.json(updated);
10372
10558
  } else if (subAction === "resume" && method === "POST") {
@@ -10394,7 +10580,7 @@ function createMCPServer(config) {
10394
10580
  body: JSON.stringify({ triggerId })
10395
10581
  });
10396
10582
  } catch (error) {
10397
- logger30.error("[Trigger] Failed to resume in scheduler:", error);
10583
+ logger31.error("[Trigger] Failed to resume in scheduler:", error);
10398
10584
  }
10399
10585
  return Response.json(updated);
10400
10586
  } else if (subAction === "run" && method === "POST") {
@@ -10405,10 +10591,7 @@ function createMCPServer(config) {
10405
10591
  if (!trigger.provider) {
10406
10592
  return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10407
10593
  }
10408
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10409
- if (!providerToken) {
10410
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10411
- }
10594
+ const { executeTrigger: executeTrigger2 } = await Promise.resolve().then(() => (init_executor(), exports_executor));
10412
10595
  const { OAuthHandler } = await Promise.resolve().then(() => (init_base_handler(), exports_base_handler));
10413
10596
  const oauthHandler = new OAuthHandler({
10414
10597
  providers,
@@ -10418,145 +10601,23 @@ function createMCPServer(config) {
10418
10601
  removeProviderToken: config.removeProviderToken,
10419
10602
  getSessionContext: config.getSessionContext
10420
10603
  });
10421
- const startTime = Date.now();
10422
- try {
10423
- const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
10424
- const duration = Date.now() - startTime;
10425
- const executionResult = {
10426
- success: true,
10427
- result,
10428
- executedAt: new Date().toISOString(),
10429
- duration
10430
- };
10431
- await config.triggers.update(triggerId, {
10432
- lastRunAt: executionResult.executedAt,
10433
- runCount: (trigger.runCount || 0) + 1,
10434
- lastResult: result,
10435
- lastError: undefined
10436
- }, context2);
10437
- return Response.json(executionResult);
10438
- } catch (error) {
10439
- const duration = Date.now() - startTime;
10440
- const executionResult = {
10441
- success: false,
10442
- error: error.message || "Tool execution failed",
10443
- executedAt: new Date().toISOString(),
10444
- duration
10445
- };
10446
- await config.triggers.update(triggerId, {
10447
- lastRunAt: executionResult.executedAt,
10448
- runCount: (trigger.runCount || 0) + 1,
10449
- lastError: error.message,
10450
- status: "failed"
10451
- }, context2);
10452
- return Response.json(executionResult, { status: 500 });
10453
- }
10454
- } else if (subAction === "execute" && method === "GET") {
10455
- const apiKey = webRequest.headers.get("x-api-key");
10456
- if (!apiKey || apiKey !== config.apiKey) {
10457
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10458
- }
10459
- const trigger = await config.triggers.get(triggerId, context2);
10460
- if (!trigger) {
10461
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10462
- }
10463
- if (!trigger.provider) {
10464
- return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
10465
- }
10466
- const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
10467
- if (!providerToken) {
10468
- return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
10469
- }
10470
- return Response.json({
10471
- trigger: {
10472
- id: trigger.id,
10473
- toolName: trigger.toolName,
10474
- toolArguments: trigger.toolArguments,
10475
- provider: trigger.provider
10604
+ const executionResult = await executeTrigger2(trigger, {
10605
+ triggers: config.triggers,
10606
+ getProviderToken: async (provider, email, ctx) => {
10607
+ return config.getProviderToken ? await config.getProviderToken(provider, email, ctx) : undefined;
10476
10608
  },
10477
- accessToken: providerToken.accessToken,
10478
- tokenType: providerToken.tokenType || "Bearer"
10479
- });
10480
- } else if (subAction === "complete" && method === "POST") {
10481
- const apiKey = webRequest.headers.get("x-api-key");
10482
- if (!apiKey || apiKey !== config.apiKey) {
10483
- return Response.json({ error: "Unauthorized" }, { status: 401 });
10484
- }
10485
- const body = await webRequest.json();
10486
- const trigger = await config.triggers.get(triggerId, context2);
10487
- if (!trigger) {
10488
- return Response.json({ error: "Trigger not found" }, { status: 404 });
10489
- }
10490
- if (body.stepIndex != null) {
10491
- const { validateStepLimit: validateStepLimit2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
10492
- const { MAX_TRIGGER_STEPS: MAX_TRIGGER_STEPS2 } = await Promise.resolve().then(() => exports_types);
10493
- const stepValidation = validateStepLimit2(body.stepIndex, MAX_TRIGGER_STEPS2);
10494
- if (!stepValidation.valid) {
10495
- return Response.json({ error: stepValidation.error }, { status: 400 });
10609
+ handleToolCall: (toolBody, authHeader, integrationsHeader) => {
10610
+ return oauthHandler.handleToolCall(toolBody, authHeader, integrationsHeader);
10496
10611
  }
10497
- }
10498
- if (config.triggers.onComplete) {
10499
- try {
10500
- const completeResponse = await config.triggers.onComplete({
10501
- trigger,
10502
- request: body,
10503
- context: context2
10504
- });
10505
- if (completeResponse.hasMore) {
10506
- return Response.json(completeResponse);
10507
- }
10508
- const updates2 = {
10509
- lastRunAt: body.executedAt,
10510
- runCount: (trigger.runCount || 0) + 1
10511
- };
10512
- if (body.success) {
10513
- updates2.lastResult = body.result;
10514
- updates2.lastError = undefined;
10515
- if (trigger.schedule.type === "once") {
10516
- updates2.status = "completed";
10517
- }
10518
- } else {
10519
- updates2.lastError = body.error;
10520
- updates2.status = "failed";
10521
- }
10522
- await config.triggers.update(triggerId, updates2, context2);
10523
- if (completeResponse.webhooks && completeResponse.webhooks.length > 0) {
10524
- const { deliverWebhooks: deliverWebhooks2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
10525
- const { WEBHOOK_DELIVERY_TIMEOUT_MS: WEBHOOK_DELIVERY_TIMEOUT_MS2 } = await Promise.resolve().then(() => exports_types);
10526
- const steps = body.previousResults || [];
10527
- const totalDuration = steps.reduce((sum, s) => sum + (s.duration || 0), 0);
10528
- const payload = {
10529
- triggerId,
10530
- success: body.success,
10531
- steps,
10532
- totalSteps: steps.length,
10533
- totalDuration,
10534
- executedAt: body.executedAt
10535
- };
10536
- deliverWebhooks2(completeResponse.webhooks, payload, WEBHOOK_DELIVERY_TIMEOUT_MS2).catch(() => {});
10537
- }
10538
- return Response.json(completeResponse);
10539
- } catch (error) {
10540
- logger30.error("onComplete callback error:", error);
10541
- return Response.json({ error: "Internal server error in onComplete callback" }, { status: 500 });
10542
- }
10543
- }
10544
- const updates = {
10545
- lastRunAt: body.executedAt,
10546
- runCount: (trigger.runCount || 0) + 1
10547
- };
10548
- if (body.success) {
10549
- updates.lastResult = body.result;
10550
- updates.lastError = undefined;
10551
- if (trigger.schedule.type === "once") {
10552
- updates.status = "completed";
10553
- }
10554
- } else {
10555
- updates.lastError = body.error;
10556
- updates.status = "failed";
10557
- }
10558
- await config.triggers.update(triggerId, updates, context2);
10559
- return Response.json({ success: true });
10612
+ }, context2);
10613
+ return Response.json({
10614
+ success: executionResult.success,
10615
+ result: executionResult.steps[0]?.result,
10616
+ executedAt: executionResult.steps[0]?.executedAt || new Date().toISOString(),
10617
+ duration: executionResult.steps[0]?.duration,
10618
+ error: executionResult.error,
10619
+ steps: executionResult.steps
10620
+ }, { status: executionResult.success ? 200 : 500 });
10560
10621
  } else if (!subAction && method === "GET") {
10561
10622
  const trigger = await config.triggers.get(triggerId, context2);
10562
10623
  if (!trigger) {
@@ -10589,7 +10650,7 @@ function createMCPServer(config) {
10589
10650
  })
10590
10651
  });
10591
10652
  } catch (error) {
10592
- logger30.error("[Trigger] Failed to update scheduler:", error);
10653
+ logger31.error("[Trigger] Failed to update scheduler:", error);
10593
10654
  }
10594
10655
  }
10595
10656
  return Response.json(updated);
@@ -10606,14 +10667,14 @@ function createMCPServer(config) {
10606
10667
  body: JSON.stringify({ triggerId })
10607
10668
  });
10608
10669
  } catch (error) {
10609
- logger30.error("[Trigger] Failed to unregister from scheduler:", error);
10670
+ logger31.error("[Trigger] Failed to unregister from scheduler:", error);
10610
10671
  }
10611
10672
  return new Response(null, { status: 204 });
10612
10673
  }
10613
10674
  }
10614
10675
  return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
10615
10676
  } catch (error) {
10616
- logger30.error("[Trigger] Error:", error);
10677
+ logger31.error("[Trigger] Error:", error);
10617
10678
  return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
10618
10679
  }
10619
10680
  }
@@ -10639,11 +10700,11 @@ function createMCPServer(config) {
10639
10700
  const errorRedirectUrl = "/auth-error";
10640
10701
  if (error) {
10641
10702
  const errorMsg = errorDescription || error;
10642
- logger30.error("[OAuth Redirect] Error:", errorMsg);
10703
+ logger31.error("[OAuth Redirect] Error:", errorMsg);
10643
10704
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
10644
10705
  }
10645
10706
  if (!code || !state) {
10646
- logger30.error("[OAuth Redirect] Missing code or state parameter");
10707
+ logger31.error("[OAuth Redirect] Missing code or state parameter");
10647
10708
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
10648
10709
  }
10649
10710
  let returnUrl = defaultRedirectUrl;
@@ -10719,7 +10780,7 @@ function createMCPServer(config) {
10719
10780
  frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
10720
10781
  return Response.redirect(frontendUrl);
10721
10782
  } catch (error2) {
10722
- logger30.error("[OAuth Backend Callback] Error:", error2);
10783
+ logger31.error("[OAuth Backend Callback] Error:", error2);
10723
10784
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
10724
10785
  }
10725
10786
  } else {
@@ -10938,7 +10999,7 @@ function toSvelteKitHandler(clientOrHandlerOrOptions, _redirectOptions) {
10938
10999
  }
10939
11000
  };
10940
11001
  }
10941
- var SERVER_LOG_CONTEXT = "server", logger30, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
11002
+ var SERVER_LOG_CONTEXT = "server", logger31, globalServerConfig = null, codeVerifierStorage, POST = async (req, context) => {
10942
11003
  if (!globalServerConfig) {
10943
11004
  return Response.json({ error: "OAuth not configured. Call createMCPServer() in your server initialization file first." }, { status: 500 });
10944
11005
  }
@@ -10986,7 +11047,7 @@ var init_server = __esm(() => {
10986
11047
  init_anthropic();
10987
11048
  init_google();
10988
11049
  init_ai();
10989
- logger30 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
11050
+ logger31 = createLogger("MCPServer", SERVER_LOG_CONTEXT);
10990
11051
  codeVerifierStorage = new Map;
10991
11052
  });
10992
11053
 
@@ -11337,7 +11398,7 @@ class OAuthHandler {
11337
11398
  url.searchParams.set("state", authorizeRequest.state);
11338
11399
  url.searchParams.set("code_challenge", authorizeRequest.codeChallenge);
11339
11400
  url.searchParams.set("code_challenge_method", authorizeRequest.codeChallengeMethod);
11340
- const redirectUri = authorizeRequest.redirectUri || providerConfig.redirectUri;
11401
+ const redirectUri = providerConfig.redirectUri;
11341
11402
  if (redirectUri) {
11342
11403
  url.searchParams.set("redirect_uri", redirectUri);
11343
11404
  }
@@ -11449,7 +11510,7 @@ class OAuthHandler {
11449
11510
  tokenType: result.tokenType,
11450
11511
  expiresIn: result.expiresIn,
11451
11512
  expiresAt: result.expiresAt,
11452
- scopes: result.scopes
11513
+ scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
11453
11514
  };
11454
11515
  await this.config.setProviderToken(callbackRequest.provider, tokenData, undefined, context);
11455
11516
  } catch (error) {}
@@ -11499,11 +11560,11 @@ class OAuthHandler {
11499
11560
  try {
11500
11561
  await this.config.removeProviderToken(request.provider, undefined, context);
11501
11562
  } catch (error) {
11502
- logger31.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11563
+ logger32.error(`Failed to delete token for ${request.provider} from database via removeProviderToken:`, error);
11503
11564
  }
11504
11565
  }
11505
11566
  } catch (error) {
11506
- logger31.error(`Failed to extract context for disconnect:`, error);
11567
+ logger32.error(`Failed to extract context for disconnect:`, error);
11507
11568
  }
11508
11569
  }
11509
11570
  const url = new URL("/oauth/disconnect", this.serverUrl);
@@ -11563,10 +11624,10 @@ class OAuthHandler {
11563
11624
  return jsonRpcResponse.result;
11564
11625
  }
11565
11626
  }
11566
- var SERVER_LOG_CONTEXT2 = "server", logger31, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11627
+ var SERVER_LOG_CONTEXT2 = "server", logger32, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
11567
11628
  var init_base_handler = __esm(() => {
11568
11629
  init_logger();
11569
- logger31 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11630
+ logger32 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT2);
11570
11631
  });
11571
11632
 
11572
11633
  // nextjs.ts
@@ -11585,7 +11646,7 @@ function createNextOAuthHandler(config) {
11585
11646
  }
11586
11647
  return response;
11587
11648
  } catch (error) {
11588
- logger32.error("[OAuth Authorize] Error:", error);
11649
+ logger33.error("[OAuth Authorize] Error:", error);
11589
11650
  return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
11590
11651
  }
11591
11652
  },
@@ -11601,7 +11662,7 @@ function createNextOAuthHandler(config) {
11601
11662
  }
11602
11663
  return response;
11603
11664
  } catch (error) {
11604
- logger32.error("[OAuth Callback] Error:", error);
11665
+ logger33.error("[OAuth Callback] Error:", error);
11605
11666
  return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
11606
11667
  }
11607
11668
  },
@@ -11623,7 +11684,7 @@ function createNextOAuthHandler(config) {
11623
11684
  }
11624
11685
  return response;
11625
11686
  } catch (error) {
11626
- logger32.error("[OAuth Status] Error:", error);
11687
+ logger33.error("[OAuth Status] Error:", error);
11627
11688
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
11628
11689
  }
11629
11690
  },
@@ -11646,7 +11707,7 @@ function createNextOAuthHandler(config) {
11646
11707
  }
11647
11708
  return response;
11648
11709
  } catch (error) {
11649
- logger32.error("[OAuth Disconnect] Error:", error);
11710
+ logger33.error("[OAuth Disconnect] Error:", error);
11650
11711
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
11651
11712
  }
11652
11713
  },
@@ -11687,7 +11748,7 @@ function createNextOAuthHandler(config) {
11687
11748
  const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
11688
11749
  return Response.json(result);
11689
11750
  } catch (error) {
11690
- logger32.error("[MCP Tool Call] Error:", error);
11751
+ logger33.error("[MCP Tool Call] Error:", error);
11691
11752
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
11692
11753
  }
11693
11754
  },
@@ -11732,11 +11793,11 @@ function createNextOAuthHandler(config) {
11732
11793
  const errorDescription = searchParams.get("error_description");
11733
11794
  if (error) {
11734
11795
  const errorMsg = errorDescription || error;
11735
- logger32.error("[OAuth Redirect] Error:", errorMsg);
11796
+ logger33.error("[OAuth Redirect] Error:", errorMsg);
11736
11797
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, req.url));
11737
11798
  }
11738
11799
  if (!code || !state) {
11739
- logger32.error("[OAuth Redirect] Missing code or state parameter");
11800
+ logger33.error("[OAuth Redirect] Missing code or state parameter");
11740
11801
  return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, req.url));
11741
11802
  }
11742
11803
  let returnUrl = defaultRedirectUrl;
@@ -11775,11 +11836,11 @@ function createNextOAuthHandler(config) {
11775
11836
  };
11776
11837
  return handlers;
11777
11838
  }
11778
- var SERVER_LOG_CONTEXT3 = "server", logger32;
11839
+ var SERVER_LOG_CONTEXT3 = "server", logger33;
11779
11840
  var init_nextjs = __esm(() => {
11780
11841
  init_base_handler();
11781
11842
  init_logger();
11782
- logger32 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11843
+ logger33 = createLogger("NextJSOAuth", SERVER_LOG_CONTEXT3);
11783
11844
  });
11784
11845
 
11785
11846
  // solid-start.ts