integrate-sdk 0.9.27-dev.0 → 0.9.27-dev.2

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/README.md CHANGED
@@ -132,6 +132,88 @@ const result = await client.github.createIssue({
132
132
  console.log("Issue created:", result);
133
133
  ```
134
134
 
135
+ ### API Key Integrations
136
+
137
+ Use API-key integrations like Granola by passing the credential directly to the integration helper:
138
+
139
+ ```typescript
140
+ import { createMCPClient, granolaIntegration } from "integrate-sdk";
141
+
142
+ const client = createMCPClient({
143
+ integrations: [
144
+ granolaIntegration({
145
+ apiKey: process.env.GRANOLA_API_KEY!,
146
+ }),
147
+ ],
148
+ });
149
+
150
+ const notes = await client.callTool("granola_list_notes", {
151
+ page_size: 10,
152
+ });
153
+
154
+ const note = await client.callTool("granola_get_note", {
155
+ note_id: "not_123",
156
+ include_transcript: true,
157
+ });
158
+
159
+ const folders = await client.callTool("granola_list_folders", {
160
+ page_size: 10,
161
+ });
162
+ ```
163
+
164
+ Mercury uses the same API-token pattern:
165
+
166
+ ```typescript
167
+ import { createMCPClient, mercuryIntegration } from "integrate-sdk";
168
+
169
+ const client = createMCPClient({
170
+ integrations: [
171
+ mercuryIntegration({
172
+ apiKey: process.env.MERCURY_API_KEY!,
173
+ }),
174
+ ],
175
+ });
176
+
177
+ const org = await client.callTool("mercury_get_organization");
178
+ const accounts = await client.callTool("mercury_list_accounts", {
179
+ limit: 50,
180
+ });
181
+ const txns = await client.callTool("mercury_list_transactions", {
182
+ start: "2026-01-01",
183
+ end: "2026-01-31",
184
+ limit: 100,
185
+ });
186
+ ```
187
+
188
+ ### OAuth File Storage Integrations
189
+
190
+ Dropbox follows the standard OAuth integration flow:
191
+
192
+ ```typescript
193
+ import { createMCPClient, dropboxIntegration } from "integrate-sdk";
194
+
195
+ const client = createMCPClient({
196
+ integrations: [
197
+ dropboxIntegration({
198
+ scopes: [
199
+ "account_info.read",
200
+ "files.metadata.read",
201
+ "files.content.read",
202
+ "files.content.write",
203
+ "sharing.read",
204
+ "sharing.write",
205
+ ],
206
+ }),
207
+ ],
208
+ });
209
+
210
+ const account = await client.callTool("dropbox_get_current_account");
211
+ const files = await client.callTool("dropbox_list_folder", {
212
+ path: "/",
213
+ limit: 50,
214
+ });
215
+ ```
216
+
135
217
  **That's it!** The SDK automatically:
136
218
 
137
219
  - ✅ Connects on first method call (no manual `connect()` needed)
@@ -2737,6 +2737,34 @@ class OAuthManager {
2737
2737
 
2738
2738
  // ../client.ts
2739
2739
  var CLIENT_LOG_CONTEXT = "client";
2740
+ var NON_TOOL_PROXY_PROPERTIES = new Set([
2741
+ "then",
2742
+ "catch",
2743
+ "finally",
2744
+ "constructor",
2745
+ "prototype",
2746
+ "toString",
2747
+ "valueOf",
2748
+ "toJSON",
2749
+ "inspect",
2750
+ "hasOwnProperty",
2751
+ "isPrototypeOf",
2752
+ "propertyIsEnumerable",
2753
+ "__proto__",
2754
+ "__defineGetter__",
2755
+ "__defineSetter__",
2756
+ "__lookupGetter__",
2757
+ "__lookupSetter__",
2758
+ "__esModule",
2759
+ Symbol.toStringTag,
2760
+ Symbol.toPrimitive,
2761
+ Symbol.iterator,
2762
+ Symbol.asyncIterator,
2763
+ Symbol.for("nodejs.util.inspect.custom")
2764
+ ]);
2765
+ function isToolProxyProperty(property) {
2766
+ return typeof property === "string" && !NON_TOOL_PROXY_PROPERTIES.has(property);
2767
+ }
2740
2768
 
2741
2769
  class SimpleEventEmitter {
2742
2770
  handlers = new Map;
@@ -2959,6 +2987,8 @@ class MCPClientBase {
2959
2987
  }
2960
2988
  return new Proxy({}, {
2961
2989
  get: (_target, methodName) => {
2990
+ if (!isToolProxyProperty(methodName))
2991
+ return;
2962
2992
  return async (args, options) => {
2963
2993
  const toolName = methodToToolName(methodName, integrationId);
2964
2994
  return await this.callToolWithRetry(toolName, args, 0, options);
@@ -2972,6 +3002,8 @@ class MCPClientBase {
2972
3002
  createServerProxy() {
2973
3003
  return new Proxy({}, {
2974
3004
  get: (_target, methodName) => {
3005
+ if (!isToolProxyProperty(methodName))
3006
+ return;
2975
3007
  if (methodName === "listConfiguredIntegrations") {
2976
3008
  return async (options) => {
2977
3009
  const transportHeaders = this.transport.headers || {};
@@ -3192,6 +3224,9 @@ class MCPClientBase {
3192
3224
  async _callToolByName(name, args, options) {
3193
3225
  return await this.callToolWithRetry(name, args, 0, options);
3194
3226
  }
3227
+ async callTool(name, args, options) {
3228
+ return await this.callToolWithRetry(name, args, 0, options);
3229
+ }
3195
3230
  async callServerTool(name, args) {
3196
3231
  try {
3197
3232
  const response = await this.callToolThroughHandler(name, args);
@@ -3202,35 +3237,38 @@ class MCPClientBase {
3202
3237
  }
3203
3238
  }
3204
3239
  async callToolThroughHandler(name, args, provider, options) {
3240
+ const integrationHeaders = this.getHeadersForTool(name);
3205
3241
  const transportHeaders = this.transport.headers || {};
3206
3242
  const hasApiKey = !!transportHeaders["X-API-KEY"];
3207
3243
  if (hasApiKey) {
3208
3244
  await this.ensureConnected();
3245
+ const temporaryHeaders = { ...integrationHeaders };
3209
3246
  if (provider) {
3210
3247
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
3211
- if (tokenData && this.transport.setHeader) {
3212
- const previousAuthHeader = transportHeaders["Authorization"];
3213
- try {
3214
- this.transport.setHeader("Authorization", `Bearer ${tokenData.accessToken}`);
3215
- const result3 = await this.transport.sendRequest("tools/call", {
3216
- name,
3217
- arguments: args || {}
3218
- });
3219
- return result3;
3220
- } finally {
3221
- if (previousAuthHeader && this.transport.setHeader) {
3222
- this.transport.setHeader("Authorization", previousAuthHeader);
3223
- } else if (this.transport.removeHeader) {
3224
- this.transport.removeHeader("Authorization");
3225
- }
3248
+ if (tokenData) {
3249
+ temporaryHeaders["Authorization"] = `Bearer ${tokenData.accessToken}`;
3250
+ }
3251
+ }
3252
+ const previousHeaders = new Map;
3253
+ for (const [key, value] of Object.entries(temporaryHeaders)) {
3254
+ previousHeaders.set(key, transportHeaders[key]);
3255
+ this.transport.setHeader(key, value);
3256
+ }
3257
+ try {
3258
+ const result2 = await this.transport.sendRequest("tools/call", {
3259
+ name,
3260
+ arguments: args || {}
3261
+ });
3262
+ return result2;
3263
+ } finally {
3264
+ for (const [key, previousValue] of previousHeaders.entries()) {
3265
+ if (previousValue !== undefined) {
3266
+ this.transport.setHeader(key, previousValue);
3267
+ } else {
3268
+ this.transport.removeHeader(key);
3226
3269
  }
3227
3270
  }
3228
3271
  }
3229
- const result2 = await this.transport.sendRequest("tools/call", {
3230
- name,
3231
- arguments: args || {}
3232
- });
3233
- return result2;
3234
3272
  }
3235
3273
  const url = this.apiBaseUrl ? `${this.apiBaseUrl}${this.apiRouteBase}/mcp` : `${this.apiRouteBase}/mcp`;
3236
3274
  const headers = {
@@ -3240,6 +3278,7 @@ class MCPClientBase {
3240
3278
  if (integrationsHeader) {
3241
3279
  headers["X-Integrations"] = integrationsHeader;
3242
3280
  }
3281
+ Object.assign(headers, integrationHeaders);
3243
3282
  if (provider) {
3244
3283
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
3245
3284
  if (tokenData) {
@@ -3329,6 +3368,14 @@ class MCPClientBase {
3329
3368
  }
3330
3369
  return;
3331
3370
  }
3371
+ getHeadersForTool(toolName) {
3372
+ for (const integration of this.integrations) {
3373
+ if (integration.tools.includes(toolName) && integration.getHeaders) {
3374
+ return integration.getHeaders();
3375
+ }
3376
+ }
3377
+ return {};
3378
+ }
3332
3379
  getTool(name) {
3333
3380
  return this.availableTools.get(name);
3334
3381
  }
@@ -3709,45 +3756,48 @@ var logger22 = createLogger("Ramp");
3709
3756
  // ../integrations/onedrive.ts
3710
3757
  init_logger();
3711
3758
  var logger23 = createLogger("OneDrive");
3759
+ // ../integrations/dropbox.ts
3760
+ init_logger();
3761
+ var logger24 = createLogger("Dropbox");
3712
3762
  // ../integrations/word.ts
3713
3763
  init_logger();
3714
- var logger24 = createLogger("Word");
3764
+ var logger25 = createLogger("Word");
3715
3765
  // ../integrations/excel.ts
3716
3766
  init_logger();
3717
- var logger25 = createLogger("Excel");
3767
+ var logger26 = createLogger("Excel");
3718
3768
  // ../integrations/powerpoint.ts
3719
3769
  init_logger();
3720
- var logger26 = createLogger("PowerPoint");
3770
+ var logger27 = createLogger("PowerPoint");
3721
3771
  // ../integrations/gdocs.ts
3722
3772
  init_logger();
3723
- var logger27 = createLogger("Google Docs");
3773
+ var logger28 = createLogger("Google Docs");
3724
3774
  // ../integrations/gdrive.ts
3725
3775
  init_logger();
3726
- var logger28 = createLogger("Google Drive");
3776
+ var logger29 = createLogger("Google Drive");
3727
3777
  // ../integrations/gsheets.ts
3728
3778
  init_logger();
3729
- var logger29 = createLogger("Google Sheets");
3779
+ var logger30 = createLogger("Google Sheets");
3730
3780
  // ../integrations/gslides.ts
3731
3781
  init_logger();
3732
- var logger30 = createLogger("Google Slides");
3782
+ var logger31 = createLogger("Google Slides");
3733
3783
  // ../integrations/polar.ts
3734
3784
  init_logger();
3735
- var logger31 = createLogger("Polar");
3785
+ var logger32 = createLogger("Polar");
3736
3786
  // ../integrations/figma.ts
3737
3787
  init_logger();
3738
- var logger32 = createLogger("Figma");
3788
+ var logger33 = createLogger("Figma");
3739
3789
  // ../integrations/intercom.ts
3740
3790
  init_logger();
3741
- var logger33 = createLogger("Intercom");
3791
+ var logger34 = createLogger("Intercom");
3742
3792
  // ../integrations/hubspot.ts
3743
3793
  init_logger();
3744
- var logger34 = createLogger("HubSpot");
3794
+ var logger35 = createLogger("HubSpot");
3745
3795
  // ../integrations/youtube.ts
3746
3796
  init_logger();
3747
- var logger35 = createLogger("YouTube");
3797
+ var logger36 = createLogger("YouTube");
3748
3798
  // ../integrations/cursor.ts
3749
3799
  init_logger();
3750
- var logger36 = createLogger("Cursor");
3800
+ var logger37 = createLogger("Cursor");
3751
3801
  // ../ai/trigger-tools.ts
3752
3802
  init_utils();
3753
3803
 
@@ -3766,7 +3816,7 @@ init_tool_builder();
3766
3816
  init_tool_builder();
3767
3817
  // ../server.ts
3768
3818
  var SERVER_LOG_CONTEXT3 = "server";
3769
- var logger37 = createLogger("MCPServer", SERVER_LOG_CONTEXT3);
3819
+ var logger38 = createLogger("MCPServer", SERVER_LOG_CONTEXT3);
3770
3820
  var codeVerifierStorage = new Map;
3771
3821
  var unauthenticatedCodeModeWarnings = new Set;
3772
3822
  function toSolidStartHandler(clientOrHandlerOrOptions, _redirectOptions) {
@@ -2737,6 +2737,34 @@ class OAuthManager {
2737
2737
 
2738
2738
  // ../client.ts
2739
2739
  var CLIENT_LOG_CONTEXT = "client";
2740
+ var NON_TOOL_PROXY_PROPERTIES = new Set([
2741
+ "then",
2742
+ "catch",
2743
+ "finally",
2744
+ "constructor",
2745
+ "prototype",
2746
+ "toString",
2747
+ "valueOf",
2748
+ "toJSON",
2749
+ "inspect",
2750
+ "hasOwnProperty",
2751
+ "isPrototypeOf",
2752
+ "propertyIsEnumerable",
2753
+ "__proto__",
2754
+ "__defineGetter__",
2755
+ "__defineSetter__",
2756
+ "__lookupGetter__",
2757
+ "__lookupSetter__",
2758
+ "__esModule",
2759
+ Symbol.toStringTag,
2760
+ Symbol.toPrimitive,
2761
+ Symbol.iterator,
2762
+ Symbol.asyncIterator,
2763
+ Symbol.for("nodejs.util.inspect.custom")
2764
+ ]);
2765
+ function isToolProxyProperty(property) {
2766
+ return typeof property === "string" && !NON_TOOL_PROXY_PROPERTIES.has(property);
2767
+ }
2740
2768
 
2741
2769
  class SimpleEventEmitter {
2742
2770
  handlers = new Map;
@@ -2959,6 +2987,8 @@ class MCPClientBase {
2959
2987
  }
2960
2988
  return new Proxy({}, {
2961
2989
  get: (_target, methodName) => {
2990
+ if (!isToolProxyProperty(methodName))
2991
+ return;
2962
2992
  return async (args, options) => {
2963
2993
  const toolName = methodToToolName(methodName, integrationId);
2964
2994
  return await this.callToolWithRetry(toolName, args, 0, options);
@@ -2972,6 +3002,8 @@ class MCPClientBase {
2972
3002
  createServerProxy() {
2973
3003
  return new Proxy({}, {
2974
3004
  get: (_target, methodName) => {
3005
+ if (!isToolProxyProperty(methodName))
3006
+ return;
2975
3007
  if (methodName === "listConfiguredIntegrations") {
2976
3008
  return async (options) => {
2977
3009
  const transportHeaders = this.transport.headers || {};
@@ -3192,6 +3224,9 @@ class MCPClientBase {
3192
3224
  async _callToolByName(name, args, options) {
3193
3225
  return await this.callToolWithRetry(name, args, 0, options);
3194
3226
  }
3227
+ async callTool(name, args, options) {
3228
+ return await this.callToolWithRetry(name, args, 0, options);
3229
+ }
3195
3230
  async callServerTool(name, args) {
3196
3231
  try {
3197
3232
  const response = await this.callToolThroughHandler(name, args);
@@ -3202,35 +3237,38 @@ class MCPClientBase {
3202
3237
  }
3203
3238
  }
3204
3239
  async callToolThroughHandler(name, args, provider, options) {
3240
+ const integrationHeaders = this.getHeadersForTool(name);
3205
3241
  const transportHeaders = this.transport.headers || {};
3206
3242
  const hasApiKey = !!transportHeaders["X-API-KEY"];
3207
3243
  if (hasApiKey) {
3208
3244
  await this.ensureConnected();
3245
+ const temporaryHeaders = { ...integrationHeaders };
3209
3246
  if (provider) {
3210
3247
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
3211
- if (tokenData && this.transport.setHeader) {
3212
- const previousAuthHeader = transportHeaders["Authorization"];
3213
- try {
3214
- this.transport.setHeader("Authorization", `Bearer ${tokenData.accessToken}`);
3215
- const result3 = await this.transport.sendRequest("tools/call", {
3216
- name,
3217
- arguments: args || {}
3218
- });
3219
- return result3;
3220
- } finally {
3221
- if (previousAuthHeader && this.transport.setHeader) {
3222
- this.transport.setHeader("Authorization", previousAuthHeader);
3223
- } else if (this.transport.removeHeader) {
3224
- this.transport.removeHeader("Authorization");
3225
- }
3248
+ if (tokenData) {
3249
+ temporaryHeaders["Authorization"] = `Bearer ${tokenData.accessToken}`;
3250
+ }
3251
+ }
3252
+ const previousHeaders = new Map;
3253
+ for (const [key, value] of Object.entries(temporaryHeaders)) {
3254
+ previousHeaders.set(key, transportHeaders[key]);
3255
+ this.transport.setHeader(key, value);
3256
+ }
3257
+ try {
3258
+ const result2 = await this.transport.sendRequest("tools/call", {
3259
+ name,
3260
+ arguments: args || {}
3261
+ });
3262
+ return result2;
3263
+ } finally {
3264
+ for (const [key, previousValue] of previousHeaders.entries()) {
3265
+ if (previousValue !== undefined) {
3266
+ this.transport.setHeader(key, previousValue);
3267
+ } else {
3268
+ this.transport.removeHeader(key);
3226
3269
  }
3227
3270
  }
3228
3271
  }
3229
- const result2 = await this.transport.sendRequest("tools/call", {
3230
- name,
3231
- arguments: args || {}
3232
- });
3233
- return result2;
3234
3272
  }
3235
3273
  const url = this.apiBaseUrl ? `${this.apiBaseUrl}${this.apiRouteBase}/mcp` : `${this.apiRouteBase}/mcp`;
3236
3274
  const headers = {
@@ -3240,6 +3278,7 @@ class MCPClientBase {
3240
3278
  if (integrationsHeader) {
3241
3279
  headers["X-Integrations"] = integrationsHeader;
3242
3280
  }
3281
+ Object.assign(headers, integrationHeaders);
3243
3282
  if (provider) {
3244
3283
  const tokenData = await this.oauthManager.getProviderToken(provider, undefined, options?.context);
3245
3284
  if (tokenData) {
@@ -3329,6 +3368,14 @@ class MCPClientBase {
3329
3368
  }
3330
3369
  return;
3331
3370
  }
3371
+ getHeadersForTool(toolName) {
3372
+ for (const integration of this.integrations) {
3373
+ if (integration.tools.includes(toolName) && integration.getHeaders) {
3374
+ return integration.getHeaders();
3375
+ }
3376
+ }
3377
+ return {};
3378
+ }
3332
3379
  getTool(name) {
3333
3380
  return this.availableTools.get(name);
3334
3381
  }
@@ -3709,45 +3756,48 @@ var logger22 = createLogger("Ramp");
3709
3756
  // ../integrations/onedrive.ts
3710
3757
  init_logger();
3711
3758
  var logger23 = createLogger("OneDrive");
3759
+ // ../integrations/dropbox.ts
3760
+ init_logger();
3761
+ var logger24 = createLogger("Dropbox");
3712
3762
  // ../integrations/word.ts
3713
3763
  init_logger();
3714
- var logger24 = createLogger("Word");
3764
+ var logger25 = createLogger("Word");
3715
3765
  // ../integrations/excel.ts
3716
3766
  init_logger();
3717
- var logger25 = createLogger("Excel");
3767
+ var logger26 = createLogger("Excel");
3718
3768
  // ../integrations/powerpoint.ts
3719
3769
  init_logger();
3720
- var logger26 = createLogger("PowerPoint");
3770
+ var logger27 = createLogger("PowerPoint");
3721
3771
  // ../integrations/gdocs.ts
3722
3772
  init_logger();
3723
- var logger27 = createLogger("Google Docs");
3773
+ var logger28 = createLogger("Google Docs");
3724
3774
  // ../integrations/gdrive.ts
3725
3775
  init_logger();
3726
- var logger28 = createLogger("Google Drive");
3776
+ var logger29 = createLogger("Google Drive");
3727
3777
  // ../integrations/gsheets.ts
3728
3778
  init_logger();
3729
- var logger29 = createLogger("Google Sheets");
3779
+ var logger30 = createLogger("Google Sheets");
3730
3780
  // ../integrations/gslides.ts
3731
3781
  init_logger();
3732
- var logger30 = createLogger("Google Slides");
3782
+ var logger31 = createLogger("Google Slides");
3733
3783
  // ../integrations/polar.ts
3734
3784
  init_logger();
3735
- var logger31 = createLogger("Polar");
3785
+ var logger32 = createLogger("Polar");
3736
3786
  // ../integrations/figma.ts
3737
3787
  init_logger();
3738
- var logger32 = createLogger("Figma");
3788
+ var logger33 = createLogger("Figma");
3739
3789
  // ../integrations/intercom.ts
3740
3790
  init_logger();
3741
- var logger33 = createLogger("Intercom");
3791
+ var logger34 = createLogger("Intercom");
3742
3792
  // ../integrations/hubspot.ts
3743
3793
  init_logger();
3744
- var logger34 = createLogger("HubSpot");
3794
+ var logger35 = createLogger("HubSpot");
3745
3795
  // ../integrations/youtube.ts
3746
3796
  init_logger();
3747
- var logger35 = createLogger("YouTube");
3797
+ var logger36 = createLogger("YouTube");
3748
3798
  // ../integrations/cursor.ts
3749
3799
  init_logger();
3750
- var logger36 = createLogger("Cursor");
3800
+ var logger37 = createLogger("Cursor");
3751
3801
  // ../ai/trigger-tools.ts
3752
3802
  init_utils();
3753
3803
 
@@ -3766,7 +3816,7 @@ init_tool_builder();
3766
3816
  init_tool_builder();
3767
3817
  // ../server.ts
3768
3818
  var SERVER_LOG_CONTEXT3 = "server";
3769
- var logger37 = createLogger("MCPServer", SERVER_LOG_CONTEXT3);
3819
+ var logger38 = createLogger("MCPServer", SERVER_LOG_CONTEXT3);
3770
3820
  var codeVerifierStorage = new Map;
3771
3821
  var unauthenticatedCodeModeWarnings = new Set;
3772
3822
  function toSolidStartHandler(clientOrHandlerOrOptions, _redirectOptions) {