@samanhappy/mcphub 1.0.32 → 1.0.33

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 (115) hide show
  1. package/README.md +11 -1
  2. package/README.zh.md +12 -2
  3. package/dist/clients/openapi.js +439 -72
  4. package/dist/clients/openapi.js.map +1 -1
  5. package/dist/config/index.js +24 -2
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/constants/oauthServerDefaults.js +5 -0
  8. package/dist/constants/oauthServerDefaults.js.map +1 -1
  9. package/dist/controllers/mcpbController.js +6 -13
  10. package/dist/controllers/mcpbController.js.map +1 -1
  11. package/dist/controllers/oauthCallbackController.js +26 -0
  12. package/dist/controllers/oauthCallbackController.js.map +1 -1
  13. package/dist/controllers/oauthServerController.js +40 -4
  14. package/dist/controllers/oauthServerController.js.map +1 -1
  15. package/dist/controllers/serverController.js +108 -31
  16. package/dist/controllers/serverController.js.map +1 -1
  17. package/dist/controllers/templateController.js +1 -1
  18. package/dist/controllers/templateController.js.map +1 -1
  19. package/dist/routes/index.js +2 -1
  20. package/dist/routes/index.js.map +1 -1
  21. package/dist/services/authorizationService.js +28 -0
  22. package/dist/services/authorizationService.js.map +1 -0
  23. package/dist/services/cimdClientService.js +195 -0
  24. package/dist/services/cimdClientService.js.map +1 -0
  25. package/dist/services/mcpService.js +108 -11
  26. package/dist/services/mcpService.js.map +1 -1
  27. package/dist/services/oauthServerService.js +17 -1
  28. package/dist/services/oauthServerService.js.map +1 -1
  29. package/dist/services/openApiToolStatsService.js +37 -0
  30. package/dist/services/openApiToolStatsService.js.map +1 -0
  31. package/dist/services/serverConfigPresenter.js +85 -0
  32. package/dist/services/serverConfigPresenter.js.map +1 -0
  33. package/dist/services/templateService.js +48 -11
  34. package/dist/services/templateService.js.map +1 -1
  35. package/dist/utils/oauthIssuer.js +57 -0
  36. package/dist/utils/oauthIssuer.js.map +1 -0
  37. package/dist/utils/openApiRequestBody.js +220 -0
  38. package/dist/utils/openApiRequestBody.js.map +1 -0
  39. package/dist/utils/processTree.js +47 -0
  40. package/dist/utils/processTree.js.map +1 -0
  41. package/dist/utils/serverConfigPersistence.js +3 -0
  42. package/dist/utils/serverConfigPersistence.js.map +1 -1
  43. package/dist/utils/serverConfigValidation.js +13 -0
  44. package/dist/utils/serverConfigValidation.js.map +1 -0
  45. package/dist/utils/serverNameValidation.js +56 -0
  46. package/dist/utils/serverNameValidation.js.map +1 -0
  47. package/dist/utils/ssrf.js +4 -4
  48. package/dist/utils/ssrf.js.map +1 -1
  49. package/dist/utils/systemConfigCache.js +40 -2
  50. package/dist/utils/systemConfigCache.js.map +1 -1
  51. package/frontend/dist/assets/{ActivityPage-C6m1hGLq.js → ActivityPage-Du9Nh-Jy.js} +2 -2
  52. package/frontend/dist/assets/{ActivityPage-C6m1hGLq.js.map → ActivityPage-Du9Nh-Jy.js.map} +1 -1
  53. package/frontend/dist/assets/ConfirmDialog-3APts2Y9.js +2 -0
  54. package/frontend/dist/assets/ConfirmDialog-3APts2Y9.js.map +1 -0
  55. package/frontend/dist/assets/Dashboard-J4G-AZkI.js +2 -0
  56. package/frontend/dist/assets/{Dashboard-DFKfjPff.js.map → Dashboard-J4G-AZkI.js.map} +1 -1
  57. package/frontend/dist/assets/{EndpointCopy-CP_Fb1To.js → EndpointCopy-DFeLcU9A.js} +2 -2
  58. package/frontend/dist/assets/{EndpointCopy-CP_Fb1To.js.map → EndpointCopy-DFeLcU9A.js.map} +1 -1
  59. package/frontend/dist/assets/GroupsPage-CGMZBiXd.js +33 -0
  60. package/frontend/dist/assets/{GroupsPage-Cwfm5q-a.js.map → GroupsPage-CGMZBiXd.js.map} +1 -1
  61. package/frontend/dist/assets/{LoginPage-CnF44h_n.js → LoginPage-g5pJLBk0.js} +2 -2
  62. package/frontend/dist/assets/{LoginPage-CnF44h_n.js.map → LoginPage-g5pJLBk0.js.map} +1 -1
  63. package/frontend/dist/assets/{LogsPage-BFIpICsM.js → LogsPage-Bkv7xhNf.js} +2 -2
  64. package/frontend/dist/assets/{LogsPage-BFIpICsM.js.map → LogsPage-Bkv7xhNf.js.map} +1 -1
  65. package/frontend/dist/assets/MarketPage-WkLrckIr.js +3 -0
  66. package/frontend/dist/assets/MarketPage-WkLrckIr.js.map +1 -0
  67. package/frontend/dist/assets/{OAuthConsentPage-zqXUvKMF.js → OAuthConsentPage-CA35XoBK.js} +2 -2
  68. package/frontend/dist/assets/{OAuthConsentPage-zqXUvKMF.js.map → OAuthConsentPage-CA35XoBK.js.map} +1 -1
  69. package/frontend/dist/assets/{PromptsPage-Cm8ykiI4.js → PromptsPage-BuDdW69R.js} +2 -2
  70. package/frontend/dist/assets/{PromptsPage-Cm8ykiI4.js.map → PromptsPage-BuDdW69R.js.map} +1 -1
  71. package/frontend/dist/assets/{ResourcesPage-UMyO6mQ4.js → ResourcesPage-Cu-eD5e2.js} +2 -2
  72. package/frontend/dist/assets/{ResourcesPage-UMyO6mQ4.js.map → ResourcesPage-Cu-eD5e2.js.map} +1 -1
  73. package/frontend/dist/assets/{ServersPage-B0RoM8ez.js → ServersPage-B1Np5x3N.js} +5 -5
  74. package/frontend/dist/assets/{ServersPage-B0RoM8ez.js.map → ServersPage-B1Np5x3N.js.map} +1 -1
  75. package/frontend/dist/assets/{SettingsPage-BTB-36-n.js → SettingsPage-BQN8-ZQh.js} +4 -4
  76. package/frontend/dist/assets/SettingsPage-BQN8-ZQh.js.map +1 -0
  77. package/frontend/dist/assets/{StatusDot-BAMXeT2x.js → StatusDot-WyvgqplP.js} +2 -2
  78. package/frontend/dist/assets/{StatusDot-BAMXeT2x.js.map → StatusDot-WyvgqplP.js.map} +1 -1
  79. package/frontend/dist/assets/{ToggleGroup-Cfgt5lJo.js → ToggleGroup-CmeedsZU.js} +2 -2
  80. package/frontend/dist/assets/{ToggleGroup-Cfgt5lJo.js.map → ToggleGroup-CmeedsZU.js.map} +1 -1
  81. package/frontend/dist/assets/UsersPage-DqDFrIIW.js +2 -0
  82. package/frontend/dist/assets/UsersPage-DqDFrIIW.js.map +1 -0
  83. package/frontend/dist/assets/contextCost-CilWqGWT.js +2 -0
  84. package/frontend/dist/assets/contextCost-CilWqGWT.js.map +1 -0
  85. package/frontend/dist/assets/index-BvU2-VT8.js +3 -0
  86. package/frontend/dist/assets/{index-CvXw771N.js.map → index-BvU2-VT8.js.map} +1 -1
  87. package/frontend/dist/assets/index-DtrCVU1h.css +1 -0
  88. package/frontend/dist/assets/passwordValidation-DTLWgUy9.js +2 -0
  89. package/frontend/dist/assets/passwordValidation-DTLWgUy9.js.map +1 -0
  90. package/frontend/dist/assets/{resourceService-D2QmlFby.js → resourceService-BFH4w47h.js} +2 -2
  91. package/frontend/dist/assets/{resourceService-D2QmlFby.js.map → resourceService-BFH4w47h.js.map} +1 -1
  92. package/frontend/dist/assets/useCostData-CoM1SxdS.js +2 -0
  93. package/frontend/dist/assets/useCostData-CoM1SxdS.js.map +1 -0
  94. package/frontend/dist/assets/useSettingsData-DKrECrG1.js +2 -0
  95. package/frontend/dist/assets/{useSettingsData-CeCvZ2nU.js.map → useSettingsData-DKrECrG1.js.map} +1 -1
  96. package/frontend/dist/assets/variableDetection-CIrYDjrq.js +16 -0
  97. package/frontend/dist/assets/variableDetection-CIrYDjrq.js.map +1 -0
  98. package/frontend/dist/index.html +2 -2
  99. package/package.json +1 -1
  100. package/frontend/dist/assets/ConfirmDialog-BCMNzi21.js +0 -2
  101. package/frontend/dist/assets/ConfirmDialog-BCMNzi21.js.map +0 -1
  102. package/frontend/dist/assets/Dashboard-DFKfjPff.js +0 -2
  103. package/frontend/dist/assets/GroupsPage-Cwfm5q-a.js +0 -33
  104. package/frontend/dist/assets/MarketPage-Du-NqiEl.js +0 -3
  105. package/frontend/dist/assets/MarketPage-Du-NqiEl.js.map +0 -1
  106. package/frontend/dist/assets/SettingsPage-BTB-36-n.js.map +0 -1
  107. package/frontend/dist/assets/UsersPage-DlzYf7Su.js +0 -2
  108. package/frontend/dist/assets/UsersPage-DlzYf7Su.js.map +0 -1
  109. package/frontend/dist/assets/contextCost-kp2vZYp7.js +0 -2
  110. package/frontend/dist/assets/contextCost-kp2vZYp7.js.map +0 -1
  111. package/frontend/dist/assets/index-CGvImZ3F.css +0 -1
  112. package/frontend/dist/assets/index-CvXw771N.js +0 -3
  113. package/frontend/dist/assets/useSettingsData-CeCvZ2nU.js +0 -2
  114. package/frontend/dist/assets/variableDetection-DKPiHkxr.js +0 -16
  115. package/frontend/dist/assets/variableDetection-DKPiHkxr.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Pre-save OpenAPI tool statistics for the import preview (#1082).
3
+ *
4
+ * Importing a large OpenAPI document can silently produce a tools/list larger
5
+ * than a model's context window. This service measures what the import *would*
6
+ * generate — tool count, definition payload size and a token estimate —
7
+ * without persisting anything, so the form can surface the numbers before the
8
+ * user confirms.
9
+ *
10
+ * Token estimation reuses the Context Footprint estimator (cl100k via
11
+ * gpt-tokenizer) so preview numbers agree with the per-server footprint shown
12
+ * elsewhere in the dashboard.
13
+ */
14
+ import { OpenAPIClient } from '../clients/openapi.js';
15
+ import { itemCostForTool } from '../utils/tokenCost.js';
16
+ export async function previewOpenApiToolStats(config) {
17
+ // Throwaway client: initialize() fetches (or parses) the spec, dereferences
18
+ // it and runs extractTools() — exactly what a real connection would do. No
19
+ // DAO writes happen here; persistOAuth2Token is left unset so any token
20
+ // refresh result stays in-memory only.
21
+ const client = new OpenAPIClient(config);
22
+ await client.initialize();
23
+ const tools = client.getTools().map((tool) => ({
24
+ name: tool.name,
25
+ description: tool.description,
26
+ inputSchema: tool.inputSchema,
27
+ }));
28
+ const items = await Promise.all(tools.map((tool) => itemCostForTool(tool)));
29
+ return {
30
+ toolCount: tools.length,
31
+ definitionsBytes: Buffer.byteLength(JSON.stringify(tools)),
32
+ estimatedTokens: items.reduce((sum, item) => sum + item.cost, 0),
33
+ // Effective security requirement the spec declares, for form prefill (#1077).
34
+ declaredSecurity: client.getDeclaredSecurity(),
35
+ };
36
+ }
37
+ //# sourceMappingURL=openApiToolStatsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openApiToolStatsService.js","sourceRoot":"","sources":["../../src/services/openApiToolStatsService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAoB;IAEpB,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,uCAAuC;IACvC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,8EAA8E;QAC9E,gBAAgB,EAAE,MAAM,CAAC,mBAAmB,EAAE;KAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { authorizationService } from './authorizationService.js';
2
+ // Metadata a shared user legitimately needs. Everything else — including
3
+ // url, command, args, env, headers, oauth, proxy, openapi, options and any
4
+ // unrecognized future field — is withheld.
5
+ const SAFE_SERVER_CONFIG_FIELDS = [
6
+ 'name',
7
+ 'description',
8
+ 'type',
9
+ 'visibility',
10
+ 'owner',
11
+ 'enabled',
12
+ 'tools',
13
+ 'prompts',
14
+ 'resources',
15
+ ];
16
+ // OAuth session-recovery fields exposed on ServerInfo list entries; only the
17
+ // connected/clientIdConfigured indicators are safe for non-config-readers.
18
+ const SAFE_SERVER_INFO_OAUTH_KEYS = ['connected', 'clientIdConfigured'];
19
+ const clone = (value) => typeof structuredClone === 'function'
20
+ ? structuredClone(value)
21
+ : JSON.parse(JSON.stringify(value));
22
+ const presentSafeServerConfig = (config) => {
23
+ const safe = {};
24
+ for (const field of SAFE_SERVER_CONFIG_FIELDS) {
25
+ if (config[field] !== undefined && config[field] !== null) {
26
+ safe[field] = clone(config[field]);
27
+ }
28
+ }
29
+ // Explicit marker so callers (and the dashboard) can tell a restricted view
30
+ // apart from "this server genuinely has no credentials".
31
+ return { ...safe, configRestricted: true };
32
+ };
33
+ const presentSafeServerInfoOauth = (oauth) => {
34
+ const safeOauth = {};
35
+ for (const key of SAFE_SERVER_INFO_OAUTH_KEYS) {
36
+ if (oauth[key] !== undefined) {
37
+ safeOauth[key] = oauth[key];
38
+ }
39
+ }
40
+ return safeOauth;
41
+ };
42
+ // Present a raw ServerConfig/DAO record for a principal: full deep copy when
43
+ // the principal may read configuration, otherwise the safe view. The input is
44
+ // never mutated. Callers decide independently whether the principal may see
45
+ // the server at all (403 handling stays with them).
46
+ export const presentServerForPrincipal = (config, principal) => {
47
+ if (authorizationService.can('server.config.read', config, principal)) {
48
+ return { view: 'full', data: clone(config) };
49
+ }
50
+ return { view: 'safe', data: presentSafeServerConfig(config) };
51
+ };
52
+ // Generic placeholder for runtime connection errors shown to principals who
53
+ // may not read the full configuration. Upstream/transport error text can
54
+ // contain connection URLs, tokens, or internal paths, and heuristic redaction
55
+ // cannot guarantee arbitrary secrets are removed — so the raw value is
56
+ // withheld entirely (fail closed). `status` stays untouched so shared users
57
+ // can still tell connected/connecting/disconnected/oauth_required apart.
58
+ export const SAFE_RUNTIME_ERROR_MESSAGE = 'Server connection failed';
59
+ const presentSafeRuntimeError = (error) => {
60
+ if (error === null || error === undefined) {
61
+ return error;
62
+ }
63
+ return SAFE_RUNTIME_ERROR_MESSAGE;
64
+ };
65
+ // Present a ServerInfo-shaped list entry: runtime metadata stays, but OAuth
66
+ // session fields, the embedded connection config, and raw runtime error text
67
+ // are reduced to their safe subsets for principals who may not read the full
68
+ // configuration.
69
+ export const presentServerInfoForPrincipal = (info, principal) => {
70
+ if (authorizationService.can('server.config.read', info, principal)) {
71
+ return info;
72
+ }
73
+ const entry = { ...info };
74
+ if (entry.oauth && typeof entry.oauth === 'object') {
75
+ entry.oauth = presentSafeServerInfoOauth(entry.oauth);
76
+ }
77
+ if (entry.config && typeof entry.config === 'object') {
78
+ entry.config = presentSafeServerConfig(entry.config);
79
+ }
80
+ if ('error' in entry) {
81
+ entry.error = presentSafeRuntimeError(entry.error);
82
+ }
83
+ return entry;
84
+ };
85
+ //# sourceMappingURL=serverConfigPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverConfigPresenter.js","sourceRoot":"","sources":["../../src/services/serverConfigPresenter.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { getServerDao, getGroupDao } from '../dao/index.js';
2
+ import { isPrivilegedServerConfig } from '../utils/serverConfigValidation.js';
3
+ import { validateServerName } from '../utils/serverNameValidation.js';
2
4
  import { createGroup } from './groupService.js';
3
5
  import { addServer } from './mcpService.js';
4
6
  import { getDataService } from './services.js';
@@ -169,7 +171,10 @@ function stripOAuthSecrets(oauth) {
169
171
  }
170
172
  return { sanitized, placeholders };
171
173
  }
