@scupit/mcp-ecosystem 0.1.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 (121) hide show
  1. package/dist/auth0/index.d.ts +3 -0
  2. package/dist/auth0/index.d.ts.map +1 -0
  3. package/dist/auth0/index.js +2 -0
  4. package/dist/auth0/index.js.map +1 -0
  5. package/dist/auth0/management-client.d.ts +78 -0
  6. package/dist/auth0/management-client.d.ts.map +1 -0
  7. package/dist/auth0/management-client.js +183 -0
  8. package/dist/auth0/management-client.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +150 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/commands/add-scope.d.ts +9 -0
  14. package/dist/commands/add-scope.d.ts.map +1 -0
  15. package/dist/commands/add-scope.js +55 -0
  16. package/dist/commands/add-scope.js.map +1 -0
  17. package/dist/commands/generate-artifacts.d.ts +10 -0
  18. package/dist/commands/generate-artifacts.d.ts.map +1 -0
  19. package/dist/commands/generate-artifacts.js +91 -0
  20. package/dist/commands/generate-artifacts.js.map +1 -0
  21. package/dist/commands/grant-client.d.ts +12 -0
  22. package/dist/commands/grant-client.d.ts.map +1 -0
  23. package/dist/commands/grant-client.js +111 -0
  24. package/dist/commands/grant-client.js.map +1 -0
  25. package/dist/commands/index.d.ts +15 -0
  26. package/dist/commands/index.d.ts.map +1 -0
  27. package/dist/commands/index.js +8 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/reconcile-all.d.ts +10 -0
  30. package/dist/commands/reconcile-all.d.ts.map +1 -0
  31. package/dist/commands/reconcile-all.js +58 -0
  32. package/dist/commands/reconcile-all.js.map +1 -0
  33. package/dist/commands/reconcile-client.d.ts +11 -0
  34. package/dist/commands/reconcile-client.d.ts.map +1 -0
  35. package/dist/commands/reconcile-client.js +295 -0
  36. package/dist/commands/reconcile-client.js.map +1 -0
  37. package/dist/commands/reconcile-server.d.ts +18 -0
  38. package/dist/commands/reconcile-server.d.ts.map +1 -0
  39. package/dist/commands/reconcile-server.js +213 -0
  40. package/dist/commands/reconcile-server.js.map +1 -0
  41. package/dist/commands/verify-tenant.d.ts +10 -0
  42. package/dist/commands/verify-tenant.d.ts.map +1 -0
  43. package/dist/commands/verify-tenant.js +76 -0
  44. package/dist/commands/verify-tenant.js.map +1 -0
  45. package/dist/config/index.d.ts +3 -0
  46. package/dist/config/index.d.ts.map +1 -0
  47. package/dist/config/index.js +2 -0
  48. package/dist/config/index.js.map +1 -0
  49. package/dist/config/loader.d.ts +21 -0
  50. package/dist/config/loader.d.ts.map +1 -0
  51. package/dist/config/loader.js +181 -0
  52. package/dist/config/loader.js.map +1 -0
  53. package/dist/index.d.ts +9 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +7 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp-runtime/auth-middleware.d.ts +27 -0
  58. package/dist/mcp-runtime/auth-middleware.d.ts.map +1 -0
  59. package/dist/mcp-runtime/auth-middleware.js +88 -0
  60. package/dist/mcp-runtime/auth-middleware.js.map +1 -0
  61. package/dist/mcp-runtime/index.d.ts +9 -0
  62. package/dist/mcp-runtime/index.d.ts.map +1 -0
  63. package/dist/mcp-runtime/index.js +5 -0
  64. package/dist/mcp-runtime/index.js.map +1 -0
  65. package/dist/mcp-runtime/protected-resource-metadata.d.ts +20 -0
  66. package/dist/mcp-runtime/protected-resource-metadata.d.ts.map +1 -0
  67. package/dist/mcp-runtime/protected-resource-metadata.js +30 -0
  68. package/dist/mcp-runtime/protected-resource-metadata.js.map +1 -0
  69. package/dist/mcp-runtime/token-validator.d.ts +32 -0
  70. package/dist/mcp-runtime/token-validator.d.ts.map +1 -0
  71. package/dist/mcp-runtime/token-validator.js +59 -0
  72. package/dist/mcp-runtime/token-validator.js.map +1 -0
  73. package/dist/mcp-runtime/www-authenticate.d.ts +19 -0
  74. package/dist/mcp-runtime/www-authenticate.d.ts.map +1 -0
  75. package/dist/mcp-runtime/www-authenticate.js +39 -0
  76. package/dist/mcp-runtime/www-authenticate.js.map +1 -0
  77. package/dist/mcp-server/create-server.d.ts +44 -0
  78. package/dist/mcp-server/create-server.d.ts.map +1 -0
  79. package/dist/mcp-server/create-server.js +73 -0
  80. package/dist/mcp-server/create-server.js.map +1 -0
  81. package/dist/mcp-server/index.d.ts +3 -0
  82. package/dist/mcp-server/index.d.ts.map +1 -0
  83. package/dist/mcp-server/index.js +2 -0
  84. package/dist/mcp-server/index.js.map +1 -0
  85. package/dist/types/auth0-responses.d.ts +46 -0
  86. package/dist/types/auth0-responses.d.ts.map +1 -0
  87. package/dist/types/auth0-responses.js +6 -0
  88. package/dist/types/auth0-responses.js.map +1 -0
  89. package/dist/types/client-config.d.ts +96 -0
  90. package/dist/types/client-config.d.ts.map +1 -0
  91. package/dist/types/client-config.js +32 -0
  92. package/dist/types/client-config.js.map +1 -0
  93. package/dist/types/client-descriptor.d.ts +45 -0
  94. package/dist/types/client-descriptor.d.ts.map +1 -0
  95. package/dist/types/client-descriptor.js +22 -0
  96. package/dist/types/client-descriptor.js.map +1 -0
  97. package/dist/types/ecosystem-config.d.ts +210 -0
  98. package/dist/types/ecosystem-config.d.ts.map +1 -0
  99. package/dist/types/ecosystem-config.js +64 -0
  100. package/dist/types/ecosystem-config.js.map +1 -0
  101. package/dist/types/index.d.ts +10 -0
  102. package/dist/types/index.d.ts.map +1 -0
  103. package/dist/types/index.js +5 -0
  104. package/dist/types/index.js.map +1 -0
  105. package/dist/types/server-config.d.ts +73 -0
  106. package/dist/types/server-config.d.ts.map +1 -0
  107. package/dist/types/server-config.js +30 -0
  108. package/dist/types/server-config.js.map +1 -0
  109. package/dist/utils/context.d.ts +19 -0
  110. package/dist/utils/context.d.ts.map +1 -0
  111. package/dist/utils/context.js +29 -0
  112. package/dist/utils/context.js.map +1 -0
  113. package/dist/utils/index.d.ts +4 -0
  114. package/dist/utils/index.d.ts.map +1 -0
  115. package/dist/utils/index.js +3 -0
  116. package/dist/utils/index.js.map +1 -0
  117. package/dist/utils/logger.d.ts +11 -0
  118. package/dist/utils/logger.d.ts.map +1 -0
  119. package/dist/utils/logger.js +29 -0
  120. package/dist/utils/logger.js.map +1 -0
  121. package/package.json +67 -0
