@postman/test-mcp-server 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.
Files changed (127) hide show
  1. package/README.md +478 -0
  2. package/dist/index.d.ts +13 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +50 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/instructions.md +24 -0
  7. package/dist/logger.d.ts +8 -0
  8. package/dist/logger.d.ts.map +1 -0
  9. package/dist/logger.js +27 -0
  10. package/dist/logger.js.map +1 -0
  11. package/dist/oauth/config.d.ts +6 -0
  12. package/dist/oauth/config.d.ts.map +1 -0
  13. package/dist/oauth/config.js +13 -0
  14. package/dist/oauth/config.js.map +1 -0
  15. package/dist/oauth/helpers.d.ts +17 -0
  16. package/dist/oauth/helpers.d.ts.map +1 -0
  17. package/dist/oauth/helpers.js +100 -0
  18. package/dist/oauth/helpers.js.map +1 -0
  19. package/dist/oauth/index.d.ts +17 -0
  20. package/dist/oauth/index.d.ts.map +1 -0
  21. package/dist/oauth/index.js +15 -0
  22. package/dist/oauth/index.js.map +1 -0
  23. package/dist/oauth/middleware.d.ts +15 -0
  24. package/dist/oauth/middleware.d.ts.map +1 -0
  25. package/dist/oauth/middleware.js +46 -0
  26. package/dist/oauth/middleware.js.map +1 -0
  27. package/dist/oauth/routes.d.ts +3 -0
  28. package/dist/oauth/routes.d.ts.map +1 -0
  29. package/dist/oauth/routes.js +476 -0
  30. package/dist/oauth/routes.js.map +1 -0
  31. package/dist/oauth/stores.d.ts +6 -0
  32. package/dist/oauth/stores.d.ts.map +1 -0
  33. package/dist/oauth/stores.js +20 -0
  34. package/dist/oauth/stores.js.map +1 -0
  35. package/dist/oauth/types.d.ts +46 -0
  36. package/dist/oauth/types.d.ts.map +1 -0
  37. package/dist/oauth/types.js +5 -0
  38. package/dist/oauth/types.js.map +1 -0
  39. package/dist/prompts/index.d.ts +99 -0
  40. package/dist/prompts/index.d.ts.map +1 -0
  41. package/dist/prompts/index.js +135 -0
  42. package/dist/prompts/index.js.map +1 -0
  43. package/dist/resources/index.d.ts +70 -0
  44. package/dist/resources/index.d.ts.map +1 -0
  45. package/dist/resources/index.js +79 -0
  46. package/dist/resources/index.js.map +1 -0
  47. package/dist/server/index.d.ts +11 -0
  48. package/dist/server/index.d.ts.map +1 -0
  49. package/dist/server/index.js +234 -0
  50. package/dist/server/index.js.map +1 -0
  51. package/dist/tools/constants.d.ts +5 -0
  52. package/dist/tools/constants.d.ts.map +1 -0
  53. package/dist/tools/constants.js +5 -0
  54. package/dist/tools/constants.js.map +1 -0
  55. package/dist/tools/definitions/add.d.ts +10 -0
  56. package/dist/tools/definitions/add.d.ts.map +1 -0
  57. package/dist/tools/definitions/add.js +24 -0
  58. package/dist/tools/definitions/add.js.map +1 -0
  59. package/dist/tools/definitions/annotatedMessage.d.ts +14 -0
  60. package/dist/tools/definitions/annotatedMessage.d.ts.map +1 -0
  61. package/dist/tools/definitions/annotatedMessage.js +63 -0
  62. package/dist/tools/definitions/annotatedMessage.js.map +1 -0
  63. package/dist/tools/definitions/echo.d.ts +9 -0
  64. package/dist/tools/definitions/echo.d.ts.map +1 -0
  65. package/dist/tools/definitions/echo.js +17 -0
  66. package/dist/tools/definitions/echo.js.map +1 -0
  67. package/dist/tools/definitions/elicitation.d.ts +8 -0
  68. package/dist/tools/definitions/elicitation.d.ts.map +1 -0
  69. package/dist/tools/definitions/elicitation.js +175 -0
  70. package/dist/tools/definitions/elicitation.js.map +1 -0
  71. package/dist/tools/definitions/getResourceLinks.d.ts +9 -0
  72. package/dist/tools/definitions/getResourceLinks.d.ts.map +1 -0
  73. package/dist/tools/definitions/getResourceLinks.js +31 -0
  74. package/dist/tools/definitions/getResourceLinks.js.map +1 -0
  75. package/dist/tools/definitions/getResourceReference.d.ts +9 -0
  76. package/dist/tools/definitions/getResourceReference.d.ts.map +1 -0
  77. package/dist/tools/definitions/getResourceReference.js +36 -0
  78. package/dist/tools/definitions/getResourceReference.js.map +1 -0
  79. package/dist/tools/definitions/getTinyImage.d.ts +7 -0
  80. package/dist/tools/definitions/getTinyImage.d.ts.map +1 -0
  81. package/dist/tools/definitions/getTinyImage.js +30 -0
  82. package/dist/tools/definitions/getTinyImage.js.map +1 -0
  83. package/dist/tools/definitions/listRoots.d.ts +8 -0
  84. package/dist/tools/definitions/listRoots.d.ts.map +1 -0
  85. package/dist/tools/definitions/listRoots.js +54 -0
  86. package/dist/tools/definitions/listRoots.js.map +1 -0
  87. package/dist/tools/definitions/longRunningOperation.d.ts +10 -0
  88. package/dist/tools/definitions/longRunningOperation.d.ts.map +1 -0
  89. package/dist/tools/definitions/longRunningOperation.js +39 -0
  90. package/dist/tools/definitions/longRunningOperation.js.map +1 -0
  91. package/dist/tools/definitions/printEnv.d.ts +7 -0
  92. package/dist/tools/definitions/printEnv.d.ts.map +1 -0
  93. package/dist/tools/definitions/printEnv.js +19 -0
  94. package/dist/tools/definitions/printEnv.js.map +1 -0
  95. package/dist/tools/definitions/sampleLlm.d.ts +10 -0
  96. package/dist/tools/definitions/sampleLlm.d.ts.map +1 -0
  97. package/dist/tools/definitions/sampleLlm.js +48 -0
  98. package/dist/tools/definitions/sampleLlm.js.map +1 -0
  99. package/dist/tools/definitions/structuredContent.d.ts +14 -0
  100. package/dist/tools/definitions/structuredContent.d.ts.map +1 -0
  101. package/dist/tools/definitions/structuredContent.js +29 -0
  102. package/dist/tools/definitions/structuredContent.js.map +1 -0
  103. package/dist/tools/definitions/zipResources.d.ts +9 -0
  104. package/dist/tools/definitions/zipResources.d.ts.map +1 -0
  105. package/dist/tools/definitions/zipResources.js +41 -0
  106. package/dist/tools/definitions/zipResources.js.map +1 -0
  107. package/dist/tools/index.d.ts +19 -0
  108. package/dist/tools/index.d.ts.map +1 -0
  109. package/dist/tools/index.js +71 -0
  110. package/dist/tools/index.js.map +1 -0
  111. package/dist/tools/types.d.ts +28 -0
  112. package/dist/tools/types.d.ts.map +1 -0
  113. package/dist/tools/types.js +2 -0
  114. package/dist/tools/types.js.map +1 -0
  115. package/dist/transports/sse.d.ts +2 -0
  116. package/dist/transports/sse.d.ts.map +1 -0
  117. package/dist/transports/sse.js +56 -0
  118. package/dist/transports/sse.js.map +1 -0
  119. package/dist/transports/stdio.d.ts +3 -0
  120. package/dist/transports/stdio.d.ts.map +1 -0
  121. package/dist/transports/stdio.js +28 -0
  122. package/dist/transports/stdio.js.map +1 -0
  123. package/dist/transports/streamableHttpServer.d.ts +37 -0
  124. package/dist/transports/streamableHttpServer.d.ts.map +1 -0
  125. package/dist/transports/streamableHttpServer.js +242 -0
  126. package/dist/transports/streamableHttpServer.js.map +1 -0
  127. package/package.json +76 -0
