@samanhappy/mcphub 1.1.2 → 1.1.4

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 (116) hide show
  1. package/README.fr.md +6 -0
  2. package/README.md +6 -0
  3. package/README.zh.md +4 -0
  4. package/dist/cli/http.js +54 -1
  5. package/dist/cli/http.js.map +1 -1
  6. package/dist/controllers/mcpbController.js +6 -2
  7. package/dist/controllers/mcpbController.js.map +1 -1
  8. package/dist/controllers/oauthCallbackController.js +11 -16
  9. package/dist/controllers/oauthCallbackController.js.map +1 -1
  10. package/dist/controllers/oauthServerController.js +10 -7
  11. package/dist/controllers/oauthServerController.js.map +1 -1
  12. package/dist/controllers/personalOAuthController.js +119 -0
  13. package/dist/controllers/personalOAuthController.js.map +1 -0
  14. package/dist/controllers/serverController.js +17 -2
  15. package/dist/controllers/serverController.js.map +1 -1
  16. package/dist/controllers/smartRoutingController.js +4 -4
  17. package/dist/controllers/smartRoutingController.js.map +1 -1
  18. package/dist/dao/CredentialBindingDao.js +8 -0
  19. package/dist/dao/CredentialBindingDao.js.map +1 -1
  20. package/dist/dao/CredentialBindingDaoDbImpl.js +14 -0
  21. package/dist/dao/CredentialBindingDaoDbImpl.js.map +1 -1
  22. package/dist/dao/SystemConfigDaoDbImpl.js +3 -0
  23. package/dist/dao/SystemConfigDaoDbImpl.js.map +1 -1
  24. package/dist/db/entities/SystemConfig.js +4 -0
  25. package/dist/db/entities/SystemConfig.js.map +1 -1
  26. package/dist/routes/index.js +8 -1
  27. package/dist/routes/index.js.map +1 -1
  28. package/dist/services/cimdClientService.js +2 -1
  29. package/dist/services/cimdClientService.js.map +1 -1
  30. package/dist/services/credentialBindingService.js +14 -8
  31. package/dist/services/credentialBindingService.js.map +1 -1
  32. package/dist/services/mcpOAuthProvider.js +40 -24
  33. package/dist/services/mcpOAuthProvider.js.map +1 -1
  34. package/dist/services/mcpService.js +120 -50
  35. package/dist/services/mcpService.js.map +1 -1
  36. package/dist/services/oauthService.js +3 -1
  37. package/dist/services/oauthService.js.map +1 -1
  38. package/dist/services/personalOAuthService.js +235 -0
  39. package/dist/services/personalOAuthService.js.map +1 -0
  40. package/dist/services/principalRuntimeService.js +67 -45
  41. package/dist/services/principalRuntimeService.js.map +1 -1
  42. package/dist/services/serverConfigPresenter.js +11 -1
  43. package/dist/services/serverConfigPresenter.js.map +1 -1
  44. package/dist/services/sseService.js +10 -30
  45. package/dist/services/sseService.js.map +1 -1
  46. package/dist/services/upstreamOAuthDisconnectService.js +2 -2
  47. package/dist/services/upstreamOAuthDisconnectService.js.map +1 -1
  48. package/dist/utils/credentialTemplate.js +37 -6
  49. package/dist/utils/credentialTemplate.js.map +1 -1
  50. package/dist/utils/migration.js +1 -0
  51. package/dist/utils/migration.js.map +1 -1
  52. package/dist/utils/protectedResource.js +44 -0
  53. package/dist/utils/protectedResource.js.map +1 -0
  54. package/dist/utils/serverConfigPersistence.js +13 -0
  55. package/dist/utils/serverConfigPersistence.js.map +1 -1
  56. package/dist/utils/ssrf.js +47 -12
  57. package/dist/utils/ssrf.js.map +1 -1
  58. package/dist/utils/upstreamError.js +8 -1
  59. package/dist/utils/upstreamError.js.map +1 -1
  60. package/frontend/dist/assets/{ActivityPage-DFLMe7o2.js → ActivityPage-Cmpa6PNN.js} +2 -2
  61. package/frontend/dist/assets/{ActivityPage-DFLMe7o2.js.map → ActivityPage-Cmpa6PNN.js.map} +1 -1
  62. package/frontend/dist/assets/{CopyClientConfigDialog-DukyyXVp.js → CopyClientConfigDialog-CAqbh1Uh.js} +3 -3
  63. package/frontend/dist/assets/{CopyClientConfigDialog-DukyyXVp.js.map → CopyClientConfigDialog-CAqbh1Uh.js.map} +1 -1
  64. package/frontend/dist/assets/{CredentialsPage-BpBCEmEE.js → CredentialsPage-Cwr2rAVa.js} +2 -2
  65. package/frontend/dist/assets/{CredentialsPage-BpBCEmEE.js.map → CredentialsPage-Cwr2rAVa.js.map} +1 -1
  66. package/frontend/dist/assets/{Dashboard-DjZkbAPt.js → Dashboard-7XIOjzwF.js} +2 -2
  67. package/frontend/dist/assets/{Dashboard-DjZkbAPt.js.map → Dashboard-7XIOjzwF.js.map} +1 -1
  68. package/frontend/dist/assets/EndpointCopy-CZVjSaZJ.js +2 -0
  69. package/frontend/dist/assets/{EndpointCopy-Bv-_FPmR.js.map → EndpointCopy-CZVjSaZJ.js.map} +1 -1
  70. package/frontend/dist/assets/{GroupsPage-B8BWRIWv.js → GroupsPage-BpHUw2qs.js} +3 -3
  71. package/frontend/dist/assets/{GroupsPage-B8BWRIWv.js.map → GroupsPage-BpHUw2qs.js.map} +1 -1
  72. package/frontend/dist/assets/{LoginPage-OH73zcbT.js → LoginPage-ClSBXFLy.js} +2 -2
  73. package/frontend/dist/assets/{LoginPage-OH73zcbT.js.map → LoginPage-ClSBXFLy.js.map} +1 -1
  74. package/frontend/dist/assets/{LogsPage-B6P_uQvL.js → LogsPage-CVuaA5oX.js} +2 -2
  75. package/frontend/dist/assets/{LogsPage-B6P_uQvL.js.map → LogsPage-CVuaA5oX.js.map} +1 -1
  76. package/frontend/dist/assets/{MarketPage-CKjkgZpe.js → MarketPage-BveXMx84.js} +2 -2
  77. package/frontend/dist/assets/{MarketPage-CKjkgZpe.js.map → MarketPage-BveXMx84.js.map} +1 -1
  78. package/frontend/dist/assets/{OAuthConsentPage-DjvtbLnm.js → OAuthConsentPage-B7kOLjXw.js} +2 -2
  79. package/frontend/dist/assets/{OAuthConsentPage-DjvtbLnm.js.map → OAuthConsentPage-B7kOLjXw.js.map} +1 -1
  80. package/frontend/dist/assets/{PromptsPage-CCMb9OH2.js → PromptsPage-DFH6bLuP.js} +2 -2
  81. package/frontend/dist/assets/{PromptsPage-CCMb9OH2.js.map → PromptsPage-DFH6bLuP.js.map} +1 -1
  82. package/frontend/dist/assets/{ResourcesPage-BERaKn0d.js → ResourcesPage-Dsjlzp3t.js} +2 -2
  83. package/frontend/dist/assets/{ResourcesPage-BERaKn0d.js.map → ResourcesPage-Dsjlzp3t.js.map} +1 -1
  84. package/frontend/dist/assets/ServersPage-BXEDxyLa.js +39 -0
  85. package/frontend/dist/assets/ServersPage-BXEDxyLa.js.map +1 -0
  86. package/frontend/dist/assets/SettingsPage-B1zU66rQ.js +14 -0
  87. package/frontend/dist/assets/SettingsPage-B1zU66rQ.js.map +1 -0
  88. package/frontend/dist/assets/{StatusDot-IWYCjv_t.js → StatusDot-Cp0G2KUZ.js} +2 -2
  89. package/frontend/dist/assets/{StatusDot-IWYCjv_t.js.map → StatusDot-Cp0G2KUZ.js.map} +1 -1
  90. package/frontend/dist/assets/{ToggleGroup-B_NGGU8p.js → ToggleGroup-BoQ324GW.js} +2 -2
  91. package/frontend/dist/assets/{ToggleGroup-B_NGGU8p.js.map → ToggleGroup-BoQ324GW.js.map} +1 -1
  92. package/frontend/dist/assets/{UsersPage-D9QdH-ma.js → UsersPage-B27T44p9.js} +2 -2
  93. package/frontend/dist/assets/{UsersPage-D9QdH-ma.js.map → UsersPage-B27T44p9.js.map} +1 -1
  94. package/frontend/dist/assets/{clipboard-CFeeSZ4D.js → clipboard-ChKqfVYn.js} +2 -2
  95. package/frontend/dist/assets/{clipboard-CFeeSZ4D.js.map → clipboard-ChKqfVYn.js.map} +1 -1
  96. package/frontend/dist/assets/{icons-vendor-CEwDZ1lN.js → icons-vendor-CkcU1LMA.js} +2 -2
  97. package/frontend/dist/assets/{icons-vendor-CEwDZ1lN.js.map → icons-vendor-CkcU1LMA.js.map} +1 -1
  98. package/frontend/dist/assets/index-dQlYMTl9.js +3 -0
  99. package/frontend/dist/assets/index-dQlYMTl9.js.map +1 -0
  100. package/frontend/dist/assets/{resourceService-BoJqsssR.js → resourceService-CmNa5REv.js} +2 -2
  101. package/frontend/dist/assets/{resourceService-BoJqsssR.js.map → resourceService-CmNa5REv.js.map} +1 -1
  102. package/frontend/dist/assets/{useCostData-Dld-MisV.js → useCostData-BrV9Dqf7.js} +2 -2
  103. package/frontend/dist/assets/{useCostData-Dld-MisV.js.map → useCostData-BrV9Dqf7.js.map} +1 -1
  104. package/frontend/dist/assets/variableDetection-sA1AjKyF.js +16 -0
  105. package/frontend/dist/assets/variableDetection-sA1AjKyF.js.map +1 -0
  106. package/frontend/dist/index.html +2 -2
  107. package/package.json +1 -1
  108. package/frontend/dist/assets/EndpointCopy-Bv-_FPmR.js +0 -2
  109. package/frontend/dist/assets/ServersPage-BNsFiZez.js +0 -39
  110. package/frontend/dist/assets/ServersPage-BNsFiZez.js.map +0 -1
  111. package/frontend/dist/assets/SettingsPage-PiL7o9b9.js +0 -12
  112. package/frontend/dist/assets/SettingsPage-PiL7o9b9.js.map +0 -1
  113. package/frontend/dist/assets/index-RTKBtgGw.js +0 -3
  114. package/frontend/dist/assets/index-RTKBtgGw.js.map +0 -1
  115. package/frontend/dist/assets/variableDetection-C1abuc-p.js +0 -16
  116. package/frontend/dist/assets/variableDetection-C1abuc-p.js.map +0 -1
