integrate-sdk 0.3.2 → 0.3.3
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/index.js +174 -147
- package/dist/oauth.js +18 -5
- package/dist/server.js +179 -185
- package/dist/src/server.d.ts +6 -6
- package/dist/src/server.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
2
19
|
var __export = (target, all) => {
|
|
3
20
|
for (var name in all)
|
|
4
21
|
__defProp(target, name, {
|
|
@@ -148,6 +165,160 @@ var init_errors = __esm(() => {
|
|
|
148
165
|
};
|
|
149
166
|
});
|
|
150
167
|
|
|
168
|
+
// src/adapters/base-handler.ts
|
|
169
|
+
class OAuthHandler {
|
|
170
|
+
config;
|
|
171
|
+
serverUrl = MCP_SERVER_URL2;
|
|
172
|
+
constructor(config) {
|
|
173
|
+
this.config = config;
|
|
174
|
+
}
|
|
175
|
+
async handleAuthorize(request) {
|
|
176
|
+
const providerConfig = this.config.providers[request.provider];
|
|
177
|
+
if (!providerConfig) {
|
|
178
|
+
throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
179
|
+
}
|
|
180
|
+
if (!providerConfig.clientId || !providerConfig.clientSecret) {
|
|
181
|
+
throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
|
|
182
|
+
}
|
|
183
|
+
const url = new URL("/oauth/authorize", this.serverUrl);
|
|
184
|
+
url.searchParams.set("provider", request.provider);
|
|
185
|
+
url.searchParams.set("client_id", providerConfig.clientId);
|
|
186
|
+
url.searchParams.set("client_secret", providerConfig.clientSecret);
|
|
187
|
+
url.searchParams.set("scope", request.scopes.join(","));
|
|
188
|
+
url.searchParams.set("state", request.state);
|
|
189
|
+
url.searchParams.set("code_challenge", request.codeChallenge);
|
|
190
|
+
url.searchParams.set("code_challenge_method", request.codeChallengeMethod);
|
|
191
|
+
const redirectUri = request.redirectUri || providerConfig.redirectUri;
|
|
192
|
+
if (redirectUri) {
|
|
193
|
+
url.searchParams.set("redirect_uri", redirectUri);
|
|
194
|
+
}
|
|
195
|
+
const response = await fetch(url.toString(), {
|
|
196
|
+
method: "GET"
|
|
197
|
+
});
|
|
198
|
+
if (!response.ok) {
|
|
199
|
+
const error = await response.text();
|
|
200
|
+
throw new Error(`MCP server failed to generate authorization URL: ${error}`);
|
|
201
|
+
}
|
|
202
|
+
const data = await response.json();
|
|
203
|
+
return data;
|
|
204
|
+
}
|
|
205
|
+
async handleCallback(request) {
|
|
206
|
+
const url = new URL("/oauth/callback", this.serverUrl);
|
|
207
|
+
const response = await fetch(url.toString(), {
|
|
208
|
+
method: "POST",
|
|
209
|
+
headers: {
|
|
210
|
+
"Content-Type": "application/json"
|
|
211
|
+
},
|
|
212
|
+
body: JSON.stringify({
|
|
213
|
+
provider: request.provider,
|
|
214
|
+
code: request.code,
|
|
215
|
+
code_verifier: request.codeVerifier,
|
|
216
|
+
state: request.state
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
const error = await response.text();
|
|
221
|
+
throw new Error(`MCP server failed to exchange authorization code: ${error}`);
|
|
222
|
+
}
|
|
223
|
+
const data = await response.json();
|
|
224
|
+
return data;
|
|
225
|
+
}
|
|
226
|
+
async handleStatus(provider, sessionToken) {
|
|
227
|
+
const url = new URL("/oauth/status", this.serverUrl);
|
|
228
|
+
url.searchParams.set("provider", provider);
|
|
229
|
+
const response = await fetch(url.toString(), {
|
|
230
|
+
method: "GET",
|
|
231
|
+
headers: {
|
|
232
|
+
"X-Session-Token": sessionToken
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
if (response.status === 401) {
|
|
237
|
+
return {
|
|
238
|
+
authorized: false,
|
|
239
|
+
provider
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const error = await response.text();
|
|
243
|
+
throw new Error(`MCP server failed to check authorization status: ${error}`);
|
|
244
|
+
}
|
|
245
|
+
const data = await response.json();
|
|
246
|
+
return data;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
var MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
250
|
+
|
|
251
|
+
// src/adapters/nextjs.ts
|
|
252
|
+
var exports_nextjs = {};
|
|
253
|
+
__export(exports_nextjs, {
|
|
254
|
+
createNextOAuthHandler: () => createNextOAuthHandler
|
|
255
|
+
});
|
|
256
|
+
function createNextOAuthHandler(config) {
|
|
257
|
+
const handler = new OAuthHandler(config);
|
|
258
|
+
const handlers = {
|
|
259
|
+
async authorize(req) {
|
|
260
|
+
try {
|
|
261
|
+
const body = await req.json();
|
|
262
|
+
const result = await handler.handleAuthorize(body);
|
|
263
|
+
return Response.json(result);
|
|
264
|
+
} catch (error) {
|
|
265
|
+
console.error("[OAuth Authorize] Error:", error);
|
|
266
|
+
return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
async callback(req) {
|
|
270
|
+
try {
|
|
271
|
+
const body = await req.json();
|
|
272
|
+
const result = await handler.handleCallback(body);
|
|
273
|
+
return Response.json(result);
|
|
274
|
+
} catch (error) {
|
|
275
|
+
console.error("[OAuth Callback] Error:", error);
|
|
276
|
+
return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
async status(req) {
|
|
280
|
+
try {
|
|
281
|
+
const provider = req.nextUrl.searchParams.get("provider");
|
|
282
|
+
const sessionToken = req.headers.get("x-session-token");
|
|
283
|
+
if (!provider) {
|
|
284
|
+
return Response.json({ error: "Missing provider query parameter" }, { status: 400 });
|
|
285
|
+
}
|
|
286
|
+
if (!sessionToken) {
|
|
287
|
+
return Response.json({ error: "Missing X-Session-Token header" }, { status: 400 });
|
|
288
|
+
}
|
|
289
|
+
const result = await handler.handleStatus(provider, sessionToken);
|
|
290
|
+
return Response.json(result);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
console.error("[OAuth Status] Error:", error);
|
|
293
|
+
return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
createRoutes() {
|
|
297
|
+
return {
|
|
298
|
+
async POST(req, context) {
|
|
299
|
+
const action = context.params.action;
|
|
300
|
+
if (action === "authorize") {
|
|
301
|
+
return handlers.authorize(req);
|
|
302
|
+
}
|
|
303
|
+
if (action === "callback") {
|
|
304
|
+
return handlers.callback(req);
|
|
305
|
+
}
|
|
306
|
+
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
307
|
+
},
|
|
308
|
+
async GET(req, context) {
|
|
309
|
+
const action = context.params.action;
|
|
310
|
+
if (action === "status") {
|
|
311
|
+
return handlers.status(req);
|
|
312
|
+
}
|
|
313
|
+
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
return handlers;
|
|
319
|
+
}
|
|
320
|
+
var init_nextjs = () => {};
|
|
321
|
+
|
|
151
322
|
// src/protocol/jsonrpc.ts
|
|
152
323
|
function parseMessage(message) {
|
|
153
324
|
try {
|
|
@@ -1154,154 +1325,10 @@ async function clearClientCache() {
|
|
|
1154
1325
|
}
|
|
1155
1326
|
}));
|
|
1156
1327
|
}
|
|
1157
|
-
// src/adapters/base-handler.ts
|
|
1158
|
-
var MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
1159
1328
|
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
constructor(config) {
|
|
1164
|
-
this.config = config;
|
|
1165
|
-
}
|
|
1166
|
-
async handleAuthorize(request) {
|
|
1167
|
-
const providerConfig = this.config.providers[request.provider];
|
|
1168
|
-
if (!providerConfig) {
|
|
1169
|
-
throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
1170
|
-
}
|
|
1171
|
-
if (!providerConfig.clientId || !providerConfig.clientSecret) {
|
|
1172
|
-
throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
|
|
1173
|
-
}
|
|
1174
|
-
const url = new URL("/oauth/authorize", this.serverUrl);
|
|
1175
|
-
url.searchParams.set("provider", request.provider);
|
|
1176
|
-
url.searchParams.set("client_id", providerConfig.clientId);
|
|
1177
|
-
url.searchParams.set("client_secret", providerConfig.clientSecret);
|
|
1178
|
-
url.searchParams.set("scope", request.scopes.join(","));
|
|
1179
|
-
url.searchParams.set("state", request.state);
|
|
1180
|
-
url.searchParams.set("code_challenge", request.codeChallenge);
|
|
1181
|
-
url.searchParams.set("code_challenge_method", request.codeChallengeMethod);
|
|
1182
|
-
const redirectUri = request.redirectUri || providerConfig.redirectUri;
|
|
1183
|
-
if (redirectUri) {
|
|
1184
|
-
url.searchParams.set("redirect_uri", redirectUri);
|
|
1185
|
-
}
|
|
1186
|
-
const response = await fetch(url.toString(), {
|
|
1187
|
-
method: "GET"
|
|
1188
|
-
});
|
|
1189
|
-
if (!response.ok) {
|
|
1190
|
-
const error = await response.text();
|
|
1191
|
-
throw new Error(`MCP server failed to generate authorization URL: ${error}`);
|
|
1192
|
-
}
|
|
1193
|
-
const data = await response.json();
|
|
1194
|
-
return data;
|
|
1195
|
-
}
|
|
1196
|
-
async handleCallback(request) {
|
|
1197
|
-
const url = new URL("/oauth/callback", this.serverUrl);
|
|
1198
|
-
const response = await fetch(url.toString(), {
|
|
1199
|
-
method: "POST",
|
|
1200
|
-
headers: {
|
|
1201
|
-
"Content-Type": "application/json"
|
|
1202
|
-
},
|
|
1203
|
-
body: JSON.stringify({
|
|
1204
|
-
provider: request.provider,
|
|
1205
|
-
code: request.code,
|
|
1206
|
-
code_verifier: request.codeVerifier,
|
|
1207
|
-
state: request.state
|
|
1208
|
-
})
|
|
1209
|
-
});
|
|
1210
|
-
if (!response.ok) {
|
|
1211
|
-
const error = await response.text();
|
|
1212
|
-
throw new Error(`MCP server failed to exchange authorization code: ${error}`);
|
|
1213
|
-
}
|
|
1214
|
-
const data = await response.json();
|
|
1215
|
-
return data;
|
|
1216
|
-
}
|
|
1217
|
-
async handleStatus(provider, sessionToken) {
|
|
1218
|
-
const url = new URL("/oauth/status", this.serverUrl);
|
|
1219
|
-
url.searchParams.set("provider", provider);
|
|
1220
|
-
const response = await fetch(url.toString(), {
|
|
1221
|
-
method: "GET",
|
|
1222
|
-
headers: {
|
|
1223
|
-
"X-Session-Token": sessionToken
|
|
1224
|
-
}
|
|
1225
|
-
});
|
|
1226
|
-
if (!response.ok) {
|
|
1227
|
-
if (response.status === 401) {
|
|
1228
|
-
return {
|
|
1229
|
-
authorized: false,
|
|
1230
|
-
provider
|
|
1231
|
-
};
|
|
1232
|
-
}
|
|
1233
|
-
const error = await response.text();
|
|
1234
|
-
throw new Error(`MCP server failed to check authorization status: ${error}`);
|
|
1235
|
-
}
|
|
1236
|
-
const data = await response.json();
|
|
1237
|
-
return data;
|
|
1238
|
-
}
|
|
1239
|
-
}
|
|
1240
|
-
// src/adapters/nextjs.ts
|
|
1241
|
-
function createNextOAuthHandler(config) {
|
|
1242
|
-
const handler = new OAuthHandler(config);
|
|
1243
|
-
const handlers = {
|
|
1244
|
-
async authorize(req) {
|
|
1245
|
-
try {
|
|
1246
|
-
const body = await req.json();
|
|
1247
|
-
const result = await handler.handleAuthorize(body);
|
|
1248
|
-
return Response.json(result);
|
|
1249
|
-
} catch (error) {
|
|
1250
|
-
console.error("[OAuth Authorize] Error:", error);
|
|
1251
|
-
return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
|
|
1252
|
-
}
|
|
1253
|
-
},
|
|
1254
|
-
async callback(req) {
|
|
1255
|
-
try {
|
|
1256
|
-
const body = await req.json();
|
|
1257
|
-
const result = await handler.handleCallback(body);
|
|
1258
|
-
return Response.json(result);
|
|
1259
|
-
} catch (error) {
|
|
1260
|
-
console.error("[OAuth Callback] Error:", error);
|
|
1261
|
-
return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
|
|
1262
|
-
}
|
|
1263
|
-
},
|
|
1264
|
-
async status(req) {
|
|
1265
|
-
try {
|
|
1266
|
-
const provider = req.nextUrl.searchParams.get("provider");
|
|
1267
|
-
const sessionToken = req.headers.get("x-session-token");
|
|
1268
|
-
if (!provider) {
|
|
1269
|
-
return Response.json({ error: "Missing provider query parameter" }, { status: 400 });
|
|
1270
|
-
}
|
|
1271
|
-
if (!sessionToken) {
|
|
1272
|
-
return Response.json({ error: "Missing X-Session-Token header" }, { status: 400 });
|
|
1273
|
-
}
|
|
1274
|
-
const result = await handler.handleStatus(provider, sessionToken);
|
|
1275
|
-
return Response.json(result);
|
|
1276
|
-
} catch (error) {
|
|
1277
|
-
console.error("[OAuth Status] Error:", error);
|
|
1278
|
-
return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
|
|
1279
|
-
}
|
|
1280
|
-
},
|
|
1281
|
-
createRoutes() {
|
|
1282
|
-
return {
|
|
1283
|
-
async POST(req, context) {
|
|
1284
|
-
const action = context.params.action;
|
|
1285
|
-
if (action === "authorize") {
|
|
1286
|
-
return handlers.authorize(req);
|
|
1287
|
-
}
|
|
1288
|
-
if (action === "callback") {
|
|
1289
|
-
return handlers.callback(req);
|
|
1290
|
-
}
|
|
1291
|
-
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
1292
|
-
},
|
|
1293
|
-
async GET(req, context) {
|
|
1294
|
-
const action = context.params.action;
|
|
1295
|
-
if (action === "status") {
|
|
1296
|
-
return handlers.status(req);
|
|
1297
|
-
}
|
|
1298
|
-
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
1299
|
-
}
|
|
1300
|
-
};
|
|
1301
|
-
}
|
|
1302
|
-
};
|
|
1303
|
-
return handlers;
|
|
1304
|
-
}
|
|
1329
|
+
// src/index.ts
|
|
1330
|
+
init_nextjs();
|
|
1331
|
+
|
|
1305
1332
|
// src/adapters/tanstack-start.ts
|
|
1306
1333
|
function createTanStackOAuthHandler(config) {
|
|
1307
1334
|
const handler = new OAuthHandler(config);
|
package/dist/oauth.js
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
2
19
|
var __export = (target, all) => {
|
|
3
20
|
for (var name in all)
|
|
4
21
|
__defProp(target, name, {
|
|
@@ -11,8 +28,6 @@ var __export = (target, all) => {
|
|
|
11
28
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
12
29
|
|
|
13
30
|
// src/adapters/base-handler.ts
|
|
14
|
-
var MCP_SERVER_URL = "https://mcp.integrate.dev/api/v1/mcp";
|
|
15
|
-
|
|
16
31
|
class OAuthHandler {
|
|
17
32
|
config;
|
|
18
33
|
serverUrl = MCP_SERVER_URL;
|
|
@@ -93,12 +108,10 @@ class OAuthHandler {
|
|
|
93
108
|
return data;
|
|
94
109
|
}
|
|
95
110
|
}
|
|
111
|
+
var MCP_SERVER_URL = "https://mcp.integrate.dev/api/v1/mcp";
|
|
96
112
|
|
|
97
113
|
// src/adapters/auto-routes.ts
|
|
98
114
|
var globalOAuthConfig = null;
|
|
99
|
-
function setGlobalOAuthConfig(config) {
|
|
100
|
-
globalOAuthConfig = config;
|
|
101
|
-
}
|
|
102
115
|
async function POST(req, context) {
|
|
103
116
|
if (!globalOAuthConfig) {
|
|
104
117
|
throw new Error("OAuth configuration not found. Did you configure oauthProviders in createMCPClient?");
|
package/dist/server.js
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
2
19
|
var __export = (target, all) => {
|
|
3
20
|
for (var name in all)
|
|
4
21
|
__defProp(target, name, {
|
|
@@ -148,6 +165,160 @@ var init_errors = __esm(() => {
|
|
|
148
165
|
};
|
|
149
166
|
});
|
|
150
167
|
|
|
168
|
+
// src/adapters/base-handler.ts
|
|
169
|
+
class OAuthHandler {
|
|
170
|
+
config;
|
|
171
|
+
serverUrl = MCP_SERVER_URL2;
|
|
172
|
+
constructor(config) {
|
|
173
|
+
this.config = config;
|
|
174
|
+
}
|
|
175
|
+
async handleAuthorize(request) {
|
|
176
|
+
const providerConfig = this.config.providers[request.provider];
|
|
177
|
+
if (!providerConfig) {
|
|
178
|
+
throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
179
|
+
}
|
|
180
|
+
if (!providerConfig.clientId || !providerConfig.clientSecret) {
|
|
181
|
+
throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
|
|
182
|
+
}
|
|
183
|
+
const url = new URL("/oauth/authorize", this.serverUrl);
|
|
184
|
+
url.searchParams.set("provider", request.provider);
|
|
185
|
+
url.searchParams.set("client_id", providerConfig.clientId);
|
|
186
|
+
url.searchParams.set("client_secret", providerConfig.clientSecret);
|
|
187
|
+
url.searchParams.set("scope", request.scopes.join(","));
|
|
188
|
+
url.searchParams.set("state", request.state);
|
|
189
|
+
url.searchParams.set("code_challenge", request.codeChallenge);
|
|
190
|
+
url.searchParams.set("code_challenge_method", request.codeChallengeMethod);
|
|
191
|
+
const redirectUri = request.redirectUri || providerConfig.redirectUri;
|
|
192
|
+
if (redirectUri) {
|
|
193
|
+
url.searchParams.set("redirect_uri", redirectUri);
|
|
194
|
+
}
|
|
195
|
+
const response = await fetch(url.toString(), {
|
|
196
|
+
method: "GET"
|
|
197
|
+
});
|
|
198
|
+
if (!response.ok) {
|
|
199
|
+
const error = await response.text();
|
|
200
|
+
throw new Error(`MCP server failed to generate authorization URL: ${error}`);
|
|
201
|
+
}
|
|
202
|
+
const data = await response.json();
|
|
203
|
+
return data;
|
|
204
|
+
}
|
|
205
|
+
async handleCallback(request) {
|
|
206
|
+
const url = new URL("/oauth/callback", this.serverUrl);
|
|
207
|
+
const response = await fetch(url.toString(), {
|
|
208
|
+
method: "POST",
|
|
209
|
+
headers: {
|
|
210
|
+
"Content-Type": "application/json"
|
|
211
|
+
},
|
|
212
|
+
body: JSON.stringify({
|
|
213
|
+
provider: request.provider,
|
|
214
|
+
code: request.code,
|
|
215
|
+
code_verifier: request.codeVerifier,
|
|
216
|
+
state: request.state
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
const error = await response.text();
|
|
221
|
+
throw new Error(`MCP server failed to exchange authorization code: ${error}`);
|
|
222
|
+
}
|
|
223
|
+
const data = await response.json();
|
|
224
|
+
return data;
|
|
225
|
+
}
|
|
226
|
+
async handleStatus(provider, sessionToken) {
|
|
227
|
+
const url = new URL("/oauth/status", this.serverUrl);
|
|
228
|
+
url.searchParams.set("provider", provider);
|
|
229
|
+
const response = await fetch(url.toString(), {
|
|
230
|
+
method: "GET",
|
|
231
|
+
headers: {
|
|
232
|
+
"X-Session-Token": sessionToken
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
if (response.status === 401) {
|
|
237
|
+
return {
|
|
238
|
+
authorized: false,
|
|
239
|
+
provider
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const error = await response.text();
|
|
243
|
+
throw new Error(`MCP server failed to check authorization status: ${error}`);
|
|
244
|
+
}
|
|
245
|
+
const data = await response.json();
|
|
246
|
+
return data;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
var MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
250
|
+
|
|
251
|
+
// src/adapters/nextjs.ts
|
|
252
|
+
var exports_nextjs = {};
|
|
253
|
+
__export(exports_nextjs, {
|
|
254
|
+
createNextOAuthHandler: () => createNextOAuthHandler
|
|
255
|
+
});
|
|
256
|
+
function createNextOAuthHandler(config) {
|
|
257
|
+
const handler = new OAuthHandler(config);
|
|
258
|
+
const handlers = {
|
|
259
|
+
async authorize(req) {
|
|
260
|
+
try {
|
|
261
|
+
const body = await req.json();
|
|
262
|
+
const result = await handler.handleAuthorize(body);
|
|
263
|
+
return Response.json(result);
|
|
264
|
+
} catch (error) {
|
|
265
|
+
console.error("[OAuth Authorize] Error:", error);
|
|
266
|
+
return Response.json({ error: error.message || "Failed to get authorization URL" }, { status: 500 });
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
async callback(req) {
|
|
270
|
+
try {
|
|
271
|
+
const body = await req.json();
|
|
272
|
+
const result = await handler.handleCallback(body);
|
|
273
|
+
return Response.json(result);
|
|
274
|
+
} catch (error) {
|
|
275
|
+
console.error("[OAuth Callback] Error:", error);
|
|
276
|
+
return Response.json({ error: error.message || "Failed to exchange authorization code" }, { status: 500 });
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
async status(req) {
|
|
280
|
+
try {
|
|
281
|
+
const provider = req.nextUrl.searchParams.get("provider");
|
|
282
|
+
const sessionToken = req.headers.get("x-session-token");
|
|
283
|
+
if (!provider) {
|
|
284
|
+
return Response.json({ error: "Missing provider query parameter" }, { status: 400 });
|
|
285
|
+
}
|
|
286
|
+
if (!sessionToken) {
|
|
287
|
+
return Response.json({ error: "Missing X-Session-Token header" }, { status: 400 });
|
|
288
|
+
}
|
|
289
|
+
const result = await handler.handleStatus(provider, sessionToken);
|
|
290
|
+
return Response.json(result);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
console.error("[OAuth Status] Error:", error);
|
|
293
|
+
return Response.json({ error: error.message || "Failed to check authorization status" }, { status: 500 });
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
createRoutes() {
|
|
297
|
+
return {
|
|
298
|
+
async POST(req, context) {
|
|
299
|
+
const action = context.params.action;
|
|
300
|
+
if (action === "authorize") {
|
|
301
|
+
return handlers.authorize(req);
|
|
302
|
+
}
|
|
303
|
+
if (action === "callback") {
|
|
304
|
+
return handlers.callback(req);
|
|
305
|
+
}
|
|
306
|
+
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
307
|
+
},
|
|
308
|
+
async GET(req, context) {
|
|
309
|
+
const action = context.params.action;
|
|
310
|
+
if (action === "status") {
|
|
311
|
+
return handlers.status(req);
|
|
312
|
+
}
|
|
313
|
+
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
return handlers;
|
|
319
|
+
}
|
|
320
|
+
var init_nextjs = () => {};
|
|
321
|
+
|
|
151
322
|
// src/protocol/jsonrpc.ts
|
|
152
323
|
function parseMessage(message) {
|
|
153
324
|
try {
|
|
@@ -1155,185 +1326,6 @@ async function clearClientCache() {
|
|
|
1155
1326
|
}));
|
|
1156
1327
|
}
|
|
1157
1328
|
|
|
1158
|
-
// src/adapters/base-handler.ts
|
|
1159
|
-
var MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
1160
|
-
|
|
1161
|
-
class OAuthHandler {
|
|
1162
|
-
config;
|
|
1163
|
-
serverUrl = MCP_SERVER_URL2;
|
|
1164
|
-
constructor(config) {
|
|
1165
|
-
this.config = config;
|
|
1166
|
-
}
|
|
1167
|
-
async handleAuthorize(request) {
|
|
1168
|
-
const providerConfig = this.config.providers[request.provider];
|
|
1169
|
-
if (!providerConfig) {
|
|
1170
|
-
throw new Error(`Provider ${request.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
1171
|
-
}
|
|
1172
|
-
if (!providerConfig.clientId || !providerConfig.clientSecret) {
|
|
1173
|
-
throw new Error(`Missing OAuth credentials for ${request.provider}. Check your environment variables.`);
|
|
1174
|
-
}
|
|
1175
|
-
const url = new URL("/oauth/authorize", this.serverUrl);
|
|
1176
|
-
url.searchParams.set("provider", request.provider);
|
|
1177
|
-
url.searchParams.set("client_id", providerConfig.clientId);
|
|
1178
|
-
url.searchParams.set("client_secret", providerConfig.clientSecret);
|
|
1179
|
-
url.searchParams.set("scope", request.scopes.join(","));
|
|
1180
|
-
url.searchParams.set("state", request.state);
|
|
1181
|
-
url.searchParams.set("code_challenge", request.codeChallenge);
|
|
1182
|
-
url.searchParams.set("code_challenge_method", request.codeChallengeMethod);
|
|
1183
|
-
const redirectUri = request.redirectUri || providerConfig.redirectUri;
|
|
1184
|
-
if (redirectUri) {
|
|
1185
|
-
url.searchParams.set("redirect_uri", redirectUri);
|
|
1186
|
-
}
|
|
1187
|
-
const response = await fetch(url.toString(), {
|
|
1188
|
-
method: "GET"
|
|
1189
|
-
});
|
|
1190
|
-
if (!response.ok) {
|
|
1191
|
-
const error = await response.text();
|
|
1192
|
-
throw new Error(`MCP server failed to generate authorization URL: ${error}`);
|
|
1193
|
-
}
|
|
1194
|
-
const data = await response.json();
|
|
1195
|
-
return data;
|
|
1196
|
-
}
|
|
1197
|
-
async handleCallback(request) {
|
|
1198
|
-
const url = new URL("/oauth/callback", this.serverUrl);
|
|
1199
|
-
const response = await fetch(url.toString(), {
|
|
1200
|
-
method: "POST",
|
|
1201
|
-
headers: {
|
|
1202
|
-
"Content-Type": "application/json"
|
|
1203
|
-
},
|
|
1204
|
-
body: JSON.stringify({
|
|
1205
|
-
provider: request.provider,
|
|
1206
|
-
code: request.code,
|
|
1207
|
-
code_verifier: request.codeVerifier,
|
|
1208
|
-
state: request.state
|
|
1209
|
-
})
|
|
1210
|
-
});
|
|
1211
|
-
if (!response.ok) {
|
|
1212
|
-
const error = await response.text();
|
|
1213
|
-
throw new Error(`MCP server failed to exchange authorization code: ${error}`);
|
|
1214
|
-
}
|
|
1215
|
-
const data = await response.json();
|
|
1216
|
-
return data;
|
|
1217
|
-
}
|
|
1218
|
-
async handleStatus(provider, sessionToken) {
|
|
1219
|
-
const url = new URL("/oauth/status", this.serverUrl);
|
|
1220
|
-
url.searchParams.set("provider", provider);
|
|
1221
|
-
const response = await fetch(url.toString(), {
|
|
1222
|
-
method: "GET",
|
|
1223
|
-
headers: {
|
|
1224
|
-
"X-Session-Token": sessionToken
|
|
1225
|
-
}
|
|
1226
|
-
});
|
|
1227
|
-
if (!response.ok) {
|
|
1228
|
-
if (response.status === 401) {
|
|
1229
|
-
return {
|
|
1230
|
-
authorized: false,
|
|
1231
|
-
provider
|
|
1232
|
-
};
|
|
1233
|
-
}
|
|
1234
|
-
const error = await response.text();
|
|
1235
|
-
throw new Error(`MCP server failed to check authorization status: ${error}`);
|
|
1236
|
-
}
|
|
1237
|
-
const data = await response.json();
|
|
1238
|
-
return data;
|
|
1239
|
-
}
|
|
1240
|
-
}
|
|
1241
|
-
|
|
1242
|
-
// src/adapters/auto-routes.ts
|
|
1243
|
-
var globalOAuthConfig = null;
|
|
1244
|
-
function setGlobalOAuthConfig(config) {
|
|
1245
|
-
globalOAuthConfig = config;
|
|
1246
|
-
}
|
|
1247
|
-
async function POST(req, context) {
|
|
1248
|
-
if (!globalOAuthConfig) {
|
|
1249
|
-
throw new Error("OAuth configuration not found. Did you configure oauthProviders in createMCPClient?");
|
|
1250
|
-
}
|
|
1251
|
-
const handler = new OAuthHandler(globalOAuthConfig);
|
|
1252
|
-
const action = context?.params?.action;
|
|
1253
|
-
if (!action) {
|
|
1254
|
-
return createErrorResponse("Missing action parameter", 400);
|
|
1255
|
-
}
|
|
1256
|
-
try {
|
|
1257
|
-
if (action === "authorize") {
|
|
1258
|
-
const body = await parseRequestBody(req);
|
|
1259
|
-
const result = await handler.handleAuthorize(body);
|
|
1260
|
-
return createSuccessResponse(result);
|
|
1261
|
-
}
|
|
1262
|
-
if (action === "callback") {
|
|
1263
|
-
const body = await parseRequestBody(req);
|
|
1264
|
-
const result = await handler.handleCallback(body);
|
|
1265
|
-
return createSuccessResponse(result);
|
|
1266
|
-
}
|
|
1267
|
-
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
1268
|
-
} catch (error) {
|
|
1269
|
-
console.error(`[OAuth ${action}] Error:`, error);
|
|
1270
|
-
return createErrorResponse(error.message, 500);
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
async function GET(req, context) {
|
|
1274
|
-
if (!globalOAuthConfig) {
|
|
1275
|
-
throw new Error("OAuth configuration not found. Did you configure oauthProviders in createMCPClient?");
|
|
1276
|
-
}
|
|
1277
|
-
const handler = new OAuthHandler(globalOAuthConfig);
|
|
1278
|
-
const action = context?.params?.action;
|
|
1279
|
-
if (!action) {
|
|
1280
|
-
return createErrorResponse("Missing action parameter", 400);
|
|
1281
|
-
}
|
|
1282
|
-
try {
|
|
1283
|
-
if (action === "status") {
|
|
1284
|
-
const { provider, sessionToken } = parseQueryParams(req);
|
|
1285
|
-
if (!provider || !sessionToken) {
|
|
1286
|
-
return createErrorResponse("Missing provider or session token", 400);
|
|
1287
|
-
}
|
|
1288
|
-
const result = await handler.handleStatus(provider, sessionToken);
|
|
1289
|
-
return createSuccessResponse(result);
|
|
1290
|
-
}
|
|
1291
|
-
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
1292
|
-
} catch (error) {
|
|
1293
|
-
console.error(`[OAuth ${action}] Error:`, error);
|
|
1294
|
-
return createErrorResponse(error.message, 500);
|
|
1295
|
-
}
|
|
1296
|
-
}
|
|
1297
|
-
async function parseRequestBody(req) {
|
|
1298
|
-
if (typeof req.json === "function") {
|
|
1299
|
-
return await req.json();
|
|
1300
|
-
}
|
|
1301
|
-
throw new Error("Unable to parse request body");
|
|
1302
|
-
}
|
|
1303
|
-
function parseQueryParams(req) {
|
|
1304
|
-
let url;
|
|
1305
|
-
if (req.nextUrl) {
|
|
1306
|
-
url = new URL(req.nextUrl);
|
|
1307
|
-
} else if (req.url) {
|
|
1308
|
-
url = new URL(req.url);
|
|
1309
|
-
} else {
|
|
1310
|
-
return {};
|
|
1311
|
-
}
|
|
1312
|
-
const provider = url.searchParams.get("provider") || undefined;
|
|
1313
|
-
const sessionToken = req.headers?.get?.("x-session-token") || undefined;
|
|
1314
|
-
return { provider, sessionToken };
|
|
1315
|
-
}
|
|
1316
|
-
function createSuccessResponse(data) {
|
|
1317
|
-
if (typeof globalThis.NextResponse !== "undefined") {
|
|
1318
|
-
const NextResponse = globalThis.NextResponse;
|
|
1319
|
-
return NextResponse.json(data);
|
|
1320
|
-
}
|
|
1321
|
-
return new Response(JSON.stringify(data), {
|
|
1322
|
-
status: 200,
|
|
1323
|
-
headers: { "Content-Type": "application/json" }
|
|
1324
|
-
});
|
|
1325
|
-
}
|
|
1326
|
-
function createErrorResponse(message, status) {
|
|
1327
|
-
if (typeof globalThis.NextResponse !== "undefined") {
|
|
1328
|
-
const NextResponse = globalThis.NextResponse;
|
|
1329
|
-
return NextResponse.json({ error: message }, { status });
|
|
1330
|
-
}
|
|
1331
|
-
return new Response(JSON.stringify({ error: message }), {
|
|
1332
|
-
status,
|
|
1333
|
-
headers: { "Content-Type": "application/json" }
|
|
1334
|
-
});
|
|
1335
|
-
}
|
|
1336
|
-
|
|
1337
1329
|
// src/plugins/github.ts
|
|
1338
1330
|
var GITHUB_TOOLS = [
|
|
1339
1331
|
"github_create_issue",
|
|
@@ -1461,17 +1453,19 @@ function createMCPServer(config) {
|
|
|
1461
1453
|
};
|
|
1462
1454
|
}
|
|
1463
1455
|
}
|
|
1464
|
-
if (Object.keys(providers).length > 0) {
|
|
1465
|
-
setGlobalOAuthConfig({ providers });
|
|
1466
|
-
}
|
|
1467
1456
|
const client = new MCPClient(config);
|
|
1457
|
+
const { POST, GET } = createOAuthRouteHandlers({ providers });
|
|
1468
1458
|
return {
|
|
1469
1459
|
client,
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
}
|
|
1460
|
+
POST,
|
|
1461
|
+
GET
|
|
1473
1462
|
};
|
|
1474
1463
|
}
|
|
1464
|
+
function createOAuthRouteHandlers(config) {
|
|
1465
|
+
const { createNextOAuthHandler: createNextOAuthHandler2 } = (init_nextjs(), __toCommonJS(exports_nextjs));
|
|
1466
|
+
const handler = createNextOAuthHandler2(config);
|
|
1467
|
+
return handler.createRoutes();
|
|
1468
|
+
}
|
|
1475
1469
|
export {
|
|
1476
1470
|
gmailPlugin,
|
|
1477
1471
|
githubPlugin,
|
package/dist/src/server.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ import type { MCPPlugin } from './plugins/types.js';
|
|
|
16
16
|
* // lib/integrate-server.ts (server-side only!)
|
|
17
17
|
* import { createMCPServer, githubPlugin, gmailPlugin } from 'integrate-sdk/server';
|
|
18
18
|
*
|
|
19
|
-
* export const { client: serverClient,
|
|
19
|
+
* export const { client: serverClient, POST, GET } = createMCPServer({
|
|
20
20
|
* plugins: [
|
|
21
21
|
* githubPlugin({
|
|
22
22
|
* clientId: process.env.GITHUB_CLIENT_ID!,
|
|
@@ -35,16 +35,16 @@ import type { MCPPlugin } from './plugins/types.js';
|
|
|
35
35
|
* Then in your route file:
|
|
36
36
|
* ```typescript
|
|
37
37
|
* // app/api/integrate/oauth/[action]/route.ts
|
|
38
|
-
* export
|
|
38
|
+
* export { POST, GET } from '@/lib/integrate-server';
|
|
39
39
|
* ```
|
|
40
40
|
*/
|
|
41
41
|
export declare function createMCPServer<TPlugins extends readonly MCPPlugin[]>(config: MCPClientConfig<TPlugins>): {
|
|
42
42
|
/** Server-side MCP client instance */
|
|
43
43
|
client: MCPClient<TPlugins>;
|
|
44
|
-
/** OAuth
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
/** OAuth POST handler - export this from your route file */
|
|
45
|
+
POST: any;
|
|
46
|
+
/** OAuth GET handler - export this from your route file */
|
|
47
|
+
GET: any;
|
|
48
48
|
};
|
|
49
49
|
export type { MCPPlugin } from './plugins/types.js';
|
|
50
50
|
export type { MCPClientConfig } from './config/types.js';
|
package/dist/src/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,QAAQ,SAAS,SAAS,SAAS,EAAE,EACnE,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC;IA4C/B,sCAAsC;;IAGtC,4DAA4D;;IAG5D,2DAA2D;;EAG9D;AAaD,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|