integrate-sdk 0.8.22 → 0.8.26

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.
@@ -651,7 +651,7 @@ class OAuthManager {
651
651
  this.getTokenCallback = tokenCallbacks?.getProviderToken;
652
652
  this.setTokenCallback = tokenCallbacks?.setProviderToken;
653
653
  this.removeTokenCallback = tokenCallbacks?.removeProviderToken;
654
- this.skipLocalStorage = tokenCallbacks?.skipLocalStorage ?? !!tokenCallbacks?.getProviderToken;
654
+ this.skipLocalStorage = !!(tokenCallbacks?.getProviderToken || tokenCallbacks?.setProviderToken);
655
655
  this.cleanupExpiredPendingAuths();
656
656
  }
657
657
  async initiateFlow(provider, config, returnUrl) {
@@ -930,6 +930,9 @@ class OAuthManager {
930
930
  if (this.getTokenCallback) {
931
931
  return;
932
932
  }
933
+ if (this.skipLocalStorage) {
934
+ return;
935
+ }
933
936
  if (typeof window !== "undefined" && window.localStorage) {
934
937
  try {
935
938
  const key = `integrate_token_${provider}`;
@@ -1046,6 +1049,9 @@ class OAuthManager {
1046
1049
  frontendOrigin: this.apiBaseUrl && this.flowConfig.mode === "redirect" && typeof window !== "undefined" ? window.location.origin : undefined
1047
1050
  })
1048
1051
  });
1052
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1053
+ this.skipLocalStorage = true;
1054
+ }
1049
1055
  if (!response.ok) {
1050
1056
  const error = await response.text();
1051
1057
  throw new Error(`Failed to get authorization URL: ${error}`);
@@ -1077,6 +1083,9 @@ class OAuthManager {
1077
1083
  state
1078
1084
  })
1079
1085
  });
