integrate-sdk 0.8.31-dev.1 → 0.8.35

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.
@@ -359,6 +359,81 @@ function methodToToolName(methodName, integrationId) {
359
359
  return `${integrationId}_${snakeCaseMethod}`;
360
360
  }
361
361
 
362
+ // ../triggers/client.ts
363
+ class TriggerClient {
364
+ config;
365
+ constructor(config) {
366
+ this.config = config;
367
+ }
368
+ async create(params) {
369
+ return this.request("POST", "/triggers", params);
370
+ }
371
+ async list(params) {
372
+ let path = "/triggers";
373
+ if (params) {
374
+ const searchParams = new URLSearchParams;
375
+ if (params.status)
376
+ searchParams.set("status", params.status);
377
+ if (params.toolName)
378
+ searchParams.set("toolName", params.toolName);
379
+ if (params.limit !== undefined)
380
+ searchParams.set("limit", params.limit.toString());
381
+ if (params.offset !== undefined)
382
+ searchParams.set("offset", params.offset.toString());
383
+ const query = searchParams.toString();
384
+ if (query)
385
+ path += `?${query}`;
386
+ }
387
+ return this.request("GET", path);
388
+ }
389
+ async get(triggerId) {
390
+ return this.request("GET", `/triggers/${triggerId}`);
391
+ }
392
+ async update(triggerId, params) {
393
+ return this.request("PATCH", `/triggers/${triggerId}`, params);
394
+ }
395
+ async delete(triggerId) {
396
+ await this.request("DELETE", `/triggers/${triggerId}`);
397
+ }
398
+ async pause(triggerId) {
399
+ return this.request("POST", `/triggers/${triggerId}/pause`);
400
+ }
401
+ async resume(triggerId) {
402
+ return this.request("POST", `/triggers/${triggerId}/resume`);
403
+ }
404
+ async run(triggerId) {
405
+ return this.request("POST", `/triggers/${triggerId}/run`);
406
+ }
407
+ async request(method, path, body) {
408
+ const url = this.config.apiBaseUrl ? `${this.config.apiBaseUrl}${this.config.apiRouteBase}${path}` : `${this.config.apiRouteBase}${path}`;
409
+ const options = {
410
+ method,
411
+ headers: {
412
+ "Content-Type": "application/json",
413
+ ...this.config.getHeaders()
414
+ }
415
+ };
416
+ if (body !== undefined) {
417
+ options.body = JSON.stringify(body);
418
+ }
419
+ const response = await fetch(url, options);
420
+ if (!response.ok) {
421
+ let errorMessage = `Request failed: ${response.statusText}`;
422
+ try {
423
+ const errorData = await response.json();
424
+ if (errorData.error) {
425
+ errorMessage = typeof errorData.error === "string" ? errorData.error : errorData.error.message || errorMessage;
426
+ }
427
+ } catch {}
428
+ throw new Error(errorMessage);
429
+ }
430
+ if (method === "DELETE" && response.status === 204) {
431
+ return;
432
+ }
433
+ return response.json();
434
+ }
435
+ }
436
+
362
437
  // ../oauth/pkce.ts
363
438
  var exports_pkce = {};
