@samanhappy/mcphub 0.10.3 → 0.10.5
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.
- package/README.md +39 -1
- package/dist/config/index.js +24 -0
- package/dist/config/index.js.map +1 -1
- package/dist/constants/oauthServerDefaults.js +36 -0
- package/dist/constants/oauthServerDefaults.js.map +1 -0
- package/dist/controllers/oauthClientController.js +252 -0
- package/dist/controllers/oauthClientController.js.map +1 -0
- package/dist/controllers/oauthDynamicRegistrationController.js +479 -0
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -0
- package/dist/controllers/oauthServerController.js +449 -0
- package/dist/controllers/oauthServerController.js.map +1 -0
- package/dist/controllers/openApiController.js +6 -3
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/serverController.js +116 -23
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/middlewares/auth.js +23 -2
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/userContext.js +27 -11
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +291 -0
- package/dist/models/OAuth.js.map +1 -0
- package/dist/routes/index.js +25 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/server.js +4 -1
- package/dist/server.js.map +1 -1
- package/dist/services/dataServicex.js +3 -0
- package/dist/services/dataServicex.js.map +1 -1
- package/dist/services/oauthServerService.js +339 -0
- package/dist/services/oauthServerService.js.map +1 -0
- package/dist/services/sseService.js +413 -45
- package/dist/services/sseService.js.map +1 -1
- package/dist/utils/oauthBearer.js +35 -0
- package/dist/utils/oauthBearer.js.map +1 -0
- package/frontend/dist/assets/index-qg3ysGil.js +251 -0
- package/frontend/dist/assets/index-qg3ysGil.js.map +1 -0
- package/frontend/dist/index.html +1 -1
- package/mcp_settings.json +23 -1
- package/package.json +2 -1
- package/frontend/dist/assets/index-BpPaTvxv.js +0 -251
- package/frontend/dist/assets/index-BpPaTvxv.js.map +0 -1
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { getOAuthServer, handleTokenRequest, handleAuthenticateRequest, } from '../services/oauthServerService.js';
|
|
2
|
+
import { findOAuthClientById } from '../models/OAuth.js';
|
|
3
|
+
import { loadSettings } from '../config/index.js';
|
|
4
|
+
import OAuth2Server from '@node-oauth/oauth2-server';
|
|
5
|
+
import jwt from 'jsonwebtoken';
|
|
6
|
+
import { JWT_SECRET } from '../config/jwt.js';
|
|
7
|
+
const { Request: OAuth2Request, Response: OAuth2Response } = OAuth2Server;
|
|
8
|
+
/**
|
|
9
|
+
* Attempt to attach a user to the request based on a JWT token present in header, query, or body.
|
|
10
|
+
*/
|
|
11
|
+
function resolveUserFromRequest(req) {
|
|
12
|
+
const headerToken = req.header('x-auth-token');
|
|
13
|
+
const queryToken = typeof req.query.token === 'string' ? req.query.token : undefined;
|
|
14
|
+
const bodyToken = req.body && typeof req.body.token === 'string'
|
|
15
|
+
? req.body.token
|
|
16
|
+
: undefined;
|
|
17
|
+
const token = headerToken || queryToken || bodyToken;
|
|
18
|
+
if (!token) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const decoded = jwt.verify(token, JWT_SECRET);
|
|
23
|
+
if (decoded?.user) {
|
|
24
|
+
return decoded.user;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.warn('Invalid JWT supplied to OAuth authorize endpoint:', error);
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Helper function to escape HTML
|
|
34
|
+
*/
|
|
35
|
+
function escapeHtml(unsafe) {
|
|
36
|
+
return unsafe
|
|
37
|
+
.replace(/&/g, '&')
|
|
38
|
+
.replace(/</g, '<')
|
|
39
|
+
.replace(/>/g, '>')
|
|
40
|
+
.replace(/"/g, '"')
|
|
41
|
+
.replace(/'/g, ''');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Helper function to validate query parameters
|
|
45
|
+
*/
|
|
46
|
+
function validateQueryParam(value, name, pattern) {
|
|
47
|
+
if (typeof value !== 'string') {
|
|
48
|
+
throw new Error(`${name} must be a string`);
|
|
49
|
+
}
|
|
50
|
+
if (pattern && !pattern.test(value)) {
|
|
51
|
+
throw new Error(`${name} has invalid format`);
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Generate OAuth authorization consent HTML page with i18n support
|
|
57
|
+
* (keeps visual style consistent with OAuth callback pages)
|
|
58
|
+
*/
|
|
59
|
+
const generateAuthorizeHtml = (title, message, options) => {
|
|
60
|
+
const backgroundColor = '#eef5ff';
|
|
61
|
+
const borderColor = '#c3d4ff';
|
|
62
|
+
const titleColor = '#23408f';
|
|
63
|
+
const approveColor = '#2563eb';
|
|
64
|
+
const denyColor = '#ef4444';
|
|
65
|
+
return `
|
|
66
|
+
<!DOCTYPE html>
|
|
67
|
+
<html>
|
|
68
|
+
<head>
|
|
69
|
+
<meta charset="utf-8" />
|
|
70
|
+
<title>${escapeHtml(title)}</title>
|
|
71
|
+
<style>
|
|
72
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; max-width: 640px; margin: 40px auto; padding: 24px; background: #f3f4f6; }
|
|
73
|
+
.container { background-color: ${backgroundColor}; border: 1px solid ${borderColor}; padding: 24px 28px; border-radius: 12px; box-shadow: 0 10px 25px rgba(15, 23, 42, 0.12); }
|
|
74
|
+
h1 { color: ${titleColor}; margin-top: 0; font-size: 22px; display: flex; align-items: center; gap: 8px; }
|
|
75
|
+
h1 span.icon { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 999px; background: white; border: 1px solid ${borderColor}; font-size: 16px; }
|
|
76
|
+
p.subtitle { margin-top: 8px; margin-bottom: 20px; color: #4b5563; font-size: 14px; }
|
|
77
|
+
.client-box { margin: 16px 0 20px; padding: 14px 16px; background: #eef2ff; border-radius: 10px; border: 1px solid #e5e7eb; display: flex; flex-direction: column; gap: 4px; }
|
|
78
|
+
.client-box-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: #6b7280; }
|
|
79
|
+
.client-box-name { font-weight: 600; color: #111827; }
|
|
80
|
+
.scopes { margin: 22px 0 16px; }
|
|
81
|
+
.scopes-title { font-size: 13px; font-weight: 600; color: #374151; margin-bottom: 8px; }
|
|
82
|
+
.scope-item { padding: 8px 0; border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; gap: 2px; }
|
|
83
|
+
.scope-item:last-child { border-bottom: none; }
|
|
84
|
+
.scope-name { font-weight: 600; font-size: 13px; color: #111827; }
|
|
85
|
+
.scope-description { font-size: 12px; color: #4b5563; }
|
|
86
|
+
.buttons { margin-top: 26px; display: flex; gap: 12px; }
|
|
87
|
+
.buttons form { flex: 1; }
|
|
88
|
+
button { width: 100%; padding: 10px 14px; border-radius: 999px; cursor: pointer; font-size: 14px; font-weight: 500; border-width: 1px; border-style: solid; transition: background-color 120ms ease, box-shadow 120ms ease, transform 60ms ease; }
|
|
89
|
+
button.approve { background: ${approveColor}; color: white; border-color: ${approveColor}; box-shadow: 0 4px 12px rgba(37, 99, 235, 0.35); }
|
|
90
|
+
button.approve:hover { background: #1d4ed8; box-shadow: 0 6px 16px rgba(37, 99, 235, 0.45); transform: translateY(-1px); }
|
|
91
|
+
button.deny { background: white; color: ${denyColor}; border-color: ${denyColor}; }
|
|
92
|
+
button.deny:hover { background: #fef2f2; }
|
|
93
|
+
.button-label { display: block; }
|
|
94
|
+
.button-sub { display: block; font-size: 11px; opacity: 0.85; }
|
|
95
|
+
</style>
|
|
96
|
+
</head>
|
|
97
|
+
<body>
|
|
98
|
+
<div class="container">
|
|
99
|
+
<h1><span class="icon">🔐</span>${escapeHtml(title)}</h1>
|
|
100
|
+
<p class="subtitle">${escapeHtml(message)}</p>
|
|
101
|
+
<div class="client-box">
|
|
102
|
+
<span class="client-box-label">${escapeHtml(options.clientName ? 'Application' : 'Client')}</span>
|
|
103
|
+
<span class="client-box-name">${escapeHtml(options.clientName || '')}</span>
|
|
104
|
+
</div>
|
|
105
|
+
<div class="scopes">
|
|
106
|
+
<div class="scopes-title">${escapeHtml('This application will be able to:')}</div>
|
|
107
|
+
${options.scopes
|
|
108
|
+
.map((s) => `
|
|
109
|
+
<div class="scope-item">
|
|
110
|
+
<span class="scope-name">${escapeHtml(s.name)}</span>
|
|
111
|
+
<span class="scope-description">${escapeHtml(s.description)}</span>
|
|
112
|
+
</div>
|
|
113
|
+
`)
|
|
114
|
+
.join('')}
|
|
115
|
+
</div>
|
|
116
|
+
<div class="buttons">
|
|
117
|
+
<form method="POST" action="/oauth/authorize">
|
|
118
|
+
${options.formFields}
|
|
119
|
+
<input type="hidden" name="allow" value="true" />
|
|
120
|
+
<button type="submit" class="approve">
|
|
121
|
+
<span class="button-label">${escapeHtml(options.approveLabel)}</span>
|
|
122
|
+
<span class="button-sub">${escapeHtml(options.approveButtonLabel)}</span>
|
|
123
|
+
</button>
|
|
124
|
+
</form>
|
|
125
|
+
<form method="POST" action="/oauth/authorize">
|
|
126
|
+
${options.formFields}
|
|
127
|
+
<input type="hidden" name="allow" value="false" />
|
|
128
|
+
<button type="submit" class="deny">
|
|
129
|
+
<span class="button-label">${escapeHtml(options.denyLabel)}</span>
|
|
130
|
+
<span class="button-sub">${escapeHtml(options.denyButtonLabel)}</span>
|
|
131
|
+
</button>
|
|
132
|
+
</form>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</body>
|
|
136
|
+
</html>
|
|
137
|
+
`;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* GET /oauth/authorize
|
|
141
|
+
* Display authorization page or handle authorization
|
|
142
|
+
*/
|
|
143
|
+
export const getAuthorize = async (req, res) => {
|
|
144
|
+
try {
|
|
145
|
+
const oauth = getOAuthServer();
|
|
146
|
+
if (!oauth) {
|
|
147
|
+
res.status(503).json({ error: 'OAuth server not available' });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Get and validate query parameters
|
|
151
|
+
const client_id = validateQueryParam(req.query.client_id, 'client_id', /^[a-zA-Z0-9_-]+$/);
|
|
152
|
+
const redirect_uri = validateQueryParam(req.query.redirect_uri, 'redirect_uri');
|
|
153
|
+
const response_type = validateQueryParam(req.query.response_type, 'response_type', /^code$/);
|
|
154
|
+
const scope = req.query.scope
|
|
155
|
+
? validateQueryParam(req.query.scope, 'scope', /^[a-zA-Z0-9_ ]+$/)
|
|
156
|
+
: undefined;
|
|
157
|
+
const state = req.query.state
|
|
158
|
+
? validateQueryParam(req.query.state, 'state', /^[a-zA-Z0-9_-]+$/)
|
|
159
|
+
: undefined;
|
|
160
|
+
const code_challenge = req.query.code_challenge
|
|
161
|
+
? validateQueryParam(req.query.code_challenge, 'code_challenge', /^[a-zA-Z0-9_-]+$/)
|
|
162
|
+
: undefined;
|
|
163
|
+
const code_challenge_method = req.query.code_challenge_method
|
|
164
|
+
? validateQueryParam(req.query.code_challenge_method, 'code_challenge_method', /^(S256|plain)$/)
|
|
165
|
+
: undefined;
|
|
166
|
+
// Validate required parameters
|
|
167
|
+
if (!client_id || !redirect_uri || !response_type) {
|
|
168
|
+
res
|
|
169
|
+
.status(400)
|
|
170
|
+
.json({ error: 'invalid_request', error_description: 'Missing required parameters' });
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Verify client
|
|
174
|
+
const client = findOAuthClientById(client_id);
|
|
175
|
+
if (!client) {
|
|
176
|
+
res.status(400).json({ error: 'invalid_client', error_description: 'Client not found' });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Verify redirect URI
|
|
180
|
+
if (!client.redirectUris.includes(redirect_uri)) {
|
|
181
|
+
res.status(400).json({ error: 'invalid_request', error_description: 'Invalid redirect_uri' });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Check if user is authenticated (including via JWT token)
|
|
185
|
+
let user = req.user;
|
|
186
|
+
if (!user) {
|
|
187
|
+
const tokenUser = resolveUserFromRequest(req);
|
|
188
|
+
if (tokenUser) {
|
|
189
|
+
req.user = tokenUser;
|
|
190
|
+
user = tokenUser;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (!user) {
|
|
194
|
+
// Redirect to login page with return URL
|
|
195
|
+
const returnUrl = encodeURIComponent(req.originalUrl);
|
|
196
|
+
res.redirect(`/login?returnUrl=${returnUrl}`);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const requestToken = typeof req.query.token === 'string' ? req.query.token : '';
|
|
200
|
+
const tokenField = requestToken
|
|
201
|
+
? `<input type="hidden" name="token" value="${escapeHtml(requestToken)}">`
|
|
202
|
+
: '';
|
|
203
|
+
// Get translation function from request (set by i18n middleware)
|
|
204
|
+
const t = req.t || ((key) => key);
|
|
205
|
+
const scopes = (scope || 'read write')
|
|
206
|
+
.split(' ')
|
|
207
|
+
.filter((s) => s)
|
|
208
|
+
.map((s) => ({ name: s, description: getScopeDescription(s) }));
|
|
209
|
+
const formFields = `
|
|
210
|
+
<input type="hidden" name="client_id" value="${escapeHtml(client_id)}" />
|
|
211
|
+
<input type="hidden" name="redirect_uri" value="${escapeHtml(redirect_uri)}" />
|
|
212
|
+
<input type="hidden" name="response_type" value="${escapeHtml(response_type)}" />
|
|
213
|
+
<input type="hidden" name="scope" value="${escapeHtml(scope || '')}" />
|
|
214
|
+
<input type="hidden" name="state" value="${escapeHtml(state || '')}" />
|
|
215
|
+
${code_challenge ? `<input type="hidden" name="code_challenge" value="${escapeHtml(code_challenge)}" />` : ''}
|
|
216
|
+
${code_challenge_method ? `<input type="hidden" name="code_challenge_method" value="${escapeHtml(code_challenge_method)}" />` : ''}
|
|
217
|
+
${tokenField}
|
|
218
|
+
`;
|
|
219
|
+
// Render authorization consent page with consistent, localized styling
|
|
220
|
+
res.send(generateAuthorizeHtml(t('oauthServer.authorizeTitle') || 'Authorize Application', t('oauthServer.authorizeSubtitle') ||
|
|
221
|
+
'Allow this application to access your MCPHub account.', {
|
|
222
|
+
clientName: client.name,
|
|
223
|
+
scopes,
|
|
224
|
+
approveLabel: t('oauthServer.buttons.approve') || 'Allow access',
|
|
225
|
+
denyLabel: t('oauthServer.buttons.deny') || 'Deny',
|
|
226
|
+
approveButtonLabel: t('oauthServer.buttons.approveSubtitle') ||
|
|
227
|
+
'Recommended if you trust this application.',
|
|
228
|
+
denyButtonLabel: t('oauthServer.buttons.denySubtitle') || 'You can always grant access later.',
|
|
229
|
+
formFields,
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
console.error('Authorization error:', error);
|
|
234
|
+
res.status(500).json({ error: 'server_error', error_description: 'Internal server error' });
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
/**
|
|
238
|
+
* POST /oauth/authorize
|
|
239
|
+
* Handle authorization decision
|
|
240
|
+
*/
|
|
241
|
+
export const postAuthorize = async (req, res) => {
|
|
242
|
+
try {
|
|
243
|
+
const oauth = getOAuthServer();
|
|
244
|
+
if (!oauth) {
|
|
245
|
+
res.status(503).json({ error: 'OAuth server not available' });
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const { allow, redirect_uri, state } = req.body;
|
|
249
|
+
// If user denied
|
|
250
|
+
if (allow !== 'true') {
|
|
251
|
+
const redirectUrl = new URL(redirect_uri);
|
|
252
|
+
redirectUrl.searchParams.set('error', 'access_denied');
|
|
253
|
+
if (state) {
|
|
254
|
+
redirectUrl.searchParams.set('state', state);
|
|
255
|
+
}
|
|
256
|
+
res.redirect(redirectUrl.toString());
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Get authenticated user (JWT support for browser form submissions)
|
|
260
|
+
let user = req.user;
|
|
261
|
+
if (!user) {
|
|
262
|
+
const tokenUser = resolveUserFromRequest(req);
|
|
263
|
+
if (tokenUser) {
|
|
264
|
+
req.user = tokenUser;
|
|
265
|
+
user = tokenUser;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!user) {
|
|
269
|
+
res.status(401).json({ error: 'unauthorized', error_description: 'User not authenticated' });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Create OAuth request/response
|
|
273
|
+
const request = new OAuth2Request(req);
|
|
274
|
+
const response = new OAuth2Response(res);
|
|
275
|
+
// Authorize the request
|
|
276
|
+
const code = await oauth.authorize(request, response, {
|
|
277
|
+
authenticateHandler: {
|
|
278
|
+
handle: async () => user,
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
// Build redirect URL with authorization code
|
|
282
|
+
const redirectUrl = new URL(redirect_uri);
|
|
283
|
+
redirectUrl.searchParams.set('code', code.authorizationCode);
|
|
284
|
+
if (state) {
|
|
285
|
+
redirectUrl.searchParams.set('state', state);
|
|
286
|
+
}
|
|
287
|
+
res.redirect(redirectUrl.toString());
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
console.error('Authorization error:', error);
|
|
291
|
+
// Handle OAuth errors
|
|
292
|
+
if (error instanceof Error && 'code' in error) {
|
|
293
|
+
const oauthError = error;
|
|
294
|
+
const redirect_uri = req.body.redirect_uri;
|
|
295
|
+
const state = req.body.state;
|
|
296
|
+
if (redirect_uri) {
|
|
297
|
+
const redirectUrl = new URL(redirect_uri);
|
|
298
|
+
redirectUrl.searchParams.set('error', oauthError.name || 'server_error');
|
|
299
|
+
if (oauthError.message) {
|
|
300
|
+
redirectUrl.searchParams.set('error_description', oauthError.message);
|
|
301
|
+
}
|
|
302
|
+
if (state) {
|
|
303
|
+
redirectUrl.searchParams.set('state', state);
|
|
304
|
+
}
|
|
305
|
+
res.redirect(redirectUrl.toString());
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
res.status(400).json({
|
|
309
|
+
error: oauthError.name || 'server_error',
|
|
310
|
+
error_description: oauthError.message || 'Internal server error',
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
res.status(500).json({ error: 'server_error', error_description: 'Internal server error' });
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* POST /oauth/token
|
|
321
|
+
* Exchange authorization code for access token
|
|
322
|
+
*/
|
|
323
|
+
export const postToken = async (req, res) => {
|
|
324
|
+
try {
|
|
325
|
+
const token = await handleTokenRequest(req, res);
|
|
326
|
+
res.json({
|
|
327
|
+
access_token: token.accessToken,
|
|
328
|
+
token_type: 'Bearer',
|
|
329
|
+
expires_in: Math.floor(((token.accessTokenExpiresAt?.getTime() || 0) - Date.now()) / 1000),
|
|
330
|
+
refresh_token: token.refreshToken,
|
|
331
|
+
scope: Array.isArray(token.scope) ? token.scope.join(' ') : token.scope,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
console.error('Token error:', error);
|
|
336
|
+
if (error instanceof Error && 'code' in error) {
|
|
337
|
+
const oauthError = error;
|
|
338
|
+
res.status(oauthError.code || 400).json({
|
|
339
|
+
error: oauthError.name || 'invalid_request',
|
|
340
|
+
error_description: oauthError.message || 'Token request failed',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
res.status(400).json({
|
|
345
|
+
error: 'invalid_request',
|
|
346
|
+
error_description: 'Token request failed',
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
/**
|
|
352
|
+
* GET /oauth/userinfo
|
|
353
|
+
* Get user info from access token (OpenID Connect compatible)
|
|
354
|
+
*/
|
|
355
|
+
export const getUserInfo = async (req, res) => {
|
|
356
|
+
try {
|
|
357
|
+
const token = await handleAuthenticateRequest(req, res);
|
|
358
|
+
res.json({
|
|
359
|
+
sub: token.user.username,
|
|
360
|
+
username: token.user.username,
|
|
361
|
+
// Add more user info as needed
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.error('UserInfo error:', error);
|
|
366
|
+
res.status(401).json({
|
|
367
|
+
error: 'invalid_token',
|
|
368
|
+
error_description: 'Invalid or expired access token',
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* GET /.well-known/oauth-authorization-server
|
|
374
|
+
* OAuth 2.0 Authorization Server Metadata (RFC 8414)
|
|
375
|
+
*/
|
|
376
|
+
export const getMetadata = async (req, res) => {
|
|
377
|
+
try {
|
|
378
|
+
const settings = loadSettings();
|
|
379
|
+
const oauthConfig = settings.systemConfig?.oauthServer;
|
|
380
|
+
if (!oauthConfig || !oauthConfig.enabled) {
|
|
381
|
+
res.status(404).json({ error: 'OAuth server not configured' });
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const baseUrl = settings.systemConfig?.install?.baseUrl || `${req.protocol}://${req.get('host')}`;
|
|
385
|
+
const allowedScopes = oauthConfig.allowedScopes || ['read', 'write'];
|
|
386
|
+
const metadata = {
|
|
387
|
+
issuer: baseUrl,
|
|
388
|
+
authorization_endpoint: `${baseUrl}/oauth/authorize`,
|
|
389
|
+
token_endpoint: `${baseUrl}/oauth/token`,
|
|
390
|
+
userinfo_endpoint: `${baseUrl}/oauth/userinfo`,
|
|
391
|
+
scopes_supported: allowedScopes,
|
|
392
|
+
response_types_supported: ['code'],
|
|
393
|
+
grant_types_supported: ['authorization_code', 'refresh_token'],
|
|
394
|
+
token_endpoint_auth_methods_supported: oauthConfig.requireClientSecret !== false
|
|
395
|
+
? ['client_secret_basic', 'client_secret_post', 'none']
|
|
396
|
+
: ['none'],
|
|
397
|
+
code_challenge_methods_supported: ['S256', 'plain'],
|
|
398
|
+
};
|
|
399
|
+
// Add dynamic registration endpoint if enabled
|
|
400
|
+
if (oauthConfig.dynamicRegistration?.enabled) {
|
|
401
|
+
metadata.registration_endpoint = `${baseUrl}/oauth/register`;
|
|
402
|
+
}
|
|
403
|
+
res.json(metadata);
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
console.error('Metadata error:', error);
|
|
407
|
+
res.status(500).json({ error: 'server_error' });
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
/**
|
|
411
|
+
* GET /.well-known/oauth-protected-resource
|
|
412
|
+
* OAuth 2.0 Protected Resource Metadata (RFC 9728)
|
|
413
|
+
* Provides information about authorization servers that protect this resource
|
|
414
|
+
*/
|
|
415
|
+
export const getProtectedResourceMetadata = async (req, res) => {
|
|
416
|
+
try {
|
|
417
|
+
const settings = loadSettings();
|
|
418
|
+
const oauthConfig = settings.systemConfig?.oauthServer;
|
|
419
|
+
if (!oauthConfig || !oauthConfig.enabled) {
|
|
420
|
+
res.status(404).json({ error: 'OAuth server not configured' });
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
const baseUrl = settings.systemConfig?.install?.baseUrl || `${req.protocol}://${req.get('host')}`;
|
|
424
|
+
const allowedScopes = oauthConfig.allowedScopes || ['read', 'write'];
|
|
425
|
+
// Return protected resource metadata according to RFC 9728
|
|
426
|
+
res.json({
|
|
427
|
+
resource: baseUrl,
|
|
428
|
+
authorization_servers: [baseUrl],
|
|
429
|
+
scopes_supported: allowedScopes,
|
|
430
|
+
bearer_methods_supported: ['header'],
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
console.error('Protected resource metadata error:', error);
|
|
435
|
+
res.status(500).json({ error: 'server_error' });
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
/**
|
|
439
|
+
* Helper function to get scope description
|
|
440
|
+
*/
|
|
441
|
+
function getScopeDescription(scope) {
|
|
442
|
+
const descriptions = {
|
|
443
|
+
read: 'Read access to your MCP servers and tools',
|
|
444
|
+
write: 'Execute tools and modify MCP server configurations',
|
|
445
|
+
admin: 'Administrative access to all resources',
|
|
446
|
+
};
|
|
447
|
+
return descriptions[scope] || 'Access to MCPHub resources';
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=oauthServerController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthServerController.js","sourceRoot":"","sources":["../../src/controllers/oauthServerController.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,7 +89,7 @@ export const executeToolViaOpenAPI = async (req, res) => {
|
|
|
89
89
|
try {
|
|
90
90
|
// Decode URL-encoded parameters to handle slashes in server/tool names
|
|
91
91
|
const serverName = decodeURIComponent(req.params.serverName);
|
|
92
|
-
|
|
92
|
+
let toolName = decodeURIComponent(req.params.toolName);
|
|
93
93
|
// Import handleCallToolRequest function
|
|
94
94
|
const { handleCallToolRequest } = await import('../services/mcpService.js');
|
|
95
95
|
// Get the server info to access the tool's input schema
|
|
@@ -99,8 +99,11 @@ export const executeToolViaOpenAPI = async (req, res) => {
|
|
|
99
99
|
// Find the tool in the server's tools list
|
|
100
100
|
const fullToolName = `${serverName}${getNameSeparator()}${toolName}`;
|
|
101
101
|
const tool = serverInfo.tools.find((t) => t.name === fullToolName || t.name === toolName);
|
|
102
|
-
if (tool
|
|
103
|
-
|
|
102
|
+
if (tool) {
|
|
103
|
+
toolName = tool.name; // Use the matched tool's actual name (with server prefix if applicable) for the subsequent call to handleCallToolRequest.
|
|
104
|
+
if (tool.inputSchema) {
|
|
105
|
+
inputSchema = tool.inputSchema;
|
|
106
|
+
}
|
|
104
107
|
}
|
|
105
108
|
}
|
|
106
109
|
// Prepare arguments from query params (GET) or body (POST)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openApiController.js","sourceRoot":"","sources":["../../src/controllers/openApiController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"openApiController.js","sourceRoot":"","sources":["../../src/controllers/openApiController.ts"],"names":[],"mappings":"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"}
|