integrate-sdk 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/auto-routes.js +268 -0
- package/dist/adapters/base-handler.js +144 -0
- package/dist/adapters/nextjs-oauth-redirect.js +152 -0
- package/dist/adapters/nextjs.js +405 -0
- package/dist/adapters/node.js +280 -0
- package/dist/adapters/solid-start.js +27 -0
- package/dist/adapters/svelte-kit.js +34 -0
- package/dist/adapters/tanstack-start.js +26 -0
- package/dist/index.js +189 -77
- package/dist/oauth.js +19 -7
- package/dist/server.js +26 -10
- package/dist/src/adapters/base-handler.d.ts +10 -0
- package/dist/src/adapters/base-handler.d.ts.map +1 -1
- package/dist/src/adapters/node.d.ts +48 -0
- package/dist/src/adapters/node.d.ts.map +1 -0
- package/dist/src/adapters/solid-start.d.ts +54 -0
- package/dist/src/adapters/solid-start.d.ts.map +1 -0
- package/dist/src/adapters/svelte-kit.d.ts +82 -0
- package/dist/src/adapters/svelte-kit.d.ts.map +1 -0
- package/dist/src/adapters/tanstack-start.d.ts +28 -144
- package/dist/src/adapters/tanstack-start.d.ts.map +1 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/package.json +28 -7
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, {
|
|
5
|
+
get: all[name],
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
set: (newValue) => all[name] = () => newValue
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/adapters/solid-start.ts
|
|
13
|
+
function toSolidStartHandler(baseHandler) {
|
|
14
|
+
const handler = async (event) => {
|
|
15
|
+
return baseHandler(event.request);
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
GET: handler,
|
|
19
|
+
POST: handler,
|
|
20
|
+
PATCH: handler,
|
|
21
|
+
PUT: handler,
|
|
22
|
+
DELETE: handler
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
toSolidStartHandler
|
|
27
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, {
|
|
5
|
+
get: all[name],
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
set: (newValue) => all[name] = () => newValue
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/adapters/svelte-kit.ts
|
|
13
|
+
async function svelteKitHandler({
|
|
14
|
+
authConfig,
|
|
15
|
+
event,
|
|
16
|
+
resolve,
|
|
17
|
+
basePath = "/api/auth"
|
|
18
|
+
}) {
|
|
19
|
+
const { url } = event;
|
|
20
|
+
const baseUrl = new URL(basePath, url.origin);
|
|
21
|
+
if (!url.pathname.startsWith(baseUrl.pathname)) {
|
|
22
|
+
return resolve(event);
|
|
23
|
+
}
|
|
24
|
+
return authConfig(event.request);
|
|
25
|
+
}
|
|
26
|
+
function toSvelteKitHandler(baseHandler) {
|
|
27
|
+
return async (event) => {
|
|
28
|
+
return baseHandler(event.request);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
toSvelteKitHandler,
|
|
33
|
+
svelteKitHandler
|
|
34
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, {
|
|
5
|
+
get: all[name],
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
set: (newValue) => all[name] = () => newValue
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/adapters/tanstack-start.ts
|
|
13
|
+
function toTanStackStartHandler(handler) {
|
|
14
|
+
const baseHandler = async ({ request }) => {
|
|
15
|
+
return handler(request);
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
GET: baseHandler,
|
|
19
|
+
POST: baseHandler
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
var createTanStackOAuthHandler = toTanStackStartHandler;
|
|
23
|
+
export {
|
|
24
|
+
toTanStackStartHandler,
|
|
25
|
+
createTanStackOAuthHandler
|
|
26
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1464,6 +1464,7 @@ function registerCleanupHandlers() {
|
|
|
1464
1464
|
}
|
|
1465
1465
|
function generateCacheKey(config) {
|
|
1466
1466
|
const parts = [
|
|
1467
|
+
config.serverUrl || "default",
|
|
1467
1468
|
config.clientInfo?.name || "integrate-sdk",
|
|
1468
1469
|
config.clientInfo?.version || "0.1.0",
|
|
1469
1470
|
JSON.stringify(config.plugins.map((p) => ({ id: p.id, tools: p.tools }))),
|
|
@@ -1560,12 +1561,23 @@ var MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
|
1560
1561
|
class OAuthHandler {
|
|
1561
1562
|
config;
|
|
1562
1563
|
serverUrl;
|
|
1564
|
+
apiKey;
|
|
1563
1565
|
constructor(config) {
|
|
1564
1566
|
this.config = config;
|
|
1565
1567
|
if (!config || !config.providers) {
|
|
1566
1568
|
throw new Error("OAuthHandler requires a valid config with providers");
|
|
1567
1569
|
}
|
|
1568
1570
|
this.serverUrl = config.serverUrl || MCP_SERVER_URL2;
|
|
1571
|
+
this.apiKey = config.apiKey;
|
|
1572
|
+
}
|
|
1573
|
+
getHeaders(additionalHeaders) {
|
|
1574
|
+
const headers = {
|
|
1575
|
+
...additionalHeaders
|
|
1576
|
+
};
|
|
1577
|
+
if (this.apiKey) {
|
|
1578
|
+
headers["X-API-KEY"] = this.apiKey;
|
|
1579
|
+
}
|
|
1580
|
+
return headers;
|
|
1569
1581
|
}
|
|
1570
1582
|
async handleAuthorize(request) {
|
|
1571
1583
|
const providerConfig = this.config.providers[request.provider];
|
|
@@ -1588,7 +1600,8 @@ class OAuthHandler {
|
|
|
1588
1600
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
1589
1601
|
}
|
|
1590
1602
|
const response = await fetch(url.toString(), {
|
|
1591
|
-
method: "GET"
|
|
1603
|
+
method: "GET",
|
|
1604
|
+
headers: this.getHeaders()
|
|
1592
1605
|
});
|
|
1593
1606
|
if (!response.ok) {
|
|
1594
1607
|
const error = await response.text();
|
|
@@ -1608,9 +1621,9 @@ class OAuthHandler {
|
|
|
1608
1621
|
const url = new URL("/oauth/callback", this.serverUrl);
|
|
1609
1622
|
const response = await fetch(url.toString(), {
|
|
1610
1623
|
method: "POST",
|
|
1611
|
-
headers: {
|
|
1624
|
+
headers: this.getHeaders({
|
|
1612
1625
|
"Content-Type": "application/json"
|
|
1613
|
-
},
|
|
1626
|
+
}),
|
|
1614
1627
|
body: JSON.stringify({
|
|
1615
1628
|
provider: request.provider,
|
|
1616
1629
|
code: request.code,
|
|
@@ -1633,9 +1646,9 @@ class OAuthHandler {
|
|
|
1633
1646
|
url.searchParams.set("provider", provider);
|
|
1634
1647
|
const response = await fetch(url.toString(), {
|
|
1635
1648
|
method: "GET",
|
|
1636
|
-
headers: {
|
|
1649
|
+
headers: this.getHeaders({
|
|
1637
1650
|
Authorization: `Bearer ${accessToken}`
|
|
1638
|
-
}
|
|
1651
|
+
})
|
|
1639
1652
|
});
|
|
1640
1653
|
if (!response.ok) {
|
|
1641
1654
|
if (response.status === 401) {
|
|
@@ -1656,10 +1669,10 @@ class OAuthHandler {
|
|
|
1656
1669
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
1657
1670
|
const response = await fetch(url.toString(), {
|
|
1658
1671
|
method: "POST",
|
|
1659
|
-
headers: {
|
|
1672
|
+
headers: this.getHeaders({
|
|
1660
1673
|
"Content-Type": "application/json",
|
|
1661
1674
|
Authorization: `Bearer ${accessToken}`
|
|
1662
|
-
},
|
|
1675
|
+
}),
|
|
1663
1676
|
body: JSON.stringify({
|
|
1664
1677
|
provider: request.provider
|
|
1665
1678
|
})
|
|
@@ -1878,90 +1891,183 @@ function createOAuthRedirectHandler(config) {
|
|
|
1878
1891
|
return Response.redirect(targetUrl);
|
|
1879
1892
|
};
|
|
1880
1893
|
}
|
|
1881
|
-
// src/adapters/
|
|
1882
|
-
function
|
|
1883
|
-
const
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
status: 200,
|
|
1891
|
-
headers: {
|
|
1892
|
-
"Content-Type": "application/json"
|
|
1893
|
-
}
|
|
1894
|
-
});
|
|
1895
|
-
} catch (error) {
|
|
1896
|
-
console.error("[OAuth Authorize] Error:", error);
|
|
1897
|
-
return new Response(JSON.stringify({ error: error.message || "Failed to get authorization URL" }), {
|
|
1898
|
-
status: 500,
|
|
1899
|
-
headers: {
|
|
1900
|
-
"Content-Type": "application/json"
|
|
1901
|
-
}
|
|
1902
|
-
});
|
|
1894
|
+
// src/adapters/node.ts
|
|
1895
|
+
function fromNodeHeaders(nodeHeaders) {
|
|
1896
|
+
const webHeaders = new Headers;
|
|
1897
|
+
for (const [key, value] of Object.entries(nodeHeaders)) {
|
|
1898
|
+
if (value !== undefined) {
|
|
1899
|
+
if (Array.isArray(value)) {
|
|
1900
|
+
value.forEach((v) => webHeaders.append(key, v));
|
|
1901
|
+
} else {
|
|
1902
|
+
webHeaders.set(key, value);
|
|
1903
1903
|
}
|
|
1904
|
-
}
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
return webHeaders;
|
|
1907
|
+
}
|
|
1908
|
+
async function toWebRequest(req) {
|
|
1909
|
+
const protocol = req.socket.encrypted ? "https" : "http";
|
|
1910
|
+
const host = req.headers.host || "localhost";
|
|
1911
|
+
const url = `${protocol}://${host}${req.url}`;
|
|
1912
|
+
const headers = fromNodeHeaders(req.headers);
|
|
1913
|
+
let body;
|
|
1914
|
+
if (req.method && ["POST", "PUT", "PATCH"].includes(req.method)) {
|
|
1915
|
+
body = await new Promise((resolve, reject) => {
|
|
1916
|
+
let data = "";
|
|
1917
|
+
req.on("data", (chunk) => data += chunk);
|
|
1918
|
+
req.on("end", () => resolve(data));
|
|
1919
|
+
req.on("error", reject);
|
|
1920
|
+
});
|
|
1921
|
+
}
|
|
1922
|
+
return new Request(url, {
|
|
1923
|
+
method: req.method,
|
|
1924
|
+
headers,
|
|
1925
|
+
body: body || undefined
|
|
1926
|
+
});
|
|
1927
|
+
}
|
|
1928
|
+
async function sendWebResponse(webRes, nodeRes) {
|
|
1929
|
+
nodeRes.statusCode = webRes.status;
|
|
1930
|
+
webRes.headers.forEach((value, key) => {
|
|
1931
|
+
nodeRes.setHeader(key, value);
|
|
1932
|
+
});
|
|
1933
|
+
const body = await webRes.text();
|
|
1934
|
+
nodeRes.end(body);
|
|
1935
|
+
}
|
|
1936
|
+
function toNodeHandler(config) {
|
|
1937
|
+
const oauthHandler = new OAuthHandler(config);
|
|
1938
|
+
return async (req, res) => {
|
|
1939
|
+
try {
|
|
1940
|
+
const webReq = await toWebRequest(req);
|
|
1941
|
+
const url = new URL(webReq.url);
|
|
1942
|
+
const segments = url.pathname.split("/").filter(Boolean);
|
|
1943
|
+
const action = segments[segments.length - 1];
|
|
1944
|
+
let webRes;
|
|
1945
|
+
if (req.method === "POST") {
|
|
1946
|
+
if (action === "authorize") {
|
|
1947
|
+
const body = await webReq.json();
|
|
1948
|
+
const result = await oauthHandler.handleAuthorize(body);
|
|
1949
|
+
webRes = new Response(JSON.stringify(result), {
|
|
1950
|
+
status: 200,
|
|
1951
|
+
headers: { "Content-Type": "application/json" }
|
|
1952
|
+
});
|
|
1953
|
+
} else if (action === "callback") {
|
|
1954
|
+
const body = await webReq.json();
|
|
1955
|
+
const result = await oauthHandler.handleCallback(body);
|
|
1956
|
+
webRes = new Response(JSON.stringify(result), {
|
|
1957
|
+
status: 200,
|
|
1958
|
+
headers: { "Content-Type": "application/json" }
|
|
1959
|
+
});
|
|
1960
|
+
} else if (action === "disconnect") {
|
|
1961
|
+
const authHeader = webReq.headers.get("authorization");
|
|
1962
|
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
1963
|
+
webRes = new Response(JSON.stringify({ error: "Missing or invalid Authorization header" }), {
|
|
1964
|
+
status: 400,
|
|
1965
|
+
headers: { "Content-Type": "application/json" }
|
|
1966
|
+
});
|
|
1967
|
+
} else {
|
|
1968
|
+
const accessToken = authHeader.substring(7);
|
|
1969
|
+
const body = await webReq.json();
|
|
1970
|
+
const { provider } = body;
|
|
1971
|
+
if (!provider) {
|
|
1972
|
+
webRes = new Response(JSON.stringify({ error: "Missing provider in request body" }), {
|
|
1973
|
+
status: 400,
|
|
1974
|
+
headers: { "Content-Type": "application/json" }
|
|
1975
|
+
});
|
|
1976
|
+
} else {
|
|
1977
|
+
const result = await oauthHandler.handleDisconnect({ provider }, accessToken);
|
|
1978
|
+
webRes = new Response(JSON.stringify(result), {
|
|
1979
|
+
status: 200,
|
|
1980
|
+
headers: { "Content-Type": "application/json" }
|
|
1981
|
+
});
|
|
1982
|
+
}
|
|
1921
1983
|
}
|
|
1922
|
-
}
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1984
|
+
} else {
|
|
1985
|
+
webRes = new Response(JSON.stringify({ error: `Unknown action: ${action}` }), {
|
|
1986
|
+
status: 404,
|
|
1987
|
+
headers: { "Content-Type": "application/json" }
|
|
1988
|
+
});
|
|
1989
|
+
}
|
|
1990
|
+
} else if (req.method === "GET" && action === "status") {
|
|
1928
1991
|
const provider = url.searchParams.get("provider");
|
|
1929
|
-
const
|
|
1992
|
+
const authHeader = webReq.headers.get("authorization");
|
|
1930
1993
|
if (!provider) {
|
|
1931
|
-
|
|
1994
|
+
webRes = new Response(JSON.stringify({ error: "Missing provider query parameter" }), {
|
|
1932
1995
|
status: 400,
|
|
1933
|
-
headers: {
|
|
1934
|
-
"Content-Type": "application/json"
|
|
1935
|
-
}
|
|
1996
|
+
headers: { "Content-Type": "application/json" }
|
|
1936
1997
|
});
|
|
1937
|
-
}
|
|
1938
|
-
|
|
1939
|
-
return new Response(JSON.stringify({ error: "Missing X-Session-Token header" }), {
|
|
1998
|
+
} else if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
1999
|
+
webRes = new Response(JSON.stringify({ error: "Missing or invalid Authorization header" }), {
|
|
1940
2000
|
status: 400,
|
|
1941
|
-
headers: {
|
|
1942
|
-
|
|
1943
|
-
|
|
2001
|
+
headers: { "Content-Type": "application/json" }
|
|
2002
|
+
});
|
|
2003
|
+
} else {
|
|
2004
|
+
const accessToken = authHeader.substring(7);
|
|
2005
|
+
const result = await oauthHandler.handleStatus(provider, accessToken);
|
|
2006
|
+
webRes = new Response(JSON.stringify(result), {
|
|
2007
|
+
status: 200,
|
|
2008
|
+
headers: { "Content-Type": "application/json" }
|
|
1944
2009
|
});
|
|
1945
2010
|
}
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
status:
|
|
1949
|
-
headers: {
|
|
1950
|
-
"Content-Type": "application/json"
|
|
1951
|
-
}
|
|
1952
|
-
});
|
|
1953
|
-
} catch (error) {
|
|
1954
|
-
console.error("[OAuth Status] Error:", error);
|
|
1955
|
-
return new Response(JSON.stringify({ error: error.message || "Failed to check authorization status" }), {
|
|
1956
|
-
status: 500,
|
|
1957
|
-
headers: {
|
|
1958
|
-
"Content-Type": "application/json"
|
|
1959
|
-
}
|
|
2011
|
+
} else {
|
|
2012
|
+
webRes = new Response(JSON.stringify({ error: `Unknown action: ${action}` }), {
|
|
2013
|
+
status: 404,
|
|
2014
|
+
headers: { "Content-Type": "application/json" }
|
|
1960
2015
|
});
|
|
1961
2016
|
}
|
|
2017
|
+
await sendWebResponse(webRes, res);
|
|
2018
|
+
} catch (error) {
|
|
2019
|
+
console.error("[OAuth Handler] Error:", error);
|
|
2020
|
+
const errorRes = new Response(JSON.stringify({ error: error.message || "Internal server error" }), {
|
|
2021
|
+
status: 500,
|
|
2022
|
+
headers: { "Content-Type": "application/json" }
|
|
2023
|
+
});
|
|
2024
|
+
await sendWebResponse(errorRes, res);
|
|
1962
2025
|
}
|
|
1963
2026
|
};
|
|
1964
2027
|
}
|
|
2028
|
+
// src/adapters/solid-start.ts
|
|
2029
|
+
function toSolidStartHandler(baseHandler) {
|
|
2030
|
+
const handler = async (event) => {
|
|
2031
|
+
return baseHandler(event.request);
|
|
2032
|
+
};
|
|
2033
|
+
return {
|
|
2034
|
+
GET: handler,
|
|
2035
|
+
POST: handler,
|
|
2036
|
+
PATCH: handler,
|
|
2037
|
+
PUT: handler,
|
|
2038
|
+
DELETE: handler
|
|
2039
|
+
};
|
|
2040
|
+
}
|
|
2041
|
+
// src/adapters/svelte-kit.ts
|
|
2042
|
+
async function svelteKitHandler({
|
|
2043
|
+
authConfig,
|
|
2044
|
+
event,
|
|
2045
|
+
resolve,
|
|
2046
|
+
basePath = "/api/auth"
|
|
2047
|
+
}) {
|
|
2048
|
+
const { url } = event;
|
|
2049
|
+
const baseUrl = new URL(basePath, url.origin);
|
|
2050
|
+
if (!url.pathname.startsWith(baseUrl.pathname)) {
|
|
2051
|
+
return resolve(event);
|
|
2052
|
+
}
|
|
2053
|
+
return authConfig(event.request);
|
|
2054
|
+
}
|
|
2055
|
+
function toSvelteKitHandler(baseHandler) {
|
|
2056
|
+
return async (event) => {
|
|
2057
|
+
return baseHandler(event.request);
|
|
2058
|
+
};
|
|
2059
|
+
}
|
|
2060
|
+
// src/adapters/tanstack-start.ts
|
|
2061
|
+
function toTanStackStartHandler(handler) {
|
|
2062
|
+
const baseHandler = async ({ request }) => {
|
|
2063
|
+
return handler(request);
|
|
2064
|
+
};
|
|
2065
|
+
return {
|
|
2066
|
+
GET: baseHandler,
|
|
2067
|
+
POST: baseHandler
|
|
2068
|
+
};
|
|
2069
|
+
}
|
|
2070
|
+
var createTanStackOAuthHandler = toTanStackStartHandler;
|
|
1965
2071
|
|
|
1966
2072
|
// src/index.ts
|
|
1967
2073
|
init_errors();
|
|
@@ -6205,6 +6311,11 @@ async function getVercelAITools(client, options) {
|
|
|
6205
6311
|
return convertMCPToolsToVercelAI(client, options);
|
|
6206
6312
|
}
|
|
6207
6313
|
export {
|
|
6314
|
+
toTanStackStartHandler,
|
|
6315
|
+
toSvelteKitHandler,
|
|
6316
|
+
toSolidStartHandler,
|
|
6317
|
+
toNodeHandler,
|
|
6318
|
+
svelteKitHandler,
|
|
6208
6319
|
sendCallbackToOpener,
|
|
6209
6320
|
parseState,
|
|
6210
6321
|
parseServerError,
|
|
@@ -6219,6 +6330,7 @@ export {
|
|
|
6219
6330
|
generateState,
|
|
6220
6331
|
generateCodeVerifier,
|
|
6221
6332
|
generateCodeChallenge,
|
|
6333
|
+
fromNodeHeaders,
|
|
6222
6334
|
createTanStackOAuthHandler,
|
|
6223
6335
|
createSimplePlugin,
|
|
6224
6336
|
createOAuthRedirectHandler,
|
package/dist/oauth.js
CHANGED
|
@@ -16,12 +16,23 @@ var MCP_SERVER_URL = "https://mcp.integrate.dev/api/v1/mcp";
|
|
|
16
16
|
class OAuthHandler {
|
|
17
17
|
config;
|
|
18
18
|
serverUrl;
|
|
19
|
+
apiKey;
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.config = config;
|
|
21
22
|
if (!config || !config.providers) {
|
|
22
23
|
throw new Error("OAuthHandler requires a valid config with providers");
|
|
23
24
|
}
|
|
24
25
|
this.serverUrl = config.serverUrl || MCP_SERVER_URL;
|
|
26
|
+
this.apiKey = config.apiKey;
|
|
27
|
+
}
|
|
28
|
+
getHeaders(additionalHeaders) {
|
|
29
|
+
const headers = {
|
|
30
|
+
...additionalHeaders
|
|
31
|
+
};
|
|
32
|
+
if (this.apiKey) {
|
|
33
|
+
headers["X-API-KEY"] = this.apiKey;
|
|
34
|
+
}
|
|
35
|
+
return headers;
|
|
25
36
|
}
|
|
26
37
|
async handleAuthorize(request) {
|
|
27
38
|
const providerConfig = this.config.providers[request.provider];
|
|
@@ -44,7 +55,8 @@ class OAuthHandler {
|
|
|
44
55
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
45
56
|
}
|
|
46
57
|
const response = await fetch(url.toString(), {
|
|
47
|
-
method: "GET"
|
|
58
|
+
method: "GET",
|
|
59
|
+
headers: this.getHeaders()
|
|
48
60
|
});
|
|
49
61
|
if (!response.ok) {
|
|
50
62
|
const error = await response.text();
|
|
@@ -64,9 +76,9 @@ class OAuthHandler {
|
|
|
64
76
|
const url = new URL("/oauth/callback", this.serverUrl);
|
|
65
77
|
const response = await fetch(url.toString(), {
|
|
66
78
|
method: "POST",
|
|
67
|
-
headers: {
|
|
79
|
+
headers: this.getHeaders({
|
|
68
80
|
"Content-Type": "application/json"
|
|
69
|
-
},
|
|
81
|
+
}),
|
|
70
82
|
body: JSON.stringify({
|
|
71
83
|
provider: request.provider,
|
|
72
84
|
code: request.code,
|
|
@@ -89,9 +101,9 @@ class OAuthHandler {
|
|
|
89
101
|
url.searchParams.set("provider", provider);
|
|
90
102
|
const response = await fetch(url.toString(), {
|
|
91
103
|
method: "GET",
|
|
92
|
-
headers: {
|
|
104
|
+
headers: this.getHeaders({
|
|
93
105
|
Authorization: `Bearer ${accessToken}`
|
|
94
|
-
}
|
|
106
|
+
})
|
|
95
107
|
});
|
|
96
108
|
if (!response.ok) {
|
|
97
109
|
if (response.status === 401) {
|
|
@@ -112,10 +124,10 @@ class OAuthHandler {
|
|
|
112
124
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
113
125
|
const response = await fetch(url.toString(), {
|
|
114
126
|
method: "POST",
|
|
115
|
-
headers: {
|
|
127
|
+
headers: this.getHeaders({
|
|
116
128
|
"Content-Type": "application/json",
|
|
117
129
|
Authorization: `Bearer ${accessToken}`
|
|
118
|
-
},
|
|
130
|
+
}),
|
|
119
131
|
body: JSON.stringify({
|
|
120
132
|
provider: request.provider
|
|
121
133
|
})
|
package/dist/server.js
CHANGED
|
@@ -1464,6 +1464,7 @@ function registerCleanupHandlers() {
|
|
|
1464
1464
|
}
|
|
1465
1465
|
function generateCacheKey(config) {
|
|
1466
1466
|
const parts = [
|
|
1467
|
+
config.serverUrl || "default",
|
|
1467
1468
|
config.clientInfo?.name || "integrate-sdk",
|
|
1468
1469
|
config.clientInfo?.version || "0.1.0",
|
|
1469
1470
|
JSON.stringify(config.plugins.map((p) => ({ id: p.id, tools: p.tools }))),
|
|
@@ -1561,12 +1562,23 @@ var MCP_SERVER_URL2 = "https://mcp.integrate.dev/api/v1/mcp";
|
|
|
1561
1562
|
class OAuthHandler {
|
|
1562
1563
|
config;
|
|
1563
1564
|
serverUrl;
|
|
1565
|
+
apiKey;
|
|
1564
1566
|
constructor(config) {
|
|
1565
1567
|
this.config = config;
|
|
1566
1568
|
if (!config || !config.providers) {
|
|
1567
1569
|
throw new Error("OAuthHandler requires a valid config with providers");
|
|
1568
1570
|
}
|
|
1569
1571
|
this.serverUrl = config.serverUrl || MCP_SERVER_URL2;
|
|
1572
|
+
this.apiKey = config.apiKey;
|
|
1573
|
+
}
|
|
1574
|
+
getHeaders(additionalHeaders) {
|
|
1575
|
+
const headers = {
|
|
1576
|
+
...additionalHeaders
|
|
1577
|
+
};
|
|
1578
|
+
if (this.apiKey) {
|
|
1579
|
+
headers["X-API-KEY"] = this.apiKey;
|
|
1580
|
+
}
|
|
1581
|
+
return headers;
|
|
1570
1582
|
}
|
|
1571
1583
|
async handleAuthorize(request) {
|
|
1572
1584
|
const providerConfig = this.config.providers[request.provider];
|
|
@@ -1589,7 +1601,8 @@ class OAuthHandler {
|
|
|
1589
1601
|
url.searchParams.set("redirect_uri", redirectUri);
|
|
1590
1602
|
}
|
|
1591
1603
|
const response = await fetch(url.toString(), {
|
|
1592
|
-
method: "GET"
|
|
1604
|
+
method: "GET",
|
|
1605
|
+
headers: this.getHeaders()
|
|
1593
1606
|
});
|
|
1594
1607
|
if (!response.ok) {
|
|
1595
1608
|
const error = await response.text();
|
|
@@ -1609,9 +1622,9 @@ class OAuthHandler {
|
|
|
1609
1622
|
const url = new URL("/oauth/callback", this.serverUrl);
|
|
1610
1623
|
const response = await fetch(url.toString(), {
|
|
1611
1624
|
method: "POST",
|
|
1612
|
-
headers: {
|
|
1625
|
+
headers: this.getHeaders({
|
|
1613
1626
|
"Content-Type": "application/json"
|
|
1614
|
-
},
|
|
1627
|
+
}),
|
|
1615
1628
|
body: JSON.stringify({
|
|
1616
1629
|
provider: request.provider,
|
|
1617
1630
|
code: request.code,
|
|
@@ -1634,9 +1647,9 @@ class OAuthHandler {
|
|
|
1634
1647
|
url.searchParams.set("provider", provider);
|
|
1635
1648
|
const response = await fetch(url.toString(), {
|
|
1636
1649
|
method: "GET",
|
|
1637
|
-
headers: {
|
|
1650
|
+
headers: this.getHeaders({
|
|
1638
1651
|
Authorization: `Bearer ${accessToken}`
|
|
1639
|
-
}
|
|
1652
|
+
})
|
|
1640
1653
|
});
|
|
1641
1654
|
if (!response.ok) {
|
|
1642
1655
|
if (response.status === 401) {
|
|
@@ -1657,10 +1670,10 @@ class OAuthHandler {
|
|
|
1657
1670
|
const url = new URL("/oauth/disconnect", this.serverUrl);
|
|
1658
1671
|
const response = await fetch(url.toString(), {
|
|
1659
1672
|
method: "POST",
|
|
1660
|
-
headers: {
|
|
1673
|
+
headers: this.getHeaders({
|
|
1661
1674
|
"Content-Type": "application/json",
|
|
1662
1675
|
Authorization: `Bearer ${accessToken}`
|
|
1663
|
-
},
|
|
1676
|
+
}),
|
|
1664
1677
|
body: JSON.stringify({
|
|
1665
1678
|
provider: request.provider
|
|
1666
1679
|
})
|
|
@@ -1991,7 +2004,8 @@ function createMCPServer(config) {
|
|
|
1991
2004
|
});
|
|
1992
2005
|
globalServerConfig = {
|
|
1993
2006
|
providers,
|
|
1994
|
-
serverUrl: config.serverUrl
|
|
2007
|
+
serverUrl: config.serverUrl,
|
|
2008
|
+
apiKey: config.apiKey
|
|
1995
2009
|
};
|
|
1996
2010
|
const clientConfig = {
|
|
1997
2011
|
...config,
|
|
@@ -2005,11 +2019,13 @@ function createMCPServer(config) {
|
|
|
2005
2019
|
}
|
|
2006
2020
|
client.__oauthConfig = {
|
|
2007
2021
|
providers,
|
|
2008
|
-
serverUrl: config.serverUrl
|
|
2022
|
+
serverUrl: config.serverUrl,
|
|
2023
|
+
apiKey: config.apiKey
|
|
2009
2024
|
};
|
|
2010
2025
|
const { POST, GET } = createOAuthRouteHandlers({
|
|
2011
2026
|
providers,
|
|
2012
|
-
serverUrl: config.serverUrl
|
|
2027
|
+
serverUrl: config.serverUrl,
|
|
2028
|
+
apiKey: config.apiKey
|
|
2013
2029
|
});
|
|
2014
2030
|
return {
|
|
2015
2031
|
client,
|
|
@@ -21,6 +21,11 @@ export interface OAuthHandlerConfig {
|
|
|
21
21
|
* @default 'https://mcp.integrate.dev/api/v1/mcp'
|
|
22
22
|
*/
|
|
23
23
|
serverUrl?: string;
|
|
24
|
+
/**
|
|
25
|
+
* API Key for authentication and usage tracking (SERVER-SIDE ONLY)
|
|
26
|
+
* Sent as X-API-KEY header with all OAuth requests to the MCP server
|
|
27
|
+
*/
|
|
28
|
+
apiKey?: string;
|
|
24
29
|
}
|
|
25
30
|
/**
|
|
26
31
|
* Request body for authorize endpoint
|
|
@@ -88,7 +93,12 @@ export interface DisconnectResponse {
|
|
|
88
93
|
export declare class OAuthHandler {
|
|
89
94
|
private config;
|
|
90
95
|
private readonly serverUrl;
|
|
96
|
+
private readonly apiKey?;
|
|
91
97
|
constructor(config: OAuthHandlerConfig);
|
|
98
|
+
/**
|
|
99
|
+
* Get headers with API key if configured
|
|
100
|
+
*/
|
|
101
|
+
private getHeaders;
|
|
92
102
|
/**
|
|
93
103
|
* Handle authorization URL request
|
|
94
104
|
* Gets authorization URL from MCP server with full OAuth credentials
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QACxB,iDAAiD;QACjD,QAAQ,EAAE,MAAM,CAAC;QACjB,qDAAqD;QACrD,YAAY,EAAE,MAAM,CAAC;QACrB,qCAAqC;QACrC,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QACxB,iDAAiD;QACjD,QAAQ,EAAE,MAAM,CAAC;QACjB,qDAAqD;QACrD,YAAY,EAAE,MAAM,CAAC;QACrB,qCAAqC;QACrC,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;gBAEb,MAAM,EAAE,kBAAkB;IAW9C;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;;;;;;;;OASG;IACG,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2C5E;;;;;;;;;OASG;IACG,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2CzE;;;;;;;;;OASG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA4BlF;;;;;;;;;;OAUG;IACG,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2BrG"}
|