@@ -115,7 +115,7 @@ export const isOAuthEnabled = () => {
115
115
  export const getServerOAuthToken = async (serverName) => {
116
116
  const serverDao = getServerDao();
117
117
  const serverConfig = await serverDao.findById(serverName);
118
- if (!serverConfig?.oauth) {
118
+ if (!serverConfig?.oauth || serverConfig.oauth.identityMode === 'personal') {
119
119
  return undefined;
120
120
  }
121
121
  // If a pre-configured access token exists, use it
@@ -187,6 +187,8 @@ export const initializeAllOAuthClients = async () => {
187
187
  logger.log('Initializing OAuth clients for explicitly configured servers...');
188
188
  const registrationPromises = [];
189
189
  for (const serverConfig of allServers) {
190
+ if (serverConfig.oauth?.identityMode === 'personal')
191
+ continue;
190
192
  const serverName = serverConfig.name;
191
193
  // Only initialize servers with explicitly enabled dynamic registration
192
194
  // Others will be auto-detected and registered on first 401 response
@@ -1 +1 @@
1
- {"version":3,"file":"oauthService.js","sourceRoot":"","sources":["../../src/services/oauthService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauthService.js","sourceRoot":"","sources":["../../src/services/oauthService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ import { expandServerConfig } from './serverConfigEnvironment.js';
2
+ import { getCredentialBindingDao, getServerDao, getUserDao } from '../dao/DaoFactory.js';
3
+ import { credentialBindingEvents, encryptCredentialValues, decryptCredentialValues, } from './credentialBindingService.js';
4
+ import { authorizationService } from './authorizationService.js';
5
+ import { CredentialBindingError } from '../utils/credentialTemplate.js';
6
+ export const hasPersonalOAuth = (config) => config?.oauth?.identityMode === 'personal';
7
+ export const personalOAuthContexts = new WeakMap();
8
+ const queues = new Map();
9
+ const serialize = async (key, action) => {
10
+ const previous = queues.get(key) || Promise.resolve();
11
+ const next = previous.catch(() => undefined).then(action);
12
+ queues.set(key, next);
13
+ try {
14
+ return await next;
15
+ }
16
+ finally {
17
+ if (queues.get(key) === next)
18
+ queues.delete(key);
19
+ }
20
+ };
21
+ export const withPersonalOAuthLock = (serverName, username, action) => serialize(JSON.stringify([serverName, username]), action);
22
+ export const personalAuthorizationRequired = (name) => new CredentialBindingError(`Personal authorization required for '${name}'. Connect in Dashboard → Servers.`);
23
+ // The declaration, not resolved tokens/client registration, binds a flow to its destination.
24
+ const fingerprint = (config, expanded) => {
25
+ // Bindings follow a plain rename; the display name does not change the destination.
26
+ const { name: _, ...declaration } = config;
27
+ return JSON.stringify([declaration, expanded.url, expanded.oauth]);
28
+ };
29
+ export class PersonalOAuthContext {
30
+ constructor(serverName, username, config, declaration) {
31
+ this.serverName = serverName;
32
+ this.username = username;
33
+ this.declaration = declaration;
34
+ const { accessToken: _, refreshToken: __, pendingAuthorization: ___, ...oauth } = config.oauth || {};
35
+ this.config = {
36
+ ...config,
37
+ oauth,
38
+ passthroughHeaders: config.passthroughHeaders?.filter((name) => name.toLowerCase() !== 'authorization'),
39
+ };
40
+ }
41
+ static async load(serverName, username, definition) {
42
+ const expanded = await expandServerConfig(definition);
43
+ const context = new PersonalOAuthContext(serverName, username, expanded, fingerprint(definition, expanded));
44
+ const binding = await getCredentialBindingDao().get(serverName, username);
45
+ if (binding) {
46
+ const values = await decryptCredentialValues(binding);
47
+ if (values.oauthDeclaration === context.declaration && values.oauth) {
48
+ context.config.oauth = { ...context.config.oauth, ...JSON.parse(values.oauth) };
49
+ }
50
+ context.revision = binding.encryptedValues;
51
+ }
52
+ personalOAuthContexts.set(context.config, context);
53
+ return context;
54
+ }
55
+ wrapFetch(fetchFn) {
56
+ return async (input, init) => {
57
+ const body = init?.body instanceof URLSearchParams
58
+ ? init.body
59
+ : typeof init?.body === 'string'
60
+ ? new URLSearchParams(init.body)
61
+ : undefined;
62
+ if (body?.get('grant_type') !== 'refresh_token')
63
+ return fetchFn(input, init);
64
+ const key = JSON.stringify([String(input), body.get('refresh_token')]);
65
+ if (this.refresh?.key !== key) {
66
+ const response = fetchFn(input, init);
67
+ this.refresh = { key, response };
68
+ void response.then(() => {
69
+ // The SDK may reject an HTTP 200 payload without persisting tokens.
70
+ // Bound coalescing so that an unusable response cannot poison retries.
71
+ const timer = setTimeout(() => {
72
+ if (this.refresh?.response === response)
73
+ this.refresh = undefined;
74
+ }, 1000);
75
+ timer.unref?.();
76
+ }, () => {
77
+ if (this.refresh?.response === response)
78
+ this.refresh = undefined;
79
+ });
80
+ }
81
+ // Briefly share the response until token persistence completes, so concurrent
82
+ // SDK calls do not redeem a rotating refresh token twice.
83
+ const refresh = this.refresh;
84
+ const response = await refresh.response;
85
+ if (!response.ok && this.refresh === refresh)
86
+ this.refresh = undefined;
87
+ return response.clone();
88
+ };
89
+ }
90
+ get authorizationUrl() {
91
+ const pending = this.config.oauth.pendingAuthorization;
92
+ return pending?.state && pending.createdAt && Date.now() - pending.createdAt < 600000
93
+ ? pending.authorizationUrl
94
+ : undefined;
95
+ }
96
+ get version() {
97
+ return this.revision || 'unbound';
98
+ }
99
+ async assertCurrent() {
100
+ const definition = await getServerDao().findById(this.serverName);
101
+ const user = await getUserDao().findByUsername(this.username);
102
+ if (!definition ||
103
+ !user ||
104
+ definition.enabled === false ||
105
+ !hasPersonalOAuth(definition) ||
106
+ fingerprint(definition, await expandServerConfig(definition)) !== this.declaration ||
107
+ !authorizationService.can('server.invoke', definition, { ...user, username: this.username }))
108
+ throw new CredentialBindingError('Personal authorization or server access changed; reconnect');
109
+ }
110
+ async mutate(mutator) {
111
+ return withPersonalOAuthLock(this.serverName, this.username, async () => {
112
+ await this.assertCurrent();
113
+ const dao = getCredentialBindingDao();
114
+ const current = await dao.get(this.serverName, this.username);
115
+ if (current?.encryptedValues !== this.revision)
116
+ throw new CredentialBindingError('Personal authorization changed; reconnect');
117
+ const config = structuredClone(this.config);
118
+ mutator({ serverConfig: config, oauth: config.oauth });
119
+ const encryptedValues = await encryptCredentialValues(this.serverName, this.username, {
120
+ oauthDeclaration: this.declaration,
121
+ oauth: JSON.stringify(config.oauth),
122
+ });
123
+ await this.assertCurrent();
124
+ if (!(await dao.compareAndSave({
125
+ serverName: this.serverName,
126
+ username: this.username,
127
+ encryptedValues,
128
+ updatedAt: new Date().toISOString(),
129
+ }, this.revision)))
130
+ throw new CredentialBindingError('Personal authorization changed; reconnect');
131
+ this.revision = encryptedValues;
132
+ this.config = config;
133
+ personalOAuthContexts.set(config, this);
134
+ return config;
135
+ });
136
+ }
137
+ async loadServerConfig(_name) {
138
+ await this.assertCurrent();
139
+ return this.config;
140
+ }
141
+ mutateOAuthSettings(_name, mutator) {
142
+ return this.mutate(mutator);
143
+ }
144
+ persistClientCredentials(_name, credentials) {
145
+ return this.mutate(({ oauth }) => Object.assign(oauth, credentials));
146
+ }
147
+ async persistTokens(_name, tokens) {
148
+ const saved = await this.mutate(({ oauth }) => {
149
+ oauth.accessToken = tokens.accessToken;
150
+ if (tokens.refreshToken !== undefined)
151
+ oauth.refreshToken = tokens.refreshToken || undefined;
152
+ const metadata = oauth.pendingAuthorization?.discoveryState?.authorizationServerMetadata;
153
+ if (metadata &&
154
+ 'revocation_endpoint' in metadata &&
155
+ typeof metadata.revocation_endpoint === 'string')
156
+ oauth.revocationEndpoint = metadata.revocation_endpoint;
157
+ if (tokens.clearPendingAuthorization)
158
+ delete oauth.pendingAuthorization;
159
+ });
160
+ this.refresh = undefined;
161
+ return saved;
162
+ }
163
+ updatePendingAuthorization(_name, pending) {
164
+ return this.mutate(({ oauth }) => {
165
+ oauth.pendingAuthorization = {
166
+ ...oauth.pendingAuthorization,
167
+ ...pending,
168
+ createdAt: pending.createdAt ?? Date.now(),
169
+ };
170
+ });
171
+ }
172
+ clearOAuthData(_name, scope) {
173
+ return this.mutate(({ oauth }) => {
174
+ if (scope === 'all' || scope === 'tokens') {
175
+ delete oauth.accessToken;
176
+ delete oauth.refreshToken;
177
+ }
178
+ if (scope === 'all' || scope === 'client') {
179
+ delete oauth.clientId;
180
+ delete oauth.clientSecret;
181
+ }
182
+ if (scope === 'all' || scope === 'verifier')
183
+ delete oauth.pendingAuthorization;
184
+ if (scope === 'discovery' && oauth.pendingAuthorization) {
185
+ delete oauth.pendingAuthorization.discoveryState;
186
+ delete oauth.pendingAuthorization.issuer;
187
+ delete oauth.pendingAuthorization.issRequired;
188
+ }
189
+ });
190
+ }
191
+ }
192
+ export const resolvePersonalOAuth = async (serverName, username, definition) => {
193
+ const context = await PersonalOAuthContext.load(serverName, username, definition);
194
+ if (!context.config.oauth.accessToken)
195
+ throw personalAuthorizationRequired(serverName);
196
+ return { config: context.config, revision: context.version };
197
+ };
198
+ export const findPersonalOAuthFlow = async (state) => {
199
+ if (!state.startsWith('personal.'))
200
+ return undefined;
201
+ for (const server of await getServerDao().findAll()) {
202
+ if (!hasPersonalOAuth(server))
203
+ continue;
204
+ for (const username of await getCredentialBindingDao().listUsernames(server.name)) {
205
+ let context;
206
+ try {
207
+ context = await PersonalOAuthContext.load(server.name, username, server);
208
+ }
209
+ catch {
210
+ continue;
211
+ } // One damaged binding must not block another user's callback.
212
+ const pending = context.config.oauth.pendingAuthorization;
213
+ if (pending?.state === state &&
214
+ pending.createdAt &&
215
+ Date.now() - pending.createdAt < 600000) {
216
+ await context.assertCurrent();
217
+ return context;
218
+ }
219
+ }
220
+ }
221
+ return undefined;
222
+ };
223
+ export const disconnectPersonalOAuth = async (serverName, username) => {
224
+ await withPersonalOAuthLock(serverName, username, async () => {
225
+ // Retain an encrypted tombstone so even a pre-save, unbound context becomes stale.
226
+ await getCredentialBindingDao().save({
227
+ serverName,
228
+ username,
229
+ encryptedValues: await encryptCredentialValues(serverName, username, {}),
230
+ updatedAt: new Date().toISOString(),
231
+ });
232
+ credentialBindingEvents.emit('invalidate', { serverName, username });
233
+ });
234
+ };
235
+ //# sourceMappingURL=personalOAuthService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personalOAuthService.js","sourceRoot":"","sources":["../../src/services/personalOAuthService.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
+ import { hasPersonalOAuth, resolvePersonalOAuth, personalOAuthContexts, withPersonalOAuthLock, } from './personalOAuthService.js';
1
2
  import { getServerDao } from '../dao/DaoFactory.js';
2
3
  import { credentialBindingEvents, resolveCredentialBinding } from './credentialBindingService.js';
3
4
  import { authorizationService } from './authorizationService.js';
4
- import { CredentialBindingError, hasCredentialTemplate } from '../utils/credentialTemplate.js';
5
+ import { CredentialBindingError, hasPersonalAuthentication } from '../utils/credentialTemplate.js';
5
6
  import { expandServerConfig } from './serverConfigEnvironment.js';
6
7
  /** Reuses children across MCP sessions, but never across authenticated principals. */
7
8
  export class PrincipalRuntimeService {
@@ -29,56 +30,77 @@ export class PrincipalRuntimeService {
29
30
  const definition = await getServerDao().findById(serverName);
30
31
  if (!definition ||
31
32
  definition.enabled === false ||
32
- !hasCredentialTemplate(definition) ||
33
+ !hasPersonalAuthentication(definition) ||
33
34
  !authorizationService.can('server.invoke', definition, principal)) {
34
35
  throw new CredentialBindingError('Server not available');
35
36
  }
36
37
  // These snapshots only detect runtime changes in memory; they are never persisted or logged.
37
38
  const definitionSnapshot = JSON.stringify(definition);
38
- const resolved = await resolveCredentialBinding(serverName, principal.username, await expandServerConfig(definition));
39
- const revision = JSON.stringify([definitionSnapshot, resolved.revision]);
40
- const key = JSON.stringify([serverName, principal.username]);
41
- let entry = this.entries.get(key);
42
- if (entry && (entry.revision !== revision || entry.info?.status === 'disconnected')) {
43
- this.invalidate({ serverName, username: principal.username });
44
- entry = undefined;
45
- }
46
- if (!entry) {
47
- const created = {
48
- serverName,
49
- username: principal.username,
50
- revision,
51
- valid: true,
52
- active: 0,
53
- promise: undefined,
54
- };
55
- this.entries.set(key, created);
56
- created.promise = (async () => {
57
- let info;
58
- try {
59
- info = await this.connect(serverName, resolved.config);
60
- // A rotation/deletion may have raced the initial read or async handshake.
61
- const latest = await resolveCredentialBinding(serverName, principal.username, definition);
62
- const currentDefinition = await getServerDao().findById(serverName);
63
- if (!created.valid ||
64
- latest.revision !== resolved.revision ||
65
- JSON.stringify(currentDefinition) !== definitionSnapshot) {
66
- throw new CredentialBindingError('Personal credentials or server configuration changed; retry the request');
39
+ const resolver = hasPersonalOAuth(definition) ? resolvePersonalOAuth : resolveCredentialBinding;
40
+ const prepare = async () => {
41
+ const resolved = await resolver(serverName, principal.username, hasPersonalOAuth(definition) ? definition : await expandServerConfig(definition));
42
+ const revision = JSON.stringify([definitionSnapshot, resolved.revision]);
43
+ const key = JSON.stringify([serverName, principal.username]);
44
+ let entry = this.entries.get(key);
45
+ if (entry && (entry.revision !== revision || entry.info?.status === 'disconnected')) {
46
+ this.invalidate({ serverName, username: principal.username });
47
+ entry = undefined;
48
+ }
49
+ if (!entry) {
50
+ const created = {
51
+ serverName,
52
+ username: principal.username,
53
+ // This context advances only after its own successful CAS writes. External
54
+ // binding changes still differ from its version and invalidate the runtime.
55
+ get revision() {
56
+ return JSON.stringify([
57
+ definitionSnapshot,
58
+ personalOAuthContexts.get(resolved.config)?.version || resolved.revision,
59
+ ]);
60
+ },
61
+ valid: true,
62
+ active: 0,
63
+ promise: undefined,
64
+ };
65
+ this.entries.set(key, created);
66
+ created.promise = (async () => {
67
+ let info;
68
+ try {
69
+ info = await this.connect(serverName, resolved.config);
70
+ // A rotation/deletion may have raced the initial read or async handshake.
71
+ const verify = async () => {
72
+ const latest = await resolver(serverName, principal.username, definition);
73
+ const currentDefinition = await getServerDao().findById(serverName);
74
+ if (!created.valid ||
75
+ latest.revision !==
76
+ (personalOAuthContexts.get(resolved.config)?.version || resolved.revision) ||
77
+ JSON.stringify(currentDefinition) !== definitionSnapshot) {
78
+ throw new CredentialBindingError('Personal credentials or server configuration changed; retry the request');
79
+ }
80
+ };
81
+ if (hasPersonalOAuth(definition))
82
+ await withPersonalOAuthLock(serverName, principal.username, verify);
83
+ else
84
+ await verify();
85
+ created.info = info;
86
+ return info;
67
87
  }
68
- created.info = info;
69
- return info;
70
- }
71
- catch (error) {
72
- if (info)
73
- this.close(info);
74
- if (this.entries.get(key) === created)
75
- this.entries.delete(key);
76
- created.valid = false;
77
- throw error;
78
- }
79
- })();
80
- entry = created;
81
- }
88
+ catch (error) {
89
+ if (info)
90
+ this.close(info);
91
+ if (this.entries.get(key) === created)
92
+ this.entries.delete(key);
93
+ created.valid = false;
94
+ throw error;
95
+ }
96
+ })();
97
+ entry = created;
98
+ }
99
+ return entry;
100
+ };
101
+ const entry = hasPersonalOAuth(definition)
102
+ ? await withPersonalOAuthLock(serverName, principal.username, prepare)
103
+ : await prepare();
82
104
  clearTimeout(entry.timer);
83
105
  entry.active += 1;
84
106
  const held = entry;
@@ -1 +1 @@
1
- {"version":3,"file":"principalRuntimeService.js","sourceRoot":"","sources":["../../src/services/principalRuntimeService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"principalRuntimeService.js","sourceRoot":"","sources":["../../src/services/principalRuntimeService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAyB,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAclE,sFAAsF;AACtF,MAAM,OAAO,uBAAuB;IAGlC,YACmB,OAAoE,EACpE,KAAiC;QADjC,YAAO,GAAP,OAAO,CAA6D;QACpE,UAAK,GAAL,KAAK,CAA4B;QAJnC,YAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAMzD,uBAAuB,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,UAAU,CAAC,SAAqD,EAAE;QAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;gBAAE,SAAS;YACxF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;gBAAE,SAAS;YAClF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CACX,UAAkB,EAClB,SAA2B;QAE3B,IAAI,SAAS,CAAC,kBAAkB,KAAK,KAAK;YACxC,MAAM,IAAI,sBAAsB,CAAC,qCAAqC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAM,YAAY,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7D,IACE,CAAC,UAAU;YACX,UAAU,CAAC,OAAO,KAAK,KAAK;YAC5B,CAAC,yBAAyB,CAAC,UAAU,CAAC;YACtC,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,EAAE,SAAS,CAAC,EACjE,CAAC;YACD,MAAM,IAAI,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;QAC3D,CAAC;QACD,6FAA6F;QAC7F,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAChG,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,UAAU,EACV,SAAS,CAAC,QAAQ,EAClB,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,UAAU,CAAC,CACjF,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7D,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,CAAC,EAAE,CAAC;gBACpF,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9D,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,OAAO,GAAiB;oBAC5B,UAAU;oBACV,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,2EAA2E;oBAC3E,4EAA4E;oBAC5E,IAAI,QAAQ;wBACV,OAAO,IAAI,CAAC,SAAS,CAAC;4BACpB,kBAAkB;4BAClB,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAC,QAAQ;yBACzE,CAAC,CAAC;oBACL,CAAC;oBACD,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,CAAC;oBACT,OAAO,EAAE,SAAU;iBACpB,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC/B,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;oBAC5B,IAAI,IAA4B,CAAC;oBACjC,IAAI,CAAC;wBACH,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;wBACvD,0EAA0E;wBAC1E,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;4BACxB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;4BAC1E,MAAM,iBAAiB,GAAG,MAAM,YAAY,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;4BACpE,IACE,CAAC,OAAO,CAAC,KAAK;gCACd,MAAM,CAAC,QAAQ;oCACb,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC;gCAC5E,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,kBAAkB,EACxD,CAAC;gCACD,MAAM,IAAI,sBAAsB,CAC9B,yEAAyE,CAC1E,CAAC;4BACJ,CAAC;wBACH,CAAC,CAAC;wBACF,IAAI,gBAAgB,CAAC,UAAU,CAAC;4BAC9B,MAAM,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;4BACjE,MAAM,MAAM,EAAE,CAAC;wBACpB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;wBACpB,OAAO,IAAI,CAAC;oBACd,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,IAAI;4BAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO;4BAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAChE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;wBACtB,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC,CAAC,EAAE,CAAC;gBACL,KAAK,GAAG,OAAO,CAAC;YAClB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC;YACxC,CAAC,CAAC,MAAM,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;YACtE,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC;QACpB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC;QACnB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpC,MAAM,MAAM,GACV,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC;oBACtD,CAAC,CAAC,UAAU,CAAC,aAAa;oBAC1B,CAAC,CAAC,MAAO,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,UAAU,CACrB,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,EACnE,MAAM,CACP,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,KAAK;gBACb,MAAM,IAAI,sBAAsB,CAAC,iDAAiD,CAAC,CAAC;YACtF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YACV,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -26,6 +26,8 @@ const presentSafeServerConfig = (config) => {
26
26
  safe[field] = clone(config[field]);
27
27
  }
28
28
  }
29
+ if (config.oauth?.identityMode === 'personal')
30
+ safe.oauth = { identityMode: 'personal' };
29
31
  if (Array.isArray(config.credentialTemplate)) {
30
32
  safe.credentialTemplate = config.credentialTemplate.map(({ target, name, label }) => ({ target, name, ...(label ? { label } : {}) }));
31
33
  }
@@ -75,7 +77,15 @@ export const presentServerInfoForPrincipal = (info, principal) => {
75
77
  }
76
78
  const entry = { ...info };
77
79
  if (entry.oauth && typeof entry.oauth === 'object') {
78
- entry.oauth = presentSafeServerInfoOauth(entry.oauth);
80
+ const oauth = entry.oauth;
81
+ entry.oauth =
82
+ oauth.identityMode === 'personal'
83
+ ? {
84
+ identityMode: 'personal',
85
+ connected: oauth.connected,
86
+ authorizationUrl: oauth.authorizationUrl,
87
+ }
88
+ : presentSafeServerInfoOauth(oauth);
79
89
  }
80
90
  if (entry.config && typeof entry.config === 'object') {
81
91
  entry.config = presentSafeServerConfig(entry.config);
@@ -1 +1 @@
1
- {"version":3,"file":"serverConfigPresenter.js","sourceRoot":"","sources":["../../src/services/serverConfigPresenter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serverConfigPresenter.js","sourceRoot":"","sources":["../../src/services/serverConfigPresenter.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ import { getBearerAuthHeaderValue, getBearerTokenFromHeaders } from '../utils/be
14
14
  import { HostedAuthUnavailableError, isHostedApiKey, validateHostedBearer, } from './hostedAuthService.js';
15
15
  import { isHostedModeEnabled } from './hostedMode.js';
16
16
  import { authenticateForwardAuthToken } from './forwardAuthService.js';
17
+ import { getPublicResourceUrl, getResourceMetadataUrl } from '../utils/protectedResource.js';
17
18
  import { logger } from '../utils/logger.js';
18
19
  export const transports = {};
19
20
  const SESSION_NOT_FOUND_CODE = -32001;
@@ -435,29 +436,7 @@ const attachUserContextFromBearer = (result, res) => {
435
436
  const escapeHeaderValue = (value) => {
436
437
  return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
437
438
  };
438
- const buildResourceMetadataUrl = (req) => {
439
- const forwardedProto = req.headers['x-forwarded-proto']
440
- ?.split(',')[0]
441
- ?.trim();
442
- const protocol = forwardedProto || req.protocol || 'http';
443
- const forwardedHost = req.headers['x-forwarded-host']
444
- ?.split(',')[0]
445
- ?.trim();
446
- const host = forwardedHost ||
447
- req.headers.host ||
448
- req.headers[':authority'];
449
- if (!host) {
450
- return undefined;
451
- }
452
- const origin = `${protocol}://${host}`;
453
- const basePath = config.basePath || '';
454
- if (!basePath || basePath === '/') {
455
- return `${origin}/.well-known/oauth-protected-resource`;
456
- }
457
- const normalizedBasePath = `${basePath.startsWith('/') ? '' : '/'}${basePath}`.replace(/\/+$/, '');
458
- return `${origin}/.well-known/oauth-protected-resource${normalizedBasePath}`;
459
- };
460
- const sendBearerAuthError = (req, res, reason) => {
439
+ const sendBearerAuthError = async (req, res, reason) => {
461
440
  if (reason === 'forbidden') {
462
441
  res.status(403).json({
463
442
  error: 'forbidden',
@@ -474,7 +453,8 @@ const sendBearerAuthError = (req, res, reason) => {
474
453
  return;
475
454
  }
476
455
  const errorDescription = reason === 'missing' ? 'No authorization provided' : 'Invalid bearer token';
477
- const resourceMetadataUrl = buildResourceMetadataUrl(req);
456
+ const systemConfig = await getSystemConfigDao().get();
457
+ const resourceMetadataUrl = getResourceMetadataUrl(getPublicResourceUrl(req, systemConfig));
478
458
  const headerParts = [
479
459
  'error="invalid_token"',
480
460
  `error_description="${escapeHeaderValue(errorDescription)}"`,
@@ -501,7 +481,7 @@ export const handleSseConnection = async (req, res) => {
501
481
  // Check bearer auth using filtered settings
502
482
  const bearerAuthResult = await validateBearerAuth(req);
503
483
  if (!bearerAuthResult.valid) {
504
- sendBearerAuthError(req, res, bearerAuthResult.reason);
484
+ await sendBearerAuthError(req, res, bearerAuthResult.reason);
505
485
  return;
506
486
  }
507
487
  attachUserContextFromBearer(bearerAuthResult, res);
@@ -564,7 +544,7 @@ export const handleSseMessage = async (req, res) => {
564
544
  // Check bearer auth using filtered settings
565
545
  const bearerAuthResult = await validateBearerAuth(req);
566
546
  if (!bearerAuthResult.valid) {
567
- sendBearerAuthError(req, res, bearerAuthResult.reason);
547
+ await sendBearerAuthError(req, res, bearerAuthResult.reason);
568
548
  return;
569
549
  }
570
550
  attachUserContextFromBearer(bearerAuthResult, res);
@@ -674,7 +654,7 @@ export const handleMcpPostRequest = async (req, res) => {
674
654
  // Check bearer auth using filtered settings
675
655
  const bearerAuthResult = await validateBearerAuth(req);
676
656
  if (!bearerAuthResult.valid) {
677
- sendBearerAuthError(req, res, bearerAuthResult.reason);
657
+ await sendBearerAuthError(req, res, bearerAuthResult.reason);
678
658
  return;
679
659
  }
680
660
  attachUserContextFromBearer(bearerAuthResult, res);
@@ -714,8 +694,8 @@ export const handleMcpPostRequest = async (req, res) => {
714
694
  context.sessionId = undefined;
715
695
  const requestMeta = (Array.isArray(req.body) ? req.body[0] : req.body)?.params?._meta;
716
696
  context.clientCapabilities = requestMeta?.['io.modelcontextprotocol/clientCapabilities'];
717
- // Bind explicit state to the authenticated credential, user and route.
718
- // Never treat an arbitrary header or an unauthenticated token as identity.
697
+ // Bind application state to the authenticated credential, user and route.
698
+ // Never treat caller-provided correlation metadata as identity.
719
699
  const token = getBearerTokenFromHeaders(req.headers, systemConfig);
720
700
  if (token && (systemConfig?.routing?.enableBearerAuth ?? true)) {
721
701
  context.clientStateScope = createHash('sha256')
@@ -843,7 +823,7 @@ export const handleMcpOtherRequest = async (req, res) => {
843
823
  // Check bearer auth using filtered settings
844
824
  const bearerAuthResult = await validateBearerAuth(req);
845
825
  if (!bearerAuthResult.valid) {
846
- sendBearerAuthError(req, res, bearerAuthResult.reason);
826
+ await sendBearerAuthError(req, res, bearerAuthResult.reason);
847
827
  return;
848
828
  }
849
829
  attachUserContextFromBearer(bearerAuthResult, res);