1086
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1087
+ this.skipLocalStorage = true;
1088
+ }
1080
1089
  if (!response.ok) {
1081
1090
  const error = await response.text();
1082
1091
  throw new Error(`Failed to exchange code for token: ${error}`);
@@ -1084,6 +1093,9 @@ class OAuthManager {
1084
1093
  const data = await response.json();
1085
1094
  return data;
1086
1095
  }
1096
+ setSkipLocalStorage(value) {
1097
+ this.skipLocalStorage = value;
1098
+ }
1087
1099
  close() {
1088
1100
  this.windowManager.close();
1089
1101
  }
@@ -1140,6 +1152,7 @@ class MCPClientBase {
1140
1152
  eventEmitter = new SimpleEventEmitter;
1141
1153
  apiRouteBase;
1142
1154
  apiBaseUrl;
1155
+ databaseDetected = false;
1143
1156
  oauthCallbackPromise;
1144
1157
  server;
1145
1158
  constructor(config) {
@@ -1173,8 +1186,7 @@ class MCPClientBase {
1173
1186
  this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1174
1187
  getProviderToken: config.getProviderToken,
1175
1188
  setProviderToken: config.setProviderToken,
1176
- removeProviderToken: config.removeProviderToken,
1177
- skipLocalStorage: config.skipLocalStorage
1189
+ removeProviderToken: config.removeProviderToken
1178
1190
  });
1179
1191
  for (const integration of this.integrations) {
1180
1192
  for (const toolName of integration.tools) {
@@ -1384,6 +1396,10 @@ class MCPClientBase {
1384
1396
  arguments: args
1385
1397
  })
1386
1398
  });
1399
+ if (!this.databaseDetected && response.headers.get("X-Integrate-Use-Database") === "true") {
1400
+ this.oauthManager.setSkipLocalStorage(true);
1401
+ this.databaseDetected = true;
1402
+ }
1387
1403
  if (!response.ok) {
1388
1404
  let errorMessage = `Request failed: ${response.statusText}`;
1389
1405
  const error = new Error(errorMessage);
@@ -6556,10 +6572,17 @@ function createMCPServer(config) {
6556
6572
  const oauthHandler = new OAuthHandler({
6557
6573
  providers,
6558
6574
  serverUrl: config.serverUrl,
6559
- apiKey: config.apiKey
6575
+ apiKey: config.apiKey,
6576
+ setProviderToken: config.setProviderToken,
6577
+ removeProviderToken: config.removeProviderToken,
6578
+ getSessionContext: config.getSessionContext
6560
6579
  });
6561
6580
  const result = await oauthHandler.handleToolCall(body, authHeader);
6562
- return Response.json(result);
6581
+ const response2 = Response.json(result);
6582
+ if (oauthHandler.hasDatabaseCallbacks()) {
6583
+ response2.headers.set("X-Integrate-Use-Database", "true");
6584
+ }
6585
+ return response2;
6563
6586
  } catch (error) {
6564
6587
  console.error("[MCP Tool Call] Error:", error);
6565
6588
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
@@ -7215,6 +7238,9 @@ class OAuthHandler {
7215
7238
  }
7216
7239
  return headers;
7217
7240
  }
7241
+ hasDatabaseCallbacks() {
7242
+ return !!this.config.setProviderToken;
7243
+ }
7218
7244
  async handleAuthorize(request) {
7219
7245
  let webRequest;
7220
7246
  let authorizeRequest;
@@ -7495,6 +7521,9 @@ function createNextOAuthHandler(config) {
7495
7521
  if (result.setCookie) {
7496
7522
  response.headers.set("Set-Cookie", result.setCookie);
7497
7523
  }
7524
+ if (handler.hasDatabaseCallbacks()) {
7525
+ response.headers.set("X-Integrate-Use-Database", "true");
7526
+ }
7498
7527
  return response;
7499
7528
  } catch (error) {
7500
7529
  console.error("[OAuth Authorize] Error:", error);
@@ -7508,6 +7537,9 @@ function createNextOAuthHandler(config) {
7508
7537
  if (result.clearCookie) {
7509
7538
  response.headers.set("Set-Cookie", result.clearCookie);
7510
7539
  }
7540
+ if (handler.hasDatabaseCallbacks()) {
7541
+ response.headers.set("X-Integrate-Use-Database", "true");
7542
+ }
7511
7543
  return response;
7512
7544
  } catch (error) {
7513
7545
  console.error("[OAuth Callback] Error:", error);
@@ -7526,7 +7558,11 @@ function createNextOAuthHandler(config) {
7526
7558
  }
7527
7559
  const accessToken = authHeader.substring(7);
7528
7560
  const result = await handler.handleStatus(provider, accessToken);
7529
- return Response.json(result);
7561
+ const response = Response.json(result);
7562
+ if (handler.hasDatabaseCallbacks()) {
7563
+ response.headers.set("X-Integrate-Use-Database", "true");
7564
+ }
7565
+ return response;
7530
7566
  } catch (error) {
7531
7567
  console.error("[OAuth Status] Error:", error);
7532
7568
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
@@ -7545,7 +7581,11 @@ function createNextOAuthHandler(config) {
7545
7581
  return Response.json({ error: "Missing provider in request body" }, { status: 400 });
7546
7582
  }
7547
7583
  const result = await handler.handleDisconnect({ provider }, accessToken, req);
7548
- return Response.json(result);
7584
+ const response = Response.json(result);
7585
+ if (handler.hasDatabaseCallbacks()) {
7586
+ response.headers.set("X-Integrate-Use-Database", "true");
7587
+ }
7588
+ return response;
7549
7589
  } catch (error) {
7550
7590
  console.error("[OAuth Disconnect] Error:", error);
7551
7591
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
@@ -192,6 +192,11 @@ export declare class OAuthHandler {
192
192
  * Get headers with API key if configured
193
193
  */
194
194
  private getHeaders;
195
+ /**
196
+ * Check if database callbacks are configured
197
+ * Used to determine if we should set X-Integrate-Use-Database header
198
+ */
199
+ hasDatabaseCallbacks(): boolean;
195
200
  /**
196
201
  * Handle authorization URL request
197
202
  * Gets authorization URL from MCP server with full OAuth credentials
@@ -1 +1 @@
1
- {"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"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"}
@@ -651,7 +651,7 @@ class OAuthManager {
651
651
  this.getTokenCallback = tokenCallbacks?.getProviderToken;
652
652
  this.setTokenCallback = tokenCallbacks?.setProviderToken;
653
653
  this.removeTokenCallback = tokenCallbacks?.removeProviderToken;
654
- this.skipLocalStorage = tokenCallbacks?.skipLocalStorage ?? !!tokenCallbacks?.getProviderToken;
654
+ this.skipLocalStorage = !!(tokenCallbacks?.getProviderToken || tokenCallbacks?.setProviderToken);
655
655
  this.cleanupExpiredPendingAuths();
656
656
  }
657
657
  async initiateFlow(provider, config, returnUrl) {
@@ -930,6 +930,9 @@ class OAuthManager {
930
930
  if (this.getTokenCallback) {
931
931
  return;
932
932
  }
933
+ if (this.skipLocalStorage) {
934
+ return;
935
+ }
933
936
  if (typeof window !== "undefined" && window.localStorage) {
934
937
  try {
935
938
  const key = `integrate_token_${provider}`;
@@ -1046,6 +1049,9 @@ class OAuthManager {
1046
1049
  frontendOrigin: this.apiBaseUrl && this.flowConfig.mode === "redirect" && typeof window !== "undefined" ? window.location.origin : undefined
1047
1050
  })
1048
1051
  });
1052
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1053
+ this.skipLocalStorage = true;
1054
+ }
1049
1055
  if (!response.ok) {
1050
1056
  const error = await response.text();
1051
1057
  throw new Error(`Failed to get authorization URL: ${error}`);
@@ -1077,6 +1083,9 @@ class OAuthManager {
1077
1083
  state
1078
1084
  })
1079
1085
  });
1086
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1087
+ this.skipLocalStorage = true;
1088
+ }
1080
1089
  if (!response.ok) {
1081
1090
  const error = await response.text();
1082
1091
  throw new Error(`Failed to exchange code for token: ${error}`);
@@ -1084,6 +1093,9 @@ class OAuthManager {
1084
1093
  const data = await response.json();
1085
1094
  return data;
1086
1095
  }
1096
+ setSkipLocalStorage(value) {
1097
+ this.skipLocalStorage = value;
1098
+ }
1087
1099
  close() {
1088
1100
  this.windowManager.close();
1089
1101
  }
@@ -1140,6 +1152,7 @@ class MCPClientBase {
1140
1152
  eventEmitter = new SimpleEventEmitter;
1141
1153
  apiRouteBase;
1142
1154
  apiBaseUrl;
1155
+ databaseDetected = false;
1143
1156
  oauthCallbackPromise;
1144
1157
  server;
1145
1158
  constructor(config) {
@@ -1173,8 +1186,7 @@ class MCPClientBase {
1173
1186
  this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1174
1187
  getProviderToken: config.getProviderToken,
1175
1188
  setProviderToken: config.setProviderToken,
1176
- removeProviderToken: config.removeProviderToken,
1177
- skipLocalStorage: config.skipLocalStorage
1189
+ removeProviderToken: config.removeProviderToken
1178
1190
  });
1179
1191
  for (const integration of this.integrations) {
1180
1192
  for (const toolName of integration.tools) {
@@ -1384,6 +1396,10 @@ class MCPClientBase {
1384
1396
  arguments: args
1385
1397
  })
1386
1398
  });
1399
+ if (!this.databaseDetected && response.headers.get("X-Integrate-Use-Database") === "true") {
1400
+ this.oauthManager.setSkipLocalStorage(true);
1401
+ this.databaseDetected = true;
1402
+ }
1387
1403
  if (!response.ok) {
1388
1404
  let errorMessage = `Request failed: ${response.statusText}`;
1389
1405
  const error = new Error(errorMessage);
@@ -6556,10 +6572,17 @@ function createMCPServer(config) {
6556
6572
  const oauthHandler = new OAuthHandler({
6557
6573
  providers,
6558
6574
  serverUrl: config.serverUrl,
6559
- apiKey: config.apiKey
6575
+ apiKey: config.apiKey,
6576
+ setProviderToken: config.setProviderToken,
6577
+ removeProviderToken: config.removeProviderToken,
6578
+ getSessionContext: config.getSessionContext
6560
6579
  });
6561
6580
  const result = await oauthHandler.handleToolCall(body, authHeader);
6562
- return Response.json(result);
6581
+ const response2 = Response.json(result);
6582
+ if (oauthHandler.hasDatabaseCallbacks()) {
6583
+ response2.headers.set("X-Integrate-Use-Database", "true");
6584
+ }
6585
+ return response2;
6563
6586
  } catch (error) {
6564
6587
  console.error("[MCP Tool Call] Error:", error);
6565
6588
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
@@ -7215,6 +7238,9 @@ class OAuthHandler {
7215
7238
  }
7216
7239
  return headers;
7217
7240
  }
7241
+ hasDatabaseCallbacks() {
7242
+ return !!this.config.setProviderToken;
7243
+ }
7218
7244
  async handleAuthorize(request) {
7219
7245
  let webRequest;
7220
7246
  let authorizeRequest;
@@ -7495,6 +7521,9 @@ function createNextOAuthHandler(config) {
7495
7521
  if (result.setCookie) {
7496
7522
  response.headers.set("Set-Cookie", result.setCookie);
7497
7523
  }
7524
+ if (handler.hasDatabaseCallbacks()) {
7525
+ response.headers.set("X-Integrate-Use-Database", "true");
7526
+ }
7498
7527
  return response;
7499
7528
  } catch (error) {
7500
7529
  console.error("[OAuth Authorize] Error:", error);
@@ -7508,6 +7537,9 @@ function createNextOAuthHandler(config) {
7508
7537
  if (result.clearCookie) {
7509
7538
  response.headers.set("Set-Cookie", result.clearCookie);
7510
7539
  }
7540
+ if (handler.hasDatabaseCallbacks()) {
7541
+ response.headers.set("X-Integrate-Use-Database", "true");
7542
+ }
7511
7543
  return response;
7512
7544
  } catch (error) {
7513
7545
  console.error("[OAuth Callback] Error:", error);
@@ -7526,7 +7558,11 @@ function createNextOAuthHandler(config) {
7526
7558
  }
7527
7559
  const accessToken = authHeader.substring(7);
7528
7560
  const result = await handler.handleStatus(provider, accessToken);
7529
- return Response.json(result);
7561
+ const response = Response.json(result);
7562
+ if (handler.hasDatabaseCallbacks()) {
7563
+ response.headers.set("X-Integrate-Use-Database", "true");
7564
+ }
7565
+ return response;
7530
7566
  } catch (error) {
7531
7567
  console.error("[OAuth Status] Error:", error);
7532
7568
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
@@ -7545,7 +7581,11 @@ function createNextOAuthHandler(config) {
7545
7581
  return Response.json({ error: "Missing provider in request body" }, { status: 400 });
7546
7582
  }
7547
7583
  const result = await handler.handleDisconnect({ provider }, accessToken, req);
7548
- return Response.json(result);
7584
+ const response = Response.json(result);
7585
+ if (handler.hasDatabaseCallbacks()) {
7586
+ response.headers.set("X-Integrate-Use-Database", "true");
7587
+ }
7588
+ return response;
7549
7589
  } catch (error) {
7550
7590
  console.error("[OAuth Disconnect] Error:", error);
7551
7591
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,KAAK,WAAW,GAAG,GAAG,CAAC;AACvB,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;mBACkB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;kBACiB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;gBACe,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;oBACmB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCzD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;QAGC;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;QA2BxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;;IAiB5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACY,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAelD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;qCAC8B;QAC/B,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iEAAiE;QACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;QAKG;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;QAsCxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;;EA+F/B"}
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,KAAK,WAAW,GAAG,GAAG,CAAC;AACvB,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;mBACkB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;kBACiB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;gBACe,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;oBACmB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;QAGC;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;QA2BxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;;IAiB5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACY,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAelD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;qCAC8B;QAC/B,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iEAAiE;QACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;QAKG;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;QAsCxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;;EA+F/B"}
@@ -651,7 +651,7 @@ class OAuthManager {
651
651
  this.getTokenCallback = tokenCallbacks?.getProviderToken;
652
652
  this.setTokenCallback = tokenCallbacks?.setProviderToken;
653
653
  this.removeTokenCallback = tokenCallbacks?.removeProviderToken;
654
- this.skipLocalStorage = tokenCallbacks?.skipLocalStorage ?? !!tokenCallbacks?.getProviderToken;
654
+ this.skipLocalStorage = !!(tokenCallbacks?.getProviderToken || tokenCallbacks?.setProviderToken);
655
655
  this.cleanupExpiredPendingAuths();
656
656
  }
657
657
  async initiateFlow(provider, config, returnUrl) {
@@ -930,6 +930,9 @@ class OAuthManager {
930
930
  if (this.getTokenCallback) {
931
931
  return;
932
932
  }
933
+ if (this.skipLocalStorage) {
934
+ return;
935
+ }
933
936
  if (typeof window !== "undefined" && window.localStorage) {
934
937
  try {
935
938
  const key = `integrate_token_${provider}`;
@@ -1046,6 +1049,9 @@ class OAuthManager {
1046
1049
  frontendOrigin: this.apiBaseUrl && this.flowConfig.mode === "redirect" && typeof window !== "undefined" ? window.location.origin : undefined
1047
1050
  })
1048
1051
  });
1052
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1053
+ this.skipLocalStorage = true;
1054
+ }
1049
1055
  if (!response.ok) {
1050
1056
  const error = await response.text();
1051
1057
  throw new Error(`Failed to get authorization URL: ${error}`);
@@ -1077,6 +1083,9 @@ class OAuthManager {
1077
1083
  state
1078
1084
  })
1079
1085
  });
1086
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1087
+ this.skipLocalStorage = true;
1088
+ }
1080
1089
  if (!response.ok) {
1081
1090
  const error = await response.text();
1082
1091
  throw new Error(`Failed to exchange code for token: ${error}`);
@@ -1084,6 +1093,9 @@ class OAuthManager {
1084
1093
  const data = await response.json();
1085
1094
  return data;
1086
1095
  }
1096
+ setSkipLocalStorage(value) {
1097
+ this.skipLocalStorage = value;
1098
+ }
1087
1099
  close() {
1088
1100
  this.windowManager.close();
1089
1101
  }
@@ -1140,6 +1152,7 @@ class MCPClientBase {
1140
1152
  eventEmitter = new SimpleEventEmitter;
1141
1153
  apiRouteBase;
1142
1154
  apiBaseUrl;
1155
+ databaseDetected = false;
1143
1156
  oauthCallbackPromise;
1144
1157
  server;
1145
1158
  constructor(config) {
@@ -1173,8 +1186,7 @@ class MCPClientBase {
1173
1186
  this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1174
1187
  getProviderToken: config.getProviderToken,
1175
1188
  setProviderToken: config.setProviderToken,
1176
- removeProviderToken: config.removeProviderToken,
1177
- skipLocalStorage: config.skipLocalStorage
1189
+ removeProviderToken: config.removeProviderToken
1178
1190
  });
1179
1191
  for (const integration of this.integrations) {
1180
1192
  for (const toolName of integration.tools) {
@@ -1384,6 +1396,10 @@ class MCPClientBase {
1384
1396
  arguments: args
1385
1397
  })
1386
1398
  });
1399
+ if (!this.databaseDetected && response.headers.get("X-Integrate-Use-Database") === "true") {
1400
+ this.oauthManager.setSkipLocalStorage(true);
1401
+ this.databaseDetected = true;
1402
+ }
1387
1403
  if (!response.ok) {
1388
1404
  let errorMessage = `Request failed: ${response.statusText}`;
1389
1405
  const error = new Error(errorMessage);
@@ -6556,10 +6572,17 @@ function createMCPServer(config) {
6556
6572
  const oauthHandler = new OAuthHandler({
6557
6573
  providers,
6558
6574
  serverUrl: config.serverUrl,
6559
- apiKey: config.apiKey
6575
+ apiKey: config.apiKey,
6576
+ setProviderToken: config.setProviderToken,
6577
+ removeProviderToken: config.removeProviderToken,
6578
+ getSessionContext: config.getSessionContext
6560
6579
  });
6561
6580
  const result = await oauthHandler.handleToolCall(body, authHeader);
6562
- return Response.json(result);
6581
+ const response2 = Response.json(result);
6582
+ if (oauthHandler.hasDatabaseCallbacks()) {
6583
+ response2.headers.set("X-Integrate-Use-Database", "true");
6584
+ }
6585
+ return response2;
6563
6586
  } catch (error) {
6564
6587
  console.error("[MCP Tool Call] Error:", error);
6565
6588
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
@@ -7215,6 +7238,9 @@ class OAuthHandler {
7215
7238
  }
7216
7239
  return headers;
7217
7240
  }
7241
+ hasDatabaseCallbacks() {
7242
+ return !!this.config.setProviderToken;
7243
+ }
7218
7244
  async handleAuthorize(request) {
7219
7245
  let webRequest;
7220
7246
  let authorizeRequest;
@@ -7495,6 +7521,9 @@ function createNextOAuthHandler(config) {
7495
7521
  if (result.setCookie) {
7496
7522
  response.headers.set("Set-Cookie", result.setCookie);
7497
7523
  }
7524
+ if (handler.hasDatabaseCallbacks()) {
7525
+ response.headers.set("X-Integrate-Use-Database", "true");
7526
+ }
7498
7527
  return response;
7499
7528
  } catch (error) {
7500
7529
  console.error("[OAuth Authorize] Error:", error);
@@ -7508,6 +7537,9 @@ function createNextOAuthHandler(config) {
7508
7537
  if (result.clearCookie) {
7509
7538
  response.headers.set("Set-Cookie", result.clearCookie);
7510
7539
  }
7540
+ if (handler.hasDatabaseCallbacks()) {
7541
+ response.headers.set("X-Integrate-Use-Database", "true");
7542
+ }
7511
7543
  return response;
7512
7544
  } catch (error) {
7513
7545
  console.error("[OAuth Callback] Error:", error);
@@ -7526,7 +7558,11 @@ function createNextOAuthHandler(config) {
7526
7558
  }
7527
7559
  const accessToken = authHeader.substring(7);
7528
7560
  const result = await handler.handleStatus(provider, accessToken);
7529
- return Response.json(result);
7561
+ const response = Response.json(result);
7562
+ if (handler.hasDatabaseCallbacks()) {
7563
+ response.headers.set("X-Integrate-Use-Database", "true");
7564
+ }
7565
+ return response;
7530
7566
  } catch (error) {
7531
7567
  console.error("[OAuth Status] Error:", error);
7532
7568
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
@@ -7545,7 +7581,11 @@ function createNextOAuthHandler(config) {
7545
7581
  return Response.json({ error: "Missing provider in request body" }, { status: 400 });
7546
7582
  }
7547
7583
  const result = await handler.handleDisconnect({ provider }, accessToken, req);
7548
- return Response.json(result);
7584
+ const response = Response.json(result);
7585
+ if (handler.hasDatabaseCallbacks()) {
7586
+ response.headers.set("X-Integrate-Use-Database", "true");
7587
+ }
7588
+ return response;
7549
7589
  } catch (error) {
7550
7590
  console.error("[OAuth Disconnect] Error:", error);
7551
7591
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
@@ -651,7 +651,7 @@ class OAuthManager {
651
651
  this.getTokenCallback = tokenCallbacks?.getProviderToken;
652
652
  this.setTokenCallback = tokenCallbacks?.setProviderToken;
653
653
  this.removeTokenCallback = tokenCallbacks?.removeProviderToken;
654
- this.skipLocalStorage = tokenCallbacks?.skipLocalStorage ?? !!tokenCallbacks?.getProviderToken;
654
+ this.skipLocalStorage = !!(tokenCallbacks?.getProviderToken || tokenCallbacks?.setProviderToken);
655
655
  this.cleanupExpiredPendingAuths();
656
656
  }
657
657
  async initiateFlow(provider, config, returnUrl) {
@@ -930,6 +930,9 @@ class OAuthManager {
930
930
  if (this.getTokenCallback) {
931
931
  return;
932
932
  }
933
+ if (this.skipLocalStorage) {
934
+ return;
935
+ }
933
936
  if (typeof window !== "undefined" && window.localStorage) {
934
937
  try {
935
938
  const key = `integrate_token_${provider}`;
@@ -1046,6 +1049,9 @@ class OAuthManager {
1046
1049
  frontendOrigin: this.apiBaseUrl && this.flowConfig.mode === "redirect" && typeof window !== "undefined" ? window.location.origin : undefined
1047
1050
  })
1048
1051
  });
1052
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1053
+ this.skipLocalStorage = true;
1054
+ }
1049
1055
  if (!response.ok) {
1050
1056
  const error = await response.text();
1051
1057
  throw new Error(`Failed to get authorization URL: ${error}`);
@@ -1077,6 +1083,9 @@ class OAuthManager {
1077
1083
  state
1078
1084
  })
1079
1085
  });
1086
+ if (response.headers.get("X-Integrate-Use-Database") === "true") {
1087
+ this.skipLocalStorage = true;
1088
+ }
1080
1089
  if (!response.ok) {
1081
1090
  const error = await response.text();
1082
1091
  throw new Error(`Failed to exchange code for token: ${error}`);
@@ -1084,6 +1093,9 @@ class OAuthManager {
1084
1093
  const data = await response.json();
1085
1094
  return data;
1086
1095
  }
1096
+ setSkipLocalStorage(value) {
1097
+ this.skipLocalStorage = value;
1098
+ }
1087
1099
  close() {
1088
1100
  this.windowManager.close();
1089
1101
  }
@@ -1140,6 +1152,7 @@ class MCPClientBase {
1140
1152
  eventEmitter = new SimpleEventEmitter;
1141
1153
  apiRouteBase;
1142
1154
  apiBaseUrl;
1155
+ databaseDetected = false;
1143
1156
  oauthCallbackPromise;
1144
1157
  server;
1145
1158
  constructor(config) {
@@ -1173,8 +1186,7 @@ class MCPClientBase {
1173
1186
  this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1174
1187
  getProviderToken: config.getProviderToken,
1175
1188
  setProviderToken: config.setProviderToken,
1176
- removeProviderToken: config.removeProviderToken,
1177
- skipLocalStorage: config.skipLocalStorage
1189
+ removeProviderToken: config.removeProviderToken
1178
1190
  });
1179
1191
  for (const integration of this.integrations) {
1180
1192
  for (const toolName of integration.tools) {
@@ -1384,6 +1396,10 @@ class MCPClientBase {
1384
1396
  arguments: args
1385
1397
  })
1386
1398
  });
1399
+ if (!this.databaseDetected && response.headers.get("X-Integrate-Use-Database") === "true") {
1400
+ this.oauthManager.setSkipLocalStorage(true);
1401
+ this.databaseDetected = true;
1402
+ }
1387
1403
  if (!response.ok) {
1388
1404
  let errorMessage = `Request failed: ${response.statusText}`;
1389
1405
  const error = new Error(errorMessage);
@@ -6556,10 +6572,17 @@ function createMCPServer(config) {
6556
6572
  const oauthHandler = new OAuthHandler({
6557
6573
  providers,
6558
6574
  serverUrl: config.serverUrl,
6559
- apiKey: config.apiKey
6575
+ apiKey: config.apiKey,
6576
+ setProviderToken: config.setProviderToken,
6577
+ removeProviderToken: config.removeProviderToken,
6578
+ getSessionContext: config.getSessionContext
6560
6579
  });
6561
6580
  const result = await oauthHandler.handleToolCall(body, authHeader);
6562
- return Response.json(result);
6581
+ const response2 = Response.json(result);
6582
+ if (oauthHandler.hasDatabaseCallbacks()) {
6583
+ response2.headers.set("X-Integrate-Use-Database", "true");
6584
+ }
6585
+ return response2;
6563
6586
  } catch (error) {
6564
6587
  console.error("[MCP Tool Call] Error:", error);
6565
6588
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
@@ -7215,6 +7238,9 @@ class OAuthHandler {
7215
7238
  }
7216
7239
  return headers;
7217
7240
  }
7241
+ hasDatabaseCallbacks() {
7242
+ return !!this.config.setProviderToken;
7243
+ }
7218
7244
  async handleAuthorize(request) {
7219
7245
  let webRequest;
7220
7246
  let authorizeRequest;
@@ -7495,6 +7521,9 @@ function createNextOAuthHandler(config) {
7495
7521
  if (result.setCookie) {
7496
7522
  response.headers.set("Set-Cookie", result.setCookie);
7497
7523
  }
7524
+ if (handler.hasDatabaseCallbacks()) {
7525
+ response.headers.set("X-Integrate-Use-Database", "true");
7526
+ }
7498
7527
  return response;
7499
7528
  } catch (error) {
7500
7529
  console.error("[OAuth Authorize] Error:", error);
@@ -7508,6 +7537,9 @@ function createNextOAuthHandler(config) {
7508
7537
  if (result.clearCookie) {
7509
7538
  response.headers.set("Set-Cookie", result.clearCookie);
7510
7539
  }
7540
+ if (handler.hasDatabaseCallbacks()) {
7541
+ response.headers.set("X-Integrate-Use-Database", "true");
7542
+ }
7511
7543
  return response;
7512
7544
  } catch (error) {
7513
7545
  console.error("[OAuth Callback] Error:", error);
@@ -7526,7 +7558,11 @@ function createNextOAuthHandler(config) {
7526
7558
  }
7527
7559
  const accessToken = authHeader.substring(7);
7528
7560
  const result = await handler.handleStatus(provider, accessToken);
7529
- return Response.json(result);
7561
+ const response = Response.json(result);
7562
+ if (handler.hasDatabaseCallbacks()) {
7563
+ response.headers.set("X-Integrate-Use-Database", "true");
7564
+ }
7565
+ return response;
7530
7566
  } catch (error) {
7531
7567
  console.error("[OAuth Status] Error:", error);
7532
7568
  return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
@@ -7545,7 +7581,11 @@ function createNextOAuthHandler(config) {
7545
7581
  return Response.json({ error: "Missing provider in request body" }, { status: 400 });
7546
7582
  }
7547
7583
  const result = await handler.handleDisconnect({ provider }, accessToken, req);
7548
- return Response.json(result);
7584
+ const response = Response.json(result);
7585
+ if (handler.hasDatabaseCallbacks()) {
7586
+ response.headers.set("X-Integrate-Use-Database", "true");
7587
+ }
7588
+ return response;
7549
7589
  } catch (error) {
7550
7590
  console.error("[OAuth Disconnect] Error:", error);
7551
7591
  return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });