@forumone/throughline 2.2.0 → 2.3.0-pr-315-e1a501e

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/audit/types.d.ts +1 -1
  3. package/dist/audit/types.d.ts.map +1 -1
  4. package/dist/audit/types.js +2 -0
  5. package/dist/audit/types.js.map +1 -1
  6. package/dist/editorial/palette/ReportsNav.d.ts +3 -1
  7. package/dist/editorial/palette/ReportsNav.d.ts.map +1 -1
  8. package/dist/editorial/palette/ReportsNav.js +3 -3
  9. package/dist/editorial/palette/ReportsNav.js.map +1 -1
  10. package/dist/exports/rsc.d.ts +1 -0
  11. package/dist/exports/rsc.d.ts.map +1 -1
  12. package/dist/exports/rsc.js +2 -0
  13. package/dist/exports/rsc.js.map +1 -1
  14. package/dist/mcp-oauth/admin/McpClientActions.d.ts +15 -0
  15. package/dist/mcp-oauth/admin/McpClientActions.d.ts.map +1 -0
  16. package/dist/mcp-oauth/admin/McpClientActions.js +79 -0
  17. package/dist/mcp-oauth/admin/McpClientActions.js.map +1 -0
  18. package/dist/mcp-oauth/admin/styles.d.ts +2 -0
  19. package/dist/mcp-oauth/admin/styles.d.ts.map +1 -0
  20. package/dist/mcp-oauth/admin/styles.js +27 -0
  21. package/dist/mcp-oauth/admin/styles.js.map +1 -0
  22. package/dist/mcp-oauth/admin/views.d.ts +4 -0
  23. package/dist/mcp-oauth/admin/views.d.ts.map +1 -0
  24. package/dist/mcp-oauth/admin/views.js +99 -0
  25. package/dist/mcp-oauth/admin/views.js.map +1 -0
  26. package/dist/mcp-oauth/auth.d.ts +12 -0
  27. package/dist/mcp-oauth/auth.d.ts.map +1 -0
  28. package/dist/mcp-oauth/auth.js +56 -0
  29. package/dist/mcp-oauth/auth.js.map +1 -0
  30. package/dist/mcp-oauth/cimd.d.ts +13 -0
  31. package/dist/mcp-oauth/cimd.d.ts.map +1 -0
  32. package/dist/mcp-oauth/cimd.js +93 -0
  33. package/dist/mcp-oauth/cimd.js.map +1 -0
  34. package/dist/mcp-oauth/clients.d.ts +42 -0
  35. package/dist/mcp-oauth/clients.d.ts.map +1 -0
  36. package/dist/mcp-oauth/clients.js +151 -0
  37. package/dist/mcp-oauth/clients.js.map +1 -0
  38. package/dist/mcp-oauth/collections.d.ts +10 -0
  39. package/dist/mcp-oauth/collections.d.ts.map +1 -0
  40. package/dist/mcp-oauth/collections.js +236 -0
  41. package/dist/mcp-oauth/collections.js.map +1 -0
  42. package/dist/mcp-oauth/crypto.d.ts +29 -0
  43. package/dist/mcp-oauth/crypto.d.ts.map +1 -0
  44. package/dist/mcp-oauth/crypto.js +91 -0
  45. package/dist/mcp-oauth/crypto.js.map +1 -0
  46. package/dist/mcp-oauth/endpoints.d.ts +11 -0
  47. package/dist/mcp-oauth/endpoints.d.ts.map +1 -0
  48. package/dist/mcp-oauth/endpoints.js +365 -0
  49. package/dist/mcp-oauth/endpoints.js.map +1 -0
  50. package/dist/mcp-oauth/index.d.ts +10 -0
  51. package/dist/mcp-oauth/index.d.ts.map +1 -0
  52. package/dist/mcp-oauth/index.js +6 -0
  53. package/dist/mcp-oauth/index.js.map +1 -0
  54. package/dist/mcp-oauth/metadata.d.ts +45 -0
  55. package/dist/mcp-oauth/metadata.d.ts.map +1 -0
  56. package/dist/mcp-oauth/metadata.js +84 -0
  57. package/dist/mcp-oauth/metadata.js.map +1 -0
  58. package/dist/mcp-oauth/plugin.d.ts +37 -0
  59. package/dist/mcp-oauth/plugin.d.ts.map +1 -0
  60. package/dist/mcp-oauth/plugin.js +90 -0
  61. package/dist/mcp-oauth/plugin.js.map +1 -0
  62. package/dist/mcp-oauth/runtime.d.ts +124 -0
  63. package/dist/mcp-oauth/runtime.d.ts.map +1 -0
  64. package/dist/mcp-oauth/runtime.js +111 -0
  65. package/dist/mcp-oauth/runtime.js.map +1 -0
  66. package/dist/mcp-oauth/store.d.ts +75 -0
  67. package/dist/mcp-oauth/store.d.ts.map +1 -0
  68. package/dist/mcp-oauth/store.js +408 -0
  69. package/dist/mcp-oauth/store.js.map +1 -0
  70. package/dist/migrate/exports.json +29 -0
  71. package/package.json +7 -3