172
- function stripOpenApiSecuritySecrets(security) {
174
+ function stripOpenApiSecuritySecrets(security,
175
+ // Placeholder prefix, so `security` and `specSecurity` (#1079) secrets map
176
+ // to distinct required env vars instead of one var filling both slots.
177
+ placeholderPrefix = 'OPENAPI') {
173
178
  const sanitized = { type: security.type };
174
179
  const placeholders = [];
175
180
  if (security.apiKey) {
@@ -179,7 +184,7 @@ function stripOpenApiSecuritySecrets(security) {
179
184
  value: security.apiKey.value,
180
185
  };
181
186
  if (security.apiKey.value) {
182
- const { sanitizedValue, placeholder } = sanitizeSecretValue(security.apiKey.value, toPlaceholderName(security.apiKey.name, 'OPENAPI_API_KEY'));
187
+ const { sanitizedValue, placeholder } = sanitizeSecretValue(security.apiKey.value, toPlaceholderName(security.apiKey.name, `${placeholderPrefix}_API_KEY`));
183
188
  sanitized.apiKey.value = sanitizedValue;
184
189
  placeholders.push(placeholder);
185
190
  }
@@ -192,7 +197,7 @@ function stripOpenApiSecuritySecrets(security) {
192
197
  sanitized.http.bearerFormat = security.http.bearerFormat;
193
198
  }
194
199
  if (security.http.credentials) {
195
- const { sanitizedValue, placeholder } = sanitizeSecretValue(security.http.credentials, 'OPENAPI_HTTP_CREDENTIALS');
200
+ const { sanitizedValue, placeholder } = sanitizeSecretValue(security.http.credentials, `${placeholderPrefix}_HTTP_CREDENTIALS`);
196
201
  sanitized.http.credentials = sanitizedValue;
197
202
  placeholders.push(placeholder);
198
203
  }
@@ -206,12 +211,12 @@ function stripOpenApiSecuritySecrets(security) {
206
211
  if (security.oauth2.scopes)
207
212
  sanitized.oauth2.scopes = [...security.oauth2.scopes];
208
213
  if (security.oauth2.clientSecret) {
209
- const { sanitizedValue, placeholder } = sanitizeSecretValue(security.oauth2.clientSecret, 'OPENAPI_OAUTH2_CLIENT_SECRET');
214
+ const { sanitizedValue, placeholder } = sanitizeSecretValue(security.oauth2.clientSecret, `${placeholderPrefix}_OAUTH2_CLIENT_SECRET`);
210
215
  sanitized.oauth2.clientSecret = sanitizedValue;
211
216
  placeholders.push(placeholder);
212
217
  }
213
218
  if (security.oauth2.token) {
214
- const { sanitizedValue, placeholder } = sanitizeSecretValue(security.oauth2.token, 'OPENAPI_OAUTH2_TOKEN');
219
+ const { sanitizedValue, placeholder } = sanitizeSecretValue(security.oauth2.token, `${placeholderPrefix}_OAUTH2_TOKEN`);
215
220
  sanitized.oauth2.token = sanitizedValue;
216
221
  placeholders.push(placeholder);
217
222
  }
@@ -224,12 +229,12 @@ function stripOpenApiSecuritySecrets(security) {
224
229
  sanitized.openIdConnect.clientId = security.openIdConnect.clientId;
225
230
  }
226
231
  if (security.openIdConnect.clientSecret) {
227
- const { sanitizedValue, placeholder } = sanitizeSecretValue(security.openIdConnect.clientSecret, 'OPENAPI_OPENID_CLIENT_SECRET');
232
+ const { sanitizedValue, placeholder } = sanitizeSecretValue(security.openIdConnect.clientSecret, `${placeholderPrefix}_OPENID_CLIENT_SECRET`);
228
233
  sanitized.openIdConnect.clientSecret = sanitizedValue;
229
234
  placeholders.push(placeholder);
230
235
  }
231
236
  if (security.openIdConnect.token) {
232
- const { sanitizedValue, placeholder } = sanitizeSecretValue(security.openIdConnect.token, 'OPENAPI_OPENID_TOKEN');
237
+ const { sanitizedValue, placeholder } = sanitizeSecretValue(security.openIdConnect.token, `${placeholderPrefix}_OPENID_TOKEN`);
233
238
  sanitized.openIdConnect.token = sanitizedValue;
234
239
  placeholders.push(placeholder);
235
240
  }
@@ -305,6 +310,11 @@ function serverConfigToTemplate(config) {
305
310
  templateConfig.openapi.security = sanitized;
306
311
  envVars.push(...placeholders);
307
312
  }
313
+ if (config.openapi.specSecurity) {
314
+ const { sanitized, placeholders } = stripOpenApiSecuritySecrets(config.openapi.specSecurity, 'OPENAPI_SPEC');
315
+ templateConfig.openapi.specSecurity = sanitized;
316
+ envVars.push(...placeholders);
317
+ }
308
318
  }
309
319
  return { templateConfig, envVars };
310
320
  }
@@ -427,8 +437,13 @@ function validateTemplate(data) {
427
437
  /**
428
438
  * Import a configuration template.
429
439
  * Creates servers and groups that don't already exist.
440
+ *
441
+ * Non-admin callers cannot import privileged (stdio/command-carrying) server
442
+ * configs; each such server is reported as a failed detail item and skipped.
443
+ * No `requestingUser` means a trusted system caller — legacy unrestricted
444
+ * behavior, mirroring `exportTemplate`.
430
445
  */
431
- export async function importTemplate(template, owner) {
446
+ export async function importTemplate(template, owner, requestingUser) {
432
447
  if (!validateTemplate(template)) {
433
448
  return {
434
449
  success: false,
@@ -454,20 +469,42 @@ export async function importTemplate(template, owner) {
454
469
  serversSkipped++;
455
470
  continue;
456
471
  }
472
+ // Server names become part of downstream tool identifiers, so they must
473
+ // satisfy the same charset rule as every other create path.
474
+ const nameValidation = validateServerName(name);
475
+ if (!nameValidation.valid) {
476
+ details.push({
477
+ type: 'server',
478
+ name,
479
+ action: 'failed',
480
+ message: nameValidation.message || 'Invalid server name',
481
+ });
482
+ continue;
483
+ }
484
+ const serverName = nameValidation.normalized;
485
+ if (requestingUser && !requestingUser.isAdmin && isPrivilegedServerConfig(config)) {
486
+ details.push({
487
+ type: 'server',
488
+ name: serverName,
489
+ action: 'failed',
490
+ message: 'Only admins can import stdio-based server configurations',
491
+ });
492
+ continue;
493
+ }
457
494
  try {
458
495
  const serverConfig = {
459
496
  ...config,
460
497
  enabled: config.enabled ?? true,
461
498
  owner: owner || 'admin',
462
499
  };
463
- await addServer(name, serverConfig);
464
- details.push({ type: 'server', name, action: 'created' });
500
+ await addServer(serverName, serverConfig);
501
+ details.push({ type: 'server', name: serverName, action: 'created' });
465
502
  serversCreated++;
466
503
  }
467
504
  catch (error) {
468
505
  details.push({
469
506
  type: 'server',
470
- name,
507
+ name: serverName,
471
508
  action: 'failed',
472
509
  message: error instanceof Error ? error.message : 'Unknown error',
473
510
  });
@@ -1 +1 @@
1
- {"version":3,"file":"templateService.js","sourceRoot":"","sources":["../../src/services/templateService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templateService.js","sourceRoot":"","sources":["../../src/services/templateService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * RFC 9207 (OAuth 2.0 Authorization Server Issuer Identification) helpers.
3
+ *
4
+ * When MCPHub acts as an OAuth *client* toward upstream MCP servers, the
5
+ * authorization response redirect may carry an `iss` parameter. Per RFC 9207 /
6
+ * SEP-2468 the client must validate it against the issuer it sent the
7
+ * authorization request to before redeeming the code — this closes the
8
+ * authorization-server mix-up attack where a malicious AS's code is replayed
9
+ * at another AS's token endpoint under the same redirect URI.
10
+ */
11
+ const originOf = (url) => {
12
+ if (!url) {
13
+ return undefined;
14
+ }
15
+ try {
16
+ return new URL(url).origin;
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ };
22
+ /**
23
+ * Expected `iss` values for an upstream authorization flow: the explicitly
24
+ * configured issuer plus the origin of the authorization endpoint actually used.
25
+ */
26
+ export const expectedIssValues = (ctx) => {
27
+ const candidates = [ctx.configuredIssuer, originOf(ctx.authorizationUrl)];
28
+ return [...new Set(candidates.filter((c) => Boolean(c)))];
29
+ };
30
+ /**
31
+ * Validate the `iss` authorization-response parameter.
32
+ *
33
+ * - Absent `iss` → valid but unchecked (older servers do not send it).
34
+ * - Present `iss` with nothing to compare against → unchecked fail-safe pass,
35
+ * since we cannot establish what the client expected (no mix-up possible
36
+ * when only one AS is involved in a flow keyed by our own state parameter).
37
+ * - Present `iss` → must exactly match one of the expected values.
38
+ */
39
+ export const validateAuthorizationIss = (ctx) => {
40
+ const { iss } = ctx;
41
+ if (!iss) {
42
+ return { valid: true, checked: false };
43
+ }
44
+ const expected = expectedIssValues(ctx);
45
+ if (expected.length === 0) {
46
+ return { valid: true, checked: false };
47
+ }
48
+ if (expected.includes(iss)) {
49
+ return { valid: true, checked: true };
50
+ }
51
+ return {
52
+ valid: false,
53
+ checked: true,
54
+ reason: 'iss parameter does not match the expected authorization server issuer',
55
+ };
56
+ };
57
+ //# sourceMappingURL=oauthIssuer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthIssuer.js","sourceRoot":"","sources":["../../src/utils/oauthIssuer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,MAAM,QAAQ,GAAG,CAAC,GAAuB,EAAsB,EAAE;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAoC,EAAY,EAAE;IAClF,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,GAAoC,EACf,EAAE;IACvB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAEpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,uEAAuE;KAChF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Request-body handling for OpenAPI tool operations: resolving an operation's
3
+ * declared body content type, advertising it in a model-friendly tool schema,
4
+ * and serializing outgoing bodies per content type (#1078).
5
+ *
6
+ * Schema advertisement (OpenAPIClient.generateInputSchema) and outgoing
7
+ * serialization (OpenAPIClient.callTool) both resolve the operation's body
8
+ * through selectRequestBodyContent so they can never drift apart.
9
+ */
10
+ // Request-body content types the hub can advertise and serialize, in the order
11
+ // they are preferred when an operation declares several.
12
+ const REQUEST_BODY_CONTENT_TYPE_PRIORITY = [
13
+ 'application/json',
14
+ 'application/x-www-form-urlencoded',
15
+ 'multipart/form-data',
16
+ ];
17
+ // Media type keys may carry parameters ('application/json; charset=utf-8');
18
+ // compare on the bare type so those declarations still match.
19
+ function normalizeMediaTypeKey(key) {
20
+ return key.split(';')[0].trim().toLowerCase();
21
+ }
22
+ export function selectRequestBodyContent(requestBody) {
23
+ const content = requestBody?.content;
24
+ if (!content) {
25
+ return null;
26
+ }
27
+ for (const contentType of REQUEST_BODY_CONTENT_TYPE_PRIORITY) {
28
+ const key = Object.keys(content).find((k) => normalizeMediaTypeKey(k) === contentType);
29
+ if (!key) {
30
+ continue;
31
+ }
32
+ const mediaType = content[key];
33
+ if (mediaType) {
34
+ return { contentType, mediaType };
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ // Rewrites a multipart/form-data body schema for model consumption. Binary
40
+ // fields (`type: string, format: binary`) become plain strings carrying
41
+ // base64-encoded contents, because tool arguments arrive as JSON — a model
42
+ // cannot produce raw bytes. The rewrite must tolerate the circular references
43
+ // SwaggerParser.dereference leaves behind (#959), hence the memoized walk.
44
+ const MULTIPART_BINARY_FIELD_HINT = 'Provide base64-encoded file contents; MCPHub decodes them and uploads the bytes as this file part. An object {content, filename, contentType} may be supplied instead of a bare string to control the uploaded filename and MIME type.';
45
+ export function makeMultipartBodySchemaModelFriendly(schema) {
46
+ const cache = new Map();
47
+ const transform = (node) => {
48
+ if (!node || typeof node !== 'object' || Array.isArray(node)) {
49
+ return node;
50
+ }
51
+ const cached = cache.get(node);
52
+ if (cached !== undefined) {
53
+ return cached;
54
+ }
55
+ const source = node;
56
+ const clone = { ...source };
57
+ cache.set(node, clone);
58
+ if (source.type === 'string' && source.format === 'binary') {
59
+ delete clone.format;
60
+ const ownDescription = typeof source.description === 'string' ? `${source.description.trim()} ` : '';
61
+ clone.description = `${ownDescription}${MULTIPART_BINARY_FIELD_HINT}`;
62
+ }
63
+ if (clone.items) {
64
+ clone.items = transform(clone.items);
65
+ }
66
+ if (clone.additionalProperties && typeof clone.additionalProperties === 'object') {
67
+ clone.additionalProperties = transform(clone.additionalProperties);
68
+ }
69
+ for (const keyword of ['properties', 'patternProperties']) {
70
+ const nested = clone[keyword];
71
+ if (nested && typeof nested === 'object') {
72
+ const transformed = {};
73
+ for (const [key, value] of Object.entries(nested)) {
74
+ transformed[key] = transform(value);
75
+ }
76
+ clone[keyword] = transformed;
77
+ }
78
+ }
79
+ for (const keyword of ['anyOf', 'oneOf', 'allOf', 'prefixItems']) {
80
+ if (Array.isArray(clone[keyword])) {
81
+ clone[keyword] = clone[keyword].map(transform);
82
+ }
83
+ }
84
+ return clone;
85
+ };
86
+ return transform(schema);
87
+ }
88
+ const DEFAULT_UPLOAD_FILENAME = 'upload';
89
+ const DEFAULT_UPLOAD_CONTENT_TYPE = 'application/octet-stream';
90
+ const MULTIPART_FILE_DESCRIPTOR_KEYS = new Set(['content', 'filename', 'contentType']);
91
+ // base64 (standard or URL-safe alphabet), whitespace allowed around the value
92
+ const BASE64_PATTERN = /^[A-Za-z0-9+/\-_]+={0,2}$/;
93
+ function decodeBase64FileContents(fieldName, value) {
94
+ const compact = value.replace(/\s+/g, '');
95
+ if (!BASE64_PATTERN.test(compact)) {
96
+ throw new Error(`Multipart field '${fieldName}' must be a base64-encoded string of the file contents`);
97
+ }
98
+ const buffer = Buffer.from(compact, 'base64');
99
+ if (buffer.length === 0) {
100
+ throw new Error(`Multipart field '${fieldName}' does not contain any decodable base64 file contents`);
101
+ }
102
+ return buffer;
103
+ }
104
+ function appendMultipartField(parts, name, value, isBinaryField) {
105
+ if (value === undefined || value === null) {
106
+ return;
107
+ }
108
+ // Arrays expand into repeated parts, matching how form fields repeat keys.
109
+ if (Array.isArray(value)) {
110
+ for (const item of value) {
111
+ appendMultipartField(parts, name, item, isBinaryField);
112
+ }
113
+ return;
114
+ }
115
+ if (isBinaryField) {
116
+ let contents;
117
+ let filename;
118
+ let contentType;
119
+ if (typeof value === 'string') {
120
+ contents = value;
121
+ }
122
+ else if (typeof value === 'object' &&
123
+ typeof value.content === 'string') {
124
+ const descriptor = value;
125
+ contents = descriptor.content;
126
+ if (typeof descriptor.filename === 'string') {
127
+ filename = descriptor.filename;
128
+ }
129
+ if (typeof descriptor.contentType === 'string') {
130
+ contentType = descriptor.contentType;
131
+ }
132
+ }
133
+ else {
134
+ throw new Error(`Multipart field '${name}' expects a base64-encoded string or an object {content, filename, contentType}`);
135
+ }
136
+ parts.push({
137
+ name,
138
+ value: decodeBase64FileContents(name, contents),
139
+ filename: filename ?? DEFAULT_UPLOAD_FILENAME,
140
+ contentType: contentType ?? DEFAULT_UPLOAD_CONTENT_TYPE,
141
+ });
142
+ return;
143
+ }
144
+ // Defensive: honor explicit file descriptors even when the spec did not mark
145
+ // the field binary, then fall back to text serialization.
146
+ if (typeof value === 'object') {
147
+ const record = value;
148
+ if (typeof record.content === 'string' &&
149
+ Object.keys(record).every((key) => MULTIPART_FILE_DESCRIPTOR_KEYS.has(key))) {
150
+ appendMultipartField(parts, name, value, true);
151
+ return;
152
+ }
153
+ parts.push({ name, value: JSON.stringify(record) });
154
+ return;
155
+ }
156
+ parts.push({ name, value: String(value) });
157
+ }
158
+ export function buildMultipartParts(bodyValue, schema) {
159
+ if (!bodyValue || typeof bodyValue !== 'object' || Array.isArray(bodyValue)) {
160
+ throw new Error('multipart/form-data request body must be provided as an object of form fields');
161
+ }
162
+ const properties = schema?.properties;
163
+ const isBinaryField = (name) => {
164
+ const propertySchema = properties?.[name];
165
+ return !!propertySchema && propertySchema.type === 'string' && propertySchema.format === 'binary';
166
+ };
167
+ const parts = [];
168
+ for (const [name, value] of Object.entries(bodyValue)) {
169
+ appendMultipartField(parts, name, value, isBinaryField(name));
170
+ }
171
+ return parts;
172
+ }
173
+ // Quotes/newlines in part names or filenames would corrupt the multipart
174
+ // framing; replace them rather than trusting upstream spec names.
175
+ function sanitizeHeaderToken(token) {
176
+ return token.replace(/[\r\n"]/g, '_');
177
+ }
178
+ export function serializeMultipartBody(parts, boundary) {
179
+ const chunks = [];
180
+ for (const part of parts) {
181
+ chunks.push(Buffer.from(`--${boundary}\r\n`, 'utf8'));
182
+ if (part.filename !== undefined) {
183
+ chunks.push(Buffer.from(`Content-Disposition: form-data; name="${sanitizeHeaderToken(part.name)}"; filename="${sanitizeHeaderToken(part.filename)}"\r\n`, 'utf8'));
184
+ chunks.push(Buffer.from(`Content-Type: ${part.contentType ?? DEFAULT_UPLOAD_CONTENT_TYPE}\r\n\r\n`, 'utf8'));
185
+ chunks.push(part.value);
186
+ }
187
+ else {
188
+ chunks.push(Buffer.from(`Content-Disposition: form-data; name="${sanitizeHeaderToken(part.name)}"\r\n\r\n`, 'utf8'));
189
+ chunks.push(Buffer.from(String(part.value), 'utf8'));
190
+ }
191
+ chunks.push(Buffer.from('\r\n', 'utf8'));
192
+ }
193
+ chunks.push(Buffer.from(`--${boundary}--\r\n`, 'utf8'));
194
+ return Buffer.concat(chunks);
195
+ }
196
+ // Serializes an application/x-www-form-urlencoded body: arrays become repeated
197
+ // keys, nested objects are JSON-stringified, primitives use their string form.
198
+ export function encodeFormUrlEncoded(bodyValue) {
199
+ if (!bodyValue || typeof bodyValue !== 'object' || Array.isArray(bodyValue)) {
200
+ throw new Error('application/x-www-form-urlencoded request body must be provided as an object of form fields');
201
+ }
202
+ const params = new URLSearchParams();
203
+ const append = (key, value) => {
204
+ if (value === undefined || value === null) {
205
+ return;
206
+ }
207
+ if (Array.isArray(value)) {
208
+ for (const item of value) {
209
+ append(key, item);
210
+ }
211
+ return;
212
+ }
213
+ params.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));
214
+ };
215
+ for (const [key, value] of Object.entries(bodyValue)) {
216
+ append(key, value);
217
+ }
218
+ return params.toString();
219
+ }
220
+ //# sourceMappingURL=openApiRequestBody.js.map