nitrostack 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 (290) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/CONTRIBUTING.md +182 -0
  3. package/LICENSE +201 -0
  4. package/LICENSE_URLS_UPDATE_COMPLETE.md +388 -0
  5. package/NOTICE +153 -0
  6. package/README.md +571 -0
  7. package/dist/auth/api-key.d.ts +118 -0
  8. package/dist/auth/api-key.d.ts.map +1 -0
  9. package/dist/auth/api-key.js +168 -0
  10. package/dist/auth/api-key.js.map +1 -0
  11. package/dist/auth/client.d.ts +151 -0
  12. package/dist/auth/client.d.ts.map +1 -0
  13. package/dist/auth/client.js +330 -0
  14. package/dist/auth/client.js.map +1 -0
  15. package/dist/auth/index.d.ts +30 -0
  16. package/dist/auth/index.d.ts.map +1 -0
  17. package/dist/auth/index.js +43 -0
  18. package/dist/auth/index.js.map +1 -0
  19. package/dist/auth/middleware.d.ts +95 -0
  20. package/dist/auth/middleware.d.ts.map +1 -0
  21. package/dist/auth/middleware.js +260 -0
  22. package/dist/auth/middleware.js.map +1 -0
  23. package/dist/auth/pkce.d.ts +53 -0
  24. package/dist/auth/pkce.d.ts.map +1 -0
  25. package/dist/auth/pkce.js +105 -0
  26. package/dist/auth/pkce.js.map +1 -0
  27. package/dist/auth/quick-setup.d.ts +94 -0
  28. package/dist/auth/quick-setup.d.ts.map +1 -0
  29. package/dist/auth/quick-setup.js +210 -0
  30. package/dist/auth/quick-setup.js.map +1 -0
  31. package/dist/auth/server-integration.d.ts +97 -0
  32. package/dist/auth/server-integration.d.ts.map +1 -0
  33. package/dist/auth/server-integration.js +182 -0
  34. package/dist/auth/server-integration.js.map +1 -0
  35. package/dist/auth/server-metadata.d.ts +51 -0
  36. package/dist/auth/server-metadata.d.ts.map +1 -0
  37. package/dist/auth/server-metadata.js +106 -0
  38. package/dist/auth/server-metadata.js.map +1 -0
  39. package/dist/auth/simple-jwt.d.ts +88 -0
  40. package/dist/auth/simple-jwt.d.ts.map +1 -0
  41. package/dist/auth/simple-jwt.js +152 -0
  42. package/dist/auth/simple-jwt.js.map +1 -0
  43. package/dist/auth/token-store.d.ts +104 -0
  44. package/dist/auth/token-store.d.ts.map +1 -0
  45. package/dist/auth/token-store.js +205 -0
  46. package/dist/auth/token-store.js.map +1 -0
  47. package/dist/auth/token-validation.d.ts +47 -0
  48. package/dist/auth/token-validation.d.ts.map +1 -0
  49. package/dist/auth/token-validation.js +237 -0
  50. package/dist/auth/token-validation.js.map +1 -0
  51. package/dist/auth/types.d.ts +215 -0
  52. package/dist/auth/types.d.ts.map +1 -0
  53. package/dist/auth/types.js +6 -0
  54. package/dist/auth/types.js.map +1 -0
  55. package/dist/cli/commands/build.d.ts +6 -0
  56. package/dist/cli/commands/build.d.ts.map +1 -0
  57. package/dist/cli/commands/build.js +104 -0
  58. package/dist/cli/commands/build.js.map +1 -0
  59. package/dist/cli/commands/dev.d.ts +7 -0
  60. package/dist/cli/commands/dev.d.ts.map +1 -0
  61. package/dist/cli/commands/dev.js +312 -0
  62. package/dist/cli/commands/dev.js.map +1 -0
  63. package/dist/cli/commands/generate-types.d.ts +8 -0
  64. package/dist/cli/commands/generate-types.d.ts.map +1 -0
  65. package/dist/cli/commands/generate-types.js +220 -0
  66. package/dist/cli/commands/generate-types.js.map +1 -0
  67. package/dist/cli/commands/generate.d.ts +5 -0
  68. package/dist/cli/commands/generate.d.ts.map +1 -0
  69. package/dist/cli/commands/generate.js +365 -0
  70. package/dist/cli/commands/generate.js.map +1 -0
  71. package/dist/cli/commands/init.d.ts +7 -0
  72. package/dist/cli/commands/init.d.ts.map +1 -0
  73. package/dist/cli/commands/init.js +365 -0
  74. package/dist/cli/commands/init.js.map +1 -0
  75. package/dist/cli/commands/start.d.ts +6 -0
  76. package/dist/cli/commands/start.d.ts.map +1 -0
  77. package/dist/cli/commands/start.js +61 -0
  78. package/dist/cli/commands/start.js.map +1 -0
  79. package/dist/cli/index.d.ts +3 -0
  80. package/dist/cli/index.d.ts.map +1 -0
  81. package/dist/cli/index.js +47 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/mcp-dev-wrapper.d.ts +3 -0
  84. package/dist/cli/mcp-dev-wrapper.d.ts.map +1 -0
  85. package/dist/cli/mcp-dev-wrapper.js +116 -0
  86. package/dist/cli/mcp-dev-wrapper.js.map +1 -0
  87. package/dist/core/apikey-module.d.ts +69 -0
  88. package/dist/core/apikey-module.d.ts.map +1 -0
  89. package/dist/core/apikey-module.js +114 -0
  90. package/dist/core/apikey-module.js.map +1 -0
  91. package/dist/core/app-decorator.d.ts +58 -0
  92. package/dist/core/app-decorator.d.ts.map +1 -0
  93. package/dist/core/app-decorator.js +261 -0
  94. package/dist/core/app-decorator.js.map +1 -0
  95. package/dist/core/builders.d.ts +38 -0
  96. package/dist/core/builders.d.ts.map +1 -0
  97. package/dist/core/builders.js +129 -0
  98. package/dist/core/builders.js.map +1 -0
  99. package/dist/core/component.d.ts +105 -0
  100. package/dist/core/component.d.ts.map +1 -0
  101. package/dist/core/component.js +182 -0
  102. package/dist/core/component.js.map +1 -0
  103. package/dist/core/config-module.d.ts +55 -0
  104. package/dist/core/config-module.d.ts.map +1 -0
  105. package/dist/core/config-module.js +94 -0
  106. package/dist/core/config-module.js.map +1 -0
  107. package/dist/core/decorators/cache.decorator.d.ts +61 -0
  108. package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
  109. package/dist/core/decorators/cache.decorator.js +115 -0
  110. package/dist/core/decorators/cache.decorator.js.map +1 -0
  111. package/dist/core/decorators/health-check.decorator.d.ts +80 -0
  112. package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
  113. package/dist/core/decorators/health-check.decorator.js +153 -0
  114. package/dist/core/decorators/health-check.decorator.js.map +1 -0
  115. package/dist/core/decorators/rate-limit.decorator.d.ts +62 -0
  116. package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
  117. package/dist/core/decorators/rate-limit.decorator.js +129 -0
  118. package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
  119. package/dist/core/decorators.d.ts +151 -0
  120. package/dist/core/decorators.d.ts.map +1 -0
  121. package/dist/core/decorators.js +142 -0
  122. package/dist/core/decorators.js.map +1 -0
  123. package/dist/core/di/container.d.ts +42 -0
  124. package/dist/core/di/container.d.ts.map +1 -0
  125. package/dist/core/di/container.js +76 -0
  126. package/dist/core/di/container.js.map +1 -0
  127. package/dist/core/di/injectable.decorator.d.ts +35 -0
  128. package/dist/core/di/injectable.decorator.d.ts.map +1 -0
  129. package/dist/core/di/injectable.decorator.js +57 -0
  130. package/dist/core/di/injectable.decorator.js.map +1 -0
  131. package/dist/core/errors.d.ts +54 -0
  132. package/dist/core/errors.d.ts.map +1 -0
  133. package/dist/core/errors.js +87 -0
  134. package/dist/core/errors.js.map +1 -0
  135. package/dist/core/events/event-emitter.d.ts +50 -0
  136. package/dist/core/events/event-emitter.d.ts.map +1 -0
  137. package/dist/core/events/event-emitter.js +94 -0
  138. package/dist/core/events/event-emitter.js.map +1 -0
  139. package/dist/core/events/event.decorator.d.ts +48 -0
  140. package/dist/core/events/event.decorator.d.ts.map +1 -0
  141. package/dist/core/events/event.decorator.js +68 -0
  142. package/dist/core/events/event.decorator.js.map +1 -0
  143. package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
  144. package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
  145. package/dist/core/filters/exception-filter.decorator.js +54 -0
  146. package/dist/core/filters/exception-filter.decorator.js.map +1 -0
  147. package/dist/core/filters/exception-filter.interface.d.ts +30 -0
  148. package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
  149. package/dist/core/filters/exception-filter.interface.js +2 -0
  150. package/dist/core/filters/exception-filter.interface.js.map +1 -0
  151. package/dist/core/guards/apikey.guard.d.ts +22 -0
  152. package/dist/core/guards/apikey.guard.d.ts.map +1 -0
  153. package/dist/core/guards/apikey.guard.js +11 -0
  154. package/dist/core/guards/apikey.guard.js.map +1 -0
  155. package/dist/core/guards/guard.interface.d.ts +18 -0
  156. package/dist/core/guards/guard.interface.d.ts.map +1 -0
  157. package/dist/core/guards/guard.interface.js +2 -0
  158. package/dist/core/guards/guard.interface.js.map +1 -0
  159. package/dist/core/guards/jwt.guard.d.ts +18 -0
  160. package/dist/core/guards/jwt.guard.d.ts.map +1 -0
  161. package/dist/core/guards/jwt.guard.js +2 -0
  162. package/dist/core/guards/jwt.guard.js.map +1 -0
  163. package/dist/core/guards/oauth.guard.d.ts +35 -0
  164. package/dist/core/guards/oauth.guard.d.ts.map +1 -0
  165. package/dist/core/guards/oauth.guard.js +2 -0
  166. package/dist/core/guards/oauth.guard.js.map +1 -0
  167. package/dist/core/guards/use-guards.decorator.d.ts +25 -0
  168. package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
  169. package/dist/core/guards/use-guards.decorator.js +32 -0
  170. package/dist/core/guards/use-guards.decorator.js.map +1 -0
  171. package/dist/core/health/health-checks.resource.d.ts +14 -0
  172. package/dist/core/health/health-checks.resource.d.ts.map +1 -0
  173. package/dist/core/health/health-checks.resource.js +29 -0
  174. package/dist/core/health/health-checks.resource.js.map +1 -0
  175. package/dist/core/index.d.ts +55 -0
  176. package/dist/core/index.d.ts.map +1 -0
  177. package/dist/core/index.js +57 -0
  178. package/dist/core/index.js.map +1 -0
  179. package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
  180. package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
  181. package/dist/core/interceptors/interceptor.decorator.js +51 -0
  182. package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
  183. package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
  184. package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
  185. package/dist/core/interceptors/interceptor.interface.js +2 -0
  186. package/dist/core/interceptors/interceptor.interface.js.map +1 -0
  187. package/dist/core/jwt-module.d.ts +51 -0
  188. package/dist/core/jwt-module.d.ts.map +1 -0
  189. package/dist/core/jwt-module.js +52 -0
  190. package/dist/core/jwt-module.js.map +1 -0
  191. package/dist/core/logger.d.ts +18 -0
  192. package/dist/core/logger.d.ts.map +1 -0
  193. package/dist/core/logger.js +51 -0
  194. package/dist/core/logger.js.map +1 -0
  195. package/dist/core/middleware/middleware.decorator.d.ts +39 -0
  196. package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
  197. package/dist/core/middleware/middleware.decorator.js +53 -0
  198. package/dist/core/middleware/middleware.decorator.js.map +1 -0
  199. package/dist/core/middleware/middleware.interface.d.ts +29 -0
  200. package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
  201. package/dist/core/middleware/middleware.interface.js +2 -0
  202. package/dist/core/middleware/middleware.interface.js.map +1 -0
  203. package/dist/core/module.d.ts +74 -0
  204. package/dist/core/module.d.ts.map +1 -0
  205. package/dist/core/module.js +82 -0
  206. package/dist/core/module.js.map +1 -0
  207. package/dist/core/oauth-module.d.ts +144 -0
  208. package/dist/core/oauth-module.d.ts.map +1 -0
  209. package/dist/core/oauth-module.js +190 -0
  210. package/dist/core/oauth-module.js.map +1 -0
  211. package/dist/core/pipes/pipe.decorator.d.ts +55 -0
  212. package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
  213. package/dist/core/pipes/pipe.decorator.js +85 -0
  214. package/dist/core/pipes/pipe.decorator.js.map +1 -0
  215. package/dist/core/pipes/pipe.interface.d.ts +36 -0
  216. package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
  217. package/dist/core/pipes/pipe.interface.js +2 -0
  218. package/dist/core/pipes/pipe.interface.js.map +1 -0
  219. package/dist/core/prompt.d.ts +37 -0
  220. package/dist/core/prompt.d.ts.map +1 -0
  221. package/dist/core/prompt.js +76 -0
  222. package/dist/core/prompt.js.map +1 -0
  223. package/dist/core/resource.d.ts +42 -0
  224. package/dist/core/resource.d.ts.map +1 -0
  225. package/dist/core/resource.js +90 -0
  226. package/dist/core/resource.js.map +1 -0
  227. package/dist/core/server.d.ts +72 -0
  228. package/dist/core/server.d.ts.map +1 -0
  229. package/dist/core/server.js +406 -0
  230. package/dist/core/server.js.map +1 -0
  231. package/dist/core/tool.d.ts +78 -0
  232. package/dist/core/tool.d.ts.map +1 -0
  233. package/dist/core/tool.js +190 -0
  234. package/dist/core/tool.js.map +1 -0
  235. package/dist/core/transports/http-server.d.ts +102 -0
  236. package/dist/core/transports/http-server.d.ts.map +1 -0
  237. package/dist/core/transports/http-server.js +265 -0
  238. package/dist/core/transports/http-server.js.map +1 -0
  239. package/dist/core/types.d.ts +123 -0
  240. package/dist/core/types.d.ts.map +1 -0
  241. package/dist/core/types.js +2 -0
  242. package/dist/core/types.js.map +1 -0
  243. package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
  244. package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
  245. package/dist/core/widgets/widget-examples.resource.js +28 -0
  246. package/dist/core/widgets/widget-examples.resource.js.map +1 -0
  247. package/dist/core/widgets/widget-registry.d.ts +56 -0
  248. package/dist/core/widgets/widget-registry.d.ts.map +1 -0
  249. package/dist/core/widgets/widget-registry.js +75 -0
  250. package/dist/core/widgets/widget-registry.js.map +1 -0
  251. package/dist/testing/index.d.ts +82 -0
  252. package/dist/testing/index.d.ts.map +1 -0
  253. package/dist/testing/index.js +164 -0
  254. package/dist/testing/index.js.map +1 -0
  255. package/dist/ui-next/index.d.ts +31 -0
  256. package/dist/ui-next/index.d.ts.map +1 -0
  257. package/dist/ui-next/index.js +687 -0
  258. package/dist/ui-next/index.js.map +1 -0
  259. package/dist/widgets/index.d.ts +9 -0
  260. package/dist/widgets/index.d.ts.map +1 -0
  261. package/dist/widgets/index.js +9 -0
  262. package/dist/widgets/index.js.map +1 -0
  263. package/dist/widgets/metadata.d.ts +53 -0
  264. package/dist/widgets/metadata.d.ts.map +1 -0
  265. package/dist/widgets/metadata.js +29 -0
  266. package/dist/widgets/metadata.js.map +1 -0
  267. package/dist/widgets/withToolData.d.ts +19 -0
  268. package/dist/widgets/withToolData.d.ts.map +1 -0
  269. package/dist/widgets/withToolData.js +240 -0
  270. package/dist/widgets/withToolData.js.map +1 -0
  271. package/jest.config.js +21 -0
  272. package/package.json +108 -0
  273. package/templates/typescript-auth/AI_AGENT_CLI_REFERENCE.md +702 -0
  274. package/templates/typescript-auth/AI_AGENT_SDK_REFERENCE.md +1260 -0
  275. package/templates/typescript-auth/README.md +400 -0
  276. package/templates/typescript-auth/package.json +44 -0
  277. package/templates/typescript-auth-api-key/AI_AGENT_CLI_REFERENCE.md +701 -0
  278. package/templates/typescript-auth-api-key/AI_AGENT_SDK_REFERENCE.md +1260 -0
  279. package/templates/typescript-auth-api-key/README.md +483 -0
  280. package/templates/typescript-auth-api-key/package-lock.json +124 -0
  281. package/templates/typescript-auth-api-key/package.json +29 -0
  282. package/templates/typescript-oauth/AI_AGENT_CLI_REFERENCE.md +701 -0
  283. package/templates/typescript-oauth/AI_AGENT_SDK_REFERENCE.md +1260 -0
  284. package/templates/typescript-oauth/OAUTH_SETUP.md +406 -0
  285. package/templates/typescript-oauth/README.md +350 -0
  286. package/templates/typescript-oauth/package.json +30 -0
  287. package/templates/typescript-starter/AI_AGENT_CLI_REFERENCE.md +701 -0
  288. package/templates/typescript-starter/AI_AGENT_SDK_REFERENCE.md +1260 -0
  289. package/templates/typescript-starter/README.md +312 -0
  290. package/templates/typescript-starter/package.json +32 -0
