integrate-sdk 0.7.0 → 0.7.1

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.
@@ -10,6 +10,171 @@ var __export = (target, all) => {
10
10
  };
11
11
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
12
12
 
13
+ // src/adapters/base-handler.ts
14
+ class OAuthHandler {
15
+ config;
16
+ serverUrl;
17
+ apiKey;
18
+ constructor(config) {
19
+ this.config = config;
20
+ if (!config || !config.providers) {
21
+ throw new Error("OAuthHandler requires a valid config with providers");
22
+ }
23
+ this.serverUrl = config.serverUrl || MCP_SERVER_URL;
24
+ this.apiKey = config.apiKey;
25
+ }
26
+ getHeaders(additionalHeaders) {
27
+ const headers = {
28
+ ...additionalHeaders
29
+ };
30
+ if (this.apiKey) {
31
+ headers["X-API-KEY"] = this.apiKey;
32
+ }
33
+ return headers;
34
+ }
35
+ async handleAuthorize(request) {
36
+ const providerConfig = this.config.providers[request.provider];
37
+ if (!providerConfig) {
38
+ throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
39
+ }
40
+ if (!providerConfig.clientId || !providerConfig.clientSecret) {
41
+ throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
42
+ }
43
+ const url = new URL("/oauth/authorize", this.serverUrl);
44
+ url.searchParams.set("provider", request.provider);
45
+ url.searchParams.set("client_id", providerConfig.clientId);
46
+ url.searchParams.set("client_secret", providerConfig.clientSecret);
47
+ url.searchParams.set("scope", request.scopes.join(","));
48
+ url.searchParams.set("state", request.state);
49
+ url.searchParams.set("code_challenge", request.codeChallenge);
50
+ url.searchParams.set("code_challenge_method", request.codeChallengeMethod);
51
+ const redirectUri = request.redirectUri || providerConfig.redirectUri;
52
+ if (redirectUri) {
53
+ url.searchParams.set("redirect_uri", redirectUri);
54
+ }
55
+ const response = await fetch(url.toString(), {
56
+ method: "GET",
57
+ headers: this.getHeaders()
58
+ });
59
+ if (!response.ok) {
60
+ const error = await response.text();
61
+ throw new Error(`MCP server failed to generate authorization URL: ${error}`);
62
+ }
63
+ const data = await response.json();
64
+ return data;
65
+ }
66
+ async handleCallback(request) {
67
+ const providerConfig = this.config.providers[request.provider];
68
+ if (!providerConfig) {
69
+ throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
70
+ }
71
+ if (!providerConfig.clientId || !providerConfig.clientSecret) {
72
+ throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
73
+ }
74
+ const url = new URL("/oauth/callback", this.serverUrl);
75
+ const response = await fetch(url.toString(), {
76
+ method: "POST",
77
+ headers: this.getHeaders({
78
+ "Content-Type": "application/json"
79
+ }),
80
+ body: JSON.stringify({
81
+ provider: request.provider,
82
+ code: request.code,
83
+ code_verifier: request.codeVerifier,
84
+ state: request.state,
85
+ client_id: providerConfig.clientId,
86
+ client_secret: providerConfig.clientSecret,
87
+ redirect_uri: providerConfig.redirectUri
88
+ })
89
+ });
90
+ if (!response.ok) {
91
+ const error = await response.text();
92
+ throw new Error(`MCP server failed to exchange authorization code: ${error}`);
93
+ }
94
+ const data = await response.json();
95
+ return data;
96
+ }
97
+ async handleStatus(provider, accessToken) {
98
+ const url = new URL("/oauth/status", this.serverUrl);
99
+ url.searchParams.set("provider", provider);
100
+ const response = await fetch(url.toString(), {
101
+ method: "GET",
102
+ headers: this.getHeaders({
103
+ Authorization: `Bearer ${accessToken}`
104
+ })
105
+ });
106
+ if (!response.ok) {
107
+ if (response.status === 401) {
108
+ return {
109
+ authorized: false
110
+ };
111
+ }
112
+ const error = await response.text();
113
+ throw new Error(`MCP server failed to check authorization status: ${error}`);
114
+ }
115
+ const data = await response.json();
116
+ return data;
117
+ }
118
+ async handleDisconnect(request, accessToken) {
119
+ if (!accessToken) {
120
+ throw new Error("No access token provided. Cannot disconnect provider.");
121
+ }
122
+ const url = new URL("/oauth/disconnect", this.serverUrl);
123
+ const response = await fetch(url.toString(), {
124
+ method: "POST",
125
+ headers: this.getHeaders({
126
+ "Content-Type": "application/json",
127
+ Authorization: `Bearer ${accessToken}`
128
+ }),
129
+ body: JSON.stringify({
130
+ provider: request.provider
131
+ })
132
+ });
133
+ if (!response.ok) {
134
+ const error = await response.text();
135
+ throw new Error(`MCP server failed to disconnect provider: ${error}`);
136
+ }
137
+ const data = await response.json();
138
+ return data;
139
+ }
140
+ async handleToolCall(request, authHeader) {
141
+ const url = new URL("/tools/call", this.serverUrl);
142
+ const headers = this.getHeaders({
143
+ "Content-Type": "application/json"
144
+ });
145
+ if (authHeader && authHeader.startsWith("Bearer ")) {
146
+ headers["Authorization"] = authHeader;
147
+ }
148
+ const jsonRpcRequest = {
149
+ jsonrpc: "2.0",
150
+ id: Date.now() + Math.random(),
151
+ method: "tools/call",
152
+ params: {
153
+ name: request.name,
154
+ arguments: request.arguments || {}
155
+ }
156
+ };
157
+ const response = await fetch(url.toString(), {
158
+ method: "POST",
159
+ headers,
160
+ body: JSON.stringify(jsonRpcRequest)
161
+ });
162
+ if (!response.ok) {
163
+ const error = await response.text();
164
+ throw new Error(`MCP server failed to execute tool call: ${error}`);
165
+ }
166
+ const jsonRpcResponse = await response.json();
167
+ if (jsonRpcResponse.error) {
168
+ const error = new Error(jsonRpcResponse.error.message || "Tool call failed");
169
+ error.code = jsonRpcResponse.error.code;
170
+ error.data = jsonRpcResponse.error.data;
171
+ throw error;
172
+ }
173
+ return jsonRpcResponse.result;
174
+ }
175
+ }
176
+ var MCP_SERVER_URL = "https://mcp.integrate.dev/api/v1/mcp";
177
+
13
178
  // src/oauth/pkce.ts
