@thoughtspot/mcp-auth 1.0.0
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/LICENSE +127 -0
- package/README.md +58 -0
- package/assets/oauth-callback.css +101 -0
- package/assets/oauth-callback.html +64 -0
- package/assets/oauth-callback.js +163 -0
- package/dist/bearer.d.ts +34 -0
- package/dist/bearer.d.ts.map +1 -0
- package/dist/bearer.js +91 -0
- package/dist/bearer.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/handlers.d.ts +24 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +242 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth-provider.d.ts +49 -0
- package/dist/oauth-provider.d.ts.map +1 -0
- package/dist/oauth-provider.js +55 -0
- package/dist/oauth-provider.js.map +1 -0
- package/dist/oauth-utils.d.ts +18 -0
- package/dist/oauth-utils.d.ts.map +1 -0
- package/dist/oauth-utils.js +287 -0
- package/dist/oauth-utils.js.map +1 -0
- package/dist/routes.d.ts +21 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +19 -0
- package/dist/routes.js.map +1 -0
- package/dist/token-utils.d.ts +3 -0
- package/dist/token-utils.d.ts.map +1 -0
- package/dist/token-utils.js +57 -0
- package/dist/token-utils.js.map +1 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bearer.js","sourceRoot":"","sources":["../src/bearer.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class McpServerError extends Error {
|
|
2
|
+
readonly errorJson: unknown;
|
|
3
|
+
readonly statusCode: number;
|
|
4
|
+
constructor(errorJson: unknown, statusCode: number);
|
|
5
|
+
toJSON(): {
|
|
6
|
+
name: string;
|
|
7
|
+
message: string;
|
|
8
|
+
statusCode: number;
|
|
9
|
+
errorJson: unknown;
|
|
10
|
+
stack: string | undefined;
|
|
11
|
+
};
|
|
12
|
+
getUserMessage(): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;IACxC,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;IAmBlD,MAAM;;;;;;;IAUN,cAAc,IAAI,MAAM;CAOxB"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class McpServerError extends Error {
|
|
2
|
+
errorJson;
|
|
3
|
+
statusCode;
|
|
4
|
+
constructor(errorJson, statusCode) {
|
|
5
|
+
const message = typeof errorJson === "string"
|
|
6
|
+
? errorJson
|
|
7
|
+
: errorJson?.message ||
|
|
8
|
+
errorJson?.error ||
|
|
9
|
+
"Unknown error occurred";
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "McpServerError";
|
|
12
|
+
this.errorJson = errorJson;
|
|
13
|
+
this.statusCode = statusCode;
|
|
14
|
+
console.error("Error:", this.message);
|
|
15
|
+
Object.setPrototypeOf(this, McpServerError.prototype);
|
|
16
|
+
}
|
|
17
|
+
toJSON() {
|
|
18
|
+
return {
|
|
19
|
+
name: this.name,
|
|
20
|
+
message: this.message,
|
|
21
|
+
statusCode: this.statusCode,
|
|
22
|
+
errorJson: this.errorJson,
|
|
23
|
+
stack: this.stack,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
getUserMessage() {
|
|
27
|
+
const obj = this.errorJson;
|
|
28
|
+
if (typeof obj === "object" && obj?.userMessage) {
|
|
29
|
+
return obj.userMessage;
|
|
30
|
+
}
|
|
31
|
+
return this.message;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxB,SAAS,CAAU;IACnB,UAAU,CAAS;IAEnC,YAAY,SAAkB,EAAE,UAAkB;QACjD,MAAM,OAAO,GACZ,OAAO,SAAS,KAAK,QAAQ;YAC5B,CAAC,CAAC,SAAS;YACX,CAAC,CAAE,SAAkD,EAAE,OAAO;gBAC5D,SAAkD,EAAE,KAAK;gBAC1D,wBAAwB,CAAC;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,MAAM;QACL,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SACjB,CAAC;IACH,CAAC;IAED,cAAc;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,SAAwD,CAAC;QAC1E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC;YACjD,OAAO,GAAG,CAAC,WAAW,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;CACD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { OAuthHelpers } from "@cloudflare/workers-oauth-provider";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import type { AssetsFetcher, AuthHooks, BaseProps, ServerInfo } from "./types";
|
|
4
|
+
export interface AuthAppEnv {
|
|
5
|
+
Bindings: {
|
|
6
|
+
OAUTH_PROVIDER: OAuthHelpers;
|
|
7
|
+
ASSETS?: AssetsFetcher;
|
|
8
|
+
} & Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface CreateAuthAppOptions {
|
|
11
|
+
serverInfo: ServerInfo;
|
|
12
|
+
hooks?: AuthHooks<BaseProps>;
|
|
13
|
+
/**
|
|
14
|
+
* Custom assets fetcher. If omitted, the auth app will use `c.env.ASSETS`.
|
|
15
|
+
*/
|
|
16
|
+
assetsFetcher?: AssetsFetcher;
|
|
17
|
+
/**
|
|
18
|
+
* Add extra routes to the Hono app after the auth routes are registered.
|
|
19
|
+
* Useful for consumer-specific endpoints (e.g. /hello, well-known files).
|
|
20
|
+
*/
|
|
21
|
+
extraRoutes?: (app: Hono<AuthAppEnv>) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function createAuthApp(options: CreateAuthAppOptions): Hono<AuthAppEnv>;
|
|
24
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAU5B,OAAO,KAAK,EACX,aAAa,EACb,SAAS,EAET,SAAS,EACT,UAAU,EACV,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE;QAAE,cAAc,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE,GAAG,MAAM,CAC1E,MAAM,EACN,OAAO,CACP,CAAC;CACF;AAED,MAAM,WAAW,oBAAoB;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CAC9C;AAyBD,wBAAgB,aAAa,CAC5B,OAAO,EAAE,oBAAoB,GAC3B,IAAI,CAAC,UAAU,CAAC,CA2UlB"}
|
package/dist/handlers.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { decodeBase64Url, encodeBase64Url } from "hono/utils/encode";
|
|
3
|
+
import { McpServerError } from "./errors";
|
|
4
|
+
import { buildSamlRedirectUrl, parseRedirectApproval, renderApprovalDialog, } from "./oauth-utils";
|
|
5
|
+
import { renderTokenCallback } from "./token-utils";
|
|
6
|
+
import { PUBLIC_ROUTES } from "./routes";
|
|
7
|
+
function recordAuthMetric(hooks, name, status, c) {
|
|
8
|
+
if (!hooks?.onAuthMetric)
|
|
9
|
+
return;
|
|
10
|
+
try {
|
|
11
|
+
hooks.onAuthMetric(name, status, c.executionCtx, c.req.raw);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
console.error("onAuthMetric hook failed:", err);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function wrap(hooks, name, fn) {
|
|
18
|
+
if (hooks?.wrapSpan)
|
|
19
|
+
return hooks.wrapSpan(name, fn);
|
|
20
|
+
return fn();
|
|
21
|
+
}
|
|
22
|
+
export function createAuthApp(options) {
|
|
23
|
+
const { serverInfo, hooks, assetsFetcher, extraRoutes } = options;
|
|
24
|
+
const app = new Hono();
|
|
25
|
+
const handler = {
|
|
26
|
+
async getAuthorize(request, oauthProvider) {
|
|
27
|
+
const oauthReqInfo = await oauthProvider.parseAuthRequest(request);
|
|
28
|
+
const { clientId } = oauthReqInfo;
|
|
29
|
+
if (!clientId) {
|
|
30
|
+
throw new McpServerError({ message: "Missing client ID" }, 400);
|
|
31
|
+
}
|
|
32
|
+
if (!oauthReqInfo.codeChallenge) {
|
|
33
|
+
throw new McpServerError({ message: "PKCE is required: missing code challenge" }, 400);
|
|
34
|
+
}
|
|
35
|
+
if (oauthReqInfo.codeChallengeMethod !== "S256") {
|
|
36
|
+
throw new McpServerError({ message: "PKCE code challenge method must be S256" }, 400);
|
|
37
|
+
}
|
|
38
|
+
const client = await oauthProvider.lookupClient(clientId);
|
|
39
|
+
return renderApprovalDialog(request, {
|
|
40
|
+
client,
|
|
41
|
+
serverInfo,
|
|
42
|
+
state: { oauthReqInfo },
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
async postAuthorize(request, requestUrl) {
|
|
46
|
+
try {
|
|
47
|
+
const { state, instanceUrl } = await parseRedirectApproval(request);
|
|
48
|
+
if (!state.oauthReqInfo) {
|
|
49
|
+
throw new McpServerError({ message: "Missing OAuth request info" }, 400);
|
|
50
|
+
}
|
|
51
|
+
if (!instanceUrl) {
|
|
52
|
+
throw new McpServerError({ message: "Missing instance URL" }, 400);
|
|
53
|
+
}
|
|
54
|
+
const origin = new URL(requestUrl).origin;
|
|
55
|
+
// Free-trial shortcut: skip SAML, assume logged in.
|
|
56
|
+
if (instanceUrl.match(/^https:\/\/(?:team|my)\d+\.thoughtspot\.cloud\/?$/)) {
|
|
57
|
+
const callbackUrl = new URL("/callback", origin);
|
|
58
|
+
callbackUrl.searchParams.set("instanceUrl", instanceUrl);
|
|
59
|
+
callbackUrl.searchParams.set("oauthReqInfo", encodeBase64Url(new TextEncoder().encode(JSON.stringify(state.oauthReqInfo))
|
|
60
|
+
.buffer));
|
|
61
|
+
return callbackUrl.toString();
|
|
62
|
+
}
|
|
63
|
+
return buildSamlRedirectUrl(instanceUrl, state.oauthReqInfo, origin);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof McpServerError)
|
|
67
|
+
throw error;
|
|
68
|
+
throw new McpServerError(error, 500);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
async handleCallback(request, assets, requestUrl) {
|
|
72
|
+
const url = new URL(request.url);
|
|
73
|
+
const instanceUrl = url.searchParams.get("instanceUrl");
|
|
74
|
+
const encodedOauthReqInfo = url.searchParams
|
|
75
|
+
.get("oauthReqInfo")
|
|
76
|
+
// Workaround for https://thoughtspot.atlassian.net/browse/SCAL-258056
|
|
77
|
+
?.replace("/10023.html", "");
|
|
78
|
+
if (!instanceUrl) {
|
|
79
|
+
throw new McpServerError({ message: "Missing instance URL" }, 400);
|
|
80
|
+
}
|
|
81
|
+
if (!encodedOauthReqInfo) {
|
|
82
|
+
throw new McpServerError({ message: "Missing OAuth request info" }, 400);
|
|
83
|
+
}
|
|
84
|
+
let decodedOAuthReqInfo;
|
|
85
|
+
try {
|
|
86
|
+
decodedOAuthReqInfo = JSON.parse(new TextDecoder().decode(decodeBase64Url(encodedOauthReqInfo)));
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
throw new McpServerError({ message: "Invalid OAuth request info format", details: error }, 400);
|
|
90
|
+
}
|
|
91
|
+
const origin = new URL(requestUrl).origin;
|
|
92
|
+
try {
|
|
93
|
+
return await renderTokenCallback(instanceUrl, decodedOAuthReqInfo, assets, origin);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new McpServerError({ message: "Error rendering token callback", details: error }, 500);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
async storeToken(request, oauthProvider) {
|
|
100
|
+
// biome-ignore lint/suspicious/noExplicitAny: payload shape is consumer-defined
|
|
101
|
+
let token;
|
|
102
|
+
// biome-ignore lint/suspicious/noExplicitAny: AuthRequest from oauth provider
|
|
103
|
+
let oauthReqInfo;
|
|
104
|
+
let instanceUrl;
|
|
105
|
+
try {
|
|
106
|
+
// biome-ignore lint/suspicious/noExplicitAny: free-form body
|
|
107
|
+
const body = (await request.json());
|
|
108
|
+
token = body.token;
|
|
109
|
+
oauthReqInfo = body.oauthReqInfo;
|
|
110
|
+
instanceUrl = body.instanceUrl;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new McpServerError({ message: "Invalid JSON format", details: error }, 400);
|
|
114
|
+
}
|
|
115
|
+
if (!token || !oauthReqInfo || !instanceUrl) {
|
|
116
|
+
throw new McpServerError({ message: "Missing token or OAuth request info or instanceUrl" }, 400);
|
|
117
|
+
}
|
|
118
|
+
const { clientId } = oauthReqInfo;
|
|
119
|
+
if (!clientId) {
|
|
120
|
+
throw new McpServerError({ message: "Missing clientId" }, 400);
|
|
121
|
+
}
|
|
122
|
+
const clientName = await oauthProvider.lookupClient(clientId);
|
|
123
|
+
const props = {
|
|
124
|
+
accessToken: token.data.token,
|
|
125
|
+
instanceUrl: instanceUrl,
|
|
126
|
+
clientName: clientName,
|
|
127
|
+
};
|
|
128
|
+
const { redirectTo } = await oauthProvider.completeAuthorization({
|
|
129
|
+
request: oauthReqInfo,
|
|
130
|
+
userId: "default",
|
|
131
|
+
metadata: { label: "default" },
|
|
132
|
+
scope: oauthReqInfo.scope,
|
|
133
|
+
props,
|
|
134
|
+
});
|
|
135
|
+
return { redirectTo };
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
app.get(PUBLIC_ROUTES.authorize, async (c) => {
|
|
139
|
+
try {
|
|
140
|
+
const response = await wrap(hooks, "authorize-get", () => handler.getAuthorize(c.req.raw, c.env.OAUTH_PROVIDER));
|
|
141
|
+
recordAuthMetric(hooks, "oauth_authorize_requests_total", response.status, c);
|
|
142
|
+
return response;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
const response = c.text(`Internal Server Error ${error}`, 500);
|
|
146
|
+
recordAuthMetric(hooks, "oauth_authorize_requests_total", response.status, c);
|
|
147
|
+
return response;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
app.post(PUBLIC_ROUTES.authorize, async (c) => {
|
|
151
|
+
try {
|
|
152
|
+
const redirectUrl = await wrap(hooks, "authorize-post", () => handler.postAuthorize(c.req.raw, c.req.url));
|
|
153
|
+
const response = Response.redirect(redirectUrl);
|
|
154
|
+
recordAuthMetric(hooks, "oauth_authorize_submit_total", response.status, c);
|
|
155
|
+
return response;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof Error &&
|
|
159
|
+
error.message.includes("Missing instance URL")) {
|
|
160
|
+
const response = new Response("Missing instance URL", { status: 400 });
|
|
161
|
+
recordAuthMetric(hooks, "oauth_authorize_submit_total", response.status, c);
|
|
162
|
+
return response;
|
|
163
|
+
}
|
|
164
|
+
const response = new Response(`Internal Server Error ${error}`, {
|
|
165
|
+
status: 500,
|
|
166
|
+
});
|
|
167
|
+
recordAuthMetric(hooks, "oauth_authorize_submit_total", response.status, c);
|
|
168
|
+
return response;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
app.get(PUBLIC_ROUTES.callback, async (c) => {
|
|
172
|
+
const assets = assetsFetcher ?? c.env.ASSETS;
|
|
173
|
+
if (!assets) {
|
|
174
|
+
const response = c.text("ASSETS binding required for OAuth callback rendering", 500);
|
|
175
|
+
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
176
|
+
return response;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const htmlContent = await wrap(hooks, "oauth-callback", () => handler.handleCallback(c.req.raw, assets, c.req.url));
|
|
180
|
+
const response = new Response(htmlContent, {
|
|
181
|
+
headers: { "Content-Type": "text/html" },
|
|
182
|
+
});
|
|
183
|
+
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
184
|
+
return response;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (error instanceof Error) {
|
|
188
|
+
if (error.message.includes("Missing instance URL")) {
|
|
189
|
+
const response = c.text(`Missing instance URL ${error}`, 400);
|
|
190
|
+
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
191
|
+
return response;
|
|
192
|
+
}
|
|
193
|
+
if (error.message.includes("Missing OAuth request info")) {
|
|
194
|
+
const response = c.text(`Missing OAuth request info ${error}`, 400);
|
|
195
|
+
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
196
|
+
return response;
|
|
197
|
+
}
|
|
198
|
+
if (error.message.includes("Invalid OAuth request info format")) {
|
|
199
|
+
const response = c.text(`Invalid OAuth request info format ${error}`, 400);
|
|
200
|
+
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
201
|
+
return response;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const response = c.text(`Internal server error ${error}`, 500);
|
|
205
|
+
recordAuthMetric(hooks, "oauth_callback_total", response.status, c);
|
|
206
|
+
return response;
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
app.post(PUBLIC_ROUTES.storeToken, async (c) => {
|
|
210
|
+
try {
|
|
211
|
+
const result = await wrap(hooks, "store-token", () => handler.storeToken(c.req.raw, c.env.OAUTH_PROVIDER));
|
|
212
|
+
const response = new Response(JSON.stringify(result), {
|
|
213
|
+
status: 200,
|
|
214
|
+
headers: { "Content-Type": "application/json" },
|
|
215
|
+
});
|
|
216
|
+
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
217
|
+
return response;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
if (error instanceof Error) {
|
|
221
|
+
if (error.message.includes("Invalid JSON format")) {
|
|
222
|
+
const response = c.text(`Invalid JSON format ${error}`, 400);
|
|
223
|
+
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
224
|
+
return response;
|
|
225
|
+
}
|
|
226
|
+
if (error.message.includes("Missing token or OAuth request info or instanceUrl")) {
|
|
227
|
+
const response = c.text(`Missing token or OAuth request info or instanceUrl ${error}`, 400);
|
|
228
|
+
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
229
|
+
return response;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const response = c.text(`Internal server error ${error}`, 500);
|
|
233
|
+
recordAuthMetric(hooks, "oauth_store_token_total", response.status, c);
|
|
234
|
+
return response;
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
if (extraRoutes) {
|
|
238
|
+
extraRoutes(app);
|
|
239
|
+
}
|
|
240
|
+
return app;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { PUBLIC_ROUTES, PUBLIC_ROUTE_PREFIXES, type PublicRoutes, type PublicRoutePrefixes, } from "./routes";
|
|
2
|
+
export { McpServerError } from "./errors";
|
|
3
|
+
export type { BaseProps, ServerInfo, AuthHooks, AuthMetricName, BearerAuthRouteGroup, AssetsFetcher, } from "./types";
|
|
4
|
+
export { renderApprovalDialog, parseRedirectApproval, buildSamlRedirectUrl, validateAndSanitizeUrl, type ApprovalDialogOptions, type ParsedApprovalResult, } from "./oauth-utils";
|
|
5
|
+
export { renderTokenCallback } from "./token-utils";
|
|
6
|
+
export { createAuthApp, type CreateAuthAppOptions, type AuthAppEnv, } from "./handlers";
|
|
7
|
+
export { withBearerHandler, type WithBearerHandlerOptions, type BearerMCPServer, } from "./bearer";
|
|
8
|
+
export { createOAuthHandler, type CreateOAuthHandlerOptions, type MCPServerForOAuth, } from "./oauth-provider";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EACX,SAAS,EACT,UAAU,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,UAAU,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,GACtB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { PUBLIC_ROUTES, PUBLIC_ROUTE_PREFIXES, } from "./routes";
|
|
2
|
+
export { McpServerError } from "./errors";
|
|
3
|
+
export { renderApprovalDialog, parseRedirectApproval, buildSamlRedirectUrl, validateAndSanitizeUrl, } from "./oauth-utils";
|
|
4
|
+
export { renderTokenCallback } from "./token-utils";
|
|
5
|
+
export { createAuthApp, } from "./handlers";
|
|
6
|
+
export { withBearerHandler, } from "./bearer";
|
|
7
|
+
export { createOAuthHandler, } from "./oauth-provider";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,qBAAqB,GAGrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C,OAAO,EACN,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GAGtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACN,aAAa,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,iBAAiB,GAGjB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,GAGlB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createAuthApp } from "./handlers";
|
|
2
|
+
import type { AssetsFetcher, AuthHooks, BaseProps, ServerInfo } from "./types";
|
|
3
|
+
export interface MCPServerForOAuth {
|
|
4
|
+
serve(path: string, options?: unknown): {
|
|
5
|
+
fetch: (req: any, env: any, ctx: any) => Promise<Response>;
|
|
6
|
+
};
|
|
7
|
+
serveSSE(path: string, options?: unknown): {
|
|
8
|
+
fetch: (req: any, env: any, ctx: any) => Promise<Response>;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface CreateOAuthHandlerOptions<P extends BaseProps = BaseProps> {
|
|
12
|
+
serverInfo: ServerInfo;
|
|
13
|
+
mcpServerClass: MCPServerForOAuth;
|
|
14
|
+
/**
|
|
15
|
+
* Override the MCP/SSE paths handled by the OAuth provider.
|
|
16
|
+
* Default: { mcp: "/mcp", sse: "/sse" }.
|
|
17
|
+
* spotter-code mixed-mode usage: { mcp: "/auth/mcp", sse: "/auth/sse" }.
|
|
18
|
+
*/
|
|
19
|
+
routes?: {
|
|
20
|
+
mcp?: string;
|
|
21
|
+
sse?: string;
|
|
22
|
+
authorize?: string;
|
|
23
|
+
oauthToken?: string;
|
|
24
|
+
register?: string;
|
|
25
|
+
};
|
|
26
|
+
hooks?: AuthHooks<P>;
|
|
27
|
+
assetsFetcher?: AssetsFetcher;
|
|
28
|
+
/**
|
|
29
|
+
* Hook to wrap the inner MCP fetch (e.g. apply per-request prop injection
|
|
30
|
+
* outside the bearer flow). Receives the request + injects props.
|
|
31
|
+
*/
|
|
32
|
+
enrichMcpRequestProps?: (req: Request, ctx: ExecutionContext, baseProps: BaseProps) => P;
|
|
33
|
+
/**
|
|
34
|
+
* Mount extra Hono routes onto the default handler (e.g. `/hello`, well-known files).
|
|
35
|
+
* Runs after auth routes are registered.
|
|
36
|
+
*/
|
|
37
|
+
extraRoutes?: Parameters<typeof createAuthApp>[0]["extraRoutes"];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Builds a Cloudflare Worker fetch handler that wraps an MCP DO with
|
|
41
|
+
* OAuth 2.0 + bearer/token authentication.
|
|
42
|
+
*
|
|
43
|
+
* Returns the OAuthProvider's `fetch` directly (consumers wrap with their own
|
|
44
|
+
* tracing/metrics/middleware).
|
|
45
|
+
*/
|
|
46
|
+
export declare function createOAuthHandler<P extends BaseProps = BaseProps>(options: CreateOAuthHandlerOptions<P>): {
|
|
47
|
+
fetch: ExportedHandlerFetchHandler;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=oauth-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../src/oauth-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,aAAa,EAAE,MAAM,YAAY,CAAC;AAG5D,OAAO,KAAK,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,iBAAiB;IAEjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC;IAEvG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC;CAC1G;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACzE,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,iBAAiB,CAAC;IAClC;;;;OAIG;IACH,MAAM,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CACvB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,gBAAgB,EACrB,SAAS,EAAE,SAAS,KAChB,CAAC,CAAC;IACP;;;OAGG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;CACjE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACjE,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACnC;IAAE,KAAK,EAAE,2BAA2B,CAAA;CAAE,CAyDxC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import OAuthProvider from "@cloudflare/workers-oauth-provider";
|
|
2
|
+
import { createAuthApp } from "./handlers";
|
|
3
|
+
import { withBearerHandler } from "./bearer";
|
|
4
|
+
import { PUBLIC_ROUTES } from "./routes";
|
|
5
|
+
/**
|
|
6
|
+
* Builds a Cloudflare Worker fetch handler that wraps an MCP DO with
|
|
7
|
+
* OAuth 2.0 + bearer/token authentication.
|
|
8
|
+
*
|
|
9
|
+
* Returns the OAuthProvider's `fetch` directly (consumers wrap with their own
|
|
10
|
+
* tracing/metrics/middleware).
|
|
11
|
+
*/
|
|
12
|
+
export function createOAuthHandler(options) {
|
|
13
|
+
const mcpPath = options.routes?.mcp ?? PUBLIC_ROUTES.mcp;
|
|
14
|
+
const ssePath = options.routes?.sse ?? PUBLIC_ROUTES.sse;
|
|
15
|
+
const authorizeEndpoint = options.routes?.authorize ?? PUBLIC_ROUTES.authorize;
|
|
16
|
+
const tokenEndpoint = options.routes?.oauthToken ?? PUBLIC_ROUTES.oauthToken;
|
|
17
|
+
const registerEndpoint = options.routes?.register ?? PUBLIC_ROUTES.register;
|
|
18
|
+
const honoApp = createAuthApp({
|
|
19
|
+
serverInfo: options.serverInfo,
|
|
20
|
+
hooks: options.hooks,
|
|
21
|
+
assetsFetcher: options.assetsFetcher,
|
|
22
|
+
extraRoutes: options.extraRoutes,
|
|
23
|
+
});
|
|
24
|
+
withBearerHandler(honoApp, options.mcpServerClass, {
|
|
25
|
+
hooks: options.hooks,
|
|
26
|
+
});
|
|
27
|
+
// Builds the per-route MCP serve router with optional props enrichment.
|
|
28
|
+
function buildMcpRouter(path, method) {
|
|
29
|
+
return {
|
|
30
|
+
async fetch(request, env, ctx) {
|
|
31
|
+
if (options.enrichMcpRequestProps) {
|
|
32
|
+
const originalProps = ctx.props ?? {};
|
|
33
|
+
ctx.props =
|
|
34
|
+
options.enrichMcpRequestProps(request, ctx, originalProps);
|
|
35
|
+
}
|
|
36
|
+
return options.mcpServerClass[method](path).fetch(request, env, ctx);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const oauthProvider = new OAuthProvider({
|
|
41
|
+
apiHandlers: {
|
|
42
|
+
[mcpPath]: buildMcpRouter(mcpPath, "serve"),
|
|
43
|
+
[ssePath]: buildMcpRouter(ssePath, "serveSSE"),
|
|
44
|
+
},
|
|
45
|
+
// biome-ignore lint/suspicious/noExplicitAny: OAuthProvider types are loose
|
|
46
|
+
defaultHandler: honoApp,
|
|
47
|
+
authorizeEndpoint,
|
|
48
|
+
tokenEndpoint,
|
|
49
|
+
clientRegistrationEndpoint: registerEndpoint,
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
fetch: ((request, env, ctx) => oauthProvider.fetch(request, env, ctx)),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=oauth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../src/oauth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAmB,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgDzC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CACjC,OAAqC;IAErC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC;IACzD,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,aAAa,CAAC,SAAS,CAAC;IAC/E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,IAAI,aAAa,CAAC,UAAU,CAAC;IAC7E,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC;IAE5E,MAAM,OAAO,GAAG,aAAa,CAAC;QAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAyC;QACxD,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,iBAAiB,CAAgB,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE;QACjE,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC,CAAC;IAEH,wEAAwE;IACxE,SAAS,cAAc,CAAC,IAAY,EAAE,MAA4B;QACjE,OAAO;YACN,KAAK,CAAC,KAAK,CACV,OAAgB,EAChB,GAAY,EACZ,GAAqB;gBAErB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;oBACnC,MAAM,aAAa,GACjB,GAAwC,CAAC,KAAK,IAAK,EAAgB,CAAC;oBACrE,GAA+B,CAAC,KAAK;wBACrC,OAAO,CAAC,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;gBAC7D,CAAC;gBACD,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC;SACD,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;QACvC,WAAW,EAAE;YACZ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAU;YACpD,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,EAAE,UAAU,CAAU;SACvD;QACD,4EAA4E;QAC5E,cAAc,EAAE,OAAc;QAC9B,iBAAiB;QACjB,aAAa;QACb,0BAA0B,EAAE,gBAAgB;KAC5C,CAAC,CAAC;IAEH,OAAO;QACN,KAAK,EAAE,CAAC,CAAC,OAAgB,EAAE,GAAY,EAAE,GAAqB,EAAE,EAAE,CACjE,aAAa,CAAC,KAAK,CAClB,OAAO,EACP,GAAY,EACZ,GAAG,CACH,CAA2C;KAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AuthRequest, ClientInfo } from "@cloudflare/workers-oauth-provider";
|
|
2
|
+
import type { ServerInfo } from "./types";
|
|
3
|
+
export interface ApprovalDialogOptions {
|
|
4
|
+
client: ClientInfo | null;
|
|
5
|
+
serverInfo: ServerInfo;
|
|
6
|
+
state: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export declare function renderApprovalDialog(request: Request, options: ApprovalDialogOptions): Response;
|
|
9
|
+
export interface ParsedApprovalResult {
|
|
10
|
+
state: {
|
|
11
|
+
oauthReqInfo?: AuthRequest;
|
|
12
|
+
} & Record<string, unknown>;
|
|
13
|
+
instanceUrl: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function validateAndSanitizeUrl(url: string): string;
|
|
16
|
+
export declare function parseRedirectApproval(request: Request): Promise<ParsedApprovalResult>;
|
|
17
|
+
export declare function buildSamlRedirectUrl(instanceUrl: string, oauthReqInfo: unknown, callbackOrigin: string): string;
|
|
18
|
+
//# sourceMappingURL=oauth-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-utils.d.ts","sourceRoot":"","sources":["../src/oauth-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAW1C,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,qBAAqB,GAC5B,QAAQ,CA+MV;AAYD,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE;QAAE,YAAY,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAuB1D;AAED,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,oBAAoB,CAAC,CAqC/B;AAWD,wBAAgB,oBAAoB,CACnC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EACrB,cAAc,EAAE,MAAM,GACpB,MAAM,CAUR"}
|