integrate-sdk 0.7.43 → 0.7.44

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.
@@ -1117,7 +1117,9 @@ class OAuthManager {
1117
1117
  flowConfig;
1118
1118
  oauthApiBase;
1119
1119
  apiBaseUrl;
1120
- constructor(oauthApiBase, flowConfig, apiBaseUrl) {
1120
+ getTokenCallback;
1121
+ setTokenCallback;
1122
+ constructor(oauthApiBase, flowConfig, apiBaseUrl, tokenCallbacks) {
1121
1123
  this.oauthApiBase = oauthApiBase;
1122
1124
  this.apiBaseUrl = apiBaseUrl;
1123
1125
  this.windowManager = new OAuthWindowManager;
@@ -1126,6 +1128,8 @@ class OAuthManager {
1126
1128
  popupOptions: flowConfig?.popupOptions,
1127
1129
  onAuthCallback: flowConfig?.onAuthCallback
1128
1130
  };
1131
+ this.getTokenCallback = tokenCallbacks?.getProviderToken;
1132
+ this.setTokenCallback = tokenCallbacks?.setProviderToken;
1129
1133
  this.cleanupExpiredPendingAuths();
1130
1134
  }
1131
1135
  async initiateFlow(provider, config, returnUrl) {
@@ -1189,7 +1193,7 @@ class OAuthManager {
1189
1193
  scopes: response.scopes
1190
1194
  };
1191
1195
  this.providerTokens.set(pendingAuth.provider, tokenData);
1192
- this.saveProviderToken(pendingAuth.provider, tokenData);
1196
+ await this.saveProviderToken(pendingAuth.provider, tokenData);
1193
1197
  this.pendingAuths.delete(state);
1194
1198
  this.removePendingAuthFromStorage(state);
1195
1199
  return { ...tokenData, provider: pendingAuth.provider };
@@ -1200,7 +1204,7 @@ class OAuthManager {
1200
1204
  }
1201
1205
  }
1202
1206
  async checkAuthStatus(provider) {
1203
- const tokenData = this.providerTokens.get(provider);
1207
+ const tokenData = await this.getProviderToken(provider);
1204
1208
  if (!tokenData) {
1205
1209
  return {
1206
1210
  authorized: false,
@@ -1215,26 +1219,38 @@ class OAuthManager {
1215
1219
  };
1216
1220
  }
1217
1221
  async disconnectProvider(provider) {
1218
- const tokenData = this.providerTokens.get(provider);
1222
+ const tokenData = await this.getProviderToken(provider);
1219
1223
  if (!tokenData) {
1220
1224
  throw new Error(`No access token available for provider "${provider}". Cannot disconnect provider.`);
1221
1225
  }
1222
1226
  this.providerTokens.delete(provider);
1223
1227
  this.clearProviderToken(provider);
1224
1228
  }
1225
- getProviderToken(provider) {
1229
+ async getProviderToken(provider) {
1230
+ if (this.getTokenCallback) {
1231
+ try {
1232
+ const tokenData = await this.getTokenCallback(provider);
1233
+ if (tokenData) {
1234
+ this.providerTokens.set(provider, tokenData);
1235
+ }
1236
+ return tokenData;
1237
+ } catch (error) {
1238
+ console.error(`Failed to get token for ${provider} via callback:`, error);
1239
+ return;
1240
+ }
1241
+ }
1226
1242
  return this.providerTokens.get(provider);
1227
1243
  }
1228
1244
  getAllProviderTokens() {
1229
1245
  return new Map(this.providerTokens);
1230
1246
  }
1231
- setProviderToken(provider, tokenData) {
1247
+ async setProviderToken(provider, tokenData) {
1232
1248
  this.providerTokens.set(provider, tokenData);
1233
- this.saveProviderToken(provider, tokenData);
1249
+ await this.saveProviderToken(provider, tokenData);
1234
1250
  }
1235
1251
  clearProviderToken(provider) {
1236
1252
  this.providerTokens.delete(provider);
1237
- if (typeof window !== "undefined" && window.localStorage) {
1253
+ if (!this.getTokenCallback && typeof window !== "undefined" && window.localStorage) {
1238
1254
  try {
1239
1255
  window.localStorage.removeItem(`integrate_token_${provider}`);
1240
1256
  } catch (error) {
@@ -1245,7 +1261,7 @@ class OAuthManager {
1245
1261
  clearAllProviderTokens() {
1246
1262
  const providers = Array.from(this.providerTokens.keys());
1247
1263
  this.providerTokens.clear();
1248
- if (typeof window !== "undefined" && window.localStorage) {
1264
+ if (!this.getTokenCallback && typeof window !== "undefined" && window.localStorage) {
1249
1265
  for (const provider of providers) {
1250
1266
  try {
1251
1267
  window.localStorage.removeItem(`integrate_token_${provider}`);
@@ -1273,7 +1289,16 @@ class OAuthManager {
1273
1289
  }
1274
1290
  }
1275
1291
  }
1276
- saveProviderToken(provider, tokenData) {
1292
+ async saveProviderToken(provider, tokenData) {
1293
+ if (this.setTokenCallback) {
1294
+ try {
1295
+ await this.setTokenCallback(provider, tokenData);
1296
+ } catch (error) {
1297
+ console.error(`Failed to save token for ${provider} via callback:`, error);
1298
+ throw error;
1299
+ }
1300
+ return;
1301
+ }
1277
1302
  if (typeof window !== "undefined" && window.localStorage) {
1278
1303
  try {
1279
1304
  const key = `integrate_token_${provider}`;
@@ -1283,7 +1308,15 @@ class OAuthManager {
1283
1308
  }
1284
1309
  }
1285
1310
  }
1286
- loadProviderToken(provider) {
1311
+ async loadProviderToken(provider) {
1312
+ if (this.getTokenCallback) {
1313
+ try {
1314
+ return await this.getTokenCallback(provider);
1315
+ } catch (error) {
1316
+ console.error(`Failed to load token for ${provider} via callback:`, error);
1317
+ return;
1318
+ }
1319
+ }
1287
1320
  if (typeof window !== "undefined" && window.localStorage) {
1288
1321
  try {
1289
1322
  const key = `integrate_token_${provider}`;
@@ -1297,9 +1330,9 @@ class OAuthManager {
1297
1330
  }
1298
1331
  return;
1299
1332
  }
1300
- loadAllProviderTokens(providers) {
1333
+ async loadAllProviderTokens(providers) {
1301
1334
  for (const provider of providers) {
1302
- const tokenData = this.loadProviderToken(provider);
1335
+ const tokenData = await this.loadProviderToken(provider);
1303
1336
  if (tokenData) {
1304
1337
  this.providerTokens.set(provider, tokenData);
1305
1338
  }
@@ -1497,16 +1530,28 @@ class MCPClientBase {
1497
1530
  };
1498
1531
  this.onReauthRequired = config.onReauthRequired;
1499
1532
  this.maxReauthRetries = config.maxReauthRetries ?? 1;
1500
- this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl);
1533
+ this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1534
+ getProviderToken: config.getProviderToken,
1535
+ setProviderToken: config.setProviderToken
1536
+ });
1501
1537
  const providers = this.integrations.filter((p) => p.oauth).map((p) => p.oauth.provider);
1502
- this.oauthManager.loadAllProviderTokens(providers);
1538
+ this.oauthManager.loadAllProviderTokens(providers).catch((error) => {
1539
+ console.error("Failed to load provider tokens:", error);
1540
+ });
1503
1541
  for (const integration of this.integrations) {
1504
1542
  for (const toolName of integration.tools) {
1505
1543
  this.enabledToolNames.add(toolName);
1506
1544
  }
1507
1545
  if (integration.oauth) {
1508
- const hasToken = this.oauthManager.getProviderToken(integration.oauth.provider) !== undefined;
1509
- this.authState.set(integration.oauth.provider, { authenticated: hasToken });
1546
+ const provider = integration.oauth.provider;
1547
+ this.authState.set(provider, { authenticated: false });
1548
+ this.oauthManager.getProviderToken(provider).then((tokenData) => {
1549
+ if (tokenData) {
1550
+ this.authState.set(provider, { authenticated: true });
1551
+ }
1552
+ }).catch((error) => {
1553
+ console.error(`Failed to check token for ${provider}:`, error);
1554
+ });
1510
1555
  }
1511
1556
  }
1512
1557
  const integrationIds = this.integrations.map((i) => i.id);
@@ -1620,7 +1665,7 @@ class MCPClientBase {
1620
1665
  const hasApiKey = !!transportHeaders["X-API-KEY"];
1621
1666
  if (hasApiKey) {
1622
1667
  if (provider) {
1623
- const tokenData = this.oauthManager.getProviderToken(provider);
1668
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1624
1669
  if (tokenData && this.transport.setHeader) {
1625
1670
  const previousAuthHeader = transportHeaders["Authorization"];
1626
1671
  try {
@@ -1650,7 +1695,7 @@ class MCPClientBase {
1650
1695
  "Content-Type": "application/json"
1651
1696
  };
1652
1697
  if (provider) {
1653
- const tokenData = this.oauthManager.getProviderToken(provider);
1698
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1654
1699
  if (tokenData) {
1655
1700
  headers["Authorization"] = `Bearer ${tokenData.accessToken}`;
1656
1701
  }
@@ -1845,7 +1890,7 @@ class MCPClientBase {
1845
1890
  this.eventEmitter.emit("auth:started", { provider });
1846
1891
  try {
1847
1892
  await this.oauthManager.initiateFlow(provider, integration.oauth, options?.returnUrl);
1848
- const tokenData = this.oauthManager.getProviderToken(provider);
1893
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1849
1894
  if (tokenData) {
1850
1895
  this.eventEmitter.emit("auth:complete", {
1851
1896
  provider,
@@ -1876,11 +1921,11 @@ class MCPClientBase {
1876
1921
  throw error;
1877
1922
  }
1878
1923
  }
1879
- getProviderToken(provider) {
1880
- return this.oauthManager.getProviderToken(provider);
1924
+ async getProviderToken(provider) {
1925
+ return await this.oauthManager.getProviderToken(provider);
1881
1926
  }
1882
- setProviderToken(provider, tokenData) {
1883
- this.oauthManager.setProviderToken(provider, tokenData);
1927
+ async setProviderToken(provider, tokenData) {
1928
+ await this.oauthManager.setProviderToken(provider, tokenData);
1884
1929
  this.authState.set(provider, { authenticated: true });
1885
1930
  }
1886
1931
  getAllProviderTokens() {
@@ -982,7 +982,9 @@ class OAuthManager {
982
982
  flowConfig;
983
983
  oauthApiBase;
984
984
  apiBaseUrl;
985
- constructor(oauthApiBase, flowConfig, apiBaseUrl) {
985
+ getTokenCallback;
986
+ setTokenCallback;
987
+ constructor(oauthApiBase, flowConfig, apiBaseUrl, tokenCallbacks) {
986
988
  this.oauthApiBase = oauthApiBase;
987
989
  this.apiBaseUrl = apiBaseUrl;
988
990
  this.windowManager = new OAuthWindowManager;
@@ -991,6 +993,8 @@ class OAuthManager {
991
993
  popupOptions: flowConfig?.popupOptions,
992
994
  onAuthCallback: flowConfig?.onAuthCallback
993
995
  };
996
+ this.getTokenCallback = tokenCallbacks?.getProviderToken;
997
+ this.setTokenCallback = tokenCallbacks?.setProviderToken;
994
998
  this.cleanupExpiredPendingAuths();
995
999
  }
996
1000
  async initiateFlow(provider, config, returnUrl) {
@@ -1054,7 +1058,7 @@ class OAuthManager {
1054
1058
  scopes: response.scopes
1055
1059
  };
1056
1060
  this.providerTokens.set(pendingAuth.provider, tokenData);
1057
- this.saveProviderToken(pendingAuth.provider, tokenData);
1061
+ await this.saveProviderToken(pendingAuth.provider, tokenData);
1058
1062
  this.pendingAuths.delete(state);
1059
1063
  this.removePendingAuthFromStorage(state);
1060
1064
  return { ...tokenData, provider: pendingAuth.provider };
@@ -1065,7 +1069,7 @@ class OAuthManager {
1065
1069
  }
1066
1070
  }
1067
1071
  async checkAuthStatus(provider) {
1068
- const tokenData = this.providerTokens.get(provider);
1072
+ const tokenData = await this.getProviderToken(provider);
1069
1073
  if (!tokenData) {
1070
1074
  return {
1071
1075
  authorized: false,
@@ -1080,26 +1084,38 @@ class OAuthManager {
1080
1084
  };
1081
1085
  }
1082
1086
  async disconnectProvider(provider) {
1083
- const tokenData = this.providerTokens.get(provider);
1087
+ const tokenData = await this.getProviderToken(provider);
1084
1088
  if (!tokenData) {
1085
1089
  throw new Error(`No access token available for provider "${provider}". Cannot disconnect provider.`);
1086
1090
  }
1087
1091
  this.providerTokens.delete(provider);
1088
1092
  this.clearProviderToken(provider);
1089
1093
  }
1090
- getProviderToken(provider) {
1094
+ async getProviderToken(provider) {
1095
+ if (this.getTokenCallback) {
1096
+ try {
1097
+ const tokenData = await this.getTokenCallback(provider);
1098
+ if (tokenData) {
1099
+ this.providerTokens.set(provider, tokenData);
1100
+ }
1101
+ return tokenData;
1102
+ } catch (error) {
1103
+ console.error(`Failed to get token for ${provider} via callback:`, error);
1104
+ return;
1105
+ }
1106
+ }
1091
1107
  return this.providerTokens.get(provider);
1092
1108
  }
1093
1109
  getAllProviderTokens() {
1094
1110
  return new Map(this.providerTokens);
1095
1111
  }
1096
- setProviderToken(provider, tokenData) {
1112
+ async setProviderToken(provider, tokenData) {
1097
1113
  this.providerTokens.set(provider, tokenData);
1098
- this.saveProviderToken(provider, tokenData);
1114
+ await this.saveProviderToken(provider, tokenData);
1099
1115
  }
1100
1116
  clearProviderToken(provider) {
1101
1117
  this.providerTokens.delete(provider);
1102
- if (typeof window !== "undefined" && window.localStorage) {
1118
+ if (!this.getTokenCallback && typeof window !== "undefined" && window.localStorage) {
1103
1119
  try {
1104
1120
  window.localStorage.removeItem(`integrate_token_${provider}`);
1105
1121
  } catch (error) {
@@ -1110,7 +1126,7 @@ class OAuthManager {
1110
1126
  clearAllProviderTokens() {
1111
1127
  const providers = Array.from(this.providerTokens.keys());
1112
1128
  this.providerTokens.clear();
1113
- if (typeof window !== "undefined" && window.localStorage) {
1129
+ if (!this.getTokenCallback && typeof window !== "undefined" && window.localStorage) {
1114
1130
  for (const provider of providers) {
1115
1131
  try {
1116
1132
  window.localStorage.removeItem(`integrate_token_${provider}`);
@@ -1138,7 +1154,16 @@ class OAuthManager {
1138
1154
  }
1139
1155
  }
1140
1156
  }
1141
- saveProviderToken(provider, tokenData) {
1157
+ async saveProviderToken(provider, tokenData) {
1158
+ if (this.setTokenCallback) {
1159
+ try {
1160
+ await this.setTokenCallback(provider, tokenData);
1161
+ } catch (error) {
1162
+ console.error(`Failed to save token for ${provider} via callback:`, error);
1163
+ throw error;
1164
+ }
1165
+ return;
1166
+ }
1142
1167
  if (typeof window !== "undefined" && window.localStorage) {
1143
1168
  try {
1144
1169
  const key = `integrate_token_${provider}`;
@@ -1148,7 +1173,15 @@ class OAuthManager {
1148
1173
  }
1149
1174
  }
1150
1175
  }
1151
- loadProviderToken(provider) {
1176
+ async loadProviderToken(provider) {
1177
+ if (this.getTokenCallback) {
1178
+ try {
1179
+ return await this.getTokenCallback(provider);
1180
+ } catch (error) {
1181
+ console.error(`Failed to load token for ${provider} via callback:`, error);
1182
+ return;
1183
+ }
1184
+ }
1152
1185
  if (typeof window !== "undefined" && window.localStorage) {
1153
1186
  try {
1154
1187
  const key = `integrate_token_${provider}`;
@@ -1162,9 +1195,9 @@ class OAuthManager {
1162
1195
  }
1163
1196
  return;
1164
1197
  }
1165
- loadAllProviderTokens(providers) {
1198
+ async loadAllProviderTokens(providers) {
1166
1199
  for (const provider of providers) {
1167
- const tokenData = this.loadProviderToken(provider);
1200
+ const tokenData = await this.loadProviderToken(provider);
1168
1201
  if (tokenData) {
1169
1202
  this.providerTokens.set(provider, tokenData);
1170
1203
  }
@@ -1362,16 +1395,28 @@ class MCPClientBase {
1362
1395
  };
1363
1396
  this.onReauthRequired = config.onReauthRequired;
1364
1397
  this.maxReauthRetries = config.maxReauthRetries ?? 1;
1365
- this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl);
1398
+ this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1399
+ getProviderToken: config.getProviderToken,
1400
+ setProviderToken: config.setProviderToken
1401
+ });
1366
1402
  const providers = this.integrations.filter((p) => p.oauth).map((p) => p.oauth.provider);
1367
- this.oauthManager.loadAllProviderTokens(providers);
1403
+ this.oauthManager.loadAllProviderTokens(providers).catch((error) => {
1404
+ console.error("Failed to load provider tokens:", error);
1405
+ });
1368
1406
  for (const integration of this.integrations) {
1369
1407
  for (const toolName of integration.tools) {
1370
1408
  this.enabledToolNames.add(toolName);
1371
1409
  }
1372
1410
  if (integration.oauth) {
1373
- const hasToken = this.oauthManager.getProviderToken(integration.oauth.provider) !== undefined;
1374
- this.authState.set(integration.oauth.provider, { authenticated: hasToken });
1411
+ const provider = integration.oauth.provider;
1412
+ this.authState.set(provider, { authenticated: false });
1413
+ this.oauthManager.getProviderToken(provider).then((tokenData) => {
1414
+ if (tokenData) {
1415
+ this.authState.set(provider, { authenticated: true });
1416
+ }
1417
+ }).catch((error) => {
1418
+ console.error(`Failed to check token for ${provider}:`, error);
1419
+ });
1375
1420
  }
1376
1421
  }
1377
1422
  const integrationIds = this.integrations.map((i) => i.id);
@@ -1485,7 +1530,7 @@ class MCPClientBase {
1485
1530
  const hasApiKey = !!transportHeaders["X-API-KEY"];
1486
1531
  if (hasApiKey) {
1487
1532
  if (provider) {
1488
- const tokenData = this.oauthManager.getProviderToken(provider);
1533
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1489
1534
  if (tokenData && this.transport.setHeader) {
1490
1535
  const previousAuthHeader = transportHeaders["Authorization"];
1491
1536
  try {
@@ -1515,7 +1560,7 @@ class MCPClientBase {
1515
1560
  "Content-Type": "application/json"
1516
1561
  };
1517
1562
  if (provider) {
1518
- const tokenData = this.oauthManager.getProviderToken(provider);
1563
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1519
1564
  if (tokenData) {
1520
1565
  headers["Authorization"] = `Bearer ${tokenData.accessToken}`;
1521
1566
  }
@@ -1710,7 +1755,7 @@ class MCPClientBase {
1710
1755
  this.eventEmitter.emit("auth:started", { provider });
1711
1756
  try {
1712
1757
  await this.oauthManager.initiateFlow(provider, integration.oauth, options?.returnUrl);
1713
- const tokenData = this.oauthManager.getProviderToken(provider);
1758
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1714
1759
  if (tokenData) {
1715
1760
  this.eventEmitter.emit("auth:complete", {
1716
1761
  provider,
@@ -1741,11 +1786,11 @@ class MCPClientBase {
1741
1786
  throw error;
1742
1787
  }
1743
1788
  }
1744
- getProviderToken(provider) {
1745
- return this.oauthManager.getProviderToken(provider);
1789
+ async getProviderToken(provider) {
1790
+ return await this.oauthManager.getProviderToken(provider);
1746
1791
  }
1747
- setProviderToken(provider, tokenData) {
1748
- this.oauthManager.setProviderToken(provider, tokenData);
1792
+ async setProviderToken(provider, tokenData) {
1793
+ await this.oauthManager.setProviderToken(provider, tokenData);
1749
1794
  this.authState.set(provider, { authenticated: true });
1750
1795
  }
1751
1796
  getAllProviderTokens() {
@@ -982,7 +982,9 @@ class OAuthManager {
982
982
  flowConfig;
983
983
  oauthApiBase;
984
984
  apiBaseUrl;
985
- constructor(oauthApiBase, flowConfig, apiBaseUrl) {
985
+ getTokenCallback;
986
+ setTokenCallback;
987
+ constructor(oauthApiBase, flowConfig, apiBaseUrl, tokenCallbacks) {
986
988
  this.oauthApiBase = oauthApiBase;
987
989
  this.apiBaseUrl = apiBaseUrl;
988
990
  this.windowManager = new OAuthWindowManager;
@@ -991,6 +993,8 @@ class OAuthManager {
991
993
  popupOptions: flowConfig?.popupOptions,
992
994
  onAuthCallback: flowConfig?.onAuthCallback
993
995
  };
996
+ this.getTokenCallback = tokenCallbacks?.getProviderToken;
997
+ this.setTokenCallback = tokenCallbacks?.setProviderToken;
994
998
  this.cleanupExpiredPendingAuths();
995
999
  }
996
1000
  async initiateFlow(provider, config, returnUrl) {
@@ -1054,7 +1058,7 @@ class OAuthManager {
1054
1058
  scopes: response.scopes
1055
1059
  };
1056
1060
  this.providerTokens.set(pendingAuth.provider, tokenData);
1057
- this.saveProviderToken(pendingAuth.provider, tokenData);
1061
+ await this.saveProviderToken(pendingAuth.provider, tokenData);
1058
1062
  this.pendingAuths.delete(state);
1059
1063
  this.removePendingAuthFromStorage(state);
1060
1064
  return { ...tokenData, provider: pendingAuth.provider };
@@ -1065,7 +1069,7 @@ class OAuthManager {
1065
1069
  }
1066
1070
  }
1067
1071
  async checkAuthStatus(provider) {
1068
- const tokenData = this.providerTokens.get(provider);
1072
+ const tokenData = await this.getProviderToken(provider);
1069
1073
  if (!tokenData) {
1070
1074
  return {
1071
1075
  authorized: false,
@@ -1080,26 +1084,38 @@ class OAuthManager {
1080
1084
  };
1081
1085
  }
1082
1086
  async disconnectProvider(provider) {
1083
- const tokenData = this.providerTokens.get(provider);
1087
+ const tokenData = await this.getProviderToken(provider);
1084
1088
  if (!tokenData) {
1085
1089
  throw new Error(`No access token available for provider "${provider}". Cannot disconnect provider.`);
1086
1090
  }
1087
1091
  this.providerTokens.delete(provider);
1088
1092
  this.clearProviderToken(provider);
1089
1093
  }
1090
- getProviderToken(provider) {
1094
+ async getProviderToken(provider) {
1095
+ if (this.getTokenCallback) {
1096
+ try {
1097
+ const tokenData = await this.getTokenCallback(provider);
1098
+ if (tokenData) {
1099
+ this.providerTokens.set(provider, tokenData);
1100
+ }
1101
+ return tokenData;
1102
+ } catch (error) {
1103
+ console.error(`Failed to get token for ${provider} via callback:`, error);
1104
+ return;
1105
+ }
1106
+ }
1091
1107
  return this.providerTokens.get(provider);
1092
1108
  }
1093
1109
  getAllProviderTokens() {
1094
1110
  return new Map(this.providerTokens);
1095
1111
  }
1096
- setProviderToken(provider, tokenData) {
1112
+ async setProviderToken(provider, tokenData) {
1097
1113
  this.providerTokens.set(provider, tokenData);
1098
- this.saveProviderToken(provider, tokenData);
1114
+ await this.saveProviderToken(provider, tokenData);
1099
1115
  }
1100
1116
  clearProviderToken(provider) {
1101
1117
  this.providerTokens.delete(provider);
1102
- if (typeof window !== "undefined" && window.localStorage) {
1118
+ if (!this.getTokenCallback && typeof window !== "undefined" && window.localStorage) {
1103
1119
  try {
1104
1120
  window.localStorage.removeItem(`integrate_token_${provider}`);
1105
1121
  } catch (error) {
@@ -1110,7 +1126,7 @@ class OAuthManager {
1110
1126
  clearAllProviderTokens() {
1111
1127
  const providers = Array.from(this.providerTokens.keys());
1112
1128
  this.providerTokens.clear();
1113
- if (typeof window !== "undefined" && window.localStorage) {
1129
+ if (!this.getTokenCallback && typeof window !== "undefined" && window.localStorage) {
1114
1130
  for (const provider of providers) {
1115
1131
  try {
1116
1132
  window.localStorage.removeItem(`integrate_token_${provider}`);
@@ -1138,7 +1154,16 @@ class OAuthManager {
1138
1154
  }
1139
1155
  }
1140
1156
  }
1141
- saveProviderToken(provider, tokenData) {
1157
+ async saveProviderToken(provider, tokenData) {
1158
+ if (this.setTokenCallback) {
1159
+ try {
1160
+ await this.setTokenCallback(provider, tokenData);
1161
+ } catch (error) {
1162
+ console.error(`Failed to save token for ${provider} via callback:`, error);
1163
+ throw error;
1164
+ }
1165
+ return;
1166
+ }
1142
1167
  if (typeof window !== "undefined" && window.localStorage) {
1143
1168
  try {
1144
1169
  const key = `integrate_token_${provider}`;
@@ -1148,7 +1173,15 @@ class OAuthManager {
1148
1173
  }
1149
1174
  }
1150
1175
  }
1151
- loadProviderToken(provider) {
1176
+ async loadProviderToken(provider) {
1177
+ if (this.getTokenCallback) {
1178
+ try {
1179
+ return await this.getTokenCallback(provider);
1180
+ } catch (error) {
1181
+ console.error(`Failed to load token for ${provider} via callback:`, error);
1182
+ return;
1183
+ }
1184
+ }
1152
1185
  if (typeof window !== "undefined" && window.localStorage) {
1153
1186
  try {
1154
1187
  const key = `integrate_token_${provider}`;
@@ -1162,9 +1195,9 @@ class OAuthManager {
1162
1195
  }
1163
1196
  return;
1164
1197
  }
1165
- loadAllProviderTokens(providers) {
1198
+ async loadAllProviderTokens(providers) {
1166
1199
  for (const provider of providers) {
1167
- const tokenData = this.loadProviderToken(provider);
1200
+ const tokenData = await this.loadProviderToken(provider);
1168
1201
  if (tokenData) {
1169
1202
  this.providerTokens.set(provider, tokenData);
1170
1203
  }
@@ -1362,16 +1395,28 @@ class MCPClientBase {
1362
1395
  };
1363
1396
  this.onReauthRequired = config.onReauthRequired;
1364
1397
  this.maxReauthRetries = config.maxReauthRetries ?? 1;
1365
- this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl);
1398
+ this.oauthManager = new OAuthManager(oauthApiBase, config.oauthFlow, this.apiBaseUrl, {
1399
+ getProviderToken: config.getProviderToken,
1400
+ setProviderToken: config.setProviderToken
1401
+ });
1366
1402
  const providers = this.integrations.filter((p) => p.oauth).map((p) => p.oauth.provider);
1367
- this.oauthManager.loadAllProviderTokens(providers);
1403
+ this.oauthManager.loadAllProviderTokens(providers).catch((error) => {
1404
+ console.error("Failed to load provider tokens:", error);
1405
+ });
1368
1406
  for (const integration of this.integrations) {
1369
1407
  for (const toolName of integration.tools) {
1370
1408
  this.enabledToolNames.add(toolName);
1371
1409
  }
1372
1410
  if (integration.oauth) {
1373
- const hasToken = this.oauthManager.getProviderToken(integration.oauth.provider) !== undefined;
1374
- this.authState.set(integration.oauth.provider, { authenticated: hasToken });
1411
+ const provider = integration.oauth.provider;
1412
+ this.authState.set(provider, { authenticated: false });
1413
+ this.oauthManager.getProviderToken(provider).then((tokenData) => {
1414
+ if (tokenData) {
1415
+ this.authState.set(provider, { authenticated: true });
1416
+ }
1417
+ }).catch((error) => {
1418
+ console.error(`Failed to check token for ${provider}:`, error);
1419
+ });
1375
1420
  }
1376
1421
  }
1377
1422
  const integrationIds = this.integrations.map((i) => i.id);
@@ -1485,7 +1530,7 @@ class MCPClientBase {
1485
1530
  const hasApiKey = !!transportHeaders["X-API-KEY"];
1486
1531
  if (hasApiKey) {
1487
1532
  if (provider) {
1488
- const tokenData = this.oauthManager.getProviderToken(provider);
1533
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1489
1534
  if (tokenData && this.transport.setHeader) {
1490
1535
  const previousAuthHeader = transportHeaders["Authorization"];
1491
1536
  try {
@@ -1515,7 +1560,7 @@ class MCPClientBase {
1515
1560
  "Content-Type": "application/json"
1516
1561
  };
1517
1562
  if (provider) {
1518
- const tokenData = this.oauthManager.getProviderToken(provider);
1563
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1519
1564
  if (tokenData) {
1520
1565
  headers["Authorization"] = `Bearer ${tokenData.accessToken}`;
1521
1566
  }
@@ -1710,7 +1755,7 @@ class MCPClientBase {
1710
1755
  this.eventEmitter.emit("auth:started", { provider });
1711
1756
  try {
1712
1757
  await this.oauthManager.initiateFlow(provider, integration.oauth, options?.returnUrl);
1713
- const tokenData = this.oauthManager.getProviderToken(provider);
1758
+ const tokenData = await this.oauthManager.getProviderToken(provider);
1714
1759
  if (tokenData) {
1715
1760
  this.eventEmitter.emit("auth:complete", {
1716
1761
  provider,
@@ -1741,11 +1786,11 @@ class MCPClientBase {
1741
1786
  throw error;
1742
1787
  }
1743
1788
  }
1744
- getProviderToken(provider) {
1745
- return this.oauthManager.getProviderToken(provider);
1789
+ async getProviderToken(provider) {
1790
+ return await this.oauthManager.getProviderToken(provider);
1746
1791
  }
1747
- setProviderToken(provider, tokenData) {
1748
- this.oauthManager.setProviderToken(provider, tokenData);
1792
+ async setProviderToken(provider, tokenData) {
1793
+ await this.oauthManager.setProviderToken(provider, tokenData);
1749
1794
  this.authState.set(provider, { authenticated: true });
1750
1795
  }
1751
1796
  getAllProviderTokens() {
@@ -7,7 +7,6 @@ import type { MCPClient } from "../client.js";
7
7
  import type { AIToolsOptions } from "./utils.js";
8
8
  export * from "./vercel-ai.js";
9
9
  export * from "./openai.js";
10
- export * from "./openai-agents.js";
11
10
  export * from "./anthropic.js";
12
11
  export * from "./google.js";
13
12
  export * from "./cloudflare.js";
@@ -18,7 +17,7 @@ export * from "./utils.js";
18
17
  /**
19
18
  * Supported AI provider names
20
19
  */
21
- export type AIProviderName = "vercel-ai" | "openai" | "openai-agents" | "anthropic" | "google" | "cloudflare" | "langchain" | "llamaindex" | "mastra";
20
+ export type AIProviderName = "vercel-ai" | "openai" | "anthropic" | "google" | "cloudflare" | "langchain" | "llamaindex" | "mastra";
22
21
  /**
23
22
  * Generic function to get AI tools for any supported provider
24
23
  *
@@ -69,7 +68,6 @@ export type AIProviderName = "vercel-ai" | "openai" | "openai-agents" | "anthrop
69
68
  */
70
69
  export declare function getAITools(client: MCPClient<any>, provider: "vercel-ai", options?: AIToolsOptions): Promise<Record<string, any>>;
71
70
  export declare function getAITools(client: MCPClient<any>, provider: "openai", options?: AIToolsOptions): Promise<Array<any>>;
72
- export declare function getAITools(client: MCPClient<any>, provider: "openai-agents", options?: AIToolsOptions): Promise<Array<any>>;
73
71
  export declare function getAITools(client: MCPClient<any>, provider: "anthropic", options?: AIToolsOptions): Promise<Array<any>>;
74
72
  export declare function getAITools(client: MCPClient<any>, provider: "google", options?: AIToolsOptions): Promise<Array<any>>;
75
73
  export declare function getAITools(client: MCPClient<any>, provider: "cloudflare", options?: AIToolsOptions): Promise<Record<string, any>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAa3B;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,QAAQ,GACR,eAAe,GACf,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,QAAQ,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAEhC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAEhC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAY3B;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,QAAQ,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAEhC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAEhC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC"}