@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,3 @@
1
+ export { Auth0ManagementClient, Auth0ApiError, } from "./management-client.js";
2
+ export type { Auth0ManagementClientOptions } from "./management-client.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth0/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Auth0ManagementClient, Auth0ApiError, } from "./management-client.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth0/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,aAAa,GACd,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { Auth0Application, Auth0Api, Auth0ApiScope, Auth0ClientGrant, Auth0TenantSettings } from "../types/index.js";
2
+ export interface Auth0ManagementClientOptions {
3
+ tenantDomain: string;
4
+ managementAudience: string;
5
+ clientId: string;
6
+ clientSecret: string;
7
+ }
8
+ export declare class Auth0ManagementClient {
9
+ private readonly baseUrl;
10
+ private readonly tokenUrl;
11
+ private readonly audience;
12
+ private readonly clientId;
13
+ private readonly clientSecret;
14
+ private accessToken;
15
+ constructor(options: Auth0ManagementClientOptions);
16
+ authenticate(): Promise<void>;
17
+ private request;
18
+ getTenantSettings(): Promise<Auth0TenantSettings>;
19
+ patchTenantSettings(patch: Partial<Auth0TenantSettings>): Promise<Auth0TenantSettings>;
20
+ listApplications(params?: {
21
+ page?: number;
22
+ per_page?: number;
23
+ include_totals?: boolean;
24
+ }): Promise<Auth0Application[]>;
25
+ getApplication(clientId: string): Promise<Auth0Application>;
26
+ findApplicationByMetadata(metadataKey: string, metadataValue: string): Promise<Auth0Application | null>;
27
+ createApplication(payload: Partial<Auth0Application> & {
28
+ name: string;
29
+ app_type: string;
30
+ }): Promise<Auth0Application>;
31
+ updateApplication(clientId: string, payload: Partial<Auth0Application>): Promise<Auth0Application>;
32
+ listApis(params?: {
33
+ page?: number;
34
+ per_page?: number;
35
+ }): Promise<Auth0Api[]>;
36
+ findApiByIdentifier(identifier: string): Promise<Auth0Api | null>;
37
+ getApi(apiId: string): Promise<Auth0Api>;
38
+ createApi(payload: {
39
+ name: string;
40
+ identifier: string;
41
+ signing_alg?: string;
42
+ token_dialect?: string;
43
+ enforce_policies?: boolean;
44
+ scopes?: Auth0ApiScope[];
45
+ }): Promise<Auth0Api>;
46
+ updateApi(apiId: string, payload: Partial<{
47
+ name: string;
48
+ signing_alg: string;
49
+ token_dialect: string;
50
+ enforce_policies: boolean;
51
+ scopes: Auth0ApiScope[];
52
+ }>): Promise<Auth0Api>;
53
+ listClientGrants(params?: {
54
+ audience?: string;
55
+ client_id?: string;
56
+ page?: number;
57
+ per_page?: number;
58
+ }): Promise<Auth0ClientGrant[]>;
59
+ findClientGrant(clientId: string, audience: string, subjectType?: string): Promise<Auth0ClientGrant | null>;
60
+ createClientGrant(payload: {
61
+ client_id: string;
62
+ audience: string;
63
+ scope: string[];
64
+ subject_type?: string;
65
+ }): Promise<Auth0ClientGrant>;
66
+ updateClientGrant(grantId: string, payload: {
67
+ scope: string[];
68
+ }): Promise<Auth0ClientGrant>;
69
+ deleteClientGrant(grantId: string): Promise<void>;
70
+ }
71
+ export declare class Auth0ApiError extends Error {
72
+ readonly method: string;
73
+ readonly path: string;
74
+ readonly statusCode: number;
75
+ readonly responseBody: string;
76
+ constructor(method: string, path: string, statusCode: number, responseBody: string);
77
+ }
78
+ //# sourceMappingURL=management-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-client.d.ts","sourceRoot":"","sources":["../../src/auth0/management-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ export class Auth0ManagementClient {
2
+ baseUrl;
3
+ tokenUrl;
4
+ audience;
5
+ clientId;
6
+ clientSecret;
7
+ accessToken = null;
8
+ constructor(options) {
9
+ this.baseUrl = `https://${options.tenantDomain}/api/v2`;
10
+ this.tokenUrl = `https://${options.tenantDomain}/oauth/token`;
11
+ this.audience = options.managementAudience;
12
+ this.clientId = options.clientId;
13
+ this.clientSecret = options.clientSecret;
14
+ }
15
+ async authenticate() {
16
+ const response = await fetch(this.tokenUrl, {
17
+ method: "POST",
18
+ headers: { "Content-Type": "application/json" },
19
+ body: JSON.stringify({
20
+ grant_type: "client_credentials",
21
+ client_id: this.clientId,
22
+ client_secret: this.clientSecret,
23
+ audience: this.audience,
24
+ }),
25
+ });
26
+ if (!response.ok) {
27
+ const body = await response.text();
28
+ throw new Error(`Failed to obtain Management API token (${response.status}): ${body}`);
29
+ }
30
+ const data = (await response.json());
31
+ this.accessToken = data.access_token;
32
+ }
33
+ async request(method, path, body) {
34
+ if (!this.accessToken) {
35
+ throw new Error("Not authenticated. Call authenticate() before making API requests.");
36
+ }
37
+ const url = `${this.baseUrl}${path}`;
38
+ const headers = {
39
+ Authorization: `Bearer ${this.accessToken}`,
40
+ "Content-Type": "application/json",
41
+ };
42
+ const response = await fetch(url, {
43
+ method,
44
+ headers,
45
+ body: body ? JSON.stringify(body) : undefined,
46
+ });
47
+ if (!response.ok) {
48
+ const responseBody = await response.text();
49
+ throw new Auth0ApiError(method, path, response.status, responseBody);
50
+ }
51
+ if (response.status === 204)
52
+ return undefined;
53
+ return response.json();
54
+ }
55
+ // ── Tenant Settings ──
56
+ async getTenantSettings() {
57
+ return this.request("GET", "/tenants/settings");
58
+ }
59
+ async patchTenantSettings(patch) {
60
+ return this.request("PATCH", "/tenants/settings", patch);
61
+ }
62
+ // ── Applications (Clients) ──
63
+ async listApplications(params) {
64
+ const query = new URLSearchParams();
65
+ if (params?.page !== undefined)
66
+ query.set("page", String(params.page));
67
+ if (params?.per_page !== undefined)
68
+ query.set("per_page", String(params.per_page));
69
+ if (params?.include_totals !== undefined)
70
+ query.set("include_totals", String(params.include_totals));
71
+ const qs = query.toString();
72
+ return this.request("GET", `/clients${qs ? `?${qs}` : ""}`);
73
+ }
74
+ async getApplication(clientId) {
75
+ return this.request("GET", `/clients/${clientId}`);
76
+ }
77
+ async findApplicationByMetadata(metadataKey, metadataValue) {
78
+ let page = 0;
79
+ const perPage = 100;
80
+ while (true) {
81
+ const apps = await this.listApplications({ page, per_page: perPage });
82
+ for (const app of apps) {
83
+ if (app.client_metadata?.[metadataKey] === metadataValue) {
84
+ return app;
85
+ }
86
+ }
87
+ if (apps.length < perPage)
88
+ break;
89
+ page++;
90
+ }
91
+ return null;
92
+ }
93
+ async createApplication(payload) {
94
+ return this.request("POST", "/clients", payload);
95
+ }
96
+ async updateApplication(clientId, payload) {
97
+ return this.request("PATCH", `/clients/${clientId}`, payload);
98
+ }
99
+ // ── Resource Servers (APIs) ──
100
+ async listApis(params) {
101
+ const query = new URLSearchParams();
102
+ if (params?.page !== undefined)
103
+ query.set("page", String(params.page));
104
+ if (params?.per_page !== undefined)
105
+ query.set("per_page", String(params.per_page));
106
+ const qs = query.toString();
107
+ return this.request("GET", `/resource-servers${qs ? `?${qs}` : ""}`);
108
+ }
109
+ async findApiByIdentifier(identifier) {
110
+ let page = 0;
111
+ const perPage = 100;
112
+ while (true) {
113
+ const apis = await this.listApis({ page, per_page: perPage });
114
+ for (const api of apis) {
115
+ if (api.identifier === identifier)
116
+ return api;
117
+ }
118
+ if (apis.length < perPage)
119
+ break;
120
+ page++;
121
+ }
122
+ return null;
123
+ }
124
+ async getApi(apiId) {
125
+ return this.request("GET", `/resource-servers/${apiId}`);
126
+ }
127
+ async createApi(payload) {
128
+ return this.request("POST", "/resource-servers", payload);
129
+ }
130
+ async updateApi(apiId, payload) {
131
+ return this.request("PATCH", `/resource-servers/${apiId}`, payload);
132
+ }
133
+ // ── Client Grants ──
134
+ async listClientGrants(params) {
135
+ const query = new URLSearchParams();
136
+ if (params?.audience)
137
+ query.set("audience", params.audience);
138
+ if (params?.client_id)
139
+ query.set("client_id", params.client_id);
140
+ if (params?.page !== undefined)
141
+ query.set("page", String(params.page));
142
+ if (params?.per_page !== undefined)
143
+ query.set("per_page", String(params.per_page));
144
+ const qs = query.toString();
145
+ return this.request("GET", `/client-grants${qs ? `?${qs}` : ""}`);
146
+ }
147
+ async findClientGrant(clientId, audience, subjectType) {
148
+ const grants = await this.listClientGrants({
149
+ client_id: clientId,
150
+ audience,
151
+ });
152
+ for (const grant of grants) {
153
+ if (subjectType && grant.subject_type !== subjectType)
154
+ continue;
155
+ return grant;
156
+ }
157
+ return null;
158
+ }
159
+ async createClientGrant(payload) {
160
+ return this.request("POST", "/client-grants", payload);
161
+ }
162
+ async updateClientGrant(grantId, payload) {
163
+ return this.request("PATCH", `/client-grants/${grantId}`, payload);
164
+ }
165
+ async deleteClientGrant(grantId) {
166
+ await this.request("DELETE", `/client-grants/${grantId}`);
167
+ }
168
+ }
169
+ export class Auth0ApiError extends Error {
170
+ method;
171
+ path;
172
+ statusCode;
173
+ responseBody;
174
+ constructor(method, path, statusCode, responseBody) {
175
+ super(`Auth0 API error: ${method} ${path} returned ${statusCode}: ${responseBody}`);
176
+ this.method = method;
177
+ this.path = path;
178
+ this.statusCode = statusCode;
179
+ this.responseBody = responseBody;
180
+ this.name = "Auth0ApiError";
181
+ }
182
+ }
183
+ //# sourceMappingURL=management-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-client.js","sourceRoot":"","sources":["../../src/auth0/management-client.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { resolve } from "node:path";
4
+ import { loadAllConfig } from "./config/index.js";
5
+ import { createLazyAuth0Context, logger, setVerbose } from "./utils/index.js";
6
+ import { verifyTenant, reconcileClient, reconcileServer, reconcileAll, addScope, grantClient, generateArtifacts, } from "./commands/index.js";
7
+ const program = new Command();
8
+ program
9
+ .name("mcp-ecosystem")
10
+ .description("Provisioning and runtime tooling for a personal MCP ecosystem backed by Auth0")
11
+ .version("0.1.0")
12
+ .option("-d, --dir <path>", "Root directory of the ecosystem", ".")
13
+ .option("--dry-run", "Preview changes without modifying Auth0 or local files", false)
14
+ .option("--verbose", "Enable verbose/debug output", false)
15
+ .option("--json", "Output results as JSON", false);
16
+ async function buildContext(opts) {
17
+ if (opts.verbose)
18
+ setVerbose(true);
19
+ const rootDir = resolve(opts.dir);
20
+ logger.debug(`Root directory: ${rootDir}`);
21
+ logger.info("Loading ecosystem configuration...");
22
+ const config = await loadAllConfig(rootDir);
23
+ logger.success(`Loaded: ${config.clientConfigs.size} client(s), ${config.serverConfigs.size} server(s), ${config.clientDescriptors.size} descriptor(s)`);
24
+ const lazy = createLazyAuth0Context(config.ecosystem);
25
+ return {
26
+ rootDir,
27
+ config,
28
+ get auth0() {
29
+ return lazy.auth0;
30
+ },
31
+ dryRun: opts.dryRun,
32
+ };
33
+ }
34
+ function output(json, data) {
35
+ if (json) {
36
+ console.log(JSON.stringify(data, null, 2));
37
+ }
38
+ }
39
+ program
40
+ .command("verify-tenant")
41
+ .description("Verify Auth0 tenant prerequisites for MCP compatibility")
42
+ .action(async () => {
43
+ const opts = program.opts();
44
+ try {
45
+ const ctx = await buildContext(opts);
46
+ await ctx.auth0.authenticate();
47
+ const result = await verifyTenant(ctx);
48
+ output(opts.json, result);
49
+ }
50
+ catch (err) {
51
+ logger.error(err instanceof Error ? err.message : String(err));
52
+ process.exit(1);
53
+ }
54
+ });
55
+ program
56
+ .command("reconcile-client <client-key>")
57
+ .description("Create or reuse an Auth0 Application for a specific client")
58
+ .action(async (clientKey) => {
59
+ const opts = program.opts();
60
+ try {
61
+ const ctx = await buildContext(opts);
62
+ await ctx.auth0.authenticate();
63
+ const result = await reconcileClient(ctx, clientKey);
64
+ output(opts.json, result);
65
+ }
66
+ catch (err) {
67
+ logger.error(err instanceof Error ? err.message : String(err));
68
+ process.exit(1);
69
+ }
70
+ });
71
+ program
72
+ .command("reconcile-server <server-slug>")
73
+ .description("Reconcile Auth0 API, scopes, access policy, and grants for an MCP server")
74
+ .action(async (serverSlug) => {
75
+ const opts = program.opts();
76
+ try {
77
+ const ctx = await buildContext(opts);
78
+ await ctx.auth0.authenticate();
79
+ const result = await reconcileServer(ctx, serverSlug);
80
+ output(opts.json, result);
81
+ }
82
+ catch (err) {
83
+ logger.error(err instanceof Error ? err.message : String(err));
84
+ process.exit(1);
85
+ }
86
+ });
87
+ program
88
+ .command("reconcile-all")
89
+ .description("Full ecosystem reconciliation: tenant, clients, servers, grants")
90
+ .action(async () => {
91
+ const opts = program.opts();
92
+ try {
93
+ const ctx = await buildContext(opts);
94
+ const result = await reconcileAll(ctx);
95
+ output(opts.json, result);
96
+ }
97
+ catch (err) {
98
+ logger.error(err instanceof Error ? err.message : String(err));
99
+ process.exit(1);
100
+ }
101
+ });
102
+ program
103
+ .command("add-scope <server-slug> <scope>")
104
+ .description("Add a scope to a server and reconcile it into Auth0")
105
+ .action(async (serverSlug, scope) => {
106
+ const opts = program.opts();
107
+ try {
108
+ const ctx = await buildContext(opts);
109
+ await ctx.auth0.authenticate();
110
+ const result = await addScope(ctx, serverSlug, scope);
111
+ output(opts.json, result);
112
+ }
113
+ catch (err) {
114
+ logger.error(err instanceof Error ? err.message : String(err));
115
+ process.exit(1);
116
+ }
117
+ });
118
+ program
119
+ .command("grant-client <server-slug> <client-key> [scopes...]")
120
+ .description("Create or update a client grant for a server/client pair")
121
+ .action(async (serverSlug, clientKey, scopes) => {
122
+ const opts = program.opts();
123
+ try {
124
+ const ctx = await buildContext(opts);
125
+ await ctx.auth0.authenticate();
126
+ const result = await grantClient(ctx, serverSlug, clientKey, scopes);
127
+ output(opts.json, result);
128
+ }
129
+ catch (err) {
130
+ logger.error(err instanceof Error ? err.message : String(err));
131
+ process.exit(1);
132
+ }
133
+ });
134
+ program
135
+ .command("generate-artifacts")
136
+ .description("Generate .env.example and per-server runtime config files")
137
+ .action(async () => {
138
+ const opts = program.opts();
139
+ try {
140
+ const ctx = await buildContext(opts);
141
+ const result = await generateArtifacts(ctx);
142
+ output(opts.json, result);
143
+ }
144
+ catch (err) {
145
+ logger.error(err instanceof Error ? err.message : String(err));
146
+ process.exit(1);
147
+ }
148
+ });
149
+ program.parse();
150
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CommandContext } from "../utils/index.js";
2
+ export interface AddScopeResult {
3
+ slug: string;
4
+ scope: string;
5
+ action: "added" | "already_present" | "dry_run";
6
+ finalScopes: string[];
7
+ }
8
+ export declare function addScope(ctx: CommandContext, serverSlug: string, scope: string): Promise<AddScopeResult>;
9
+ //# sourceMappingURL=add-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-scope.d.ts","sourceRoot":"","sources":["../../src/commands/add-scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAChD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CA8DzB"}
@@ -0,0 +1,55 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { logger } from "../utils/index.js";
4
+ import { deriveCanonicalResourceUri, resolveScopes, } from "../config/index.js";
5
+ export async function addScope(ctx, serverSlug, scope) {
6
+ const { config, auth0, dryRun, rootDir } = ctx;
7
+ const serverConfig = config.serverConfigs.get(serverSlug);
8
+ if (!serverConfig) {
9
+ throw new Error(`Unknown server slug: "${serverSlug}"`);
10
+ }
11
+ const currentScopes = resolveScopes(config.ecosystem, serverConfig);
12
+ if (currentScopes.includes(scope)) {
13
+ logger.info(`Scope "${scope}" is already present on server "${serverSlug}".`);
14
+ return {
15
+ slug: serverSlug,
16
+ scope,
17
+ action: "already_present",
18
+ finalScopes: currentScopes,
19
+ };
20
+ }
21
+ const newExtraScopes = [...(serverConfig.extra_scopes ?? []), scope];
22
+ const fullDesiredScopes = [...new Set([...currentScopes, scope])];
23
+ logger.info(`Adding scope "${scope}" to server "${serverSlug}".`);
24
+ logger.debug(` Full scope set: ${fullDesiredScopes.join(", ")}`);
25
+ if (dryRun) {
26
+ logger.info("[DRY RUN] Would update local config and Auth0 API scopes.");
27
+ return { slug: serverSlug, scope, action: "dry_run", finalScopes: fullDesiredScopes };
28
+ }
29
+ // Update local config file
30
+ const serverDir = findServerDir(rootDir, serverSlug, serverConfig);
31
+ const configPath = join(serverDir, "mcp-configuration.json");
32
+ const raw = JSON.parse(await readFile(configPath, "utf-8"));
33
+ raw["extra_scopes"] = newExtraScopes;
34
+ await writeFile(configPath, JSON.stringify(raw, null, 2) + "\n", "utf-8");
35
+ logger.success(` Local config updated: ${configPath}`);
36
+ // Update Auth0 API scopes (full replacement)
37
+ const identifier = deriveCanonicalResourceUri(config.ecosystem, serverConfig.slug);
38
+ const existingApi = await auth0.findApiByIdentifier(identifier);
39
+ if (existingApi) {
40
+ const scopePayload = fullDesiredScopes.map((s) => ({
41
+ value: s,
42
+ description: `Scope: ${s}`,
43
+ }));
44
+ await auth0.updateApi(existingApi.id, { scopes: scopePayload });
45
+ logger.success(" Auth0 API scopes updated.");
46
+ }
47
+ else {
48
+ logger.warn(" Auth0 API not found for this server. Run reconcile-server to create it.");
49
+ }
50
+ return { slug: serverSlug, scope, action: "added", finalScopes: fullDesiredScopes };
51
+ }
52
+ function findServerDir(rootDir, slug, _server) {
53
+ return join(rootDir, "mcps", slug);
54
+ }
55
+ //# sourceMappingURL=add-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-scope.js","sourceRoot":"","sources":["../../src/commands/add-scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CommandContext } from "../utils/index.js";
2
+ export interface GenerateArtifactsResult {
3
+ filesWritten: string[];
4
+ }
5
+ /**
6
+ * Generates or refreshes the .env.example and per-server runtime config files.
7
+ * Never writes live secrets.
8
+ */
9
+ export declare function generateArtifacts(ctx: CommandContext): Promise<GenerateArtifactsResult>;
10
+ //# sourceMappingURL=generate-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-artifacts.d.ts","sourceRoot":"","sources":["../../src/commands/generate-artifacts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAiGlC"}
@@ -0,0 +1,91 @@
1
+ import { writeFile, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { logger } from "../utils/index.js";
4
+ import { deriveCanonicalResourceUri, deriveHostname, deriveMcpEndpoint, deriveProtectedResourceMetadataUrl, resolveScopes, } from "../config/index.js";
5
+ /**
6
+ * Generates or refreshes the .env.example and per-server runtime config files.
7
+ * Never writes live secrets.
8
+ */
9
+ export async function generateArtifacts(ctx) {
10
+ const { config, rootDir, dryRun } = ctx;
11
+ const ecosystem = config.ecosystem;
12
+ const written = [];
13
+ // ── .env.example ──
14
+ const envLines = [
15
+ "# Auth0 Management API credentials (required)",
16
+ `${ecosystem.auth0.management_client_id_env}=__REQUIRED__`,
17
+ `${ecosystem.auth0.management_client_secret_env}=__REQUIRED__`,
18
+ `AUTH0_TENANT_DOMAIN=${ecosystem.auth0.tenant_domain}`,
19
+ "",
20
+ ];
21
+ for (const [key, client] of config.clientConfigs) {
22
+ const envPrefix = `AUTH0_${key.toUpperCase().replace(/-/g, "_")}`;
23
+ envLines.push(`# Client: ${client.display_name}`);
24
+ envLines.push(`${envPrefix}_CLIENT_ID=__GENERATED_OR_EXISTING__`);
25
+ const isPublic = client.profile === "native_interactive" ||
26
+ client.profile === "spa_interactive";
27
+ if (client.credentials?.client_secret_env) {
28
+ envLines.push(`${client.credentials.client_secret_env}=__FILL_SECRET__`);
29
+ }
30
+ else if (!isPublic) {
31
+ envLines.push(`${envPrefix}_CLIENT_SECRET=__GENERATED__`);
32
+ }
33
+ else {
34
+ envLines.push(`# ${envPrefix}_CLIENT_SECRET=__ONLY_IF_CONFIDENTIAL__`);
35
+ }
36
+ envLines.push("");
37
+ }
38
+ for (const [slug, server] of config.serverConfigs) {
39
+ const identifier = deriveCanonicalResourceUri(ecosystem, slug);
40
+ const envPrefix = `AUTH0_${slug.toUpperCase().replace(/-/g, "_")}_MCP`;
41
+ envLines.push(`# Server: ${server.name}`);
42
+ envLines.push(`${envPrefix}_AUDIENCE=${identifier}`);
43
+ envLines.push("");
44
+ }
45
+ const envExamplePath = join(rootDir, ".env.example");
46
+ if (!dryRun) {
47
+ await writeFile(envExamplePath, envLines.join("\n"), "utf-8");
48
+ written.push(envExamplePath);
49
+ logger.success(`Generated: ${envExamplePath}`);
50
+ }
51
+ else {
52
+ logger.info(`[DRY RUN] Would generate: ${envExamplePath}`);
53
+ }
54
+ // ── Per-server runtime config ──
55
+ for (const [slug, server] of config.serverConfigs) {
56
+ const hostname = deriveHostname(ecosystem, slug);
57
+ const resourceUri = deriveCanonicalResourceUri(ecosystem, slug);
58
+ const mcpEndpoint = deriveMcpEndpoint(ecosystem, slug);
59
+ const metadataUrl = deriveProtectedResourceMetadataUrl(ecosystem, slug);
60
+ const scopes = resolveScopes(ecosystem, server);
61
+ const runtimeConfig = {
62
+ server: {
63
+ name: server.name,
64
+ slug: server.slug,
65
+ hostname,
66
+ resource_uri: resourceUri,
67
+ mcp_endpoint: mcpEndpoint,
68
+ },
69
+ auth: {
70
+ issuer: `https://${ecosystem.auth0.tenant_domain}/`,
71
+ audience: resourceUri,
72
+ jwks_uri: `https://${ecosystem.auth0.tenant_domain}/.well-known/jwks.json`,
73
+ protected_resource_metadata_url: metadataUrl,
74
+ },
75
+ scopes,
76
+ };
77
+ const serverDir = join(rootDir, "mcps", slug);
78
+ await mkdir(serverDir, { recursive: true });
79
+ const runtimeConfigPath = join(serverDir, "runtime-config.generated.json");
80
+ if (!dryRun) {
81
+ await writeFile(runtimeConfigPath, JSON.stringify(runtimeConfig, null, 2) + "\n", "utf-8");
82
+ written.push(runtimeConfigPath);
83
+ logger.success(`Generated: ${runtimeConfigPath}`);
84
+ }
85
+ else {
86
+ logger.info(`[DRY RUN] Would generate: ${runtimeConfigPath}`);
87
+ }
88
+ }
89
+ return { filesWritten: written };
90
+ }
91
+ //# sourceMappingURL=generate-artifacts.js.map