integrate-sdk 0.9.28-dev.0 → 0.9.29-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/auto-routes.js +54 -23
- package/dist/adapters/base-handler.d.ts +1 -0
- package/dist/adapters/base-handler.d.ts.map +1 -1
- package/dist/adapters/base-handler.js +54 -23
- package/dist/adapters/index.js +141 -56
- package/dist/adapters/nextjs.d.ts.map +1 -1
- package/dist/adapters/nextjs.js +55 -24
- package/dist/adapters/solid-start.js +141 -56
- package/dist/adapters/svelte-kit.js +141 -56
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +398 -108
- package/dist/oauth.js +53 -23
- package/dist/server.js +420 -130
- package/dist/src/adapters/base-handler.d.ts +1 -0
- package/dist/src/adapters/base-handler.d.ts.map +1 -1
- package/dist/src/adapters/nextjs.d.ts.map +1 -1
- package/dist/src/client.d.ts +7 -2
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/integrations/library-metadata.d.ts +1 -1
- package/dist/src/integrations/library-metadata.d.ts.map +1 -1
- package/dist/src/integrations/posthog-client.d.ts +222 -0
- package/dist/src/integrations/posthog-client.d.ts.map +1 -0
- package/dist/src/integrations/posthog.d.ts +30 -0
- package/dist/src/integrations/posthog.d.ts.map +1 -0
- package/dist/src/integrations/railway-client.d.ts +302 -0
- package/dist/src/integrations/railway-client.d.ts.map +1 -0
- package/dist/src/integrations/railway.d.ts +24 -0
- package/dist/src/integrations/railway.d.ts.map +1 -0
- package/dist/src/oauth/manager.d.ts.map +1 -1
- package/dist/src/oauth/types.d.ts +8 -0
- package/dist/src/oauth/types.d.ts.map +1 -1
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.d.ts.map +1 -1
- package/index.ts +2 -1
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -148,10 +148,18 @@ var init_library_metadata = __esm(() => {
|
|
|
148
148
|
description: "Manage Polar products, orders, and subscriptions",
|
|
149
149
|
category: "Business"
|
|
150
150
|
},
|
|
151
|
+
posthog: {
|
|
152
|
+
description: "Read PostHog organizations, projects, insights, and feature flags",
|
|
153
|
+
category: "Analytics"
|
|
154
|
+
},
|
|
151
155
|
ramp: {
|
|
152
156
|
description: "Manage Ramp corporate cards, bills, and spend",
|
|
153
157
|
category: "Business"
|
|
154
158
|
},
|
|
159
|
+
railway: {
|
|
160
|
+
description: "Manage Railway workspaces, projects, services, deployments, variables, domains, and volumes",
|
|
161
|
+
category: "Infrastructure"
|
|
162
|
+
},
|
|
155
163
|
slack: {
|
|
156
164
|
description: "Send and manage Slack messages and channels",
|
|
157
165
|
category: "Communication"
|
|
@@ -905,6 +913,21 @@ var exports_base_handler = {};
|
|
|
905
913
|
__export(exports_base_handler, {
|
|
906
914
|
OAuthHandler: () => OAuthHandler
|
|
907
915
|
});
|
|
916
|
+
function getForwardableProviderConfig(config) {
|
|
917
|
+
if (!config) {
|
|
918
|
+
return {};
|
|
919
|
+
}
|
|
920
|
+
return Object.fromEntries(Object.entries(config).filter(([key, value]) => value !== undefined && value !== null && !OAUTH_CONFIG_FIELDS.has(key)).map(([key, value]) => [key, String(value)]));
|
|
921
|
+
}
|
|
922
|
+
function getStoredProviderConfig(config) {
|
|
923
|
+
const baseUrl = config?.baseUrl || config?.apiBaseUrl;
|
|
924
|
+
if (!baseUrl) {
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
return {
|
|
928
|
+
baseUrl: String(baseUrl)
|
|
929
|
+
};
|
|
930
|
+
}
|
|
908
931
|
|
|
909
932
|
class OAuthHandler {
|
|
910
933
|
config;
|
|
@@ -976,25 +999,9 @@ class OAuthHandler {
|
|
|
976
999
|
if (redirectUri) {
|
|
977
1000
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
978
1001
|
}
|
|
979
|
-
const
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
"scopes",
|
|
983
|
-
"optionalScopes",
|
|
984
|
-
"redirectUri",
|
|
985
|
-
"client_id",
|
|
986
|
-
"client_secret",
|
|
987
|
-
"scope",
|
|
988
|
-
"optional_scope",
|
|
989
|
-
"redirect_uri",
|
|
990
|
-
"provider"
|
|
991
|
-
]);
|
|
992
|
-
if (providerConfig.config) {
|
|
993
|
-
for (const [key, value] of Object.entries(providerConfig.config)) {
|
|
994
|
-
if (value !== undefined && value !== null && !OAUTH_FIELDS.has(key)) {
|
|
995
|
-
url.searchParams.set(key, String(value));
|
|
996
|
-
}
|
|
997
|
-
}
|
|
1002
|
+
const extraConfig = getForwardableProviderConfig(providerConfig.config);
|
|
1003
|
+
for (const [key, value] of Object.entries(extraConfig)) {
|
|
1004
|
+
url.searchParams.set(key, value);
|
|
998
1005
|
}
|
|
999
1006
|
const response = await fetch(url.toString(), {
|
|
1000
1007
|
method: "GET",
|
|
@@ -1081,7 +1088,8 @@ class OAuthHandler {
|
|
|
1081
1088
|
state: callbackRequest.state,
|
|
1082
1089
|
client_id: providerConfig.clientId,
|
|
1083
1090
|
client_secret: providerConfig.clientSecret,
|
|
1084
|
-
redirect_uri: providerConfig.redirectUri
|
|
1091
|
+
redirect_uri: providerConfig.redirectUri,
|
|
1092
|
+
...getForwardableProviderConfig(providerConfig.config)
|
|
1085
1093
|
})
|
|
1086
1094
|
});
|
|
1087
1095
|
if (!response.ok) {
|
|
@@ -1093,12 +1101,14 @@ class OAuthHandler {
|
|
|
1093
1101
|
if (this.config.setProviderToken) {
|
|
1094
1102
|
try {
|
|
1095
1103
|
const tokenData = {
|
|
1104
|
+
sessionToken: result.sessionToken,
|
|
1096
1105
|
accessToken: result.accessToken,
|
|
1097
1106
|
refreshToken: result.refreshToken,
|
|
1098
1107
|
tokenType: result.tokenType,
|
|
1099
1108
|
expiresIn: result.expiresIn,
|
|
1100
1109
|
expiresAt: result.expiresAt,
|
|
1101
|
-
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
1110
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes,
|
|
1111
|
+
providerConfig: getStoredProviderConfig(providerConfig.config)
|
|
1102
1112
|
};
|
|
1103
1113
|
const email = result.email || await fetchUserEmail(callbackRequest.provider, tokenData);
|
|
1104
1114
|
if (email) {
|
|
@@ -1215,6 +1225,12 @@ class OAuthHandler {
|
|
|
1215
1225
|
if (providerConfig.config?.subdomain) {
|
|
1216
1226
|
body.subdomain = providerConfig.config.subdomain;
|
|
1217
1227
|
}
|
|
1228
|
+
const extraConfig = getForwardableProviderConfig(providerConfig.config);
|
|
1229
|
+
for (const [key, value] of Object.entries(extraConfig)) {
|
|
1230
|
+
if (body[key] === undefined) {
|
|
1231
|
+
body[key] = value;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1218
1234
|
const url = new URL("/oauth/refresh", this.serverUrl);
|
|
1219
1235
|
const response = await fetch(url.toString(), {
|
|
1220
1236
|
method: "POST",
|
|
@@ -1241,7 +1257,8 @@ class OAuthHandler {
|
|
|
1241
1257
|
tokenType: result.tokenType,
|
|
1242
1258
|
expiresIn: result.expiresIn,
|
|
1243
1259
|
expiresAt: result.expiresAt,
|
|
1244
|
-
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
1260
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes,
|
|
1261
|
+
providerConfig: getStoredProviderConfig(providerConfig.config)
|
|
1245
1262
|
};
|
|
1246
1263
|
const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
|
|
1247
1264
|
if (email) {
|
|
@@ -1308,12 +1325,25 @@ class OAuthHandler {
|
|
|
1308
1325
|
return jsonRpcResponse.result;
|
|
1309
1326
|
}
|
|
1310
1327
|
}
|
|
1311
|
-
var SERVER_LOG_CONTEXT = "server", logger6, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
1328
|
+
var SERVER_LOG_CONTEXT = "server", logger6, OAUTH_CONFIG_FIELDS, MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
1312
1329
|
var init_base_handler = __esm(() => {
|
|
1313
1330
|
init_integration_summary();
|
|
1314
1331
|
init_email_fetcher();
|
|
1315
1332
|
init_logger();
|
|
1316
1333
|
logger6 = createLogger("OAuthHandler", SERVER_LOG_CONTEXT);
|
|
1334
|
+
OAUTH_CONFIG_FIELDS = new Set([
|
|
1335
|
+
"clientId",
|
|
1336
|
+
"clientSecret",
|
|
1337
|
+
"scopes",
|
|
1338
|
+
"optionalScopes",
|
|
1339
|
+
"redirectUri",
|
|
1340
|
+
"client_id",
|
|
1341
|
+
"client_secret",
|
|
1342
|
+
"scope",
|
|
1343
|
+
"optional_scope",
|
|
1344
|
+
"redirect_uri",
|
|
1345
|
+
"provider"
|
|
1346
|
+
]);
|
|
1317
1347
|
});
|
|
1318
1348
|
|
|
1319
1349
|
// src/utils/env.ts
|
|
@@ -2202,7 +2232,7 @@ async function deliverWebhook(webhook, payload, timeoutMs) {
|
|
|
2202
2232
|
signal: controller.signal
|
|
2203
2233
|
});
|
|
2204
2234
|
if (!response.ok) {
|
|
2205
|
-
|
|
2235
|
+
logger40.warn(`Webhook delivery to ${webhook.url} returned ${response.status}`);
|
|
2206
2236
|
}
|
|
2207
2237
|
} finally {
|
|
2208
2238
|
clearTimeout(timeout);
|
|
@@ -2215,14 +2245,14 @@ async function deliverWebhooks(webhooks, payload, timeoutMs) {
|
|
|
2215
2245
|
for (let i = 0;i < results.length; i++) {
|
|
2216
2246
|
const result = results[i];
|
|
2217
2247
|
if (result.status === "rejected") {
|
|
2218
|
-
|
|
2248
|
+
logger40.warn(`Webhook delivery to ${webhooks[i].url} failed:`, result.reason);
|
|
2219
2249
|
}
|
|
2220
2250
|
}
|
|
2221
2251
|
}
|
|
2222
|
-
var
|
|
2252
|
+
var logger40;
|
|
2223
2253
|
var init_webhooks = __esm(() => {
|
|
2224
2254
|
init_logger();
|
|
2225
|
-
|
|
2255
|
+
logger40 = createLogger("Webhooks", "server");
|
|
2226
2256
|
});
|
|
2227
2257
|
|
|
2228
2258
|
// src/triggers/types.ts
|
|
@@ -2242,13 +2272,13 @@ async function executeTrigger(trigger, config, context) {
|
|
|
2242
2272
|
while (stepIndex < MAX_TRIGGER_STEPS) {
|
|
2243
2273
|
const stepValidation = validateStepLimit(stepIndex, MAX_TRIGGER_STEPS);
|
|
2244
2274
|
if (!stepValidation.valid) {
|
|
2245
|
-
|
|
2275
|
+
logger41.error(`[Trigger ${trigger.id}] ${stepValidation.error}`);
|
|
2246
2276
|
break;
|
|
2247
2277
|
}
|
|
2248
2278
|
const providerToken = await config.getProviderToken(currentProvider, undefined, context);
|
|
2249
2279
|
if (!providerToken) {
|
|
2250
2280
|
const error = `No OAuth token available for provider '${currentProvider}'`;
|
|
2251
|
-
|
|
2281
|
+
logger41.error(`[Trigger ${trigger.id}] ${error}`);
|
|
2252
2282
|
steps.push({
|
|
2253
2283
|
stepIndex,
|
|
2254
2284
|
toolName: currentToolName,
|
|
@@ -2274,7 +2304,7 @@ async function executeTrigger(trigger, config, context) {
|
|
|
2274
2304
|
} catch (err) {
|
|
2275
2305
|
stepSuccess = false;
|
|
2276
2306
|
stepError = err.message || "Tool execution failed";
|
|
2277
|
-
|
|
2307
|
+
logger41.error(`[Trigger ${trigger.id}] Step ${stepIndex} failed:`, err);
|
|
2278
2308
|
}
|
|
2279
2309
|
if (stepSuccess && toolResult) {
|
|
2280
2310
|
if (toolResult.isError === true) {
|
|
@@ -2367,7 +2397,7 @@ async function executeTrigger(trigger, config, context) {
|
|
|
2367
2397
|
return { success: steps.every((s) => s.success), steps, error: stepError };
|
|
2368
2398
|
}
|
|
2369
2399
|
const limitError = `Trigger execution exceeded maximum of ${MAX_TRIGGER_STEPS} steps`;
|
|
2370
|
-
|
|
2400
|
+
logger41.error(`[Trigger ${trigger.id}] ${limitError}`);
|
|
2371
2401
|
await config.triggers.update(trigger.id, {
|
|
2372
2402
|
lastRunAt: new Date().toISOString(),
|
|
2373
2403
|
runCount: (trigger.runCount || 0) + 1,
|
|
@@ -2376,12 +2406,12 @@ async function executeTrigger(trigger, config, context) {
|
|
|
2376
2406
|
}, context);
|
|
2377
2407
|
return { success: false, steps, error: limitError };
|
|
2378
2408
|
}
|
|
2379
|
-
var
|
|
2409
|
+
var logger41;
|
|
2380
2410
|
var init_executor2 = __esm(() => {
|
|
2381
2411
|
init_logger();
|
|
2382
2412
|
init_utils();
|
|
2383
2413
|
init_webhooks();
|
|
2384
|
-
|
|
2414
|
+
logger41 = createLogger("TriggerExecutor", "server");
|
|
2385
2415
|
});
|
|
2386
2416
|
|
|
2387
2417
|
// src/protocol/jsonrpc.ts
|
|
@@ -3096,6 +3126,7 @@ class OAuthManager {
|
|
|
3096
3126
|
}
|
|
3097
3127
|
const provider = tokenData.provider || pendingAuth.provider;
|
|
3098
3128
|
const tokenDataToStore = {
|
|
3129
|
+
sessionToken: tokenData.sessionToken,
|
|
3099
3130
|
accessToken: tokenData.accessToken,
|
|
3100
3131
|
refreshToken: tokenData.refreshToken,
|
|
3101
3132
|
tokenType: tokenData.tokenType,
|
|
@@ -3137,6 +3168,7 @@ class OAuthManager {
|
|
|
3137
3168
|
try {
|
|
3138
3169
|
const response = await this.exchangeCodeForToken(pendingAuth.provider, code, pendingAuth.codeVerifier, state);
|
|
3139
3170
|
const tokenData = {
|
|
3171
|
+
sessionToken: response.sessionToken,
|
|
3140
3172
|
accessToken: response.accessToken,
|
|
3141
3173
|
refreshToken: response.refreshToken,
|
|
3142
3174
|
tokenType: response.tokenType,
|
|
@@ -3708,6 +3740,7 @@ class MCPClientBase {
|
|
|
3708
3740
|
authState = new Map;
|
|
3709
3741
|
oauthManager;
|
|
3710
3742
|
eventEmitter = new SimpleEventEmitter;
|
|
3743
|
+
sessionToken;
|
|
3711
3744
|
apiRouteBase;
|
|
3712
3745
|
apiBaseUrl;
|
|
3713
3746
|
databaseDetected = false;
|
|
@@ -3752,6 +3785,7 @@ class MCPClientBase {
|
|
|
3752
3785
|
setProviderToken: config.setProviderToken,
|
|
3753
3786
|
removeProviderToken: config.removeProviderToken
|
|
3754
3787
|
});
|
|
3788
|
+
this.setSessionToken(config.sessionToken || this.loadSessionTokenFromStorage());
|
|
3755
3789
|
for (const integration of this.integrations) {
|
|
3756
3790
|
for (const toolName of integration.tools) {
|
|
3757
3791
|
this.enabledToolNames.add(toolName);
|
|
@@ -3774,6 +3808,9 @@ class MCPClientBase {
|
|
|
3774
3808
|
const provider = integration.oauth.provider;
|
|
3775
3809
|
try {
|
|
3776
3810
|
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
3811
|
+
if (tokenData?.sessionToken && !this.sessionToken) {
|
|
3812
|
+
this.setSessionToken(tokenData.sessionToken);
|
|
3813
|
+
}
|
|
3777
3814
|
const currentState = this.authState.get(provider);
|
|
3778
3815
|
if (currentState && !currentState.authenticated && !currentState.lastError) {
|
|
3779
3816
|
this.authState.set(provider, { authenticated: !!tokenData });
|
|
@@ -3798,6 +3835,9 @@ class MCPClientBase {
|
|
|
3798
3835
|
const provider = integration.oauth.provider;
|
|
3799
3836
|
const tokenData = this.oauthManager.getProviderTokenFromCache(provider);
|
|
3800
3837
|
if (tokenData) {
|
|
3838
|
+
if (tokenData.sessionToken && !this.sessionToken) {
|
|
3839
|
+
this.setSessionToken(tokenData.sessionToken);
|
|
3840
|
+
}
|
|
3801
3841
|
this.authState.set(provider, { authenticated: true });
|
|
3802
3842
|
}
|
|
3803
3843
|
}
|
|
@@ -3819,6 +3859,9 @@ class MCPClientBase {
|
|
|
3819
3859
|
if (integrationIds.includes("linear")) {
|
|
3820
3860
|
this.linear = this.createIntegrationProxy("linear");
|
|
3821
3861
|
}
|
|
3862
|
+
if (integrationIds.includes("railway")) {
|
|
3863
|
+
this.railway = this.createIntegrationProxy("railway");
|
|
3864
|
+
}
|
|
3822
3865
|
if (integrationIds.includes("vercel")) {
|
|
3823
3866
|
this.vercel = this.createIntegrationProxy("vercel");
|
|
3824
3867
|
}
|
|
@@ -3849,6 +3892,9 @@ class MCPClientBase {
|
|
|
3849
3892
|
if (integrationIds.includes("gslides")) {
|
|
3850
3893
|
this.gslides = this.createIntegrationProxy("gslides");
|
|
3851
3894
|
}
|
|
3895
|
+
if (integrationIds.includes("posthog")) {
|
|
3896
|
+
this.posthog = this.createIntegrationProxy("posthog");
|
|
3897
|
+
}
|
|
3852
3898
|
this.server = this.createServerProxy();
|
|
3853
3899
|
this.trigger = new TriggerClient({
|
|
3854
3900
|
apiRouteBase: this.apiRouteBase,
|
|
@@ -4139,17 +4185,15 @@ class MCPClientBase {
|
|
|
4139
4185
|
const headers = {
|
|
4140
4186
|
"Content-Type": "application/json"
|
|
4141
4187
|
};
|
|
4188
|
+
if (this.sessionToken) {
|
|
4189
|
+
headers["Authorization"] = `Bearer ${this.sessionToken}`;
|
|
4190
|
+
headers["X-Session-Token"] = this.sessionToken;
|
|
4191
|
+
}
|
|
4142
4192
|
const integrationsHeader = this.getIntegrationHeaderValue();
|
|
4143
4193
|
if (integrationsHeader) {
|
|
4144
4194
|
headers["X-Integrations"] = integrationsHeader;
|
|
4145
4195
|
}
|
|
4146
4196
|
Object.assign(headers, integrationHeaders);
|
|
4147
|
-
if (provider) {
|
|
4148
|
-
const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
|
|
4149
|
-
if (tokenData) {
|
|
4150
|
-
headers["Authorization"] = `Bearer ${tokenData.accessToken}`;
|
|
4151
|
-
}
|
|
4152
|
-
}
|
|
4153
4197
|
const response = await fetch(url, {
|
|
4154
4198
|
method: "POST",
|
|
4155
4199
|
headers,
|
|
@@ -4348,7 +4392,35 @@ class MCPClientBase {
|
|
|
4348
4392
|
off(event, handler) {
|
|
4349
4393
|
this.eventEmitter.off(event, handler);
|
|
4350
4394
|
}
|
|
4395
|
+
loadSessionTokenFromStorage() {
|
|
4396
|
+
if (typeof window === "undefined" || !window.sessionStorage) {
|
|
4397
|
+
return;
|
|
4398
|
+
}
|
|
4399
|
+
try {
|
|
4400
|
+
return window.sessionStorage.getItem("integrate_session_token") || undefined;
|
|
4401
|
+
} catch {
|
|
4402
|
+
return;
|
|
4403
|
+
}
|
|
4404
|
+
}
|
|
4405
|
+
setSessionToken(sessionToken) {
|
|
4406
|
+
this.sessionToken = sessionToken;
|
|
4407
|
+
if (sessionToken) {
|
|
4408
|
+
this.transport.setHeader("X-Session-Token", sessionToken);
|
|
4409
|
+
} else {
|
|
4410
|
+
this.transport.removeHeader("X-Session-Token");
|
|
4411
|
+
}
|
|
4412
|
+
if (typeof window !== "undefined" && window.sessionStorage) {
|
|
4413
|
+
try {
|
|
4414
|
+
if (sessionToken) {
|
|
4415
|
+
window.sessionStorage.setItem("integrate_session_token", sessionToken);
|
|
4416
|
+
} else {
|
|
4417
|
+
window.sessionStorage.removeItem("integrate_session_token");
|
|
4418
|
+
}
|
|
4419
|
+
} catch {}
|
|
4420
|
+
}
|
|
4421
|
+
}
|
|
4351
4422
|
clearSessionToken() {
|
|
4423
|
+
this.setSessionToken(undefined);
|
|
4352
4424
|
this.oauthManager.clearAllProviderTokens();
|
|
4353
4425
|
for (const integration of this.integrations) {
|
|
4354
4426
|
if (integration.oauth) {
|
|
@@ -4490,6 +4562,7 @@ class MCPClientBase {
|
|
|
4490
4562
|
if (tokenData) {
|
|
4491
4563
|
this.eventEmitter.emit("auth:complete", {
|
|
4492
4564
|
provider,
|
|
4565
|
+
sessionToken: tokenData.sessionToken || this.sessionToken,
|
|
4493
4566
|
accessToken: tokenData.accessToken,
|
|
4494
4567
|
expiresAt: tokenData.expiresAt
|
|
4495
4568
|
});
|
|
@@ -4505,6 +4578,7 @@ class MCPClientBase {
|
|
|
4505
4578
|
if (tokenData) {
|
|
4506
4579
|
this.eventEmitter.emit("auth:complete", {
|
|
4507
4580
|
provider,
|
|
4581
|
+
sessionToken: tokenData.sessionToken || this.sessionToken,
|
|
4508
4582
|
accessToken: tokenData.accessToken,
|
|
4509
4583
|
expiresAt: tokenData.expiresAt
|
|
4510
4584
|
});
|
|
@@ -4518,9 +4592,13 @@ class MCPClientBase {
|
|
|
4518
4592
|
async handleOAuthCallback(params) {
|
|
4519
4593
|
try {
|
|
4520
4594
|
const result = params.tokenData ? await this.oauthManager.handleCallbackWithToken(params.code, params.state, params.tokenData) : await this.oauthManager.handleCallback(params.code, params.state);
|
|
4595
|
+
if (result.sessionToken) {
|
|
4596
|
+
this.setSessionToken(result.sessionToken);
|
|
4597
|
+
}
|
|
4521
4598
|
this.authState.set(result.provider, { authenticated: true });
|
|
4522
4599
|
this.eventEmitter.emit("auth:complete", {
|
|
4523
4600
|
provider: result.provider,
|
|
4601
|
+
sessionToken: result.sessionToken || this.sessionToken,
|
|
4524
4602
|
accessToken: result.accessToken,
|
|
4525
4603
|
expiresAt: result.expiresAt
|
|
4526
4604
|
});
|
|
@@ -4716,7 +4794,7 @@ function createNextOAuthHandler(config) {
|
|
|
4716
4794
|
const codeModeHeader = req.headers.get("x-integrate-code-mode");
|
|
4717
4795
|
const tokensHeader = req.headers.get("x-integrate-tokens");
|
|
4718
4796
|
const toolName = typeof body?.name === "string" ? body.name : "";
|
|
4719
|
-
if (codeModeHeader === "1" && tokensHeader && toolName) {
|
|
4797
|
+
if (codeModeHeader === "1" && !authHeader && tokensHeader && toolName) {
|
|
4720
4798
|
try {
|
|
4721
4799
|
const tokens = JSON.parse(tokensHeader);
|
|
4722
4800
|
let best = null;
|
|
@@ -5190,9 +5268,123 @@ function linearIntegration(config = {}) {
|
|
|
5190
5268
|
}
|
|
5191
5269
|
};
|
|
5192
5270
|
}
|
|
5271
|
+
// src/integrations/railway.ts
|
|
5272
|
+
init_logger();
|
|
5273
|
+
var logger13 = createLogger("Railway");
|
|
5274
|
+
var RAILWAY_SCOPES = [
|
|
5275
|
+
"openid",
|
|
5276
|
+
"profile",
|
|
5277
|
+
"email",
|
|
5278
|
+
"workspace:admin",
|
|
5279
|
+
"project:member"
|
|
5280
|
+
];
|
|
5281
|
+
var RAILWAY_TOOLS = [
|
|
5282
|
+
"railway_get_current_user",
|
|
5283
|
+
"railway_get_workspace",
|
|
5284
|
+
"railway_list_regions",
|
|
5285
|
+
"railway_list_projects",
|
|
5286
|
+
"railway_get_project",
|
|
5287
|
+
"railway_create_project",
|
|
5288
|
+
"railway_update_project",
|
|
5289
|
+
"railway_delete_project",
|
|
5290
|
+
"railway_transfer_project",
|
|
5291
|
+
"railway_list_project_members",
|
|
5292
|
+
"railway_list_environments",
|
|
5293
|
+
"railway_get_environment",
|
|
5294
|
+
"railway_create_environment",
|
|
5295
|
+
"railway_rename_environment",
|
|
5296
|
+
"railway_delete_environment",
|
|
5297
|
+
"railway_get_environment_logs",
|
|
5298
|
+
"railway_get_environment_staged_changes",
|
|
5299
|
+
"railway_commit_environment_staged_changes",
|
|
5300
|
+
"railway_get_service",
|
|
5301
|
+
"railway_get_service_instance",
|
|
5302
|
+
"railway_create_service",
|
|
5303
|
+
"railway_update_service",
|
|
5304
|
+
"railway_update_service_instance",
|
|
5305
|
+
"railway_connect_service",
|
|
5306
|
+
"railway_disconnect_service",
|
|
5307
|
+
"railway_deploy_service",
|
|
5308
|
+
"railway_redeploy_service",
|
|
5309
|
+
"railway_get_service_limits",
|
|
5310
|
+
"railway_delete_service",
|
|
5311
|
+
"railway_list_deployments",
|
|
5312
|
+
"railway_get_deployment",
|
|
5313
|
+
"railway_get_latest_active_deployment",
|
|
5314
|
+
"railway_get_deployment_build_logs",
|
|
5315
|
+
"railway_get_deployment_runtime_logs",
|
|
5316
|
+
"railway_get_deployment_http_logs",
|
|
5317
|
+
"railway_redeploy_deployment",
|
|
5318
|
+
"railway_restart_deployment",
|
|
5319
|
+
"railway_rollback_deployment",
|
|
5320
|
+
"railway_stop_deployment",
|
|
5321
|
+
"railway_cancel_deployment",
|
|
5322
|
+
"railway_remove_deployment",
|
|
5323
|
+
"railway_get_variables",
|
|
5324
|
+
"railway_get_unrendered_variables",
|
|
5325
|
+
"railway_upsert_variable",
|
|
5326
|
+
"railway_upsert_variables",
|
|
5327
|
+
"railway_delete_variable",
|
|
5328
|
+
"railway_get_rendered_variables",
|
|
5329
|
+
"railway_list_domains",
|
|
5330
|
+
"railway_create_service_domain",
|
|
5331
|
+
"railway_delete_service_domain",
|
|
5332
|
+
"railway_check_custom_domain_availability",
|
|
5333
|
+
"railway_create_custom_domain",
|
|
5334
|
+
"railway_get_custom_domain_status",
|
|
5335
|
+
"railway_update_custom_domain",
|
|
5336
|
+
"railway_delete_custom_domain",
|
|
5337
|
+
"railway_list_project_volumes",
|
|
5338
|
+
"railway_get_volume_instance",
|
|
5339
|
+
"railway_create_volume",
|
|
5340
|
+
"railway_update_volume",
|
|
5341
|
+
"railway_update_volume_instance",
|
|
5342
|
+
"railway_delete_volume",
|
|
5343
|
+
"railway_list_volume_backups",
|
|
5344
|
+
"railway_create_volume_backup",
|
|
5345
|
+
"railway_restore_volume_backup",
|
|
5346
|
+
"railway_lock_volume_backup",
|
|
5347
|
+
"railway_delete_volume_backup",
|
|
5348
|
+
"railway_list_volume_backup_schedules",
|
|
5349
|
+
"railway_list_tcp_proxies"
|
|
5350
|
+
];
|
|
5351
|
+
function railwayIntegration(config = {}) {
|
|
5352
|
+
const oauth = {
|
|
5353
|
+
provider: "railway",
|
|
5354
|
+
clientId: config.clientId ?? getEnv("RAILWAY_CLIENT_ID"),
|
|
5355
|
+
clientSecret: config.clientSecret ?? getEnv("RAILWAY_CLIENT_SECRET"),
|
|
5356
|
+
scopes: config.scopes ?? [...RAILWAY_SCOPES],
|
|
5357
|
+
optionalScopes: config.optionalScopes,
|
|
5358
|
+
redirectUri: config.redirectUri,
|
|
5359
|
+
config: {
|
|
5360
|
+
authorization_endpoint: "https://backboard.railway.com/oauth/auth",
|
|
5361
|
+
token_endpoint: "https://backboard.railway.com/oauth/token",
|
|
5362
|
+
response_type: "code",
|
|
5363
|
+
grant_types_supported: ["authorization_code", "refresh_token"],
|
|
5364
|
+
code_challenge_method: "S256",
|
|
5365
|
+
apiBaseUrl: "https://backboard.railway.com/graphql/v2",
|
|
5366
|
+
...config
|
|
5367
|
+
}
|
|
5368
|
+
};
|
|
5369
|
+
return {
|
|
5370
|
+
id: "railway",
|
|
5371
|
+
name: "Railway",
|
|
5372
|
+
logoUrl: "https://wdvtnli2jn3texa6.public.blob.vercel-storage.com/railway.png",
|
|
5373
|
+
description: "Manage Railway workspaces, projects, services, deployments, variables, domains, and volumes",
|
|
5374
|
+
category: "Infrastructure",
|
|
5375
|
+
tools: [...RAILWAY_TOOLS],
|
|
5376
|
+
oauth,
|
|
5377
|
+
async onInit(_client) {
|
|
5378
|
+
logger13.debug("Railway integration initialized");
|
|
5379
|
+
},
|
|
5380
|
+
async onAfterConnect(_client) {
|
|
5381
|
+
logger13.debug("Railway integration connected");
|
|
5382
|
+
}
|
|
5383
|
+
};
|
|
5384
|
+
}
|
|
5193
5385
|
// src/integrations/vercel.ts
|
|
5194
5386
|
init_logger();
|
|
5195
|
-
var
|
|
5387
|
+
var logger14 = createLogger("Vercel");
|
|
5196
5388
|
var VERCEL_TOOLS = [
|
|
5197
5389
|
"vercel_list_projects",
|
|
5198
5390
|
"vercel_get_project",
|
|
@@ -5235,16 +5427,16 @@ function vercelIntegration(config = {}) {
|
|
|
5235
5427
|
tools: [...VERCEL_TOOLS],
|
|
5236
5428
|
oauth,
|
|
5237
5429
|
async onInit(_client) {
|
|
5238
|
-
|
|
5430
|
+
logger14.debug("Vercel integration initialized");
|
|
5239
5431
|
},
|
|
5240
5432
|
async onAfterConnect(_client) {
|
|
5241
|
-
|
|
5433
|
+
logger14.debug("Vercel integration connected");
|
|
5242
5434
|
}
|
|
5243
5435
|
};
|
|
5244
5436
|
}
|
|
5245
5437
|
// src/integrations/zendesk.ts
|
|
5246
5438
|
init_logger();
|
|
5247
|
-
var
|
|
5439
|
+
var logger15 = createLogger("Zendesk");
|
|
5248
5440
|
var ZENDESK_TOOLS = [
|
|
5249
5441
|
"zendesk_list_tickets",
|
|
5250
5442
|
"zendesk_get_ticket",
|
|
@@ -5293,16 +5485,16 @@ function zendeskIntegration(config = {}) {
|
|
|
5293
5485
|
tools: [...ZENDESK_TOOLS],
|
|
5294
5486
|
oauth,
|
|
5295
5487
|
async onInit(_client) {
|
|
5296
|
-
|
|
5488
|
+
logger15.debug("Zendesk integration initialized");
|
|
5297
5489
|
},
|
|
5298
5490
|
async onAfterConnect(_client) {
|
|
5299
|
-
|
|
5491
|
+
logger15.debug("Zendesk integration connected");
|
|
5300
5492
|
}
|
|
5301
5493
|
};
|
|
5302
5494
|
}
|
|
5303
5495
|
// src/integrations/stripe.ts
|
|
5304
5496
|
init_logger();
|
|
5305
|
-
var
|
|
5497
|
+
var logger16 = createLogger("Stripe");
|
|
5306
5498
|
var STRIPE_TOOLS = [
|
|
5307
5499
|
"stripe_list_customers",
|
|
5308
5500
|
"stripe_get_customer",
|
|
@@ -5358,16 +5550,16 @@ function stripeIntegration(config = {}) {
|
|
|
5358
5550
|
tools: [...STRIPE_TOOLS],
|
|
5359
5551
|
oauth,
|
|
5360
5552
|
async onInit(_client) {
|
|
5361
|
-
|
|
5553
|
+
logger16.debug("Stripe integration initialized");
|
|
5362
5554
|
},
|
|
5363
5555
|
async onAfterConnect(_client) {
|
|
5364
|
-
|
|
5556
|
+
logger16.debug("Stripe integration connected");
|
|
5365
5557
|
}
|
|
5366
5558
|
};
|
|
5367
5559
|
}
|
|
5368
5560
|
// src/integrations/gcal.ts
|
|
5369
5561
|
init_logger();
|
|
5370
|
-
var
|
|
5562
|
+
var logger17 = createLogger("Google Calendar");
|
|
5371
5563
|
var GCAL_TOOLS = [
|
|
5372
5564
|
"gcal_list_calendars",
|
|
5373
5565
|
"gcal_get_calendar",
|
|
@@ -5400,16 +5592,16 @@ function gcalIntegration(config = {}) {
|
|
|
5400
5592
|
tools: [...GCAL_TOOLS],
|
|
5401
5593
|
oauth,
|
|
5402
5594
|
async onInit(_client) {
|
|
5403
|
-
|
|
5595
|
+
logger17.debug("Google Calendar integration initialized");
|
|
5404
5596
|
},
|
|
5405
5597
|
async onAfterConnect(_client) {
|
|
5406
|
-
|
|
5598
|
+
logger17.debug("Google Calendar integration connected");
|
|
5407
5599
|
}
|
|
5408
5600
|
};
|
|
5409
5601
|
}
|
|
5410
5602
|
// src/integrations/outlook.ts
|
|
5411
5603
|
init_logger();
|
|
5412
|
-
var
|
|
5604
|
+
var logger18 = createLogger("Outlook");
|
|
5413
5605
|
var OUTLOOK_TOOLS = [
|
|
5414
5606
|
"outlook_list_messages",
|
|
5415
5607
|
"outlook_get_message",
|
|
@@ -5456,16 +5648,16 @@ function outlookIntegration(config = {}) {
|
|
|
5456
5648
|
tools: [...OUTLOOK_TOOLS],
|
|
5457
5649
|
oauth,
|
|
5458
5650
|
async onInit(_client) {
|
|
5459
|
-
|
|
5651
|
+
logger18.debug("Outlook integration initialized");
|
|
5460
5652
|
},
|
|
5461
5653
|
async onAfterConnect(_client) {
|
|
5462
|
-
|
|
5654
|
+
logger18.debug("Outlook integration connected");
|
|
5463
5655
|
}
|
|
5464
5656
|
};
|
|
5465
5657
|
}
|
|
5466
5658
|
// src/integrations/airtable.ts
|
|
5467
5659
|
init_logger();
|
|
5468
|
-
var
|
|
5660
|
+
var logger19 = createLogger("Airtable");
|
|
5469
5661
|
var AIRTABLE_TOOLS = [
|
|
5470
5662
|
"airtable_list_bases",
|
|
5471
5663
|
"airtable_get_base",
|
|
@@ -5511,16 +5703,16 @@ function airtableIntegration(config = {}) {
|
|
|
5511
5703
|
tools: [...AIRTABLE_TOOLS],
|
|
5512
5704
|
oauth,
|
|
5513
5705
|
async onInit(_client) {
|
|
5514
|
-
|
|
5706
|
+
logger19.debug("Airtable integration initialized");
|
|
5515
5707
|
},
|
|
5516
5708
|
async onAfterConnect(_client) {
|
|
5517
|
-
|
|
5709
|
+
logger19.debug("Airtable integration connected");
|
|
5518
5710
|
}
|
|
5519
5711
|
};
|
|
5520
5712
|
}
|
|
5521
5713
|
// src/integrations/todoist.ts
|
|
5522
5714
|
init_logger();
|
|
5523
|
-
var
|
|
5715
|
+
var logger20 = createLogger("Todoist");
|
|
5524
5716
|
var TODOIST_TOOLS = [
|
|
5525
5717
|
"todoist_list_projects",
|
|
5526
5718
|
"todoist_get_project",
|
|
@@ -5575,16 +5767,16 @@ function todoistIntegration(config = {}) {
|
|
|
5575
5767
|
tools: [...TODOIST_TOOLS],
|
|
5576
5768
|
oauth,
|
|
5577
5769
|
async onInit(_client) {
|
|
5578
|
-
|
|
5770
|
+
logger20.debug("Todoist integration initialized");
|
|
5579
5771
|
},
|
|
5580
5772
|
async onAfterConnect(_client) {
|
|
5581
|
-
|
|
5773
|
+
logger20.debug("Todoist integration connected");
|
|
5582
5774
|
}
|
|
5583
5775
|
};
|
|
5584
5776
|
}
|
|
5585
5777
|
// src/integrations/whatsapp.ts
|
|
5586
5778
|
init_logger();
|
|
5587
|
-
var
|
|
5779
|
+
var logger21 = createLogger("WhatsApp");
|
|
5588
5780
|
var WHATSAPP_TOOLS = [
|
|
5589
5781
|
"whatsapp_send_message",
|
|
5590
5782
|
"whatsapp_reply_message",
|
|
@@ -5630,16 +5822,16 @@ function whatsappIntegration(config = {}) {
|
|
|
5630
5822
|
tools: [...WHATSAPP_TOOLS],
|
|
5631
5823
|
oauth,
|
|
5632
5824
|
async onInit(_client) {
|
|
5633
|
-
|
|
5825
|
+
logger21.debug("WhatsApp Business integration initialized");
|
|
5634
5826
|
},
|
|
5635
5827
|
async onAfterConnect(_client) {
|
|
5636
|
-
|
|
5828
|
+
logger21.debug("WhatsApp Business integration connected");
|
|
5637
5829
|
}
|
|
5638
5830
|
};
|
|
5639
5831
|
}
|
|
5640
5832
|
// src/integrations/calcom.ts
|
|
5641
5833
|
init_logger();
|
|
5642
|
-
var
|
|
5834
|
+
var logger22 = createLogger("Cal.com");
|
|
5643
5835
|
var CALCOM_TOOLS = [
|
|
5644
5836
|
"calcom_list_bookings",
|
|
5645
5837
|
"calcom_get_booking",
|
|
@@ -5715,16 +5907,16 @@ function calcomIntegration(config = {}) {
|
|
|
5715
5907
|
tools: [...CALCOM_TOOLS],
|
|
5716
5908
|
oauth,
|
|
5717
5909
|
async onInit(_client) {
|
|
5718
|
-
|
|
5910
|
+
logger22.debug("Cal.com integration initialized");
|
|
5719
5911
|
},
|
|
5720
5912
|
async onAfterConnect(_client) {
|
|
5721
|
-
|
|
5913
|
+
logger22.debug("Cal.com integration connected");
|
|
5722
5914
|
}
|
|
5723
5915
|
};
|
|
5724
5916
|
}
|
|
5725
5917
|
// src/integrations/ramp.ts
|
|
5726
5918
|
init_logger();
|
|
5727
|
-
var
|
|
5919
|
+
var logger23 = createLogger("Ramp");
|
|
5728
5920
|
var RAMP_TOOLS = [
|
|
5729
5921
|
"ramp_list_transactions",
|
|
5730
5922
|
"ramp_get_transaction",
|
|
@@ -5756,16 +5948,16 @@ function rampIntegration(config = {}) {
|
|
|
5756
5948
|
tools: [...RAMP_TOOLS],
|
|
5757
5949
|
oauth,
|
|
5758
5950
|
async onInit(_client) {
|
|
5759
|
-
|
|
5951
|
+
logger23.debug("Ramp integration initialized");
|
|
5760
5952
|
},
|
|
5761
5953
|
async onAfterConnect(_client) {
|
|
5762
|
-
|
|
5954
|
+
logger23.debug("Ramp integration connected");
|
|
5763
5955
|
}
|
|
5764
5956
|
};
|
|
5765
5957
|
}
|
|
5766
5958
|
// src/integrations/onedrive.ts
|
|
5767
5959
|
init_logger();
|
|
5768
|
-
var
|
|
5960
|
+
var logger24 = createLogger("OneDrive");
|
|
5769
5961
|
var ONEDRIVE_TOOLS = [
|
|
5770
5962
|
"onedrive_list_files",
|
|
5771
5963
|
"onedrive_get_file",
|
|
@@ -5794,16 +5986,16 @@ function onedriveIntegration(config = {}) {
|
|
|
5794
5986
|
tools: [...ONEDRIVE_TOOLS],
|
|
5795
5987
|
oauth,
|
|
5796
5988
|
async onInit(_client) {
|
|
5797
|
-
|
|
5989
|
+
logger24.debug("OneDrive integration initialized");
|
|
5798
5990
|
},
|
|
5799
5991
|
async onAfterConnect(_client) {
|
|
5800
|
-
|
|
5992
|
+
logger24.debug("OneDrive integration connected");
|
|
5801
5993
|
}
|
|
5802
5994
|
};
|
|
5803
5995
|
}
|
|
5804
5996
|
// src/integrations/dropbox.ts
|
|
5805
5997
|
init_logger();
|
|
5806
|
-
var
|
|
5998
|
+
var logger25 = createLogger("Dropbox");
|
|
5807
5999
|
var DROPBOX_TOOLS = [
|
|
5808
6000
|
"dropbox_get_current_account",
|
|
5809
6001
|
"dropbox_get_space_usage",
|
|
@@ -5842,16 +6034,16 @@ function dropboxIntegration(options = {}) {
|
|
|
5842
6034
|
authType: "oauth",
|
|
5843
6035
|
oauth,
|
|
5844
6036
|
async onInit(_client) {
|
|
5845
|
-
|
|
6037
|
+
logger25.debug("Dropbox integration initialized");
|
|
5846
6038
|
},
|
|
5847
6039
|
async onAfterConnect(_client) {
|
|
5848
|
-
|
|
6040
|
+
logger25.debug("Dropbox integration connected");
|
|
5849
6041
|
}
|
|
5850
6042
|
};
|
|
5851
6043
|
}
|
|
5852
6044
|
// src/integrations/word.ts
|
|
5853
6045
|
init_logger();
|
|
5854
|
-
var
|
|
6046
|
+
var logger26 = createLogger("Word");
|
|
5855
6047
|
var WORD_TOOLS = [
|
|
5856
6048
|
"word_list",
|
|
5857
6049
|
"word_get",
|
|
@@ -5877,16 +6069,16 @@ function wordIntegration(config = {}) {
|
|
|
5877
6069
|
tools: [...WORD_TOOLS],
|
|
5878
6070
|
oauth,
|
|
5879
6071
|
async onInit(_client) {
|
|
5880
|
-
|
|
6072
|
+
logger26.debug("Word integration initialized");
|
|
5881
6073
|
},
|
|
5882
6074
|
async onAfterConnect(_client) {
|
|
5883
|
-
|
|
6075
|
+
logger26.debug("Word integration connected");
|
|
5884
6076
|
}
|
|
5885
6077
|
};
|
|
5886
6078
|
}
|
|
5887
6079
|
// src/integrations/excel.ts
|
|
5888
6080
|
init_logger();
|
|
5889
|
-
var
|
|
6081
|
+
var logger27 = createLogger("Excel");
|
|
5890
6082
|
var EXCEL_TOOLS = [
|
|
5891
6083
|
"excel_list",
|
|
5892
6084
|
"excel_get",
|
|
@@ -5922,16 +6114,16 @@ function excelIntegration(config = {}) {
|
|
|
5922
6114
|
tools: [...EXCEL_TOOLS],
|
|
5923
6115
|
oauth,
|
|
5924
6116
|
async onInit(_client) {
|
|
5925
|
-
|
|
6117
|
+
logger27.debug("Excel integration initialized");
|
|
5926
6118
|
},
|
|
5927
6119
|
async onAfterConnect(_client) {
|
|
5928
|
-
|
|
6120
|
+
logger27.debug("Excel integration connected");
|
|
5929
6121
|
}
|
|
5930
6122
|
};
|
|
5931
6123
|
}
|
|
5932
6124
|
// src/integrations/powerpoint.ts
|
|
5933
6125
|
init_logger();
|
|
5934
|
-
var
|
|
6126
|
+
var logger28 = createLogger("PowerPoint");
|
|
5935
6127
|
var POWERPOINT_TOOLS = [
|
|
5936
6128
|
"powerpoint_list",
|
|
5937
6129
|
"powerpoint_get",
|
|
@@ -5957,16 +6149,16 @@ function powerpointIntegration(config = {}) {
|
|
|
5957
6149
|
tools: [...POWERPOINT_TOOLS],
|
|
5958
6150
|
oauth,
|
|
5959
6151
|
async onInit(_client) {
|
|
5960
|
-
|
|
6152
|
+
logger28.debug("PowerPoint integration initialized");
|
|
5961
6153
|
},
|
|
5962
6154
|
async onAfterConnect(_client) {
|
|
5963
|
-
|
|
6155
|
+
logger28.debug("PowerPoint integration connected");
|
|
5964
6156
|
}
|
|
5965
6157
|
};
|
|
5966
6158
|
}
|
|
5967
6159
|
// src/integrations/gdocs.ts
|
|
5968
6160
|
init_logger();
|
|
5969
|
-
var
|
|
6161
|
+
var logger29 = createLogger("Google Docs");
|
|
5970
6162
|
var GDOCS_TOOLS = [
|
|
5971
6163
|
"gdocs_list",
|
|
5972
6164
|
"gdocs_get",
|
|
@@ -5991,16 +6183,16 @@ function gdocsIntegration(config = {}) {
|
|
|
5991
6183
|
tools: [...GDOCS_TOOLS],
|
|
5992
6184
|
oauth,
|
|
5993
6185
|
async onInit(_client) {
|
|
5994
|
-
|
|
6186
|
+
logger29.debug("Google Docs integration initialized");
|
|
5995
6187
|
},
|
|
5996
6188
|
async onAfterConnect(_client) {
|
|
5997
|
-
|
|
6189
|
+
logger29.debug("Google Docs integration connected");
|
|
5998
6190
|
}
|
|
5999
6191
|
};
|
|
6000
6192
|
}
|
|
6001
6193
|
// src/integrations/gdrive.ts
|
|
6002
6194
|
init_logger();
|
|
6003
|
-
var
|
|
6195
|
+
var logger30 = createLogger("Google Drive");
|
|
6004
6196
|
var GDRIVE_TOOLS = [
|
|
6005
6197
|
"gdrive_list_files",
|
|
6006
6198
|
"gdrive_get_file",
|
|
@@ -6034,16 +6226,16 @@ function gdriveIntegration(config = {}) {
|
|
|
6034
6226
|
tools: [...GDRIVE_TOOLS],
|
|
6035
6227
|
oauth,
|
|
6036
6228
|
async onInit(_client) {
|
|
6037
|
-
|
|
6229
|
+
logger30.debug("Google Drive integration initialized");
|
|
6038
6230
|
},
|
|
6039
6231
|
async onAfterConnect(_client) {
|
|
6040
|
-
|
|
6232
|
+
logger30.debug("Google Drive integration connected");
|
|
6041
6233
|
}
|
|
6042
6234
|
};
|
|
6043
6235
|
}
|
|
6044
6236
|
// src/integrations/gsheets.ts
|
|
6045
6237
|
init_logger();
|
|
6046
|
-
var
|
|
6238
|
+
var logger31 = createLogger("Google Sheets");
|
|
6047
6239
|
var GSHEETS_TOOLS = [
|
|
6048
6240
|
"gsheets_list",
|
|
6049
6241
|
"gsheets_get",
|
|
@@ -6071,16 +6263,16 @@ function gsheetsIntegration(config = {}) {
|
|
|
6071
6263
|
tools: [...GSHEETS_TOOLS],
|
|
6072
6264
|
oauth,
|
|
6073
6265
|
async onInit(_client) {
|
|
6074
|
-
|
|
6266
|
+
logger31.debug("Google Sheets integration initialized");
|
|
6075
6267
|
},
|
|
6076
6268
|
async onAfterConnect(_client) {
|
|
6077
|
-
|
|
6269
|
+
logger31.debug("Google Sheets integration connected");
|
|
6078
6270
|
}
|
|
6079
6271
|
};
|
|
6080
6272
|
}
|
|
6081
6273
|
// src/integrations/gslides.ts
|
|
6082
6274
|
init_logger();
|
|
6083
|
-
var
|
|
6275
|
+
var logger32 = createLogger("Google Slides");
|
|
6084
6276
|
var GSLIDES_TOOLS = [
|
|
6085
6277
|
"gslides_list",
|
|
6086
6278
|
"gslides_get",
|
|
@@ -6107,16 +6299,16 @@ function gslidesIntegration(config = {}) {
|
|
|
6107
6299
|
tools: [...GSLIDES_TOOLS],
|
|
6108
6300
|
oauth,
|
|
6109
6301
|
async onInit(_client) {
|
|
6110
|
-
|
|
6302
|
+
logger32.debug("Google Slides integration initialized");
|
|
6111
6303
|
},
|
|
6112
6304
|
async onAfterConnect(_client) {
|
|
6113
|
-
|
|
6305
|
+
logger32.debug("Google Slides integration connected");
|
|
6114
6306
|
}
|
|
6115
6307
|
};
|
|
6116
6308
|
}
|
|
6117
6309
|
// src/integrations/polar.ts
|
|
6118
6310
|
init_logger();
|
|
6119
|
-
var
|
|
6311
|
+
var logger33 = createLogger("Polar");
|
|
6120
6312
|
var POLAR_TOOLS = [
|
|
6121
6313
|
"polar_list_products",
|
|
6122
6314
|
"polar_get_product",
|
|
@@ -6173,16 +6365,16 @@ function polarIntegration(config = {}) {
|
|
|
6173
6365
|
tools: [...POLAR_TOOLS],
|
|
6174
6366
|
oauth,
|
|
6175
6367
|
async onInit(_client) {
|
|
6176
|
-
|
|
6368
|
+
logger33.debug("Polar integration initialized");
|
|
6177
6369
|
},
|
|
6178
6370
|
async onAfterConnect(_client) {
|
|
6179
|
-
|
|
6371
|
+
logger33.debug("Polar integration connected");
|
|
6180
6372
|
}
|
|
6181
6373
|
};
|
|
6182
6374
|
}
|
|
6183
6375
|
// src/integrations/figma.ts
|
|
6184
6376
|
init_logger();
|
|
6185
|
-
var
|
|
6377
|
+
var logger34 = createLogger("Figma");
|
|
6186
6378
|
var FIGMA_TOOLS = [
|
|
6187
6379
|
"figma_get_file",
|
|
6188
6380
|
"figma_get_file_nodes",
|
|
@@ -6248,16 +6440,16 @@ function figmaIntegration(config = {}) {
|
|
|
6248
6440
|
tools: [...FIGMA_TOOLS],
|
|
6249
6441
|
oauth,
|
|
6250
6442
|
async onInit(_client) {
|
|
6251
|
-
|
|
6443
|
+
logger34.debug("Figma integration initialized");
|
|
6252
6444
|
},
|
|
6253
6445
|
async onAfterConnect(_client) {
|
|
6254
|
-
|
|
6446
|
+
logger34.debug("Figma integration connected");
|
|
6255
6447
|
}
|
|
6256
6448
|
};
|
|
6257
6449
|
}
|
|
6258
6450
|
// src/integrations/intercom.ts
|
|
6259
6451
|
init_logger();
|
|
6260
|
-
var
|
|
6452
|
+
var logger35 = createLogger("Intercom");
|
|
6261
6453
|
var INTERCOM_TOOLS = [
|
|
6262
6454
|
"intercom_list_contacts",
|
|
6263
6455
|
"intercom_get_contact",
|
|
@@ -6288,16 +6480,16 @@ function intercomIntegration(config = {}) {
|
|
|
6288
6480
|
tools: [...INTERCOM_TOOLS],
|
|
6289
6481
|
oauth,
|
|
6290
6482
|
async onInit(_client) {
|
|
6291
|
-
|
|
6483
|
+
logger35.debug("Intercom integration initialized");
|
|
6292
6484
|
},
|
|
6293
6485
|
async onAfterConnect(_client) {
|
|
6294
|
-
|
|
6486
|
+
logger35.debug("Intercom integration connected");
|
|
6295
6487
|
}
|
|
6296
6488
|
};
|
|
6297
6489
|
}
|
|
6298
6490
|
// src/integrations/hubspot.ts
|
|
6299
6491
|
init_logger();
|
|
6300
|
-
var
|
|
6492
|
+
var logger36 = createLogger("HubSpot");
|
|
6301
6493
|
var HUBSPOT_TOOLS = [
|
|
6302
6494
|
"hubspot_list_contacts",
|
|
6303
6495
|
"hubspot_get_contact",
|
|
@@ -6347,16 +6539,16 @@ function hubspotIntegration(config = {}) {
|
|
|
6347
6539
|
tools: [...HUBSPOT_TOOLS],
|
|
6348
6540
|
oauth,
|
|
6349
6541
|
async onInit(_client) {
|
|
6350
|
-
|
|
6542
|
+
logger36.debug("HubSpot integration initialized");
|
|
6351
6543
|
},
|
|
6352
6544
|
async onAfterConnect(_client) {
|
|
6353
|
-
|
|
6545
|
+
logger36.debug("HubSpot integration connected");
|
|
6354
6546
|
}
|
|
6355
6547
|
};
|
|
6356
6548
|
}
|
|
6357
6549
|
// src/integrations/youtube.ts
|
|
6358
6550
|
init_logger();
|
|
6359
|
-
var
|
|
6551
|
+
var logger37 = createLogger("YouTube");
|
|
6360
6552
|
var YOUTUBE_TOOLS = [
|
|
6361
6553
|
"youtube_search",
|
|
6362
6554
|
"youtube_get_video",
|
|
@@ -6402,16 +6594,16 @@ function youtubeIntegration(config = {}) {
|
|
|
6402
6594
|
tools: [...YOUTUBE_TOOLS],
|
|
6403
6595
|
oauth,
|
|
6404
6596
|
async onInit(_client) {
|
|
6405
|
-
|
|
6597
|
+
logger37.debug("YouTube integration initialized");
|
|
6406
6598
|
},
|
|
6407
6599
|
async onAfterConnect(_client) {
|
|
6408
|
-
|
|
6600
|
+
logger37.debug("YouTube integration connected");
|
|
6409
6601
|
}
|
|
6410
6602
|
};
|
|
6411
6603
|
}
|
|
6412
6604
|
// src/integrations/cursor.ts
|
|
6413
6605
|
init_logger();
|
|
6414
|
-
var
|
|
6606
|
+
var logger38 = createLogger("Cursor");
|
|
6415
6607
|
var CURSOR_TOOLS = [
|
|
6416
6608
|
"cursor_list_agents",
|
|
6417
6609
|
"cursor_get_agent",
|
|
@@ -6431,10 +6623,105 @@ function cursorIntegration(_config = {}) {
|
|
|
6431
6623
|
logoUrl: "https://wdvtnli2jn3texa6.public.blob.vercel-storage.com/cursor.jpeg",
|
|
6432
6624
|
tools: [...CURSOR_TOOLS],
|
|
6433
6625
|
async onInit(_client) {
|
|
6434
|
-
|
|
6626
|
+
logger38.debug("Cursor integration initialized");
|
|
6627
|
+
},
|
|
6628
|
+
async onAfterConnect(_client) {
|
|
6629
|
+
logger38.debug("Cursor integration connected");
|
|
6630
|
+
}
|
|
6631
|
+
};
|
|
6632
|
+
}
|
|
6633
|
+
// src/integrations/posthog.ts
|
|
6634
|
+
init_logger();
|
|
6635
|
+
var logger39 = createLogger("PostHog");
|
|
6636
|
+
var DEFAULT_POSTHOG_BASE_URL = "https://us.posthog.com";
|
|
6637
|
+
var POSTHOG_SCOPES = [
|
|
6638
|
+
"openid",
|
|
6639
|
+
"profile",
|
|
6640
|
+
"email",
|
|
6641
|
+
"organization:read",
|
|
6642
|
+
"project:read",
|
|
6643
|
+
"user:read",
|
|
6644
|
+
"query:read",
|
|
6645
|
+
"insight:read",
|
|
6646
|
+
"dashboard:read",
|
|
6647
|
+
"feature_flag:read",
|
|
6648
|
+
"experiment:read",
|
|
6649
|
+
"annotation:read",
|
|
6650
|
+
"cohort:read",
|
|
6651
|
+
"person:read",
|
|
6652
|
+
"event_definition:read",
|
|
6653
|
+
"property_definition:read",
|
|
6654
|
+
"session_recording:read",
|
|
6655
|
+
"action:read"
|
|
6656
|
+
];
|
|
6657
|
+
var POSTHOG_TOOLS = [
|
|
6658
|
+
"posthog_get_current_user",
|
|
6659
|
+
"posthog_list_organizations",
|
|
6660
|
+
"posthog_get_organization",
|
|
6661
|
+
"posthog_list_projects",
|
|
6662
|
+
"posthog_get_project",
|
|
6663
|
+
"posthog_run_hogql_query",
|
|
6664
|
+
"posthog_list_insights",
|
|
6665
|
+
"posthog_get_insight",
|
|
6666
|
+
"posthog_list_dashboards",
|
|
6667
|
+
"posthog_get_dashboard",
|
|
6668
|
+
"posthog_list_feature_flags",
|
|
6669
|
+
"posthog_get_feature_flag",
|
|
6670
|
+
"posthog_list_experiments",
|
|
6671
|
+
"posthog_get_experiment",
|
|
6672
|
+
"posthog_list_annotations",
|
|
6673
|
+
"posthog_get_annotation",
|
|
6674
|
+
"posthog_list_cohorts",
|
|
6675
|
+
"posthog_get_cohort",
|
|
6676
|
+
"posthog_list_event_definitions",
|
|
6677
|
+
"posthog_get_event_definition",
|
|
6678
|
+
"posthog_list_property_definitions",
|
|
6679
|
+
"posthog_get_property_definition",
|
|
6680
|
+
"posthog_list_persons",
|
|
6681
|
+
"posthog_get_person",
|
|
6682
|
+
"posthog_list_session_recordings",
|
|
6683
|
+
"posthog_get_session_recording"
|
|
6684
|
+
];
|
|
6685
|
+
function normalizePostHogBaseUrl(baseUrl) {
|
|
6686
|
+
const value = (baseUrl || DEFAULT_POSTHOG_BASE_URL).trim().replace(/\/+$/, "");
|
|
6687
|
+
if (!value) {
|
|
6688
|
+
return DEFAULT_POSTHOG_BASE_URL;
|
|
6689
|
+
}
|
|
6690
|
+
return /^https?:\/\//i.test(value) ? value : `https://${value}`;
|
|
6691
|
+
}
|
|
6692
|
+
function posthogIntegration(config = {}) {
|
|
6693
|
+
const baseUrl = normalizePostHogBaseUrl(config.baseUrl);
|
|
6694
|
+
const oauth = {
|
|
6695
|
+
provider: "posthog",
|
|
6696
|
+
clientId: config.clientId ?? getEnv("POSTHOG_CLIENT_ID"),
|
|
6697
|
+
clientSecret: config.clientSecret ?? getEnv("POSTHOG_CLIENT_SECRET"),
|
|
6698
|
+
scopes: config.scopes ?? [...POSTHOG_SCOPES],
|
|
6699
|
+
optionalScopes: config.optionalScopes,
|
|
6700
|
+
redirectUri: config.redirectUri,
|
|
6701
|
+
config: {
|
|
6702
|
+
baseUrl,
|
|
6703
|
+
apiBaseUrl: baseUrl,
|
|
6704
|
+
authorization_endpoint: `${baseUrl}/oauth/authorize/`,
|
|
6705
|
+
token_endpoint: `${baseUrl}/oauth/token/`,
|
|
6706
|
+
token_auth_method: "client_secret_post",
|
|
6707
|
+
response_type: "code",
|
|
6708
|
+
grant_types_supported: ["authorization_code", "refresh_token"],
|
|
6709
|
+
code_challenge_method: "S256"
|
|
6710
|
+
}
|
|
6711
|
+
};
|
|
6712
|
+
return {
|
|
6713
|
+
id: "posthog",
|
|
6714
|
+
name: "PostHog",
|
|
6715
|
+
logoUrl: "https://wdvtnli2jn3texa6.public.blob.vercel-storage.com/posthog.png",
|
|
6716
|
+
description: "Read PostHog organizations, projects, insights, flags, and analytics data",
|
|
6717
|
+
category: "Analytics",
|
|
6718
|
+
tools: [...POSTHOG_TOOLS],
|
|
6719
|
+
oauth,
|
|
6720
|
+
async onInit(_client) {
|
|
6721
|
+
logger39.debug("PostHog integration initialized");
|
|
6435
6722
|
},
|
|
6436
6723
|
async onAfterConnect(_client) {
|
|
6437
|
-
|
|
6724
|
+
logger39.debug("PostHog integration connected");
|
|
6438
6725
|
}
|
|
6439
6726
|
};
|
|
6440
6727
|
}
|
|
@@ -12710,7 +12997,7 @@ function convertJsonSchemaToGoogleSchema(jsonSchema, TypeEnum) {
|
|
|
12710
12997
|
}
|
|
12711
12998
|
// src/server.ts
|
|
12712
12999
|
var SERVER_LOG_CONTEXT3 = "server";
|
|
12713
|
-
var
|
|
13000
|
+
var logger42 = createLogger("MCPServer", SERVER_LOG_CONTEXT3);
|
|
12714
13001
|
var globalServerConfig = null;
|
|
12715
13002
|
var globalMCPHandler = null;
|
|
12716
13003
|
var codeVerifierStorage = new Map;
|
|
@@ -12816,7 +13103,7 @@ function createMCPServer(config) {
|
|
|
12816
13103
|
if (integration.oauth) {
|
|
12817
13104
|
const { clientId, clientSecret, redirectUri: integrationRedirectUri, config: oauthConfig } = integration.oauth;
|
|
12818
13105
|
if (!clientId || !clientSecret) {
|
|
12819
|
-
|
|
13106
|
+
logger42.warn(`Warning: Integration "${integration.id}" is missing OAuth credentials. ` + `Provide clientId and clientSecret in the integration configuration.`);
|
|
12820
13107
|
return integration;
|
|
12821
13108
|
}
|
|
12822
13109
|
const redirectUri = integrationRedirectUri || config.redirectUri || getDefaultRedirectUri();
|
|
@@ -12944,7 +13231,7 @@ function createMCPServer(config) {
|
|
|
12944
13231
|
if (toolName !== rawToolName)
|
|
12945
13232
|
body = { ...body, name: toolName };
|
|
12946
13233
|
let tokensResolvedProvider = null;
|
|
12947
|
-
if (codeModeHeader === "1" && tokensHeader && toolName) {
|
|
13234
|
+
if (codeModeHeader === "1" && !authHeader && tokensHeader && toolName) {
|
|
12948
13235
|
try {
|
|
12949
13236
|
const tokens = JSON.parse(tokensHeader);
|
|
12950
13237
|
const provider = resolveProviderFromToolName(toolName, Object.keys(tokens));
|
|
@@ -12993,7 +13280,7 @@ function createMCPServer(config) {
|
|
|
12993
13280
|
}
|
|
12994
13281
|
return response2;
|
|
12995
13282
|
} catch (error) {
|
|
12996
|
-
|
|
13283
|
+
logger42.error("[MCP Tool Call] Error:", error);
|
|
12997
13284
|
return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
|
|
12998
13285
|
}
|
|
12999
13286
|
}
|
|
@@ -13042,7 +13329,7 @@ function createMCPServer(config) {
|
|
|
13042
13329
|
});
|
|
13043
13330
|
return Response.json(result, { status: result.success ? 200 : 500 });
|
|
13044
13331
|
} catch (error) {
|
|
13045
|
-
|
|
13332
|
+
logger42.error("[Code Mode] Error:", error);
|
|
13046
13333
|
return Response.json({ error: error?.message || "Failed to execute code" }, { status: 500 });
|
|
13047
13334
|
}
|
|
13048
13335
|
}
|
|
@@ -13100,7 +13387,7 @@ function createMCPServer(config) {
|
|
|
13100
13387
|
error: executionResult.error
|
|
13101
13388
|
});
|
|
13102
13389
|
} catch (error) {
|
|
13103
|
-
|
|
13390
|
+
logger42.error("[Trigger Notify] Error:", error);
|
|
13104
13391
|
return Response.json({ error: error.message || "Failed to execute trigger" }, { status: 500 });
|
|
13105
13392
|
}
|
|
13106
13393
|
}
|
|
@@ -13164,7 +13451,7 @@ function createMCPServer(config) {
|
|
|
13164
13451
|
})
|
|
13165
13452
|
});
|
|
13166
13453
|
} catch (scheduleError) {
|
|
13167
|
-
|
|
13454
|
+
logger42.error("[Trigger] Failed to register with scheduler:", scheduleError);
|
|
13168
13455
|
}
|
|
13169
13456
|
return Response.json(created, { status: 201 });
|
|
13170
13457
|
}
|
|
@@ -13199,7 +13486,7 @@ function createMCPServer(config) {
|
|
|
13199
13486
|
body: JSON.stringify({ triggerId })
|
|
13200
13487
|
});
|
|
13201
13488
|
} catch (error) {
|
|
13202
|
-
|
|
13489
|
+
logger42.error("[Trigger] Failed to pause in scheduler:", error);
|
|
13203
13490
|
}
|
|
13204
13491
|
return Response.json(updated);
|
|
13205
13492
|
} else if (subAction === "resume" && method === "POST") {
|
|
@@ -13227,7 +13514,7 @@ function createMCPServer(config) {
|
|
|
13227
13514
|
body: JSON.stringify({ triggerId })
|
|
13228
13515
|
});
|
|
13229
13516
|
} catch (error) {
|
|
13230
|
-
|
|
13517
|
+
logger42.error("[Trigger] Failed to resume in scheduler:", error);
|
|
13231
13518
|
}
|
|
13232
13519
|
return Response.json(updated);
|
|
13233
13520
|
} else if (subAction === "run" && method === "POST") {
|
|
@@ -13298,7 +13585,7 @@ function createMCPServer(config) {
|
|
|
13298
13585
|
})
|
|
13299
13586
|
});
|
|
13300
13587
|
} catch (error) {
|
|
13301
|
-
|
|
13588
|
+
logger42.error("[Trigger] Failed to update scheduler:", error);
|
|
13302
13589
|
}
|
|
13303
13590
|
}
|
|
13304
13591
|
return Response.json(updated);
|
|
@@ -13315,14 +13602,14 @@ function createMCPServer(config) {
|
|
|
13315
13602
|
body: JSON.stringify({ triggerId })
|
|
13316
13603
|
});
|
|
13317
13604
|
} catch (error) {
|
|
13318
|
-
|
|
13605
|
+
logger42.error("[Trigger] Failed to unregister from scheduler:", error);
|
|
13319
13606
|
}
|
|
13320
13607
|
return new Response(null, { status: 204 });
|
|
13321
13608
|
}
|
|
13322
13609
|
}
|
|
13323
13610
|
return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
|
|
13324
13611
|
} catch (error) {
|
|
13325
|
-
|
|
13612
|
+
logger42.error("[Trigger] Error:", error);
|
|
13326
13613
|
return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
|
|
13327
13614
|
}
|
|
13328
13615
|
}
|
|
@@ -13348,11 +13635,11 @@ function createMCPServer(config) {
|
|
|
13348
13635
|
const errorRedirectUrl = "/auth-error";
|
|
13349
13636
|
if (error) {
|
|
13350
13637
|
const errorMsg = errorDescription || error;
|
|
13351
|
-
|
|
13638
|
+
logger42.error("[OAuth Redirect] Error:", errorMsg);
|
|
13352
13639
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(errorMsg)}`, webRequest.url));
|
|
13353
13640
|
}
|
|
13354
13641
|
if (!code || !state) {
|
|
13355
|
-
|
|
13642
|
+
logger42.error("[OAuth Redirect] Missing code or state parameter");
|
|
13356
13643
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent("Invalid OAuth callback")}`, webRequest.url));
|
|
13357
13644
|
}
|
|
13358
13645
|
let returnUrl = defaultRedirectUrl;
|
|
@@ -13417,6 +13704,7 @@ function createMCPServer(config) {
|
|
|
13417
13704
|
}
|
|
13418
13705
|
const frontendUrl = new URL(returnUrl, frontendOrigin);
|
|
13419
13706
|
const tokenData = {
|
|
13707
|
+
sessionToken: callbackResult.sessionToken,
|
|
13420
13708
|
accessToken: callbackResult.accessToken,
|
|
13421
13709
|
refreshToken: callbackResult.refreshToken,
|
|
13422
13710
|
tokenType: callbackResult.tokenType,
|
|
@@ -13428,7 +13716,7 @@ function createMCPServer(config) {
|
|
|
13428
13716
|
frontendUrl.hash = `oauth_callback=${encodeURIComponent(JSON.stringify({ code, state, tokenData }))}`;
|
|
13429
13717
|
return Response.redirect(frontendUrl);
|
|
13430
13718
|
} catch (error2) {
|
|
13431
|
-
|
|
13719
|
+
logger42.error("[OAuth Backend Callback] Error:", error2);
|
|
13432
13720
|
return Response.redirect(new URL(`${errorRedirectUrl}?error=${encodeURIComponent(error2.message || "Failed to exchange token")}`, webRequest.url));
|
|
13433
13721
|
}
|
|
13434
13722
|
} else {
|
|
@@ -13724,7 +14012,9 @@ export {
|
|
|
13724
14012
|
slackIntegration,
|
|
13725
14013
|
sendWebResponse,
|
|
13726
14014
|
rampIntegration,
|
|
14015
|
+
railwayIntegration,
|
|
13727
14016
|
powerpointIntegration,
|
|
14017
|
+
posthogIntegration,
|
|
13728
14018
|
polarIntegration,
|
|
13729
14019
|
outlookIntegration,
|
|
13730
14020
|
onedriveIntegration,
|