@@ -0,0 +1,476 @@
1
+ import { Router } from "express";
2
+ import express from "express";
3
+ import { oauthLogger } from "../logger.js";
4
+ import { OAUTH_CONFIG } from "./config.js";
5
+ import { tokenStore, authCodeStore, refreshTokenStore, clientStore } from "./stores.js";
6
+ import { generateClientId, generateClientSecret, validateClient, getClient, generateAuthorizationCode, generateRefreshToken, verifyCodeChallenge, createToken, validateToken, } from "./helpers.js";
7
+ /**
8
+ * OAuth2 Express Routes
9
+ *
10
+ * Provides all OAuth2 endpoints:
11
+ * - GET /.well-known/oauth-authorization-server (RFC 8414)
12
+ * - POST /oauth/register (RFC 7591)
13
+ * - GET /oauth/authorize
14
+ * - POST /oauth/token
15
+ * - POST /oauth/introspect (RFC 7662)
16
+ * - POST /oauth/revoke (RFC 7009)
17
+ */
18
+ const log = oauthLogger;
19
+ const router = Router();
20
+ // Body parsers for OAuth routes only
21
+ const jsonParser = express.json();
22
+ const urlencodedParser = express.urlencoded({ extended: true });
23
+ // ============================================
24
+ // Helper to get base URL
25
+ // ============================================
26
+ function getBaseUrl(req) {
27
+ const protocol = req.protocol;
28
+ const host = req.get("host") || `localhost:${OAUTH_CONFIG.port}`;
29
+ return `${protocol}://${host}`;
30
+ }
31
+ // ============================================
32
+ // OAuth2 Authorization Server Metadata (RFC 8414)
33
+ // ============================================
34
+ router.get("/.well-known/oauth-authorization-server", (req, res) => {
35
+ const baseUrl = getBaseUrl(req);
36
+ log.debug({ baseUrl }, "Authorization server metadata requested");
37
+ const metadata = {
38
+ issuer: baseUrl,
39
+ authorization_endpoint: `${baseUrl}/oauth/authorize`,
40
+ token_endpoint: `${baseUrl}/oauth/token`,
41
+ registration_endpoint: `${baseUrl}/oauth/register`,
42
+ introspection_endpoint: `${baseUrl}/oauth/introspect`,
43
+ revocation_endpoint: `${baseUrl}/oauth/revoke`,
44
+ response_types_supported: ["code"],
45
+ response_modes_supported: ["query"],
46
+ grant_types_supported: ["authorization_code", "client_credentials", "refresh_token"],
47
+ token_endpoint_auth_methods_supported: ["client_secret_post", "client_secret_basic", "none"],
48
+ introspection_endpoint_auth_methods_supported: ["none"],
49
+ revocation_endpoint_auth_methods_supported: ["none"],
50
+ code_challenge_methods_supported: ["plain", "S256"],
51
+ scopes_supported: ["mcp:read", "mcp:write"],
52
+ service_documentation: "https://modelcontextprotocol.io",
53
+ };
54
+ res.setHeader("Content-Type", "application/json");
55
+ res.json(metadata);
56
+ });
57
+ // ============================================
58
+ // Dynamic Client Registration (RFC 7591)
59
+ // ============================================
60
+ router.post("/oauth/register", jsonParser, (req, res) => {
61
+ log.debug("Client registration request received");
62
+ const { client_name, redirect_uris, grant_types = ["client_credentials"], token_endpoint_auth_method = "client_secret_post", scope, } = req.body;
63
+ // Normalize and validate grant types
64
+ const grantTypeAliases = {
65
+ authorization_code_with_pkce: "authorization_code",
66
+ };
67
+ const supportedGrantTypes = ["client_credentials", "authorization_code", "refresh_token"];
68
+ const rawGrantTypes = Array.isArray(grant_types) ? grant_types : [grant_types];
69
+ const requestedGrantTypes = [
70
+ ...new Set(rawGrantTypes.map((gt) => grantTypeAliases[gt] || gt)),
71
+ ];
72
+ const invalidGrantTypes = requestedGrantTypes.filter((gt) => !supportedGrantTypes.includes(gt));
73
+ if (invalidGrantTypes.length > 0) {
74
+ log.warn({ invalidGrantTypes }, "Unsupported grant types requested");
75
+ res.status(400).json({
76
+ error: "invalid_client_metadata",
77
+ error_description: `Unsupported grant types: ${invalidGrantTypes.join(", ")}. Supported: ${supportedGrantTypes.join(", ")}, authorization_code_with_pkce (alias for authorization_code)`,
78
+ });
79
+ return;
80
+ }
81
+ if (requestedGrantTypes.includes("authorization_code") &&
82
+ (!redirect_uris || redirect_uris.length === 0)) {
83
+ res.status(400).json({
84
+ error: "invalid_client_metadata",
85
+ error_description: "redirect_uris is required for authorization_code grant type",
86
+ });
87
+ return;
88
+ }
89
+ const supportedAuthMethods = ["client_secret_post", "client_secret_basic", "none"];
90
+ if (!supportedAuthMethods.includes(token_endpoint_auth_method)) {
91
+ log.warn({ token_endpoint_auth_method }, "Unsupported auth method");
92
+ res.status(400).json({
93
+ error: "invalid_client_metadata",
94
+ error_description: `Unsupported token_endpoint_auth_method. Supported: ${supportedAuthMethods.join(", ")}`,
95
+ });
96
+ return;
97
+ }
98
+ const requestedScope = scope
99
+ ? typeof scope === "string"
100
+ ? scope.split(" ")
101
+ : scope
102
+ : ["mcp:read", "mcp:write"];
103
+ const clientId = generateClientId();
104
+ const clientSecret = generateClientSecret();
105
+ const client = {
106
+ clientId,
107
+ clientSecret,
108
+ clientName: client_name,
109
+ redirectUris: redirect_uris,
110
+ grantTypes: requestedGrantTypes,
111
+ tokenEndpointAuthMethod: token_endpoint_auth_method,
112
+ scope: requestedScope,
113
+ createdAt: Date.now(),
114
+ };
115
+ clientStore.set(clientId, client);
116
+ log.info({ clientId, clientName: client_name }, "Client registered successfully");
117
+ res.status(201).json({
118
+ client_id: clientId,
119
+ client_secret: clientSecret,
120
+ client_id_issued_at: Math.floor(client.createdAt / 1000),
121
+ client_secret_expires_at: 0,
122
+ client_name: client_name,
123
+ redirect_uris: redirect_uris,
124
+ grant_types: requestedGrantTypes,
125
+ token_endpoint_auth_method: token_endpoint_auth_method,
126
+ scope: requestedScope.join(" "),
127
+ });
128
+ });
129
+ // ============================================
130
+ // Authorization Endpoint
131
+ // ============================================
132
+ router.get("/oauth/authorize", (req, res) => {
133
+ const { response_type, client_id, redirect_uri, scope, state, code_challenge, code_challenge_method = "plain", } = req.query;
134
+ log.debug({ client_id, redirect_uri }, "Authorization request received");
135
+ if (response_type !== "code") {
136
+ res.status(400).json({
137
+ error: "unsupported_response_type",
138
+ error_description: "Only response_type=code is supported",
139
+ });
140
+ return;
141
+ }
142
+ const client = getClient(client_id);
143
+ if (!client) {
144
+ res.status(400).json({
145
+ error: "invalid_client",
146
+ error_description: "Unknown client_id",
147
+ });
148
+ return;
149
+ }
150
+ if (!redirect_uri) {
151
+ res.status(400).json({
152
+ error: "invalid_request",
153
+ error_description: "redirect_uri is required",
154
+ });
155
+ return;
156
+ }
157
+ if (client.redirectUris && !client.redirectUris.includes(redirect_uri)) {
158
+ res.status(400).json({
159
+ error: "invalid_request",
160
+ error_description: "redirect_uri not registered for this client",
161
+ });
162
+ return;
163
+ }
164
+ if (!client.grantTypes.includes("authorization_code")) {
165
+ res.status(400).json({
166
+ error: "unauthorized_client",
167
+ error_description: "Client is not authorized for authorization_code grant",
168
+ });
169
+ return;
170
+ }
171
+ if (code_challenge && !["plain", "S256"].includes(code_challenge_method)) {
172
+ res.status(400).json({
173
+ error: "invalid_request",
174
+ error_description: "code_challenge_method must be plain or S256",
175
+ });
176
+ return;
177
+ }
178
+ const requestedScope = scope ? scope.split(" ") : client.scope;
179
+ const code = generateAuthorizationCode();
180
+ const authCode = {
181
+ code,
182
+ clientId: client_id,
183
+ redirectUri: redirect_uri,
184
+ scope: requestedScope,
185
+ codeChallenge: code_challenge,
186
+ codeChallengeMethod: code_challenge ? code_challenge_method : undefined,
187
+ createdAt: Date.now(),
188
+ expiresAt: Date.now() + 10 * 60 * 1000,
189
+ used: false,
190
+ };
191
+ authCodeStore.set(code, authCode);
192
+ log.info({ clientId: client_id, hasPkce: !!code_challenge }, "Authorization code generated");
193
+ const redirectUrl = new URL(redirect_uri);
194
+ redirectUrl.searchParams.set("code", code);
195
+ if (state) {
196
+ redirectUrl.searchParams.set("state", state);
197
+ }
198
+ res.redirect(302, redirectUrl.toString());
199
+ });
200
+ // ============================================
201
+ // Token Endpoint
202
+ // ============================================
203
+ router.post("/oauth/token", jsonParser, urlencodedParser, (req, res) => {
204
+ log.debug({
205
+ body: req.body,
206
+ headers: { authorization: req.headers.authorization ? "[present]" : "[absent]" },
207
+ }, "OAuth token request received");
208
+ let client_id = req.body.client_id;
209
+ let client_secret = req.body.client_secret;
210
+ const authHeader = req.headers.authorization;
211
+ if (authHeader && authHeader.startsWith("Basic ")) {
212
+ try {
213
+ const base64Credentials = authHeader.slice(6);
214
+ const credentials = Buffer.from(base64Credentials, "base64").toString("utf-8");
215
+ const [headerClientId, headerClientSecret] = credentials.split(":");
216
+ if (!client_id && headerClientId)
217
+ client_id = headerClientId;
218
+ if (!client_secret && headerClientSecret)
219
+ client_secret = headerClientSecret;
220
+ log.debug({ headerClientId }, "Extracted client_id from Basic auth header");
221
+ }
222
+ catch {
223
+ log.warn("Failed to parse Basic auth header");
224
+ }
225
+ }
226
+ const { grant_type } = req.body;
227
+ // Handle client_credentials grant
228
+ if (grant_type === "client_credentials") {
229
+ const client = validateClient(client_id, client_secret);
230
+ if (!client) {
231
+ log.warn({ client_id }, "Invalid client credentials");
232
+ res.status(401).json({
233
+ error: "invalid_client",
234
+ error_description: "Invalid client credentials",
235
+ });
236
+ return;
237
+ }
238
+ if (!client.grantTypes.includes("client_credentials")) {
239
+ res.status(400).json({
240
+ error: "unauthorized_client",
241
+ error_description: "Client is not authorized for client_credentials grant",
242
+ });
243
+ return;
244
+ }
245
+ const requestedScope = req.body.scope ? req.body.scope.split(" ") : client.scope;
246
+ const tokenInfo = createToken(client_id, requestedScope);
247
+ log.info({ clientId: client_id }, "Token generated (client_credentials)");
248
+ res.json({
249
+ access_token: tokenInfo.accessToken,
250
+ token_type: "Bearer",
251
+ expires_in: OAUTH_CONFIG.tokenExpiry,
252
+ scope: requestedScope.join(" "),
253
+ });
254
+ return;
255
+ }
256
+ // Handle authorization_code grant
257
+ if (grant_type === "authorization_code") {
258
+ const { code, redirect_uri, code_verifier } = req.body;
259
+ if (!code) {
260
+ res.status(400).json({
261
+ error: "invalid_request",
262
+ error_description: "code is required",
263
+ });
264
+ return;
265
+ }
266
+ const authCode = authCodeStore.get(code);
267
+ if (!authCode) {
268
+ res.status(400).json({
269
+ error: "invalid_grant",
270
+ error_description: "Invalid or expired authorization code",
271
+ });
272
+ return;
273
+ }
274
+ if (authCode.used) {
275
+ authCodeStore.delete(code);
276
+ res.status(400).json({
277
+ error: "invalid_grant",
278
+ error_description: "Authorization code has already been used",
279
+ });
280
+ return;
281
+ }
282
+ if (Date.now() > authCode.expiresAt) {
283
+ authCodeStore.delete(code);
284
+ res.status(400).json({
285
+ error: "invalid_grant",
286
+ error_description: "Authorization code has expired",
287
+ });
288
+ return;
289
+ }
290
+ if (authCode.clientId !== client_id) {
291
+ log.warn({
292
+ storedClientId: authCode.clientId,
293
+ providedClientId: client_id,
294
+ hasClientId: !!client_id,
295
+ }, "client_id mismatch in authorization code exchange");
296
+ res.status(400).json({
297
+ error: "invalid_grant",
298
+ error_description: `client_id does not match. Expected: ${authCode.clientId}, Got: ${client_id || "(not provided)"}`,
299
+ });
300
+ return;
301
+ }
302
+ if (authCode.redirectUri !== redirect_uri) {
303
+ res.status(400).json({
304
+ error: "invalid_grant",
305
+ error_description: "redirect_uri does not match",
306
+ });
307
+ return;
308
+ }
309
+ if (authCode.codeChallenge) {
310
+ if (!code_verifier) {
311
+ res.status(400).json({
312
+ error: "invalid_grant",
313
+ error_description: "code_verifier is required for PKCE",
314
+ });
315
+ return;
316
+ }
317
+ if (!verifyCodeChallenge(code_verifier, authCode.codeChallenge, authCode.codeChallengeMethod)) {
318
+ res.status(400).json({
319
+ error: "invalid_grant",
320
+ error_description: "code_verifier does not match code_challenge",
321
+ });
322
+ return;
323
+ }
324
+ }
325
+ else {
326
+ const client = getClient(client_id);
327
+ if (client && client.tokenEndpointAuthMethod !== "none") {
328
+ if (!validateClient(client_id, client_secret)) {
329
+ res.status(401).json({
330
+ error: "invalid_client",
331
+ error_description: "Invalid client credentials",
332
+ });
333
+ return;
334
+ }
335
+ }
336
+ }
337
+ authCode.used = true;
338
+ const tokenInfo = createToken(client_id, authCode.scope);
339
+ const refreshToken = generateRefreshToken();
340
+ refreshTokenStore.set(refreshToken, {
341
+ refreshToken,
342
+ clientId: client_id,
343
+ scope: authCode.scope,
344
+ createdAt: Date.now(),
345
+ });
346
+ authCodeStore.delete(code);
347
+ log.info({ clientId: client_id }, "Token generated (authorization_code)");
348
+ res.json({
349
+ access_token: tokenInfo.accessToken,
350
+ token_type: "Bearer",
351
+ expires_in: OAUTH_CONFIG.tokenExpiry,
352
+ refresh_token: refreshToken,
353
+ scope: authCode.scope.join(" "),
354
+ });
355
+ return;
356
+ }
357
+ // Handle refresh_token grant
358
+ if (grant_type === "refresh_token") {
359
+ const { refresh_token, scope } = req.body;
360
+ if (!refresh_token) {
361
+ res.status(400).json({
362
+ error: "invalid_request",
363
+ error_description: "refresh_token is required",
364
+ });
365
+ return;
366
+ }
367
+ const storedRefreshToken = refreshTokenStore.get(refresh_token);
368
+ if (!storedRefreshToken) {
369
+ res.status(400).json({
370
+ error: "invalid_grant",
371
+ error_description: "Invalid refresh token",
372
+ });
373
+ return;
374
+ }
375
+ if (storedRefreshToken.clientId !== client_id) {
376
+ res.status(400).json({
377
+ error: "invalid_grant",
378
+ error_description: "Refresh token was not issued to this client",
379
+ });
380
+ return;
381
+ }
382
+ const client = getClient(client_id);
383
+ if (client && client.tokenEndpointAuthMethod !== "none") {
384
+ if (!validateClient(client_id, client_secret)) {
385
+ res.status(401).json({
386
+ error: "invalid_client",
387
+ error_description: "Invalid client credentials",
388
+ });
389
+ return;
390
+ }
391
+ }
392
+ if (client && !client.grantTypes.includes("refresh_token")) {
393
+ res.status(400).json({
394
+ error: "unauthorized_client",
395
+ error_description: "Client is not authorized for refresh_token grant",
396
+ });
397
+ return;
398
+ }
399
+ let requestedScope = storedRefreshToken.scope;
400
+ if (scope) {
401
+ const newScope = scope.split(" ");
402
+ const isSubset = newScope.every((s) => storedRefreshToken.scope.includes(s));
403
+ if (!isSubset) {
404
+ res.status(400).json({
405
+ error: "invalid_scope",
406
+ error_description: "Requested scope exceeds original scope",
407
+ });
408
+ return;
409
+ }
410
+ requestedScope = newScope;
411
+ }
412
+ const tokenInfo = createToken(client_id, requestedScope);
413
+ const newRefreshToken = generateRefreshToken();
414
+ refreshTokenStore.delete(refresh_token);
415
+ refreshTokenStore.set(newRefreshToken, {
416
+ refreshToken: newRefreshToken,
417
+ clientId: client_id,
418
+ scope: requestedScope,
419
+ createdAt: Date.now(),
420
+ });
421
+ log.info({ clientId: client_id }, "Token refreshed");
422
+ res.json({
423
+ access_token: tokenInfo.accessToken,
424
+ token_type: "Bearer",
425
+ expires_in: OAUTH_CONFIG.tokenExpiry,
426
+ refresh_token: newRefreshToken,
427
+ scope: requestedScope.join(" "),
428
+ });
429
+ return;
430
+ }
431
+ log.warn({ grant_type }, "Unsupported grant type");
432
+ res.status(400).json({
433
+ error: "unsupported_grant_type",
434
+ error_description: "Supported grant types: client_credentials, authorization_code, refresh_token",
435
+ });
436
+ });
437
+ // ============================================
438
+ // Token Introspection (RFC 7662)
439
+ // ============================================
440
+ router.post("/oauth/introspect", jsonParser, urlencodedParser, (req, res) => {
441
+ const { token } = req.body;
442
+ if (!token) {
443
+ res.status(400).json({
444
+ error: "invalid_request",
445
+ error_description: "Token is required",
446
+ });
447
+ return;
448
+ }
449
+ const tokenInfo = validateToken(token);
450
+ if (!tokenInfo) {
451
+ log.debug("Token introspection: inactive token");
452
+ res.json({ active: false });
453
+ return;
454
+ }
455
+ log.debug({ clientId: tokenInfo.clientId }, "Token introspection: active token");
456
+ res.json({
457
+ active: true,
458
+ client_id: tokenInfo.clientId,
459
+ scope: tokenInfo.scope.join(" "),
460
+ exp: Math.floor(tokenInfo.expiresAt / 1000),
461
+ iat: Math.floor(tokenInfo.createdAt / 1000),
462
+ });
463
+ });
464
+ // ============================================
465
+ // Token Revocation (RFC 7009)
466
+ // ============================================
467
+ router.post("/oauth/revoke", jsonParser, urlencodedParser, (req, res) => {
468
+ const { token } = req.body;
469
+ if (token) {
470
+ tokenStore.delete(token);
471
+ log.info("Token revoked");
472
+ }
473
+ res.status(200).send();
474
+ });
475
+ export { router as oauthRouter };
476
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/oauth/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TokenInfo, AuthorizationCode, RefreshTokenInfo, RegisteredClient } from "./types.js";
2
+ export declare const tokenStore: Map<string, TokenInfo>;
3
+ export declare const authCodeStore: Map<string, AuthorizationCode>;
4
+ export declare const refreshTokenStore: Map<string, RefreshTokenInfo>;
5
+ export declare const clientStore: Map<string, RegisteredClient>;
6
+ //# sourceMappingURL=stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/oauth/stores.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnG,eAAO,MAAM,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAa,CAAC;AAC5D,eAAO,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAa,CAAC;AACvE,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAa,CAAC;AAC1E,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { OAUTH_CONFIG } from "./config.js";
2
+ export const tokenStore = new Map();
3
+ export const authCodeStore = new Map();
4
+ export const refreshTokenStore = new Map();
5
+ export const clientStore = new Map();
6
+ // Pre-register the default test client
7
+ clientStore.set(OAUTH_CONFIG.clientId, {
8
+ clientId: OAUTH_CONFIG.clientId,
9
+ clientSecret: OAUTH_CONFIG.clientSecret,
10
+ clientName: "Default Test Client",
11
+ redirectUris: [
12
+ `http://localhost:${OAUTH_CONFIG.port}/callback`,
13
+ `http://127.0.0.1:${OAUTH_CONFIG.port}/callback`,
14
+ ],
15
+ grantTypes: ["client_credentials", "authorization_code", "refresh_token"],
16
+ tokenEndpointAuthMethod: "client_secret_post",
17
+ scope: ["mcp:read", "mcp:write"],
18
+ createdAt: Date.now(),
19
+ });
20
+ //# sourceMappingURL=stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/oauth/stores.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,UAAU,GAA2B,IAAI,GAAG,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAmC,IAAI,GAAG,EAAE,CAAC;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAAkC,IAAI,GAAG,EAAE,CAAC;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAkC,IAAI,GAAG,EAAE,CAAC;AAEpE,uCAAuC;AACvC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,YAAY,CAAC,QAAQ;IAC/B,YAAY,EAAE,YAAY,CAAC,YAAY;IACvC,UAAU,EAAE,qBAAqB;IACjC,YAAY,EAAE;QACZ,oBAAoB,YAAY,CAAC,IAAI,WAAW;QAChD,oBAAoB,YAAY,CAAC,IAAI,WAAW;KACjD;IACD,UAAU,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,CAAC;IACzE,uBAAuB,EAAE,oBAAoB;IAC7C,KAAK,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;CACtB,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * OAuth2 Type Definitions
3
+ */
4
+ export interface TokenInfo {
5
+ accessToken: string;
6
+ refreshToken?: string;
7
+ clientId: string;
8
+ createdAt: number;
9
+ expiresAt: number;
10
+ scope: string[];
11
+ }
12
+ export interface AuthorizationCode {
13
+ code: string;
14
+ clientId: string;
15
+ redirectUri: string;
16
+ scope: string[];
17
+ codeChallenge?: string;
18
+ codeChallengeMethod?: "plain" | "S256";
19
+ createdAt: number;
20
+ expiresAt: number;
21
+ used: boolean;
22
+ }
23
+ export interface RefreshTokenInfo {
24
+ refreshToken: string;
25
+ clientId: string;
26
+ scope: string[];
27
+ createdAt: number;
28
+ }
29
+ export interface RegisteredClient {
30
+ clientId: string;
31
+ clientSecret: string;
32
+ clientName?: string;
33
+ redirectUris?: string[];
34
+ grantTypes: string[];
35
+ tokenEndpointAuthMethod: string;
36
+ scope: string[];
37
+ createdAt: number;
38
+ }
39
+ export interface OAuthConfig {
40
+ clientId: string;
41
+ clientSecret: string;
42
+ tokenSecret: string;
43
+ tokenExpiry: number;
44
+ port: number;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/oauth/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * OAuth2 Type Definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/oauth/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}