364
439
  __export(exports_pkce, {
@@ -1537,6 +1612,7 @@ class MCPClientBase {
1537
1612
  databaseDetected = false;
1538
1613
  oauthCallbackPromise;
1539
1614
  server;
1615
+ trigger;
1540
1616
  constructor(config) {
1541
1617
  this.transport = new HttpSessionTransport({
1542
1618
  url: config.serverUrl || MCP_SERVER_URL,
@@ -1579,6 +1655,10 @@ class MCPClientBase {
1579
1655
  this.authState.set(provider, { authenticated: false });
1580
1656
  }
1581
1657
  }
1658
+ const integrationHeaderValue = this.getIntegrationHeaderValue();
1659
+ if (integrationHeaderValue && this.transport.setHeader) {
1660
+ this.transport.setHeader("X-Integrations", integrationHeaderValue);
1661
+ }
1582
1662
  const providers = this.integrations.filter((p) => p.oauth).map((p) => p.oauth.provider);
1583
1663
  const usingDatabaseCallbacks = !!config.getProviderToken;
1584
1664
  if (usingDatabaseCallbacks) {
@@ -1654,6 +1734,13 @@ class MCPClientBase {
1654
1734
  this.todoist = this.createIntegrationProxy("todoist");
1655
1735
  }
1656
1736
  this.server = this.createServerProxy();
1737
+ this.trigger = new TriggerClient({
1738
+ apiRouteBase: this.apiRouteBase,
1739
+ apiBaseUrl: this.apiBaseUrl,
1740
+ getHeaders: () => ({
1741
+ "X-Integrations": this.getIntegrationHeaderValue()
1742
+ })
1743
+ });
1657
1744
  this.initializeIntegrations();
1658
1745
  }
1659
1746
  getDefaultRedirectUri(oauthApiBase, apiBaseUrl) {
@@ -1683,9 +1770,24 @@ class MCPClientBase {
1683
1770
  }
1684
1771
  });
1685
1772
  }
1773
+ getIntegrationHeaderValue() {
1774
+ return this.integrations.map((integration) => integration.id).join(",");
1775
+ }
1686
1776
  createServerProxy() {
1687
1777
  return new Proxy({}, {
1688
1778
  get: (_target, methodName) => {
1779
+ if (methodName === "listConfiguredIntegrations") {
1780
+ return async () => ({
1781
+ integrations: this.integrations.map((integration) => ({
1782
+ id: integration.id,
1783
+ name: integration.name || integration.id,
1784
+ tools: integration.tools,
1785
+ hasOAuth: !!integration.oauth,
1786
+ scopes: integration.oauth?.scopes,
1787
+ provider: integration.oauth?.provider
1788
+ }))
1789
+ });
1790
+ }
1689
1791
  return async (args, options) => {
1690
1792
  const toolName = methodToToolName(methodName, "");
1691
1793
  const finalToolName = toolName.startsWith("_") ? toolName.substring(1) : toolName;
@@ -1791,6 +1893,10 @@ class MCPClientBase {
1791
1893
  const headers = {
1792
1894
  "Content-Type": "application/json"
1793
1895
  };
1896
+ const integrationsHeader = this.getIntegrationHeaderValue();
1897
+ if (integrationsHeader) {
1898
+ headers["X-Integrations"] = integrationsHeader;
1899
+ }
1794
1900
  if (provider) {
1795
1901
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
1796
1902
  if (tokenData) {
@@ -7617,6 +7723,71 @@ var init_ai = __esm(() => {
7617
7723
  init_google();
7618
7724
  });
7619
7725
 
7726
+ // ../../node_modules/nanoid/url-alphabet/index.js
7727
+ var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
7728
+ var init_url_alphabet = () => {};
7729
+
7730
+ // ../../node_modules/nanoid/index.js
7731
+ import crypto2 from "crypto";
7732
+ var POOL_SIZE_MULTIPLIER = 128, pool, poolOffset, fillPool = (bytes) => {
7733
+ if (!pool || pool.length < bytes) {
7734
+ pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
7735
+ crypto2.randomFillSync(pool);
7736
+ poolOffset = 0;
7737
+ } else if (poolOffset + bytes > pool.length) {
7738
+ crypto2.randomFillSync(pool);
7739
+ poolOffset = 0;
7740
+ }
7741
+ poolOffset += bytes;
7742
+ }, nanoid = (size = 21) => {
7743
+ fillPool(size |= 0);
7744
+ let id = "";
7745
+ for (let i = poolOffset - size;i < poolOffset; i++) {
7746
+ id += urlAlphabet[pool[i] & 63];
7747
+ }
7748
+ return id;
7749
+ };
7750
+ var init_nanoid = __esm(() => {
7751
+ init_url_alphabet();
7752
+ });
7753
+
7754
+ // ../triggers/utils.ts
7755
+ var exports_utils = {};
7756
+ __export(exports_utils, {
7757
+ validateStatusTransition: () => validateStatusTransition,
7758
+ generateTriggerId: () => generateTriggerId,
7759
+ extractProviderFromToolName: () => extractProviderFromToolName,
7760
+ calculateHasMore: () => calculateHasMore
7761
+ });
7762
+ function generateTriggerId() {
7763
+ return `trig_${nanoid(12)}`;
7764
+ }
7765
+ function extractProviderFromToolName(toolName) {
7766
+ const parts = toolName.split("_");
7767
+ return parts[0] || toolName;
7768
+ }
7769
+ function validateStatusTransition(currentStatus, targetStatus) {
7770
+ if (targetStatus === "paused" && currentStatus !== "active") {
7771
+ return {
7772
+ valid: false,
7773
+ error: `Cannot pause trigger with status '${currentStatus}'. Only 'active' triggers can be paused.`
7774
+ };
7775
+ }
7776
+ if (targetStatus === "active" && currentStatus !== "paused") {
7777
+ return {
7778
+ valid: false,
7779
+ error: `Cannot resume trigger with status '${currentStatus}'. Only 'paused' triggers can be resumed.`
7780
+ };
7781
+ }
7782
+ return { valid: true };
7783
+ }
7784
+ function calculateHasMore(offset, returnedCount, total) {
7785
+ return offset + returnedCount < total;
7786
+ }
7787
+ var init_utils2 = __esm(() => {
7788
+ init_nanoid();
7789
+ });
7790
+
7620
7791
  // ../server.ts
7621
7792
  var exports_server = {};
7622
7793
  __export(exports_server, {
@@ -7816,6 +7987,7 @@ function createMCPServer(config) {
7816
7987
  try {
7817
7988
  const body = await webRequest.json();
7818
7989
  const authHeader = webRequest.headers.get("authorization");
7990
+ const integrationsHeader = webRequest.headers.get("x-integrations");
7819
7991
  const { OAuthHandler } = await Promise.resolve().then(() => exports_base_handler);
7820
7992
  const oauthHandler = new OAuthHandler({
7821
7993
  providers,
@@ -7825,7 +7997,7 @@ function createMCPServer(config) {
7825
7997
  removeProviderToken: config.removeProviderToken,
7826
7998
  getSessionContext: config.getSessionContext
7827
7999
  });
7828
- const result = await oauthHandler.handleToolCall(body, authHeader);
8000
+ const result = await oauthHandler.handleToolCall(body, authHeader, integrationsHeader);
7829
8001
  const response2 = Response.json(result);
7830
8002
  if (oauthHandler.hasDatabaseCallbacks()) {
7831
8003
  response2.headers.set("X-Integrate-Use-Database", "true");
@@ -7836,13 +8008,308 @@ function createMCPServer(config) {
7836
8008
  return Response.json({ error: error.message || "Failed to execute tool call" }, { status: error.statusCode || 500 });
7837
8009
  }
7838
8010
  }
8011
+ if (segments.length >= 1 && segments[0] === "triggers") {
8012
+ if (!config.triggers) {
8013
+ return Response.json({ error: "Triggers not configured. Add triggers callbacks to createMCPServer config." }, { status: 501 });
8014
+ }
8015
+ try {
8016
+ const context2 = config.getSessionContext ? await config.getSessionContext(webRequest) : undefined;
8017
+ if (segments.length === 1) {
8018
+ if (method === "GET") {
8019
+ const url = new URL(webRequest.url);
8020
+ const params = {
8021
+ status: url.searchParams.get("status"),
8022
+ toolName: url.searchParams.get("toolName") || undefined,
8023
+ limit: url.searchParams.get("limit") ? parseInt(url.searchParams.get("limit")) : undefined,
8024
+ offset: url.searchParams.get("offset") ? parseInt(url.searchParams.get("offset")) : undefined
8025
+ };
8026
+ const callbackResult = await config.triggers.list(params, context2);
8027
+ const { calculateHasMore: calculateHasMore2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
8028
+ const offset = params.offset || 0;
8029
+ const hasMore = calculateHasMore2(offset, callbackResult.triggers.length, callbackResult.total);
8030
+ return Response.json({
8031
+ triggers: callbackResult.triggers,
8032
+ total: callbackResult.total,
8033
+ hasMore
8034
+ });
8035
+ } else if (method === "POST") {
8036
+ const body = await webRequest.json();
8037
+ const { generateTriggerId: generateTriggerId2, extractProviderFromToolName: extractProviderFromToolName2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
8038
+ const triggerId = generateTriggerId2();
8039
+ const provider = body.toolName ? extractProviderFromToolName2(body.toolName) : undefined;
8040
+ const trigger = {
8041
+ id: triggerId,
8042
+ ...body,
8043
+ provider,
8044
+ status: body.status || "active",
8045
+ createdAt: new Date().toISOString(),
8046
+ updatedAt: new Date().toISOString(),
8047
+ runCount: 0
8048
+ };
8049
+ const created = await config.triggers.create(trigger, context2);
8050
+ const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
8051
+ const callbackBaseUrl = process.env.INTEGRATE_URL || (typeof window !== "undefined" ? window.location.origin : "http://localhost:3000");
8052
+ try {
8053
+ await fetch(`${schedulerUrl}/scheduler/register`, {
8054
+ method: "POST",
8055
+ headers: {
8056
+ "Content-Type": "application/json",
8057
+ "X-API-KEY": config.apiKey || ""
8058
+ },
8059
+ body: JSON.stringify({
8060
+ triggerId: created.id,
8061
+ schedule: created.schedule,
8062
+ callbackUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/execute`,
8063
+ completeUrl: `${callbackBaseUrl}/api/integrate/triggers/${created.id}/complete`,
8064
+ metadata: {
8065
+ userId: context2?.userId,
8066
+ provider: created.provider
8067
+ }
8068
+ })
8069
+ });
8070
+ } catch (scheduleError) {
8071
+ console.error("[Trigger] Failed to register with scheduler:", scheduleError);
8072
+ }
8073
+ return Response.json(created, { status: 201 });
8074
+ }
8075
+ } else if (segments.length >= 2) {
8076
+ const triggerId = segments[1];
8077
+ if (!triggerId) {
8078
+ return Response.json({ error: "Trigger ID is required" }, { status: 400 });
8079
+ }
8080
+ const subAction = segments.length > 2 ? segments[2] : undefined;
8081
+ if (subAction === "pause" && method === "POST") {
8082
+ const trigger = await config.triggers.get(triggerId, context2);
8083
+ if (!trigger) {
8084
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8085
+ }
8086
+ const { validateStatusTransition: validateStatusTransition2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
8087
+ const validation = validateStatusTransition2(trigger.status, "paused");
8088
+ if (!validation.valid) {
8089
+ return Response.json({ error: validation.error }, { status: 400 });
8090
+ }
8091
+ const updated = await config.triggers.update(triggerId, {
8092
+ status: "paused",
8093
+ updatedAt: new Date().toISOString()
8094
+ }, context2);
8095
+ const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
8096
+ try {
8097
+ await fetch(`${schedulerUrl}/scheduler/pause`, {
8098
+ method: "POST",
8099
+ headers: {
8100
+ "Content-Type": "application/json",
8101
+ "X-API-KEY": config.apiKey || ""
8102
+ },
8103
+ body: JSON.stringify({ triggerId })
8104
+ });
8105
+ } catch (error) {
8106
+ console.error("[Trigger] Failed to pause in scheduler:", error);
8107
+ }
8108
+ return Response.json(updated);
8109
+ } else if (subAction === "resume" && method === "POST") {
8110
+ const trigger = await config.triggers.get(triggerId, context2);
8111
+ if (!trigger) {
8112
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8113
+ }
8114
+ const { validateStatusTransition: validateStatusTransition2 } = await Promise.resolve().then(() => (init_utils2(), exports_utils));
8115
+ const validation = validateStatusTransition2(trigger.status, "active");
8116
+ if (!validation.valid) {
8117
+ return Response.json({ error: validation.error }, { status: 400 });
8118
+ }
8119
+ const updated = await config.triggers.update(triggerId, {
8120
+ status: "active",
8121
+ updatedAt: new Date().toISOString()
8122
+ }, context2);
8123
+ const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
8124
+ try {
8125
+ await fetch(`${schedulerUrl}/scheduler/resume`, {
8126
+ method: "POST",
8127
+ headers: {
8128
+ "Content-Type": "application/json",
8129
+ "X-API-KEY": config.apiKey || ""
8130
+ },
8131
+ body: JSON.stringify({ triggerId })
8132
+ });
8133
+ } catch (error) {
8134
+ console.error("[Trigger] Failed to resume in scheduler:", error);
8135
+ }
8136
+ return Response.json(updated);
8137
+ } else if (subAction === "run" && method === "POST") {
8138
+ const trigger = await config.triggers.get(triggerId, context2);
8139
+ if (!trigger) {
8140
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8141
+ }
8142
+ if (!trigger.provider) {
8143
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
8144
+ }
8145
+ const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
8146
+ if (!providerToken) {
8147
+ return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
8148
+ }
8149
+ const { OAuthHandler } = await Promise.resolve().then(() => exports_base_handler);
8150
+ const oauthHandler = new OAuthHandler({
8151
+ providers,
8152
+ serverUrl: config.serverUrl,
8153
+ apiKey: config.apiKey,
8154
+ setProviderToken: config.setProviderToken,
8155
+ removeProviderToken: config.removeProviderToken,
8156
+ getSessionContext: config.getSessionContext
8157
+ });
8158
+ const startTime = Date.now();
8159
+ try {
8160
+ const result = await oauthHandler.handleToolCall({ name: trigger.toolName, arguments: trigger.toolArguments }, `Bearer ${providerToken.accessToken}`, null);
8161
+ const duration = Date.now() - startTime;
8162
+ const executionResult = {
8163
+ success: true,
8164
+ result,
8165
+ executedAt: new Date().toISOString(),
8166
+ duration
8167
+ };
8168
+ await config.triggers.update(triggerId, {
8169
+ lastRunAt: executionResult.executedAt,
8170
+ runCount: (trigger.runCount || 0) + 1,
8171
+ lastResult: result,
8172
+ lastError: undefined
8173
+ }, context2);
8174
+ return Response.json(executionResult);
8175
+ } catch (error) {
8176
+ const duration = Date.now() - startTime;
8177
+ const executionResult = {
8178
+ success: false,
8179
+ error: error.message || "Tool execution failed",
8180
+ executedAt: new Date().toISOString(),
8181
+ duration
8182
+ };
8183
+ await config.triggers.update(triggerId, {
8184
+ lastRunAt: executionResult.executedAt,
8185
+ runCount: (trigger.runCount || 0) + 1,
8186
+ lastError: error.message,
8187
+ status: "failed"
8188
+ }, context2);
8189
+ return Response.json(executionResult, { status: 500 });
8190
+ }
8191
+ } else if (subAction === "execute" && method === "GET") {
8192
+ const apiKey = webRequest.headers.get("x-api-key");
8193
+ if (!apiKey || apiKey !== config.apiKey) {
8194
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
8195
+ }
8196
+ const trigger = await config.triggers.get(triggerId, context2);
8197
+ if (!trigger) {
8198
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8199
+ }
8200
+ if (!trigger.provider) {
8201
+ return Response.json({ error: "Trigger has no provider configured" }, { status: 400 });
8202
+ }
8203
+ const providerToken = config.getProviderToken ? await config.getProviderToken(trigger.provider, undefined, context2) : undefined;
8204
+ if (!providerToken) {
8205
+ return Response.json({ error: "No OAuth token available for this trigger" }, { status: 401 });
8206
+ }
8207
+ return Response.json({
8208
+ trigger: {
8209
+ id: trigger.id,
8210
+ toolName: trigger.toolName,
8211
+ toolArguments: trigger.toolArguments,
8212
+ provider: trigger.provider
8213
+ },
8214
+ accessToken: providerToken.accessToken,
8215
+ tokenType: providerToken.tokenType || "Bearer"
8216
+ });
8217
+ } else if (subAction === "complete" && method === "POST") {
8218
+ const apiKey = webRequest.headers.get("x-api-key");
8219
+ if (!apiKey || apiKey !== config.apiKey) {
8220
+ return Response.json({ error: "Unauthorized" }, { status: 401 });
8221
+ }
8222
+ const body = await webRequest.json();
8223
+ const trigger = await config.triggers.get(triggerId, context2);
8224
+ if (!trigger) {
8225
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8226
+ }
8227
+ const updates = {
8228
+ lastRunAt: body.executedAt,
8229
+ runCount: (trigger.runCount || 0) + 1
8230
+ };
8231
+ if (body.success) {
8232
+ updates.lastResult = body.result;
8233
+ updates.lastError = undefined;
8234
+ if (trigger.schedule.type === "once") {
8235
+ updates.status = "completed";
8236
+ }
8237
+ } else {
8238
+ updates.lastError = body.error;
8239
+ updates.status = "failed";
8240
+ }
8241
+ await config.triggers.update(triggerId, updates, context2);
8242
+ return Response.json({ success: true });
8243
+ } else if (!subAction && method === "GET") {
8244
+ const trigger = await config.triggers.get(triggerId, context2);
8245
+ if (!trigger) {
8246
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8247
+ }
8248
+ return Response.json(trigger);
8249
+ } else if (!subAction && method === "PATCH") {
8250
+ const body = await webRequest.json();
8251
+ const trigger = await config.triggers.get(triggerId, context2);
8252
+ if (!trigger) {
8253
+ return Response.json({ error: "Trigger not found" }, { status: 404 });
8254
+ }
8255
+ const updates = {
8256
+ ...body,
8257
+ updatedAt: new Date().toISOString()
8258
+ };
8259
+ const updated = await config.triggers.update(triggerId, updates, context2);
8260
+ if (body.schedule) {
8261
+ const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
8262
+ try {
8263
+ await fetch(`${schedulerUrl}/scheduler/update`, {
8264
+ method: "POST",
8265
+ headers: {
8266
+ "Content-Type": "application/json",
8267
+ "X-API-KEY": config.apiKey || ""
8268
+ },
8269
+ body: JSON.stringify({
8270
+ triggerId,
8271
+ schedule: body.schedule
8272
+ })
8273
+ });
8274
+ } catch (error) {
8275
+ console.error("[Trigger] Failed to update scheduler:", error);
8276
+ }
8277
+ }
8278
+ return Response.json(updated);
8279
+ } else if (!subAction && method === "DELETE") {
8280
+ await config.triggers.delete(triggerId, context2);
8281
+ const schedulerUrl = config.schedulerUrl || config.serverUrl || "https://mcp.integrate.dev";
8282
+ try {
8283
+ await fetch(`${schedulerUrl}/scheduler/unregister`, {
8284
+ method: "POST",
8285
+ headers: {
8286
+ "Content-Type": "application/json",
8287
+ "X-API-KEY": config.apiKey || ""
8288
+ },
8289
+ body: JSON.stringify({ triggerId })
8290
+ });
8291
+ } catch (error) {
8292
+ console.error("[Trigger] Failed to unregister from scheduler:", error);
8293
+ }
8294
+ return new Response(null, { status: 204 });
8295
+ }
8296
+ }
8297
+ return Response.json({ error: "Invalid trigger route or method" }, { status: 404 });
8298
+ } catch (error) {
8299
+ console.error("[Trigger] Error:", error);
8300
+ return Response.json({ error: error.message || "Failed to process trigger request" }, { status: error.statusCode || 500 });
8301
+ }
8302
+ }
7839
8303
  if (segments.length > 0) {
7840
- if (segments.length === 2 && segments[0] !== "oauth") {
8304
+ if (segments.length === 2 && segments[0] !== "oauth" && segments[0] !== "triggers") {
7841
8305
  return Response.json({ error: `Invalid route: /${segments.join("/")}` }, { status: 404 });
7842
8306
  }
7843
8307
  if (segments.length === 1 && segments[0] === "mcp") {
7844
8308
  return Response.json({ error: `Method ${method} not allowed for /mcp route. Use POST.` }, { status: 405 });
7845
8309
  }
8310
+ if (segments.length >= 1 && segments[0] === "triggers") {
8311
+ return Response.json({ error: `Invalid trigger route or method` }, { status: 404 });
8312
+ }
7846
8313
  }
7847
8314
  if (method === "GET" && action === "callback") {
7848
8315
  const url = new URL(webRequest.url);
@@ -8724,7 +9191,7 @@ class OAuthHandler {
8724
9191
  const data = await response.json();
8725
9192
  return data;
8726
9193
  }
8727
- async handleToolCall(request, authHeader) {
9194
+ async handleToolCall(request, authHeader, integrationsHeader) {
8728
9195
  const url = this.serverUrl;
8729
9196
  const headers = this.getHeaders({
8730
9197
  "Content-Type": "application/json"
@@ -8732,6 +9199,9 @@ class OAuthHandler {
8732
9199
  if (authHeader && authHeader.startsWith("Bearer ")) {
8733
9200
  headers["Authorization"] = authHeader;
8734
9201
  }
9202
+ if (integrationsHeader) {
9203
+ headers["X-Integrations"] = integrationsHeader;
9204
+ }
8735
9205
  const jsonRpcRequest = {
8736
9206
  jsonrpc: "2.0",
8737
9207
  id: Date.now() + Math.random(),
@@ -8876,7 +9346,8 @@ function createNextOAuthHandler(config) {
8876
9346
  try {
8877
9347
  const body = await req.json();
8878
9348
  const authHeader = req.headers.get("authorization");
8879
- const result = await handler.handleToolCall(body, authHeader);
9349
+ const integrationsHeader = req.headers.get("x-integrations");
9350
+ const result = await handler.handleToolCall(body, authHeader, integrationsHeader);
8880
9351
  return Response.json(result);
8881
9352
  } catch (error) {
8882
9353
  console.error("[MCP Tool Call] Error:", error);
@@ -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;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"}
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;IAgBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}