@@ -0,0 +1,91 @@
1
+ import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ /*
3
+ Every secret this module hands out, and how each is kept.
4
+
5
+ **Tokens are opaque and stored hashed.** An access token is a random string,
6
+ not a JWT: it is looked up on every MCP request anyway, to re-read the person's
7
+ role, so a signature would buy nothing and would make revocation wait for
8
+ expiry. The database holds an HMAC of each token, keyed from the Payload
9
+ secret, so a leaked table is no use without the secret — the same arrangement
10
+ Payload uses for API keys (`apiKeyIndex`).
11
+
12
+ **The authorization request travels sealed.** Between `/authorize` and the
13
+ consent screen the request is carried in the URL, HMAC-signed and dated, rather
14
+ than stored: nothing is written until somebody actually clicks Allow, so an
15
+ unauthenticated GET cannot fill a table.
16
+
17
+ Each use derives its own key from the Payload secret, so a value minted for one
18
+ purpose cannot be replayed as another.
19
+ */
20
+ export const TOKEN_PREFIX = {
21
+ access: 'tlo_at_',
22
+ refresh: 'tlo_rt_',
23
+ code: 'tlo_ac_',
24
+ client: 'tlo_client_',
25
+ };
26
+ function base64url(bytes) {
27
+ return bytes.toString('base64url');
28
+ }
29
+ /** A fresh random token with a recognisable prefix. */
30
+ export function newToken(prefix) {
31
+ return `${prefix}${base64url(randomBytes(32))}`;
32
+ }
33
+ /** A client id: shorter, because it is not a secret. */
34
+ export function newClientId() {
35
+ return `${TOKEN_PREFIX.client}${base64url(randomBytes(16))}`;
36
+ }
37
+ /** A key for one purpose, from the Payload secret. */
38
+ export function deriveKey(secret, purpose) {
39
+ return createHmac('sha256', secret).update(`throughline:mcp-oauth:${purpose}`).digest();
40
+ }
41
+ /** What the database stores in place of a token. */
42
+ export function hashToken(key, token) {
43
+ return createHmac('sha256', key).update(token).digest('hex');
44
+ }
45
+ /**
46
+ * PKCE S256 (RFC 7636 §4.6). The verifier is 43–128 unreserved characters;
47
+ * anything else fails before it is hashed.
48
+ */
49
+ export function verifyPkce(verifier, challenge) {
50
+ if (typeof verifier !== 'string' || !/^[A-Za-z0-9._~-]{43,128}$/.test(verifier))
51
+ return false;
52
+ const computed = base64url(createHash('sha256').update(verifier).digest());
53
+ const a = Buffer.from(computed);
54
+ const b = Buffer.from(challenge);
55
+ return a.length === b.length && timingSafeEqual(a, b);
56
+ }
57
+ /** A code challenge as RFC 7636 §4.2 shapes it: 43 base64url characters. */
58
+ export function isCodeChallenge(value) {
59
+ return typeof value === 'string' && /^[A-Za-z0-9_-]{43}$/.test(value);
60
+ }
61
+ /** Signs `value` with an expiry, for carrying through a URL. */
62
+ export function seal(key, value, ttlSeconds, now = Date.now()) {
63
+ const body = base64url(Buffer.from(JSON.stringify({ ...value, exp: Math.floor(now / 1000) + ttlSeconds })));
64
+ const mac = base64url(createHmac('sha256', key).update(body).digest());
65
+ return `${body}.${mac}`;
66
+ }
67
+ /**
68
+ * The sealed value, if this server signed it and it has not expired. The MAC is
69
+ * checked before anything is parsed.
70
+ */
71
+ export function unseal(key, sealed, now = Date.now()) {
72
+ if (typeof sealed !== 'string')
73
+ return undefined;
74
+ const [body, mac, ...rest] = sealed.split('.');
75
+ if (!body || !mac || rest.length > 0)
76
+ return undefined;
77
+ const expected = Buffer.from(base64url(createHmac('sha256', key).update(body).digest()));
78
+ const given = Buffer.from(mac);
79
+ if (expected.length !== given.length || !timingSafeEqual(expected, given))
80
+ return undefined;
81
+ try {
82
+ const value = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
83
+ if (typeof value.exp !== 'number' || value.exp * 1000 < now)
84
+ return undefined;
85
+ return value;
86
+ }
87
+ catch {
88
+ return undefined;
89
+ }
90
+ }
91
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/mcp-oauth/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Endpoint } from 'payload';
2
+ import type { FetchLike } from './cimd.js';
3
+ import { type McpOAuthRuntime } from './runtime.js';
4
+ /** `redirectUri` with the response parameters added, `iss` always among them. */
5
+ export declare function withParams(redirectUri: string, params: Record<string, string | undefined>): string;
6
+ export interface EndpointOptions {
7
+ /** For tests: how a client metadata document is fetched. */
8
+ fetch?: FetchLike;
9
+ }
10
+ export declare function oauthEndpoints(runtime: McpOAuthRuntime, options?: EndpointOptions): Endpoint[];
11
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/mcp-oauth/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAK1C,OAAO,EAA2C,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AA2E5F,iFAAiF;AACjF,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACzC,MAAM,CAMR;AAoDD,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,eAAoB,GAC5B,QAAQ,EAAE,CAoTZ"}
@@ -0,0 +1,365 @@
1
+ import { clientKindFor, redirectRegistered } from './clients.js';
2
+ import { signedInPerson } from './collections.js';
3
+ import { isCodeChallenge, seal, unseal } from './crypto.js';
4
+ import { authorizationServerMetadata, protectedResourceMetadata } from './metadata.js';
5
+ import { keys, MCP_OAUTH_GRANTS_SLUG, readPolicy } from './runtime.js';
6
+ import { createPendingGrant, exchangeCode, refresh, registerClient, resolveClient, revokeGrant, revokeToken, } from './store.js';
7
+ /*
8
+ The authorization server, as Payload endpoints under `/api/oauth`.
9
+
10
+ | Endpoint | Who calls it |
11
+ | --- | --- |
12
+ | `GET metadata`, `GET protected-resource` | the app, discovering (rewritten from `/.well-known`) |
13
+ | `POST register` | the app, registering itself (RFC 7591) |
14
+ | `GET authorize` | the person's browser, sent by the app |
15
+ | `POST consent` | the consent screen, signed in |
16
+ | `POST token` | the app: a code or a refresh token for tokens |
17
+ | `POST revoke` | the app, disconnecting (RFC 7009) |
18
+ | `POST grants/:id/revoke` | the Connect MCP page, signed in |
19
+
20
+ The app-facing ones answer any origin, because a browser-based MCP client calls
21
+ them cross-origin and none of them takes a cookie. The two a signed-in person
22
+ calls refuse a cross-origin request outright: they act on the session cookie, so
23
+ an `Origin` that is not this site is a forgery.
24
+ */
25
+ const APP_CORS = {
26
+ 'access-control-allow-origin': '*',
27
+ 'access-control-allow-methods': 'GET, POST, OPTIONS',
28
+ 'access-control-allow-headers': 'authorization, content-type, mcp-protocol-version',
29
+ 'access-control-max-age': '86400',
30
+ };
31
+ function json(body, status = 200, headers = {}) {
32
+ return new Response(JSON.stringify(body), {
33
+ status,
34
+ headers: { 'content-type': 'application/json', ...headers },
35
+ });
36
+ }
37
+ function appJson(body, status = 200) {
38
+ return json(body, status, { ...APP_CORS, 'cache-control': 'no-store', pragma: 'no-cache' });
39
+ }
40
+ function escapeHtml(value) {
41
+ return value.replace(/[&<>"']/g, (char) => `&#${char.charCodeAt(0)};`);
42
+ }
43
+ /*
44
+ An error the browser shows rather than one sent back to the app. RFC 6749
45
+ §4.1.2.1: when the client or its redirect cannot be trusted, the server must not
46
+ redirect — that would make it an open redirector for anybody who can write a
47
+ URL. So these are a page, with a way back to the instructions.
48
+ */
49
+ function errorPage(runtime, adminRoute, title, message) {
50
+ const html = `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escapeHtml(title)}</title>
51
+ <style>body{font:16px/1.5 system-ui,sans-serif;max-width:36rem;margin:10vh auto;padding:0 1rem;color:#1a1a1a}h1{font-size:1.4rem}a{color:inherit}</style></head>
52
+ <body><h1>${escapeHtml(title)}</h1><p>${escapeHtml(message)}</p>
53
+ <p><a href="${escapeHtml(`${adminRoute}${runtime.connectPath}`)}">How to connect an app to ${escapeHtml(runtime.serverName)}</a></p></body></html>`;
54
+ return new Response(html, {
55
+ status: 400,
56
+ headers: { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store' },
57
+ });
58
+ }
59
+ /** `redirectUri` with the response parameters added, `iss` always among them. */
60
+ export function withParams(redirectUri, params) {
61
+ const url = new URL(redirectUri);
62
+ for (const [name, value] of Object.entries(params)) {
63
+ if (value !== undefined)
64
+ url.searchParams.set(name, value);
65
+ }
66
+ return url.toString();
67
+ }
68
+ function sameResource(given, ours) {
69
+ return given.replace(/\/+$/, '') === ours.replace(/\/+$/, '');
70
+ }
71
+ async function readParams(req) {
72
+ const type = req.headers.get('content-type') ?? '';
73
+ const text = typeof req.text === 'function' ? await req.text() : '';
74
+ if (type.includes('application/json')) {
75
+ try {
76
+ const parsed = JSON.parse(text);
77
+ return Object.fromEntries(Object.entries(parsed).filter((entry) => typeof entry[1] === 'string'));
78
+ }
79
+ catch {
80
+ return {};
81
+ }
82
+ }
83
+ return Object.fromEntries(new URLSearchParams(text));
84
+ }
85
+ async function readJson(req) {
86
+ try {
87
+ const text = typeof req.text === 'function' ? await req.text() : '';
88
+ const parsed = JSON.parse(text);
89
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
90
+ ? parsed
91
+ : undefined;
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ }
97
+ /** True when a cookie-authenticated request came from this site. */
98
+ function sameOrigin(req, runtime) {
99
+ const origin = req.headers.get('origin');
100
+ if (!origin)
101
+ return false;
102
+ if (origin === runtime.origin)
103
+ return true;
104
+ try {
105
+ return origin === new URL(req.url ?? '').origin;
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ function adminRouteOf(req) {
112
+ return req.payload.config.routes?.admin ?? '/admin';
113
+ }
114
+ export function oauthEndpoints(runtime, options = {}) {
115
+ const preflight = (path) => ({
116
+ path,
117
+ method: 'options',
118
+ handler: () => new Response(null, { status: 204, headers: APP_CORS }),
119
+ });
120
+ return [
121
+ {
122
+ path: '/oauth/metadata',
123
+ method: 'get',
124
+ handler: () => json(authorizationServerMetadata(runtime), 200, {
125
+ ...APP_CORS,
126
+ 'cache-control': 'public, max-age=300',
127
+ }),
128
+ },
129
+ {
130
+ path: '/oauth/protected-resource',
131
+ method: 'get',
132
+ handler: () => json(protectedResourceMetadata(runtime), 200, {
133
+ ...APP_CORS,
134
+ 'cache-control': 'public, max-age=300',
135
+ }),
136
+ },
137
+ preflight('/oauth/metadata'),
138
+ preflight('/oauth/protected-resource'),
139
+ preflight('/oauth/register'),
140
+ preflight('/oauth/token'),
141
+ preflight('/oauth/revoke'),
142
+ {
143
+ path: '/oauth/register',
144
+ method: 'post',
145
+ handler: async (req) => {
146
+ const body = await readJson(req);
147
+ if (!body) {
148
+ return appJson({
149
+ error: 'invalid_client_metadata',
150
+ error_description: 'The body must be a JSON object.',
151
+ }, 400);
152
+ }
153
+ const redirectUris = body['redirect_uris'];
154
+ if (!Array.isArray(redirectUris)) {
155
+ return appJson({ error: 'invalid_redirect_uri', error_description: 'redirect_uris is required.' }, 400);
156
+ }
157
+ const grantTypes = body['grant_types'];
158
+ if (Array.isArray(grantTypes) &&
159
+ grantTypes.some((each) => each !== 'authorization_code' && each !== 'refresh_token')) {
160
+ return appJson({
161
+ error: 'invalid_client_metadata',
162
+ error_description: 'Only authorization_code and refresh_token are supported.',
163
+ }, 400);
164
+ }
165
+ const policy = await readPolicy(req.payload, runtime);
166
+ const name = typeof body['client_name'] === 'string' ? body['client_name'] : undefined;
167
+ const client = await registerClient(req.payload, policy, {
168
+ redirectUris,
169
+ ...(name ? { name } : {}),
170
+ });
171
+ if ('error' in client) {
172
+ return appJson({ error: 'invalid_redirect_uri', error_description: client.error }, 400);
173
+ }
174
+ return appJson({
175
+ client_id: client.clientId,
176
+ client_id_issued_at: Math.floor(Date.now() / 1000),
177
+ ...(client.name ? { client_name: client.name } : {}),
178
+ redirect_uris: client.redirectUris,
179
+ grant_types: ['authorization_code', 'refresh_token'],
180
+ response_types: ['code'],
181
+ token_endpoint_auth_method: 'none',
182
+ }, 201);
183
+ },
184
+ },
185
+ {
186
+ path: '/oauth/authorize',
187
+ method: 'get',
188
+ handler: async (req) => {
189
+ const adminRoute = adminRouteOf(req);
190
+ const params = new URL(req.url ?? '', runtime.origin).searchParams;
191
+ const policy = await readPolicy(req.payload, runtime);
192
+ const client = await resolveClient(req.payload, policy, params.get('client_id'), options.fetch);
193
+ if ('error' in client)
194
+ return errorPage(runtime, adminRoute, 'This app can’t connect', client.error);
195
+ const requested = params.get('redirect_uri') ?? undefined;
196
+ const redirectUri = requested ?? (client.redirectUris.length === 1 ? client.redirectUris[0] : undefined);
197
+ if (!redirectUri || !redirectRegistered(redirectUri, client.redirectUris)) {
198
+ return errorPage(runtime, adminRoute, 'This app can’t connect', 'The address it asked to return to is not one it registered.');
199
+ }
200
+ if (clientKindFor(redirectUri, (kind) => policy.clients[kind]) !== client.kind) {
201
+ return errorPage(runtime, adminRoute, 'This app can’t connect', 'Connections from this app are turned off on this site.');
202
+ }
203
+ // From here the redirect is trusted, so errors go back to the app.
204
+ const state = params.get('state') ?? undefined;
205
+ const back = (error, description) => new Response(null, {
206
+ status: 302,
207
+ headers: {
208
+ location: withParams(redirectUri, {
209
+ error,
210
+ error_description: description,
211
+ state,
212
+ iss: runtime.issuer,
213
+ }),
214
+ 'cache-control': 'no-store',
215
+ },
216
+ });
217
+ if (params.get('response_type') !== 'code') {
218
+ return back('unsupported_response_type', 'Only response_type=code is supported.');
219
+ }
220
+ const challenge = params.get('code_challenge');
221
+ if (!isCodeChallenge(challenge) || params.get('code_challenge_method') !== 'S256') {
222
+ return back('invalid_request', 'PKCE with code_challenge_method=S256 is required.');
223
+ }
224
+ const resource = params.get('resource');
225
+ if (resource && !sameResource(resource, runtime.resource)) {
226
+ return back('invalid_target', `This server issues tokens for ${runtime.resource} only.`);
227
+ }
228
+ const request = {
229
+ clientId: client.clientId,
230
+ redirectUri,
231
+ codeChallenge: challenge,
232
+ ...(state !== undefined ? { state } : {}),
233
+ };
234
+ const sealed = seal(keys(req.payload).request, request, 15 * 60);
235
+ return new Response(null, {
236
+ status: 302,
237
+ headers: {
238
+ location: `${adminRoute}${runtime.connectPath}/authorize?request=${encodeURIComponent(sealed)}`,
239
+ 'cache-control': 'no-store',
240
+ },
241
+ });
242
+ },
243
+ },
244
+ {
245
+ path: '/oauth/consent',
246
+ method: 'post',
247
+ handler: async (req) => {
248
+ const user = signedInPerson(req);
249
+ if (!user)
250
+ return json({ error: 'Sign in first.' }, 401);
251
+ if (!sameOrigin(req, runtime))
252
+ return json({ error: 'Cross-origin request refused.' }, 403);
253
+ const body = await readJson(req);
254
+ const request = unseal(keys(req.payload).request, body?.['request']);
255
+ if (!request) {
256
+ return json({ error: 'This sign-in request has expired. Start again from the app.' }, 400);
257
+ }
258
+ const policy = await readPolicy(req.payload, runtime);
259
+ const client = await resolveClient(req.payload, policy, request.clientId, options.fetch);
260
+ if ('error' in client)
261
+ return json({ error: client.error }, 400);
262
+ if (!redirectRegistered(request.redirectUri, client.redirectUris)) {
263
+ return json({ error: 'This app’s registration has changed. Start again from the app.' }, 400);
264
+ }
265
+ if (body?.['decision'] !== 'allow') {
266
+ return json({
267
+ redirect: withParams(request.redirectUri, {
268
+ error: 'access_denied',
269
+ error_description: 'The person declined.',
270
+ state: request.state,
271
+ iss: runtime.issuer,
272
+ }),
273
+ });
274
+ }
275
+ const verdict = runtime.eligible(user);
276
+ if (verdict !== true)
277
+ return json({ error: verdict }, 403);
278
+ const code = await createPendingGrant(req.payload, user, client, request);
279
+ return json({
280
+ redirect: withParams(request.redirectUri, {
281
+ code,
282
+ state: request.state,
283
+ iss: runtime.issuer,
284
+ }),
285
+ });
286
+ },
287
+ },
288
+ {
289
+ path: '/oauth/token',
290
+ method: 'post',
291
+ handler: async (req) => {
292
+ const params = await readParams(req);
293
+ if (params['resource'] && !sameResource(params['resource'], runtime.resource)) {
294
+ return appJson({
295
+ error: 'invalid_target',
296
+ error_description: `This server issues tokens for ${runtime.resource} only.`,
297
+ }, 400);
298
+ }
299
+ const policy = await readPolicy(req.payload, runtime);
300
+ const grantType = params['grant_type'];
301
+ if (grantType === 'authorization_code') {
302
+ const result = await exchangeCode(req.payload, runtime, policy, {
303
+ ...(params['code'] ? { code: params['code'] } : {}),
304
+ ...(params['client_id'] ? { clientId: params['client_id'] } : {}),
305
+ ...(params['redirect_uri'] ? { redirectUri: params['redirect_uri'] } : {}),
306
+ ...(params['code_verifier'] ? { codeVerifier: params['code_verifier'] } : {}),
307
+ });
308
+ return appJson(result, 'error' in result ? 400 : 200);
309
+ }
310
+ if (grantType === 'refresh_token') {
311
+ const result = await refresh(req.payload, runtime, policy, {
312
+ ...(params['refresh_token'] ? { refreshToken: params['refresh_token'] } : {}),
313
+ ...(params['client_id'] ? { clientId: params['client_id'] } : {}),
314
+ });
315
+ return appJson(result, 'error' in result ? 400 : 200);
316
+ }
317
+ return appJson({
318
+ error: 'unsupported_grant_type',
319
+ error_description: 'Use authorization_code or refresh_token.',
320
+ }, 400);
321
+ },
322
+ },
323
+ {
324
+ path: '/oauth/revoke',
325
+ method: 'post',
326
+ handler: async (req) => {
327
+ const params = await readParams(req);
328
+ await revokeToken(req.payload, params['token']);
329
+ return new Response(null, {
330
+ status: 200,
331
+ headers: { ...APP_CORS, 'cache-control': 'no-store' },
332
+ });
333
+ },
334
+ },
335
+ {
336
+ path: '/oauth/grants/:id/revoke',
337
+ method: 'post',
338
+ handler: async (req) => {
339
+ const user = signedInPerson(req);
340
+ if (!user)
341
+ return json({ error: 'Sign in first.' }, 401);
342
+ if (!sameOrigin(req, runtime))
343
+ return json({ error: 'Cross-origin request refused.' }, 403);
344
+ const id = req.routeParams?.['id'];
345
+ const grant = (await req.payload.findByID({
346
+ collection: MCP_OAUTH_GRANTS_SLUG,
347
+ id: id,
348
+ depth: 0,
349
+ overrideAccess: true,
350
+ disableErrors: true,
351
+ }));
352
+ const admin = runtime.isAdmin(user);
353
+ if (!grant || (!admin && String(grant['user']) !== String(user['id']))) {
354
+ return json({ error: 'No such connection.' }, 404);
355
+ }
356
+ if (grant['status'] !== 'revoked') {
357
+ const own = String(grant['user']) === String(user['id']);
358
+ await revokeGrant(req.payload, grant, own ? 'disconnected by its owner' : 'revoked by an administrator');
359
+ }
360
+ return json({ ok: true });
361
+ },
362
+ },
363
+ ];
364
+ }
365
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/mcp-oauth/endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { mcpOAuth, CONNECT_MCP_VIEW_PATH, MCP_AUTHORIZE_VIEW_PATH } from './plugin.js';
2
+ export type { McpOAuth } from './plugin.js';
3
+ export { createOverrideAuth } from './auth.js';
4
+ export type { McpAccessSettings, OverrideAuth } from './auth.js';
5
+ export { MCP_ACCESS_SLUG, MCP_OAUTH_CLIENTS_SLUG, MCP_OAUTH_GRANTS_SLUG, MCP_OAUTH_STRATEGY, readPolicy, toolsFor, } from './runtime.js';
6
+ export type { McpAccessPolicy, McpOAuthOptions, McpOAuthRuntime } from './runtime.js';
7
+ export { MCP_CLIENT_KINDS, MCP_CLIENT_RULES, classifyRedirects, clientKindFor, redirectRegistered, } from './clients.js';
8
+ export type { McpClientKind, McpClientRule } from './clients.js';
9
+ export { authorizationServerMetadata, mcpOAuthRewrites, protectedResourceMetadata, protectedResourceMetadataUrl, } from './metadata.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACtF,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,QAAQ,GACT,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACrF,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,eAAe,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { mcpOAuth, CONNECT_MCP_VIEW_PATH, MCP_AUTHORIZE_VIEW_PATH } from './plugin.js';
2
+ export { createOverrideAuth } from './auth.js';
3
+ export { MCP_ACCESS_SLUG, MCP_OAUTH_CLIENTS_SLUG, MCP_OAUTH_GRANTS_SLUG, MCP_OAUTH_STRATEGY, readPolicy, toolsFor, } from './runtime.js';
4
+ export { MCP_CLIENT_KINDS, MCP_CLIENT_RULES, classifyRedirects, clientKindFor, redirectRegistered, } from './clients.js';
5
+ export { authorizationServerMetadata, mcpOAuthRewrites, protectedResourceMetadata, protectedResourceMetadataUrl, } from './metadata.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAEtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,QAAQ,GACT,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,eAAe,CAAA"}
@@ -0,0 +1,45 @@
1
+ import type { McpOAuthRuntime } from './runtime.js';
2
+ export declare const MCP_SCOPE = "mcp";
3
+ export declare function authorizationServerMetadata(runtime: McpOAuthRuntime): {
4
+ issuer: string;
5
+ authorization_endpoint: string;
6
+ token_endpoint: string;
7
+ registration_endpoint: string;
8
+ revocation_endpoint: string;
9
+ response_types_supported: string[];
10
+ response_modes_supported: string[];
11
+ grant_types_supported: string[];
12
+ token_endpoint_auth_methods_supported: string[];
13
+ revocation_endpoint_auth_methods_supported: string[];
14
+ code_challenge_methods_supported: string[];
15
+ scopes_supported: string[];
16
+ client_id_metadata_document_supported: boolean;
17
+ authorization_response_iss_parameter_supported: boolean;
18
+ };
19
+ export declare function protectedResourceMetadata(runtime: McpOAuthRuntime): {
20
+ resource: string;
21
+ authorization_servers: string[];
22
+ bearer_methods_supported: string[];
23
+ scopes_supported: string[];
24
+ resource_name: string;
25
+ };
26
+ /** Where the protected-resource metadata is served. */
27
+ export declare function protectedResourceMetadataUrl(runtime: McpOAuthRuntime): string;
28
+ /**
29
+ * Rewrites for `next.config`, so the well-known paths at the root reach the
30
+ * endpoints Payload serves under its API route. Payload only routes under
31
+ * `/api`; RFC 8414 and RFC 9728 put discovery at `/.well-known`.
32
+ *
33
+ * ```js
34
+ * async rewrites() {
35
+ * return mcpOAuthRewrites()
36
+ * }
37
+ * ```
38
+ */
39
+ export declare function mcpOAuthRewrites({ apiRoute }?: {
40
+ apiRoute?: string;
41
+ }): {
42
+ source: string;
43
+ destination: string;
44
+ }[];
45
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/mcp-oauth/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAsBnD,eAAO,MAAM,SAAS,QAAQ,CAAA;AAE9B,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;;;;EAiBnE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe;;;;;;EAQjE;AAED,uDAAuD;AACvD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAE7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAiB,EAAE,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO;;;IAoBjF"}