14
179
  var exports_pkce = {};
15
180
  __export(exports_pkce, {
@@ -244,172 +409,6 @@ var init_errors = __esm(() => {
244
409
  };
245
410
  });
246
411
 
247
- // src/adapters/base-handler.ts
248
- var MCP_SERVER_URL = "https://mcp.integrate.dev/api/v1/mcp";
249
-
250
- class OAuthHandler {
251
- config;
252
- serverUrl;
253
- apiKey;
254
- constructor(config) {
255
- this.config = config;
256
- if (!config || !config.providers) {
257
- throw new Error("OAuthHandler requires a valid config with providers");
258
- }
259
- this.serverUrl = config.serverUrl || MCP_SERVER_URL;
260
- this.apiKey = config.apiKey;
261
- }
262
- getHeaders(additionalHeaders) {
263
- const headers = {
264
- ...additionalHeaders
265
- };
266
- if (this.apiKey) {
267
- headers["X-API-KEY"] = this.apiKey;
268
- }
269
- return headers;
270
- }
271
- async handleAuthorize(request) {
272
- const providerConfig = this.config.providers[request.provider];
273
- if (!providerConfig) {
274
- throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
275
- }
276
- if (!providerConfig.clientId || !providerConfig.clientSecret) {
277
- throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
278
- }
279
- const url = new URL("/oauth/authorize", this.serverUrl);
280
- url.searchParams.set("provider", request.provider);
281
- url.searchParams.set("client_id", providerConfig.clientId);
282
- url.searchParams.set("client_secret", providerConfig.clientSecret);
283
- url.searchParams.set("scope", request.scopes.join(","));
284
- url.searchParams.set("state", request.state);
285
- url.searchParams.set("code_challenge", request.codeChallenge);
286
- url.searchParams.set("code_challenge_method", request.codeChallengeMethod);
287
- const redirectUri = request.redirectUri || providerConfig.redirectUri;
288
- if (redirectUri) {
289
- url.searchParams.set("redirect_uri", redirectUri);
290
- }
291
- const response = await fetch(url.toString(), {
292
- method: "GET",
293
- headers: this.getHeaders()
294
- });
295
- if (!response.ok) {
296
- const error = await response.text();
297
- throw new Error(`MCP server failed to generate authorization URL: ${error}`);
298
- }
299
- const data = await response.json();
300
- return data;
301
- }
302
- async handleCallback(request) {
303
- const providerConfig = this.config.providers[request.provider];
304
- if (!providerConfig) {
305
- throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
306
- }
307
- if (!providerConfig.clientId || !providerConfig.clientSecret) {
308
- throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
309
- }
310
- const url = new URL("/oauth/callback", this.serverUrl);
311
- const response = await fetch(url.toString(), {
312
- method: "POST",
313
- headers: this.getHeaders({
314
- "Content-Type": "application/json"
315
- }),
316
- body: JSON.stringify({
317
- provider: request.provider,
318
- code: request.code,
319
- code_verifier: request.codeVerifier,
320
- state: request.state,
321
- client_id: providerConfig.clientId,
322
- client_secret: providerConfig.clientSecret,
323
- redirect_uri: providerConfig.redirectUri
324
- })
325
- });
326
- if (!response.ok) {
327
- const error = await response.text();
328
- throw new Error(`MCP server failed to exchange authorization code: ${error}`);
329
- }
330
- const data = await response.json();
331
- return data;
332
- }
333
- async handleStatus(provider, accessToken) {
334
- const url = new URL("/oauth/status", this.serverUrl);
335
- url.searchParams.set("provider", provider);
336
- const response = await fetch(url.toString(), {
337
- method: "GET",
338
- headers: this.getHeaders({
339
- Authorization: `Bearer ${accessToken}`
340
- })
341
- });
342
- if (!response.ok) {
343
- if (response.status === 401) {
344
- return {
345
- authorized: false
346
- };
347
- }
348
- const error = await response.text();
349
- throw new Error(`MCP server failed to check authorization status: ${error}`);
350
- }
351
- const data = await response.json();
352
- return data;
353
- }
354
- async handleDisconnect(request, accessToken) {
355
- if (!accessToken) {
356
- throw new Error("No access token provided. Cannot disconnect provider.");
357
- }
358
- const url = new URL("/oauth/disconnect", this.serverUrl);
359
- const response = await fetch(url.toString(), {
360
- method: "POST",
361
- headers: this.getHeaders({
362
- "Content-Type": "application/json",
363
- Authorization: `Bearer ${accessToken}`
364
- }),
365
- body: JSON.stringify({
366
- provider: request.provider
367
- })
368
- });
369
- if (!response.ok) {
370
- const error = await response.text();
371
- throw new Error(`MCP server failed to disconnect provider: ${error}`);
372
- }
373
- const data = await response.json();
374
- return data;
375
- }
376
- async handleToolCall(request, authHeader) {
377
- const url = new URL("/tools/call", this.serverUrl);
378
- const headers = this.getHeaders({
379
- "Content-Type": "application/json"
380
- });
381
- if (authHeader && authHeader.startsWith("Bearer ")) {
382
- headers["Authorization"] = authHeader;
383
- }
384
- const jsonRpcRequest = {
385
- jsonrpc: "2.0",
386
- id: Date.now() + Math.random(),
387
- method: "tools/call",
388
- params: {
389
- name: request.name,
390
- arguments: request.arguments || {}
391
- }
392
- };
393
- const response = await fetch(url.toString(), {
394
- method: "POST",
395
- headers,
396
- body: JSON.stringify(jsonRpcRequest)
397
- });
398
- if (!response.ok) {
399
- const error = await response.text();
400
- throw new Error(`MCP server failed to execute tool call: ${error}`);
401
- }
402
- const jsonRpcResponse = await response.json();
403
- if (jsonRpcResponse.error) {
404
- const error = new Error(jsonRpcResponse.error.message || "Tool call failed");
405
- error.code = jsonRpcResponse.error.code;
406
- error.data = jsonRpcResponse.error.data;
407
- throw error;
408
- }
409
- return jsonRpcResponse.result;
410
- }
411
- }
412
-
413
412
  // src/adapters/nextjs.ts
414
413
  function createNextOAuthHandler(config) {
415
414
  const handler = new OAuthHandler(config);