@@ -0,0 +1,94 @@
1
+ import { Express } from 'express';
2
+ import { SimpleJWTConfig } from './simple-jwt.js';
3
+ import { APIKeyConfig } from './api-key.js';
4
+ import { McpAuthConfig } from './server-integration.js';
5
+ /**
6
+ * Quick Setup Helpers
7
+ *
8
+ * Make it dead simple to add authentication to NitroStack servers
9
+ */
10
+ /**
11
+ * Setup Simple JWT Authentication (1-liner!)
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const server = createServer({...});
16
+ *
17
+ * // That's it! JWT auth enabled
18
+ * setupJWTAuth(server.app, {
19
+ * secret: process.env.JWT_SECRET!,
20
+ * });
21
+ *
22
+ * server.start();
23
+ * ```
24
+ */
25
+ export declare function setupJWTAuth(app: Express, config: SimpleJWTConfig, path?: string): void;
26
+ /**
27
+ * Setup API Key Authentication (1-liner!)
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const server = createServer({...});
32
+ *
33
+ * // That's it! API key auth enabled
34
+ * setupAPIKeyAuth(server.app, {
35
+ * keys: [process.env.API_KEY!],
36
+ * });
37
+ *
38
+ * server.start();
39
+ * ```
40
+ */
41
+ export declare function setupAPIKeyAuth(app: Express, config: APIKeyConfig, path?: string): void;
42
+ /**
43
+ * Setup OAuth 2.1 Authentication (full enterprise setup)
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const server = createServer({...});
48
+ *
49
+ * // Full OAuth 2.1 with PKCE
50
+ * setupOAuthAuth(server.app, {
51
+ * resourceUri: 'https://mcp.example.com',
52
+ * authorizationServers: ['https://auth.example.com'],
53
+ * tokenIntrospectionEndpoint: '...',
54
+ * tokenIntrospectionClientId: '...',
55
+ * tokenIntrospectionClientSecret: process.env.INTROSPECTION_SECRET,
56
+ * });
57
+ *
58
+ * server.start();
59
+ * ```
60
+ */
61
+ export declare function setupOAuthAuth(app: Express, config: McpAuthConfig, path?: string): void;
62
+ /**
63
+ * Generate test credentials (for development)
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const creds = generateTestCredentials();
68
+ * console.log('JWT Secret:', creds.jwtSecret);
69
+ * console.log('API Key:', creds.apiKey);
70
+ * console.log('Sample Token:', creds.sampleToken);
71
+ * ```
72
+ */
73
+ export declare function generateTestCredentials(options?: {
74
+ jwtAudience?: string;
75
+ jwtIssuer?: string;
76
+ apiKeyPrefix?: string;
77
+ }): {
78
+ jwtSecret: string;
79
+ apiKey: string;
80
+ apiKeyHashed: string;
81
+ sampleToken: string;
82
+ };
83
+ /**
84
+ * Print auth setup instructions
85
+ */
86
+ export declare function printAuthSetupInstructions(type: 'jwt' | 'apikey' | 'oauth'): void;
87
+ /**
88
+ * Validate auth environment variables
89
+ */
90
+ export declare function validateAuthEnv(type: 'jwt' | 'apikey' | 'oauth'): {
91
+ valid: boolean;
92
+ missing: string[];
93
+ };
94
+ //# sourceMappingURL=quick-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-setup.d.ts","sourceRoot":"","sources":["../../src/auth/quick-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAuB,eAAe,EAAe,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAoB,YAAY,EAA8B,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAuB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;;;GAIG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,eAAe,EACvB,IAAI,GAAE,MAAe,GACpB,IAAI,CAQN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,MAAe,GACpB,IAAI,CAQN;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,MAAe,GACpB,IAAI,CASN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;;;;;EAqBA;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CA8DjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmCvG"}
@@ -0,0 +1,210 @@
1
+ import { createSimpleJWTAuth, generateJWT } from './simple-jwt.js';
2
+ import { createAPIKeyAuth, generateAPIKey, hashAPIKey } from './api-key.js';
3
+ import { configureServerAuth } from './server-integration.js';
4
+ /**
5
+ * Quick Setup Helpers
6
+ *
7
+ * Make it dead simple to add authentication to NitroStack servers
8
+ */
9
+ /**
10
+ * Setup Simple JWT Authentication (1-liner!)
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const server = createServer({...});
15
+ *
16
+ * // That's it! JWT auth enabled
17
+ * setupJWTAuth(server.app, {
18
+ * secret: process.env.JWT_SECRET!,
19
+ * });
20
+ *
21
+ * server.start();
22
+ * ```
23
+ */
24
+ export function setupJWTAuth(app, config, path = '/mcp') {
25
+ const middleware = createSimpleJWTAuth(config);
26
+ app.use(path, middleware);
27
+ console.log(`✅ Simple JWT auth enabled on ${path}`);
28
+ console.log(` Audience: ${config.audience || 'any'}`);
29
+ console.log(` Issuer: ${config.issuer || 'any'}`);
30
+ console.log(` Algorithm: ${config.algorithm || 'HS256'}`);
31
+ }
32
+ /**
33
+ * Setup API Key Authentication (1-liner!)
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const server = createServer({...});
38
+ *
39
+ * // That's it! API key auth enabled
40
+ * setupAPIKeyAuth(server.app, {
41
+ * keys: [process.env.API_KEY!],
42
+ * });
43
+ *
44
+ * server.start();
45
+ * ```
46
+ */
47
+ export function setupAPIKeyAuth(app, config, path = '/mcp') {
48
+ const middleware = createAPIKeyAuth(config);
49
+ app.use(path, middleware);
50
+ console.log(`✅ API Key auth enabled on ${path}`);
51
+ console.log(` Header: ${config.headerName || 'X-API-Key'}`);
52
+ console.log(` Keys: ${config.keys.length} configured`);
53
+ console.log(` Query param: ${config.allowQueryParam ? 'enabled' : 'disabled'}`);
54
+ }
55
+ /**
56
+ * Setup OAuth 2.1 Authentication (full enterprise setup)
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const server = createServer({...});
61
+ *
62
+ * // Full OAuth 2.1 with PKCE
63
+ * setupOAuthAuth(server.app, {
64
+ * resourceUri: 'https://mcp.example.com',
65
+ * authorizationServers: ['https://auth.example.com'],
66
+ * tokenIntrospectionEndpoint: '...',
67
+ * tokenIntrospectionClientId: '...',
68
+ * tokenIntrospectionClientSecret: process.env.INTROSPECTION_SECRET,
69
+ * });
70
+ *
71
+ * server.start();
72
+ * ```
73
+ */
74
+ export function setupOAuthAuth(app, config, path = '/mcp') {
75
+ configureServerAuth(app, config, {
76
+ protectRoutes: [path],
77
+ });
78
+ console.log(`✅ OAuth 2.1 auth enabled on ${path}`);
79
+ console.log(` Resource URI: ${config.resourceUri}`);
80
+ console.log(` Auth Servers: ${config.authorizationServers.join(', ')}`);
81
+ console.log(` Scopes: ${config.scopesSupported?.join(', ') || 'none'}`);
82
+ }
83
+ /**
84
+ * Generate test credentials (for development)
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * const creds = generateTestCredentials();
89
+ * console.log('JWT Secret:', creds.jwtSecret);
90
+ * console.log('API Key:', creds.apiKey);
91
+ * console.log('Sample Token:', creds.sampleToken);
92
+ * ```
93
+ */
94
+ export function generateTestCredentials(options) {
95
+ const jwtSecret = generateAPIKey('jwt_secret');
96
+ const apiKey = generateAPIKey(options?.apiKeyPrefix);
97
+ const sampleToken = generateJWT({
98
+ secret: jwtSecret,
99
+ payload: {
100
+ sub: 'test-user',
101
+ scopes: ['mcp:read', 'mcp:write'],
102
+ },
103
+ expiresIn: '1h',
104
+ audience: options?.jwtAudience,
105
+ issuer: options?.jwtIssuer,
106
+ });
107
+ return {
108
+ jwtSecret,
109
+ apiKey,
110
+ apiKeyHashed: hashAPIKey(apiKey),
111
+ sampleToken,
112
+ };
113
+ }
114
+ /**
115
+ * Print auth setup instructions
116
+ */
117
+ export function printAuthSetupInstructions(type) {
118
+ console.log('\n╔══════════════════════════════════════════════════════════════╗');
119
+ console.log('║ AUTH SETUP INSTRUCTIONS ║');
120
+ console.log('╚══════════════════════════════════════════════════════════════╝\n');
121
+ if (type === 'jwt') {
122
+ console.log('📝 Simple JWT Authentication Setup:\n');
123
+ console.log('1. Generate a secret:');
124
+ console.log(' const creds = generateTestCredentials();');
125
+ console.log(' console.log(creds.jwtSecret);\n');
126
+ console.log('2. Add to .env:');
127
+ console.log(' JWT_SECRET=jwt_secret_...\n');
128
+ console.log('3. Enable in server:');
129
+ console.log(' setupJWTAuth(server.app, {');
130
+ console.log(' secret: process.env.JWT_SECRET!,');
131
+ console.log(' audience: "my-mcp-server",');
132
+ console.log(' });\n');
133
+ console.log('4. Generate tokens:');
134
+ console.log(' const token = generateJWT({');
135
+ console.log(' secret: process.env.JWT_SECRET!,');
136
+ console.log(' payload: { sub: "user123" },');
137
+ console.log(' expiresIn: "1h",');
138
+ console.log(' });\n');
139
+ console.log('5. Use in client:');
140
+ console.log(' Authorization: Bearer <token>\n');
141
+ }
142
+ if (type === 'apikey') {
143
+ console.log('📝 API Key Authentication Setup:\n');
144
+ console.log('1. Generate API keys:');
145
+ console.log(' const key1 = generateAPIKey();');
146
+ console.log(' const key2 = generateAPIKey();\n');
147
+ console.log('2. Add to .env:');
148
+ console.log(' API_KEY_1=sk_...');
149
+ console.log(' API_KEY_2=sk_...\n');
150
+ console.log('3. Enable in server:');
151
+ console.log(' setupAPIKeyAuth(server.app, {');
152
+ console.log(' keys: [');
153
+ console.log(' process.env.API_KEY_1!,');
154
+ console.log(' process.env.API_KEY_2!,');
155
+ console.log(' ],');
156
+ console.log(' });\n');
157
+ console.log('4. Use in client:');
158
+ console.log(' X-API-Key: sk_...\n');
159
+ }
160
+ if (type === 'oauth') {
161
+ console.log('📝 OAuth 2.1 Authentication Setup:\n');
162
+ console.log('1. Deploy an OAuth 2.1 authorization server');
163
+ console.log(' (e.g., Auth0, Keycloak, Azure AD)\n');
164
+ console.log('2. Configure in server:');
165
+ console.log(' setupOAuthAuth(server.app, {');
166
+ console.log(' resourceUri: "https://mcp.example.com",');
167
+ console.log(' authorizationServers: ["https://auth.example.com"],');
168
+ console.log(' tokenIntrospectionEndpoint: "...",');
169
+ console.log(' tokenIntrospectionClientId: "...",');
170
+ console.log(' tokenIntrospectionClientSecret: process.env.SECRET,');
171
+ console.log(' });\n');
172
+ console.log('3. Use the inspector AUTH tab to test\n');
173
+ }
174
+ console.log('═══════════════════════════════════════════════════════════════\n');
175
+ }
176
+ /**
177
+ * Validate auth environment variables
178
+ */
179
+ export function validateAuthEnv(type) {
180
+ const missing = [];
181
+ if (type === 'jwt') {
182
+ if (!process.env.JWT_SECRET) {
183
+ missing.push('JWT_SECRET');
184
+ }
185
+ }
186
+ if (type === 'apikey') {
187
+ if (!process.env.API_KEY_1 && !process.env.API_KEY) {
188
+ missing.push('API_KEY_1 or API_KEY');
189
+ }
190
+ }
191
+ if (type === 'oauth') {
192
+ const required = [
193
+ 'OAUTH_RESOURCE_URI',
194
+ 'OAUTH_AUTH_SERVER',
195
+ 'OAUTH_INTROSPECTION_ENDPOINT',
196
+ 'OAUTH_CLIENT_ID',
197
+ 'OAUTH_CLIENT_SECRET',
198
+ ];
199
+ for (const key of required) {
200
+ if (!process.env[key]) {
201
+ missing.push(key);
202
+ }
203
+ }
204
+ }
205
+ return {
206
+ valid: missing.length === 0,
207
+ missing,
208
+ };
209
+ }
210
+ //# sourceMappingURL=quick-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-setup.js","sourceRoot":"","sources":["../../src/auth/quick-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { Express } from 'express';
2
+ import { McpAuthConfig } from './types.js';
3
+ import { requireScopes } from './middleware.js';
4
+ export type { McpAuthConfig } from './types.js';
5
+ /**
6
+ * Server Integration Utilities
7
+ *
8
+ * Easy integration of OAuth 2.1 auth into MCP servers
9
+ */
10
+ /**
11
+ * Configure authentication for MCP server
12
+ *
13
+ * This adds:
14
+ * 1. Protected Resource Metadata endpoint
15
+ * 2. Authentication middleware to specified routes
16
+ *
17
+ * @param app - Express application
18
+ * @param config - Auth configuration
19
+ * @param protectRoutes - Routes to protect with auth (default: all /mcp routes)
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const app = express();
24
+ *
25
+ * configureServerAuth(app, {
26
+ * resourceUri: 'https://mcp.example.com',
27
+ * authorizationServers: ['https://auth.example.com'],
28
+ * tokenIntrospectionEndpoint: 'https://auth.example.com/oauth/introspect',
29
+ * tokenIntrospectionClientId: 'mcp-server',
30
+ * tokenIntrospectionClientSecret: process.env.INTROSPECTION_SECRET,
31
+ * audience: 'https://mcp.example.com',
32
+ * scopesSupported: ['mcp:read', 'mcp:write']
33
+ * }, {
34
+ * protectRoutes: ['/mcp/*']
35
+ * });
36
+ * ```
37
+ */
38
+ export declare function configureServerAuth(app: Express, config: McpAuthConfig, options?: {
39
+ protectRoutes?: string[];
40
+ metadataPath?: string;
41
+ }): void;
42
+ /**
43
+ * Scope-based route protection helper
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const scopes = createScopeGuards(['mcp:read', 'mcp:write', 'mcp:admin']);
48
+ *
49
+ * app.get('/mcp/tools', scopes.read, (req, res) => {
50
+ * // List tools - requires mcp:read
51
+ * });
52
+ *
53
+ * app.post('/mcp/tools/execute', scopes.write, (req, res) => {
54
+ * // Execute tool - requires mcp:write
55
+ * });
56
+ *
57
+ * app.delete('/mcp/resources', scopes.admin, (req, res) => {
58
+ * // Delete resource - requires mcp:admin
59
+ * });
60
+ * ```
61
+ */
62
+ export declare function createScopeGuards(scopeConfig: {
63
+ read?: string[];
64
+ write?: string[];
65
+ admin?: string[];
66
+ [key: string]: string[] | undefined;
67
+ }): Record<string, ReturnType<typeof requireScopes>>;
68
+ /**
69
+ * Create standard MCP scope configuration
70
+ *
71
+ * Returns scope guards for common MCP operations:
72
+ * - read: List tools, resources, prompts
73
+ * - execute: Execute tools, get prompts
74
+ * - write: Modify resources
75
+ * - admin: Server configuration
76
+ *
77
+ * @param scopePrefix - Scope prefix (default: 'mcp')
78
+ */
79
+ export declare function createMCPScopeGuards(scopePrefix?: string): Record<string, import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>>;
80
+ /**
81
+ * Generate suggested scopes for MCP server
82
+ *
83
+ * Returns standard scope definitions for MCP operations
84
+ */
85
+ export declare function getStandardMCPScopes(scopePrefix?: string): {
86
+ scopes: string[];
87
+ descriptions: Record<string, string>;
88
+ };
89
+ /**
90
+ * Helper to validate auth configuration
91
+ */
92
+ export declare function validateAuthConfig(config: McpAuthConfig): {
93
+ valid: boolean;
94
+ errors: string[];
95
+ warnings: string[];
96
+ };
97
+ //# sourceMappingURL=server-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-integration.d.ts","sourceRoot":"","sources":["../../src/auth/server-integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAwB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGtE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,IAAI,CA0BN;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE;IAC7C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACrC,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAUnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,GAAE,MAAc,gKAO/D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,GAAE,MAAc,GAAG;IACjE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAgBA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG;IACzD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAkEA"}
@@ -0,0 +1,182 @@
1
+ import { createProtectedResourceMetadata } from './server-metadata.js';
2
+ import { createAuthMiddleware, requireScopes } from './middleware.js';
3
+ /**
4
+ * Server Integration Utilities
5
+ *
6
+ * Easy integration of OAuth 2.1 auth into MCP servers
7
+ */
8
+ /**
9
+ * Configure authentication for MCP server
10
+ *
11
+ * This adds:
12
+ * 1. Protected Resource Metadata endpoint
13
+ * 2. Authentication middleware to specified routes
14
+ *
15
+ * @param app - Express application
16
+ * @param config - Auth configuration
17
+ * @param protectRoutes - Routes to protect with auth (default: all /mcp routes)
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const app = express();
22
+ *
23
+ * configureServerAuth(app, {
24
+ * resourceUri: 'https://mcp.example.com',
25
+ * authorizationServers: ['https://auth.example.com'],
26
+ * tokenIntrospectionEndpoint: 'https://auth.example.com/oauth/introspect',
27
+ * tokenIntrospectionClientId: 'mcp-server',
28
+ * tokenIntrospectionClientSecret: process.env.INTROSPECTION_SECRET,
29
+ * audience: 'https://mcp.example.com',
30
+ * scopesSupported: ['mcp:read', 'mcp:write']
31
+ * }, {
32
+ * protectRoutes: ['/mcp/*']
33
+ * });
34
+ * ```
35
+ */
36
+ export function configureServerAuth(app, config, options) {
37
+ const metadataPath = options?.metadataPath || '/.well-known/oauth-protected-resource';
38
+ const protectRoutes = options?.protectRoutes || ['/mcp/*'];
39
+ // 1. Add Protected Resource Metadata endpoint
40
+ app.get(metadataPath, (req, res) => {
41
+ const metadata = createProtectedResourceMetadata(config.resourceUri, config.authorizationServers, config.scopesSupported);
42
+ res.json(metadata);
43
+ });
44
+ // 2. Apply auth middleware to protected routes
45
+ const authMiddleware = createAuthMiddleware(config);
46
+ for (const route of protectRoutes) {
47
+ app.use(route, authMiddleware);
48
+ }
49
+ console.log(`🔐 OAuth 2.1 authentication configured for ${config.resourceUri}`);
50
+ console.log(` Authorization servers: ${config.authorizationServers.join(', ')}`);
51
+ console.log(` Protected routes: ${protectRoutes.join(', ')}`);
52
+ console.log(` Metadata endpoint: ${metadataPath}`);
53
+ }
54
+ /**
55
+ * Scope-based route protection helper
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const scopes = createScopeGuards(['mcp:read', 'mcp:write', 'mcp:admin']);
60
+ *
61
+ * app.get('/mcp/tools', scopes.read, (req, res) => {
62
+ * // List tools - requires mcp:read
63
+ * });
64
+ *
65
+ * app.post('/mcp/tools/execute', scopes.write, (req, res) => {
66
+ * // Execute tool - requires mcp:write
67
+ * });
68
+ *
69
+ * app.delete('/mcp/resources', scopes.admin, (req, res) => {
70
+ * // Delete resource - requires mcp:admin
71
+ * });
72
+ * ```
73
+ */
74
+ export function createScopeGuards(scopeConfig) {
75
+ const guards = {};
76
+ for (const [name, scopes] of Object.entries(scopeConfig)) {
77
+ if (scopes && scopes.length > 0) {
78
+ guards[name] = requireScopes(...scopes);
79
+ }
80
+ }
81
+ return guards;
82
+ }
83
+ /**
84
+ * Create standard MCP scope configuration
85
+ *
86
+ * Returns scope guards for common MCP operations:
87
+ * - read: List tools, resources, prompts
88
+ * - execute: Execute tools, get prompts
89
+ * - write: Modify resources
90
+ * - admin: Server configuration
91
+ *
92
+ * @param scopePrefix - Scope prefix (default: 'mcp')
93
+ */
94
+ export function createMCPScopeGuards(scopePrefix = 'mcp') {
95
+ return createScopeGuards({
96
+ read: [`${scopePrefix}:read`],
97
+ execute: [`${scopePrefix}:read`, `${scopePrefix}:execute`],
98
+ write: [`${scopePrefix}:read`, `${scopePrefix}:write`],
99
+ admin: [`${scopePrefix}:admin`],
100
+ });
101
+ }
102
+ /**
103
+ * Generate suggested scopes for MCP server
104
+ *
105
+ * Returns standard scope definitions for MCP operations
106
+ */
107
+ export function getStandardMCPScopes(scopePrefix = 'mcp') {
108
+ const scopes = [
109
+ `${scopePrefix}:read`,
110
+ `${scopePrefix}:execute`,
111
+ `${scopePrefix}:write`,
112
+ `${scopePrefix}:admin`,
113
+ ];
114
+ const descriptions = {
115
+ [`${scopePrefix}:read`]: 'Read access to tools, resources, and prompts',
116
+ [`${scopePrefix}:execute`]: 'Execute tools and get prompts',
117
+ [`${scopePrefix}:write`]: 'Modify resources and server state',
118
+ [`${scopePrefix}:admin`]: 'Administrative access to server configuration',
119
+ };
120
+ return { scopes, descriptions };
121
+ }
122
+ /**
123
+ * Helper to validate auth configuration
124
+ */
125
+ export function validateAuthConfig(config) {
126
+ const errors = [];
127
+ const warnings = [];
128
+ // Required fields
129
+ if (!config.resourceUri) {
130
+ errors.push('resourceUri is required');
131
+ }
132
+ if (!config.authorizationServers || config.authorizationServers.length === 0) {
133
+ errors.push('At least one authorization server is required');
134
+ }
135
+ // Token validation method
136
+ const hasIntrospection = !!config.tokenIntrospectionEndpoint;
137
+ const hasJWT = !!config.jwksUri;
138
+ if (!hasIntrospection && !hasJWT) {
139
+ errors.push('Either tokenIntrospectionEndpoint or jwksUri must be configured');
140
+ }
141
+ // Introspection credentials
142
+ if (hasIntrospection) {
143
+ if (!config.tokenIntrospectionClientId) {
144
+ warnings.push('tokenIntrospectionClientId not set - introspection may fail');
145
+ }
146
+ if (!config.tokenIntrospectionClientSecret) {
147
+ warnings.push('tokenIntrospectionClientSecret not set - introspection may fail');
148
+ }
149
+ }
150
+ // JWT validation
151
+ if (hasJWT) {
152
+ if (!config.audience) {
153
+ errors.push('audience is required for JWT validation (prevents confused deputy attacks)');
154
+ }
155
+ if (!config.issuer) {
156
+ warnings.push('issuer not set - JWT validation may be less strict');
157
+ }
158
+ }
159
+ // Audience (critical for security)
160
+ if (!config.audience) {
161
+ warnings.push('audience not set - tokens will not be validated for this resource. ' +
162
+ 'This is a security risk (confused deputy attacks).');
163
+ }
164
+ // HTTPS
165
+ if (config.requireHttps !== false && process.env.NODE_ENV === 'production') {
166
+ try {
167
+ const url = new URL(config.resourceUri);
168
+ if (url.protocol !== 'https:') {
169
+ errors.push('resourceUri must use HTTPS in production');
170
+ }
171
+ }
172
+ catch {
173
+ errors.push('resourceUri is not a valid URL');
174
+ }
175
+ }
176
+ return {
177
+ valid: errors.length === 0,
178
+ errors,
179
+ warnings,
180
+ };
181
+ }
182
+ //# sourceMappingURL=server-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-integration.js","sourceRoot":"","sources":["../../src/auth/server-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { ProtectedResourceMetadata } from './types.js';
2
+ /**
3
+ * Protected Resource Metadata (RFC 9728)
4
+ *
5
+ * MCP servers MUST implement this to advertise their authorization servers
6
+ * to MCP clients. This enables automatic discovery of auth configuration.
7
+ */
8
+ /**
9
+ * Create protected resource metadata document
10
+ *
11
+ * @param resourceUri - The URI of this MCP server
12
+ * @param authorizationServers - Array of authorization server issuer URLs
13
+ * @param scopesSupported - Optional: scopes this resource supports
14
+ */
15
+ export declare function createProtectedResourceMetadata(resourceUri: string, authorizationServers: string[], scopesSupported?: string[]): ProtectedResourceMetadata;
16
+ /**
17
+ * Get well-known URI for protected resource metadata
18
+ * Per RFC 9728, can be at:
19
+ * 1. Resource path: /.well-known/oauth-protected-resource{path}
20
+ * 2. Root: /.well-known/oauth-protected-resource
21
+ */
22
+ export declare function getWellKnownMetadataUris(resourceUrl: URL): string[];
23
+ /**
24
+ * Generate WWW-Authenticate header value for 401 responses
25
+ * Per RFC 6750 and MCP spec
26
+ *
27
+ * @param resourceMetadataUrl - URL to protected resource metadata
28
+ * @param scope - Optional: required scopes for this request
29
+ * @param error - Optional: error code (invalid_token, insufficient_scope, etc.)
30
+ * @param errorDescription - Optional: human-readable error description
31
+ */
32
+ export declare function generateWWWAuthenticateHeader(options: {
33
+ resourceMetadataUrl?: string;
34
+ scope?: string;
35
+ error?: string;
36
+ errorDescription?: string;
37
+ realm?: string;
38
+ }): string;
39
+ /**
40
+ * Parse WWW-Authenticate header
41
+ * Extracts Bearer auth challenge parameters
42
+ */
43
+ export declare function parseWWWAuthenticateHeader(headerValue: string): {
44
+ scheme: string;
45
+ realm?: string;
46
+ scope?: string;
47
+ resourceMetadata?: string;
48
+ error?: string;
49
+ errorDescription?: string;
50
+ } | null;
51
+ //# sourceMappingURL=server-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-metadata.d.ts","sourceRoot":"","sources":["../../src/auth/server-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;GAKG;AAEH;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,yBAAyB,CAO3B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,GAAG,GAAG,MAAM,EAAE,CAcnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAwBT;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,IAAI,CAoCP"}