@@ -0,0 +1,213 @@
1
+ import { logger } from "../utils/index.js";
2
+ import { deriveCanonicalResourceUri, resolveScopes, resolveGrantTargets, } from "../config/index.js";
3
+ import { reconcileClient } from "./reconcile-client.js";
4
+ const SCOPE_DESCRIPTIONS = {
5
+ "resources.read": "Read MCP resources",
6
+ "prompts.read": "Read MCP prompts",
7
+ "tools.read": "Execute read-only tools",
8
+ "tools.write": "Execute mutating tools",
9
+ };
10
+ export async function reconcileServer(ctx, serverSlug) {
11
+ const { config } = ctx;
12
+ const serverConfig = config.serverConfigs.get(serverSlug);
13
+ if (!serverConfig) {
14
+ throw new Error(`Unknown server slug: "${serverSlug}"`);
15
+ }
16
+ const ecosystem = config.ecosystem;
17
+ const identifier = deriveCanonicalResourceUri(ecosystem, serverConfig.slug);
18
+ const allScopes = resolveScopes(ecosystem, serverConfig);
19
+ logger.info(`Reconciling server: ${serverConfig.name} (${serverConfig.slug})`);
20
+ logger.debug(` Identifier: ${identifier}`);
21
+ logger.debug(` Scopes: ${allScopes.join(", ")}`);
22
+ // ── Phase 1: Reconcile Auth0 API ──
23
+ const apiResult = await reconcileApi(ctx, serverConfig, identifier, allScopes);
24
+ // ── Phase 2: Reconcile access policy ──
25
+ if (apiResult.action !== "dry_run") {
26
+ await reconcileAccessPolicy(ctx, apiResult.auth0ApiId, serverConfig);
27
+ }
28
+ // ── Phase 3: Reconcile client grants ──
29
+ const grantTargets = resolveGrantTargets(ecosystem, serverConfig, config.clientConfigs);
30
+ const grantResults = [];
31
+ for (const target of grantTargets) {
32
+ const clientConfig = config.clientConfigs.get(target.clientKey);
33
+ if (!clientConfig) {
34
+ logger.warn(` Skipping grant for unknown client: ${target.clientKey}`);
35
+ continue;
36
+ }
37
+ let clientId = clientConfig.auth0.existing_client_id;
38
+ if (!clientId) {
39
+ logger.info(` Ensuring client "${target.clientKey}" exists...`);
40
+ const clientResult = await reconcileClient(ctx, target.clientKey);
41
+ clientId = clientResult.clientId;
42
+ }
43
+ if (!clientId || clientId === "__DRY_RUN__") {
44
+ grantResults.push({
45
+ clientKey: target.clientKey,
46
+ clientId: clientId ?? "__DRY_RUN__",
47
+ action: "dry_run",
48
+ scopes: target.scopes,
49
+ subjectType: target.subjectType,
50
+ });
51
+ continue;
52
+ }
53
+ if (target.subjectType === "client" &&
54
+ resolveClientAccessPolicy(serverConfig) === "deny_all") {
55
+ logger.warn(` Server "${serverSlug}" has client access policy deny_all. ` +
56
+ `Skipping M2M grant for "${target.clientKey}". ` +
57
+ `Set access_policy.client to "require_client_grant" to enable.`);
58
+ continue;
59
+ }
60
+ const grantResult = await reconcileGrant(ctx, target.clientKey, clientId, identifier, target.scopes, target.subjectType);
61
+ grantResults.push(grantResult);
62
+ }
63
+ logger.blank();
64
+ logger.success(`Server "${serverConfig.name}" reconciliation complete.`);
65
+ return {
66
+ slug: serverConfig.slug,
67
+ apiIdentifier: identifier,
68
+ auth0ApiId: apiResult.auth0ApiId,
69
+ action: apiResult.action,
70
+ scopes: allScopes,
71
+ grantResults,
72
+ };
73
+ }
74
+ async function reconcileApi(ctx, server, identifier, scopes) {
75
+ const { config, auth0, dryRun } = ctx;
76
+ const ecosystem = config.ecosystem;
77
+ const signingAlg = ecosystem.defaults.api.signing_alg;
78
+ const tokenDialect = ecosystem.defaults.api.token_dialect;
79
+ const scopePayload = scopes.map((s) => ({
80
+ value: s,
81
+ description: SCOPE_DESCRIPTIONS[s] ?? `Scope: ${s}`,
82
+ }));
83
+ if (server.auth0?.existing_api_id) {
84
+ logger.info(` Using existing API ID: ${server.auth0.existing_api_id}`);
85
+ const existing = await auth0.getApi(server.auth0.existing_api_id);
86
+ return reconcileExistingApi(ctx, existing, server, scopePayload, signingAlg, tokenDialect);
87
+ }
88
+ logger.info(" Searching for existing Auth0 API by identifier...");
89
+ const existing = await auth0.findApiByIdentifier(identifier);
90
+ if (existing) {
91
+ logger.info(` Found existing API: ${existing.name} (${existing.id})`);
92
+ return reconcileExistingApi(ctx, existing, server, scopePayload, signingAlg, tokenDialect);
93
+ }
94
+ if (server.auth0?.create_api_if_missing === false) {
95
+ throw new Error(`No Auth0 API found for identifier "${identifier}" and create_api_if_missing is false.`);
96
+ }
97
+ if (dryRun) {
98
+ logger.info(" [DRY RUN] Would create Auth0 API.");
99
+ return { auth0ApiId: "__DRY_RUN__", action: "dry_run" };
100
+ }
101
+ logger.info(" Creating Auth0 API...");
102
+ const newApi = await auth0.createApi({
103
+ name: server.name,
104
+ identifier,
105
+ signing_alg: signingAlg,
106
+ token_dialect: tokenDialect,
107
+ enforce_policies: true,
108
+ scopes: scopePayload,
109
+ });
110
+ logger.success(` API created: ${newApi.name} (${newApi.id})`);
111
+ return { auth0ApiId: newApi.id, action: "created" };
112
+ }
113
+ async function reconcileExistingApi(ctx, existing, _server, desiredScopes, signingAlg, tokenDialect) {
114
+ const { auth0, dryRun } = ctx;
115
+ const needsUpdate = existing.signing_alg !== signingAlg ||
116
+ existing.token_dialect !== tokenDialect ||
117
+ !scopesMatch(existing.scopes ?? [], desiredScopes);
118
+ if (!needsUpdate) {
119
+ logger.info(" API is up to date.");
120
+ return { auth0ApiId: existing.id, action: "unchanged" };
121
+ }
122
+ if (dryRun) {
123
+ logger.info(" [DRY RUN] Would update Auth0 API.");
124
+ return { auth0ApiId: existing.id, action: "dry_run" };
125
+ }
126
+ logger.info(" Updating Auth0 API...");
127
+ await auth0.updateApi(existing.id, {
128
+ signing_alg: signingAlg,
129
+ token_dialect: tokenDialect,
130
+ enforce_policies: true,
131
+ scopes: desiredScopes,
132
+ });
133
+ logger.success(" API updated.");
134
+ return { auth0ApiId: existing.id, action: "updated" };
135
+ }
136
+ function scopesMatch(existing, desired) {
137
+ const existingValues = new Set(existing.map((s) => s.value));
138
+ const desiredValues = new Set(desired.map((s) => s.value));
139
+ if (existingValues.size !== desiredValues.size)
140
+ return false;
141
+ for (const v of desiredValues) {
142
+ if (!existingValues.has(v))
143
+ return false;
144
+ }
145
+ return true;
146
+ }
147
+ async function reconcileAccessPolicy(ctx, apiId, server) {
148
+ const { auth0, dryRun, config } = ctx;
149
+ const userPolicy = server.access_policy?.user ?? config.ecosystem.defaults.api.user_access_policy;
150
+ const clientPolicy = server.access_policy?.client ??
151
+ config.ecosystem.defaults.api.client_access_policy;
152
+ logger.debug(` Access policy: user=${userPolicy}, client=${clientPolicy}`);
153
+ if (dryRun) {
154
+ logger.info(" [DRY RUN] Would update access policy.");
155
+ return;
156
+ }
157
+ try {
158
+ await auth0.updateApi(apiId, {
159
+ enforce_policies: true,
160
+ });
161
+ }
162
+ catch {
163
+ logger.debug(" Note: Access policy enforcement may need to be configured via the Auth0 Dashboard " +
164
+ "if the Management API does not support direct subject_type_authorization patches.");
165
+ }
166
+ }
167
+ function resolveClientAccessPolicy(server) {
168
+ return server.access_policy?.client ?? "deny_all";
169
+ }
170
+ async function reconcileGrant(ctx, clientKey, clientId, audience, scopes, subjectType) {
171
+ const { auth0, dryRun } = ctx;
172
+ logger.info(` Reconciling grant: ${clientKey} -> ${audience} (${subjectType})`);
173
+ logger.debug(` Scopes: ${scopes.join(", ")}`);
174
+ const existingGrant = await auth0.findClientGrant(clientId, audience, subjectType);
175
+ if (existingGrant) {
176
+ const existingScopes = new Set(existingGrant.scope);
177
+ const desiredScopes = new Set(scopes);
178
+ const scopesEqual = existingScopes.size === desiredScopes.size &&
179
+ [...desiredScopes].every((s) => existingScopes.has(s));
180
+ if (scopesEqual) {
181
+ logger.info(` Grant exists and is up to date.`);
182
+ return {
183
+ clientKey,
184
+ clientId,
185
+ action: "unchanged",
186
+ scopes,
187
+ subjectType,
188
+ };
189
+ }
190
+ if (dryRun) {
191
+ logger.info(` [DRY RUN] Would update grant scopes.`);
192
+ return { clientKey, clientId, action: "dry_run", scopes, subjectType };
193
+ }
194
+ logger.info(` Updating grant scopes...`);
195
+ await auth0.updateClientGrant(existingGrant.id, { scope: scopes });
196
+ logger.success(` Grant updated.`);
197
+ return { clientKey, clientId, action: "updated", scopes, subjectType };
198
+ }
199
+ if (dryRun) {
200
+ logger.info(` [DRY RUN] Would create grant.`);
201
+ return { clientKey, clientId, action: "dry_run", scopes, subjectType };
202
+ }
203
+ logger.info(` Creating grant...`);
204
+ await auth0.createClientGrant({
205
+ client_id: clientId,
206
+ audience,
207
+ scope: scopes,
208
+ subject_type: subjectType,
209
+ });
210
+ logger.success(` Grant created.`);
211
+ return { clientKey, clientId, action: "created", scopes, subjectType };
212
+ }
213
+ //# sourceMappingURL=reconcile-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-server.js","sourceRoot":"","sources":["../../src/commands/reconcile-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EACL,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,kBAAkB,GAA2B;IACjD,gBAAgB,EAAE,oBAAoB;IACtC,cAAc,EAAE,kBAAkB;IAClC,YAAY,EAAE,yBAAyB;IACvC,aAAa,EAAE,wBAAwB;CACxC,CAAC;AAmBF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAmB,EACnB,UAAkB;IAElB,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,MAAM,UAAU,GAAG,0BAA0B,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEzD,MAAM,CAAC,IAAI,CACT,uBAAuB,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,GAAG,CAClE,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,aAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElD,qCAAqC;IAErC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAE/E,yCAAyC;IAEzC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACvE,CAAC;IAED,yCAAyC;IAEzC,MAAM,YAAY,GAAG,mBAAmB,CACtC,SAAS,EACT,YAAY,EACZ,MAAM,CAAC,aAAa,CACrB,CAAC;IAEF,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CACT,wCAAwC,MAAM,CAAC,SAAS,EAAE,CAC3D,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,SAAS,aAAa,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAClE,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC5C,YAAY,CAAC,IAAI,CAAC;gBAChB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,QAAQ,IAAI,aAAa;gBACnC,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IACE,MAAM,CAAC,WAAW,KAAK,QAAQ;YAC/B,yBAAyB,CAAC,YAAY,CAAC,KAAK,UAAU,EACtD,CAAC;YACD,MAAM,CAAC,IAAI,CACT,aAAa,UAAU,uCAAuC;gBAC5D,2BAA2B,MAAM,CAAC,SAAS,KAAK;gBAChD,+DAA+D,CAClE,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC,GAAG,EACH,MAAM,CAAC,SAAS,EAChB,QAAQ,EACR,UAAU,EACV,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,WAAW,CACnB,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,WAAW,YAAY,CAAC,IAAI,4BAA4B,CAAC,CAAC;IAEzE,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,aAAa,EAAE,UAAU;QACzB,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,SAAS;QACjB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAmB,EACnB,MAAoB,EACpB,UAAkB,EAClB,MAAgB;IAKhB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;IACtD,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;IAE1D,MAAM,YAAY,GAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,EAAE;KACpD,CAAC,CAAC,CAAC;IAEJ,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CACT,4BAA4B,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAC3D,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClE,OAAO,oBAAoB,CACzB,GAAG,EACH,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,UAAU,EACV,YAAY,CACb,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAE7D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QACvE,OAAO,oBAAoB,CACzB,GAAG,EACH,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,UAAU,EACV,YAAY,CACb,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,qBAAqB,KAAK,KAAK,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,sCAAsC,UAAU,uCAAuC,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC;QACnC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU;QACV,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,YAAY;QAC3B,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,kBAAkB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,GAAmB,EACnB,QAAkB,EAClB,OAAqB,EACrB,aAA8B,EAC9B,UAAkB,EAClB,YAAoB;IAKpB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE9B,MAAM,WAAW,GACf,QAAQ,CAAC,WAAW,KAAK,UAAU;QACnC,QAAQ,CAAC,aAAa,KAAK,YAAY;QACvC,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE;QACjC,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,YAAY;QAC3B,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,WAAW,CAClB,QAAyB,EACzB,OAAwB;IAExB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAI,cAAc,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAAmB,EACnB,KAAa,EACb,MAAoB;IAEpB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACtC,MAAM,UAAU,GACd,MAAM,CAAC,aAAa,EAAE,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACjF,MAAM,YAAY,GAChB,MAAM,CAAC,aAAa,EAAE,MAAM;QAC5B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAErD,MAAM,CAAC,KAAK,CAAC,yBAAyB,UAAU,YAAY,YAAY,EAAE,CAAC,CAAC;IAE5E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;YAC3B,gBAAgB,EAAE,IAAI;SAC6C,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CACV,sFAAsF;YACpF,mFAAmF,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAoB;IACrD,OAAO,MAAM,CAAC,aAAa,EAAE,MAAM,IAAI,UAAU,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAmB,EACnB,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,MAAgB,EAChB,WAAmB;IAEnB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE9B,MAAM,CAAC,IAAI,CACT,wBAAwB,SAAS,OAAO,QAAQ,KAAK,WAAW,GAAG,CACpE,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,eAAe,CAC/C,QAAQ,EACR,QAAQ,EACR,WAAW,CACZ,CAAC;IAEF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,WAAW,GACf,cAAc,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;YAC1C,CAAC,GAAG,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO;gBACL,SAAS;gBACT,QAAQ;gBACR,MAAM,EAAE,WAAW;gBACnB,MAAM;gBACN,WAAW;aACZ,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACzE,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,iBAAiB,CAAC;QAC5B,SAAS,EAAE,QAAQ;QACnB,QAAQ;QACR,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,WAAW;KAC1B,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAErC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACzE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CommandContext } from "../utils/index.js";
2
+ export interface VerifyTenantResult {
3
+ tenantDomain: string;
4
+ managementAudience: string;
5
+ resourceParameterCompatibility: boolean;
6
+ manualActionRequired: boolean;
7
+ message: string;
8
+ }
9
+ export declare function verifyTenant(ctx: CommandContext): Promise<VerifyTenantResult>;
10
+ //# sourceMappingURL=verify-tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-tenant.d.ts","sourceRoot":"","sources":["../../src/commands/verify-tenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8BAA8B,EAAE,OAAO,CAAC;IACxC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAoG7B"}
@@ -0,0 +1,76 @@
1
+ import { logger } from "../utils/index.js";
2
+ export async function verifyTenant(ctx) {
3
+ const { config, auth0, dryRun } = ctx;
4
+ const ecosystem = config.ecosystem;
5
+ logger.info(`Verifying tenant: ${ecosystem.auth0.tenant_domain}`);
6
+ logger.blank();
7
+ logger.info("Authenticating to Auth0 Management API...");
8
+ await auth0.authenticate();
9
+ logger.success("Management API authentication successful.");
10
+ logger.info("Fetching tenant settings...");
11
+ const tenantSettings = await auth0.getTenantSettings();
12
+ const rpcp = tenantSettings.flags?.["resource_param_compatibility_profile"] ?? false;
13
+ if (rpcp) {
14
+ logger.success("Resource Parameter Compatibility Profile is ENABLED.");
15
+ }
16
+ else {
17
+ logger.warn("Resource Parameter Compatibility Profile is DISABLED.");
18
+ logger.blank();
19
+ if (!dryRun) {
20
+ logger.info("Attempting to enable Resource Parameter Compatibility Profile...");
21
+ try {
22
+ await auth0.patchTenantSettings({
23
+ flags: {
24
+ ...tenantSettings.flags,
25
+ resource_param_compatibility_profile: true,
26
+ },
27
+ });
28
+ logger.success("Resource Parameter Compatibility Profile has been ENABLED.");
29
+ return {
30
+ tenantDomain: ecosystem.auth0.tenant_domain,
31
+ managementAudience: ecosystem.auth0.management_audience,
32
+ resourceParameterCompatibility: true,
33
+ manualActionRequired: false,
34
+ message: "Resource Parameter Compatibility Profile was disabled and has been enabled programmatically.",
35
+ };
36
+ }
37
+ catch (err) {
38
+ logger.warn("Could not enable the setting programmatically.");
39
+ logger.debug(`Error: ${err instanceof Error ? err.message : String(err)}`);
40
+ }
41
+ }
42
+ logger.blank();
43
+ logger.error("MANUAL ACTION REQUIRED:");
44
+ logger.error(" 1. Go to the Auth0 Dashboard");
45
+ logger.error(" 2. Navigate to: Settings > Advanced > Settings");
46
+ logger.error(" 3. Find 'Resource Parameter Compatibility Profile'");
47
+ logger.error(" 4. Enable it");
48
+ logger.error(" 5. Re-run this command to verify");
49
+ logger.blank();
50
+ return {
51
+ tenantDomain: ecosystem.auth0.tenant_domain,
52
+ managementAudience: ecosystem.auth0.management_audience,
53
+ resourceParameterCompatibility: false,
54
+ manualActionRequired: true,
55
+ message: "Resource Parameter Compatibility Profile is disabled. Enable it via Dashboard > Settings > Advanced > Settings.",
56
+ };
57
+ }
58
+ const dcr = tenantSettings.flags?.["enable_dynamic_client_registration"] ?? false;
59
+ if (dcr) {
60
+ logger.warn("Dynamic Client Registration is enabled. The baseline system uses static registration. " +
61
+ "Disable DCR unless you specifically need it.");
62
+ }
63
+ else {
64
+ logger.info("Dynamic Client Registration is disabled (expected for baseline).");
65
+ }
66
+ logger.blank();
67
+ logger.success("Tenant verification complete.");
68
+ return {
69
+ tenantDomain: ecosystem.auth0.tenant_domain,
70
+ managementAudience: ecosystem.auth0.management_audience,
71
+ resourceParameterCompatibility: true,
72
+ manualActionRequired: false,
73
+ message: "Tenant prerequisites are satisfied.",
74
+ };
75
+ }
76
+ //# sourceMappingURL=verify-tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-tenant.js","sourceRoot":"","sources":["../../src/commands/verify-tenant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { loadAllConfig, deriveHostname, deriveCanonicalResourceUri, deriveMcpEndpoint, deriveProtectedResourceMetadataUrl, resolveScopes, resolveClientGroupMembers, resolveGrantTargets, } from "./loader.js";
2
+ export type { LoadedConfig, ResolvedGrantTarget } from "./loader.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,kCAAkC,EAClC,aAAa,EACb,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { loadAllConfig, deriveHostname, deriveCanonicalResourceUri, deriveMcpEndpoint, deriveProtectedResourceMetadataUrl, resolveScopes, resolveClientGroupMembers, resolveGrantTargets, } from "./loader.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,kCAAkC,EAClC,aAAa,EACb,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { EcosystemConfig, ClientDescriptor, ClientConfig, ServerConfig } from "../types/index.js";
2
+ export interface LoadedConfig {
3
+ ecosystem: EcosystemConfig;
4
+ clientDescriptors: Map<string, ClientDescriptor>;
5
+ clientConfigs: Map<string, ClientConfig>;
6
+ serverConfigs: Map<string, ServerConfig>;
7
+ }
8
+ export declare function loadAllConfig(rootDir: string): Promise<LoadedConfig>;
9
+ export declare function deriveHostname(ecosystem: EcosystemConfig, slug: string): string;
10
+ export declare function deriveCanonicalResourceUri(ecosystem: EcosystemConfig, slug: string): string;
11
+ export declare function deriveMcpEndpoint(ecosystem: EcosystemConfig, slug: string): string;
12
+ export declare function deriveProtectedResourceMetadataUrl(ecosystem: EcosystemConfig, slug: string): string;
13
+ export declare function resolveScopes(ecosystem: EcosystemConfig, server: ServerConfig): string[];
14
+ export declare function resolveClientGroupMembers(ecosystem: EcosystemConfig, groupName: string): string[];
15
+ export interface ResolvedGrantTarget {
16
+ clientKey: string;
17
+ scopes: string[];
18
+ subjectType: "user" | "client";
19
+ }
20
+ export declare function resolveGrantTargets(ecosystem: EcosystemConfig, server: ServerConfig, clientConfigs: Map<string, ClientConfig>): ResolvedGrantTarget[];
21
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC1C;AAyBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiE1E;AAsDD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,GACX,MAAM,CAIR;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,GACX,MAAM,CAER;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,GACX,MAAM,CAER;AAED,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,GACX,MAAM,CAER;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,YAAY,GACnB,MAAM,EAAE,CAMV;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAEV;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACvC,mBAAmB,EAAE,CAoCvB"}
@@ -0,0 +1,181 @@
1
+ import { readFile, readdir, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { config as loadDotenv } from "dotenv";
4
+ import { EcosystemConfigSchema, ClientDescriptorSchema, ClientConfigSchema, ServerConfigSchema, } from "../types/index.js";
5
+ async function readJson(filePath) {
6
+ const raw = await readFile(filePath, "utf-8");
7
+ return JSON.parse(raw);
8
+ }
9
+ async function directoryExists(dirPath) {
10
+ try {
11
+ const s = await stat(dirPath);
12
+ return s.isDirectory();
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function fileExists(filePath) {
19
+ try {
20
+ const s = await stat(filePath);
21
+ return s.isFile();
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ export async function loadAllConfig(rootDir) {
28
+ loadDotenv({ path: join(rootDir, ".env") });
29
+ const ecosystemPath = join(rootDir, "ecosystem-configuration.json");
30
+ const ecosystemRaw = await readJson(ecosystemPath);
31
+ const ecosystem = EcosystemConfigSchema.parse(ecosystemRaw);
32
+ const clientDescriptors = new Map();
33
+ const descriptorsDir = join(rootDir, "client-descriptors");
34
+ if (await directoryExists(descriptorsDir)) {
35
+ const entries = await readdir(descriptorsDir);
36
+ for (const entry of entries) {
37
+ if (!entry.endsWith(".json"))
38
+ continue;
39
+ const raw = await readJson(join(descriptorsDir, entry));
40
+ const descriptor = ClientDescriptorSchema.parse(raw);
41
+ if (clientDescriptors.has(descriptor.descriptor_key)) {
42
+ throw new Error(`Duplicate client descriptor key: ${descriptor.descriptor_key}`);
43
+ }
44
+ clientDescriptors.set(descriptor.descriptor_key, descriptor);
45
+ }
46
+ }
47
+ const clientConfigs = new Map();
48
+ const clientsDir = join(rootDir, "oauth-clients");
49
+ if (await directoryExists(clientsDir)) {
50
+ const entries = await readdir(clientsDir);
51
+ for (const entry of entries) {
52
+ const clientDir = join(clientsDir, entry);
53
+ if (!(await directoryExists(clientDir)))
54
+ continue;
55
+ const configPath = join(clientDir, "client-configuration.json");
56
+ if (!(await fileExists(configPath)))
57
+ continue;
58
+ const raw = await readJson(configPath);
59
+ const clientCfg = ClientConfigSchema.parse(raw);
60
+ if (clientConfigs.has(clientCfg.client_key)) {
61
+ throw new Error(`Duplicate client key: ${clientCfg.client_key}`);
62
+ }
63
+ clientConfigs.set(clientCfg.client_key, clientCfg);
64
+ }
65
+ }
66
+ const serverConfigs = new Map();
67
+ const mcpsDir = join(rootDir, "mcps");
68
+ if (await directoryExists(mcpsDir)) {
69
+ const mcpEntries = await readdir(mcpsDir);
70
+ for (const entry of mcpEntries) {
71
+ const entryPath = join(mcpsDir, entry);
72
+ if (!(await directoryExists(entryPath)))
73
+ continue;
74
+ const mcpConfigPath = join(entryPath, "mcp-configuration.json");
75
+ if (!(await fileExists(mcpConfigPath)))
76
+ continue;
77
+ const raw = await readJson(mcpConfigPath);
78
+ const serverCfg = ServerConfigSchema.parse(raw);
79
+ if (serverConfigs.has(serverCfg.slug)) {
80
+ throw new Error(`Duplicate server slug: ${serverCfg.slug}`);
81
+ }
82
+ serverConfigs.set(serverCfg.slug, serverCfg);
83
+ }
84
+ }
85
+ validateCrossReferences(ecosystem, clientDescriptors, clientConfigs, serverConfigs);
86
+ return { ecosystem, clientDescriptors, clientConfigs, serverConfigs };
87
+ }
88
+ function validateCrossReferences(ecosystem, descriptors, clients, servers) {
89
+ for (const [key, client] of clients) {
90
+ if (client.descriptor && !descriptors.has(client.descriptor)) {
91
+ throw new Error(`Client "${key}" references unknown descriptor "${client.descriptor}"`);
92
+ }
93
+ }
94
+ const resourceUris = new Set();
95
+ for (const [slug, server] of servers) {
96
+ const uri = deriveCanonicalResourceUri(ecosystem, server.slug);
97
+ if (resourceUris.has(uri)) {
98
+ throw new Error(`Duplicate derived resource URI for server "${slug}": ${uri}`);
99
+ }
100
+ resourceUris.add(uri);
101
+ if (server.scope_profile && !ecosystem.defaults.scope_profiles[server.scope_profile]) {
102
+ throw new Error(`Server "${slug}" references unknown scope profile "${server.scope_profile}"`);
103
+ }
104
+ if (server.grants?.client_groups) {
105
+ for (const group of server.grants.client_groups) {
106
+ if (!ecosystem.client_groups?.[group]) {
107
+ throw new Error(`Server "${slug}" references unknown client group "${group}"`);
108
+ }
109
+ }
110
+ }
111
+ if (server.grants?.client_overrides) {
112
+ for (const clientKey of Object.keys(server.grants.client_overrides)) {
113
+ if (!clients.has(clientKey)) {
114
+ throw new Error(`Server "${slug}" has a grant override for unknown client "${clientKey}"`);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ export function deriveHostname(ecosystem, slug) {
121
+ return ecosystem.domain.server_host_pattern
122
+ .replace("{slug}", slug)
123
+ .replace("{base_domain}", ecosystem.domain.base_domain);
124
+ }
125
+ export function deriveCanonicalResourceUri(ecosystem, slug) {
126
+ return `https://${deriveHostname(ecosystem, slug)}`;
127
+ }
128
+ export function deriveMcpEndpoint(ecosystem, slug) {
129
+ return `${deriveCanonicalResourceUri(ecosystem, slug)}/mcp`;
130
+ }
131
+ export function deriveProtectedResourceMetadataUrl(ecosystem, slug) {
132
+ return `${deriveCanonicalResourceUri(ecosystem, slug)}/.well-known/oauth-protected-resource`;
133
+ }
134
+ export function resolveScopes(ecosystem, server) {
135
+ const profileScopes = server.scope_profile
136
+ ? (ecosystem.defaults.scope_profiles[server.scope_profile] ?? [])
137
+ : [];
138
+ const extraScopes = server.extra_scopes ?? [];
139
+ return [...new Set([...profileScopes, ...extraScopes])];
140
+ }
141
+ export function resolveClientGroupMembers(ecosystem, groupName) {
142
+ return ecosystem.client_groups?.[groupName] ?? [];
143
+ }
144
+ export function resolveGrantTargets(ecosystem, server, clientConfigs) {
145
+ const allScopes = resolveScopes(ecosystem, server);
146
+ const targets = new Map();
147
+ if (server.grants?.client_groups) {
148
+ for (const group of server.grants.client_groups) {
149
+ const members = resolveClientGroupMembers(ecosystem, group);
150
+ for (const clientKey of members) {
151
+ const client = clientConfigs.get(clientKey);
152
+ if (!client)
153
+ continue;
154
+ const profile = resolveClientProfile(ecosystem, client);
155
+ targets.set(clientKey, {
156
+ clientKey,
157
+ scopes: [...allScopes],
158
+ subjectType: profile?.access_mode === "machine" ? "client" : "user",
159
+ });
160
+ }
161
+ }
162
+ }
163
+ if (server.grants?.client_overrides) {
164
+ for (const [clientKey, scopes] of Object.entries(server.grants.client_overrides)) {
165
+ const client = clientConfigs.get(clientKey);
166
+ if (!client)
167
+ continue;
168
+ const profile = resolveClientProfile(ecosystem, client);
169
+ targets.set(clientKey, {
170
+ clientKey,
171
+ scopes,
172
+ subjectType: profile?.access_mode === "machine" ? "client" : "user",
173
+ });
174
+ }
175
+ }
176
+ return [...targets.values()];
177
+ }
178
+ function resolveClientProfile(ecosystem, client) {
179
+ return ecosystem.defaults.client_profiles?.[client.profile];
180
+ }
181
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type { EcosystemConfig, ClientProfile, AccessMode, GrantStrategy, TokenEndpointAuthMethod, UserAccessPolicy, ClientAccessPolicy, ClientProfileDefinition, ClientDescriptor, ReusePolicy, ClientConfig, ServerConfig, Auth0Application, Auth0Api, Auth0ClientGrant, Auth0TenantSettings, } from "./types/index.js";
2
+ export { loadAllConfig, deriveHostname, deriveCanonicalResourceUri, deriveMcpEndpoint, deriveProtectedResourceMetadataUrl, resolveScopes, resolveGrantTargets, } from "./config/index.js";
3
+ export type { LoadedConfig, ResolvedGrantTarget } from "./config/index.js";
4
+ export { Auth0ManagementClient, Auth0ApiError } from "./auth0/index.js";
5
+ export type { Auth0ManagementClientOptions } from "./auth0/index.js";
6
+ export { buildProtectedResourceMetadata, protectedResourceMetadataHandler, TokenValidator, InsufficientScopeError, buildWwwAuthenticateChallenge, send401Challenge, createAuthMiddleware, requireScopes, } from "./mcp-runtime/index.js";
7
+ export type { ProtectedResourceMetadata, ProtectedResourceMetadataOptions, TokenValidatorOptions, ValidatedToken, ChallengeOptions, AuthMiddlewareOptions, } from "./mcp-runtime/index.js";
8
+ export type { RuntimeConfig } from "./mcp-server/index.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,kCAAkC,EAClC,aAAa,EACb,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,YAAY,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAGrE,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,cAAc,EACd,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,yBAAyB,EACzB,gCAAgC,EAChC,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ // Public API: config loading and derivation
2
+ export { loadAllConfig, deriveHostname, deriveCanonicalResourceUri, deriveMcpEndpoint, deriveProtectedResourceMetadataUrl, resolveScopes, resolveGrantTargets, } from "./config/index.js";
3
+ // Public API: Auth0 management client
4
+ export { Auth0ManagementClient, Auth0ApiError } from "./auth0/index.js";
5
+ // Public API: MCP runtime helpers
6
+ export { buildProtectedResourceMetadata, protectedResourceMetadataHandler, TokenValidator, InsufficientScopeError, buildWwwAuthenticateChallenge, send401Challenge, createAuthMiddleware, requireScopes, } from "./mcp-runtime/index.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,4CAA4C;AAC5C,OAAO,EACL,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,kCAAkC,EAClC,aAAa,EACb,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAG3B,sCAAsC;AACtC,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGxE,kCAAkC;AAClC,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,cAAc,EACd,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,GACd,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ export interface AuthMiddlewareOptions {
3
+ resourceUri: string;
4
+ resourceMetadataUrl: string;
5
+ issuer: string;
6
+ audience: string;
7
+ jwksUri?: string;
8
+ }
9
+ /**
10
+ * Creates an Express/Connect-compatible middleware that validates bearer tokens.
11
+ *
12
+ * On success, attaches `req.auth` with the validated token claims.
13
+ * On failure, sends a proper 401 WWW-Authenticate challenge per MCP spec.
14
+ */
15
+ export declare function createAuthMiddleware(options: AuthMiddlewareOptions): (req: IncomingMessage & {
16
+ auth?: unknown;
17
+ }, res: ServerResponse, next?: (err?: unknown) => void) => Promise<void>;
18
+ /**
19
+ * Factory for route-level scope enforcement middleware.
20
+ *
21
+ * Usage:
22
+ * app.post('/tools/execute', requireScopes(['tools.write']), handler);
23
+ */
24
+ export declare function requireScopes(scopes: string[]): (req: IncomingMessage & {
25
+ auth?: Record<string, unknown>;
26
+ }, res: ServerResponse, next?: (err?: unknown) => void) => void;
27
+ //# sourceMappingURL=auth-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../src/mcp-runtime/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,IAQ/D,KAAK,eAAe,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,KAAK,cAAc,EACnB,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,mBAsCjC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAE1C,KAAK,eAAe,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACzD,KAAK,cAAc,EACnB,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,UAmCjC"}