fa-mcp-sdk 0.2.144 → 0.2.174
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 +1 -1
- package/bin/fa-mcp.js +66 -54
- package/cli-template/.env.example +2 -2
- package/cli-template/README.md +2 -2
- package/cli-template/fa-mcp-sdk-spec.md +122 -41
- package/cli-template/package.json +3 -3
- package/cli-template/r/TEST HTTP.xml +9 -0
- package/cli-template/{run/TEST SSE.run.xml → r/TEST SSE.xml } +2 -2
- package/cli-template/{run/TEST STDIO.run.xml → r/TEST STDIO.xml } +2 -2
- package/cli-template/r/generate-token.xml +14 -0
- package/cli-template/{run/kill-server.run.xml → r/kill-server.xml} +2 -2
- package/cli-template/{run/kill-token-gen-server.xml → r/remove-nul.xml} +4 -5
- package/{cli-template/config → config}/_local.yaml +28 -14
- package/{cli-template/config → config}/custom-environment-variables.yaml +3 -0
- package/{cli-template/config → config}/default.yaml +50 -10
- package/{cli-template/config → config}/development.yaml +4 -4
- package/config/local.yaml +81 -0
- package/{cli-template/config → config}/production.yaml +4 -4
- package/dist/core/_types_/active-directory-config.d.ts +3 -0
- package/dist/core/_types_/active-directory-config.d.ts.map +1 -1
- package/dist/core/_types_/config.d.ts +5 -1
- package/dist/core/_types_/config.d.ts.map +1 -1
- package/dist/core/_types_/types.d.ts +5 -1
- package/dist/core/_types_/types.d.ts.map +1 -1
- package/dist/core/ad/group-checker.d.ts +13 -0
- package/dist/core/ad/group-checker.d.ts.map +1 -0
- package/dist/core/ad/group-checker.js +86 -0
- package/dist/core/ad/group-checker.js.map +1 -0
- package/dist/core/auth/admin-auth.d.ts +16 -0
- package/dist/core/auth/admin-auth.d.ts.map +1 -0
- package/dist/core/auth/admin-auth.js +159 -0
- package/dist/core/auth/admin-auth.js.map +1 -0
- package/dist/core/auth/basic.d.ts +6 -0
- package/dist/core/auth/basic.d.ts.map +1 -0
- package/dist/core/auth/basic.js +26 -0
- package/dist/core/auth/basic.js.map +1 -0
- package/dist/core/auth/{jwt-validation.d.ts → jwt.d.ts} +4 -3
- package/dist/core/auth/jwt.d.ts.map +1 -0
- package/dist/core/auth/{jwt-validation.js → jwt.js} +9 -19
- package/dist/core/auth/jwt.js.map +1 -0
- package/dist/core/auth/middleware.d.ts.map +1 -1
- package/dist/core/auth/middleware.js +3 -3
- package/dist/core/auth/middleware.js.map +1 -1
- package/dist/core/auth/multi-auth.d.ts +14 -6
- package/dist/core/auth/multi-auth.d.ts.map +1 -1
- package/dist/core/auth/multi-auth.js +151 -141
- package/dist/core/auth/multi-auth.js.map +1 -1
- package/dist/core/auth/permanent.d.ts +6 -0
- package/dist/core/auth/permanent.d.ts.map +1 -0
- package/dist/core/auth/permanent.js +15 -0
- package/dist/core/auth/permanent.js.map +1 -0
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.d.ts +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.d.ts.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js +8 -10
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.d.ts.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.js +9 -2
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.js.map +1 -1
- package/dist/core/auth/token-generator/server.d.ts.map +1 -1
- package/dist/core/auth/token-generator/server.js +59 -25
- package/dist/core/auth/token-generator/server.js.map +1 -1
- package/dist/core/auth/types.d.ts +4 -3
- package/dist/core/auth/types.d.ts.map +1 -1
- package/dist/core/bootstrap/startup-info.d.ts.map +1 -1
- package/dist/core/bootstrap/startup-info.js +19 -0
- package/dist/core/bootstrap/startup-info.js.map +1 -1
- package/dist/core/consul/access-points-updater.js +1 -1
- package/dist/core/consul/access-points-updater.js.map +1 -1
- package/dist/core/consul/get-consul-api.d.ts +1 -1
- package/dist/core/consul/get-consul-api.d.ts.map +1 -1
- package/dist/core/consul/get-consul-api.js +1 -1
- package/dist/core/consul/get-consul-api.js.map +1 -1
- package/dist/core/consul/register.d.ts +1 -1
- package/dist/core/consul/register.d.ts.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/init-mcp-server.d.ts.map +1 -1
- package/dist/core/init-mcp-server.js +1 -1
- package/dist/core/init-mcp-server.js.map +1 -1
- package/dist/core/utils/testing/McpSseClient.js.map +1 -1
- package/dist/core/web/admin-router.d.ts +10 -0
- package/dist/core/web/admin-router.d.ts.map +1 -0
- package/dist/core/web/admin-router.js +227 -0
- package/dist/core/web/admin-router.js.map +1 -0
- package/dist/core/web/favicon-svg.d.ts +1 -1
- package/dist/core/web/favicon-svg.d.ts.map +1 -1
- package/dist/core/web/favicon-svg.js +21 -3
- package/dist/core/web/favicon-svg.js.map +1 -1
- package/dist/core/web/home-api.d.ts +7 -0
- package/dist/core/web/home-api.d.ts.map +1 -0
- package/dist/core/web/home-api.js +93 -0
- package/dist/core/web/home-api.js.map +1 -0
- package/dist/core/web/server-http.d.ts +1 -0
- package/dist/core/web/server-http.d.ts.map +1 -1
- package/dist/core/web/server-http.js +60 -25
- package/dist/core/web/server-http.js.map +1 -1
- package/dist/core/web/static/home/index.html +206 -0
- package/dist/core/web/static/home/script.js +636 -0
- package/dist/core/web/{about-page/css.js → static/styles.css} +435 -105
- package/dist/core/web/static/token-gen/index.html +82 -0
- package/dist/core/web/static/token-gen/jwt-icon.svg +3 -0
- package/dist/core/web/static/token-gen/logout.svg +4 -0
- package/dist/core/web/static/token-gen/script.js +365 -0
- package/dist/core/web/static/token-gen/user.svg +4 -0
- package/dist/core/web/svg-icons.d.ts +7 -0
- package/dist/core/web/svg-icons.d.ts.map +1 -0
- package/dist/core/web/svg-icons.js +78 -0
- package/dist/core/web/svg-icons.js.map +1 -0
- package/package.json +7 -3
- package/scripts/copy-static.js +31 -0
- package/src/template/_examples/multi-auth-examples.ts +14 -47
- package/src/template/_types_/custom-config.ts +83 -0
- package/src/template/asset/logo.svg +4 -0
- package/src/template/start.ts +3 -3
- package/src/template/tools/handle-tool-call.ts +2 -1
- package/src/tests/mcp/test-http.js +10 -2
- package/src/tests/mcp/test-sse.js +10 -2
- package/src/tests/mcp/test-stdio.js +1 -2
- package/cli-template/run/TEST HTTP.run.xml +0 -5
- package/cli-template/run/TEST search.run.xml +0 -11
- package/cli-template/run/remove-nul.js.run.xml +0 -5
- package/dist/core/auth/jwt-validation.d.ts.map +0 -1
- package/dist/core/auth/jwt-validation.js.map +0 -1
- package/dist/core/auth/token-generator/html.d.ts +0 -9
- package/dist/core/auth/token-generator/html.d.ts.map +0 -1
- package/dist/core/auth/token-generator/html.js +0 -862
- package/dist/core/auth/token-generator/html.js.map +0 -1
- package/dist/core/web/about-page/css.d.ts +0 -2
- package/dist/core/web/about-page/css.d.ts.map +0 -1
- package/dist/core/web/about-page/css.js.map +0 -1
- package/dist/core/web/about-page/render.d.ts +0 -2
- package/dist/core/web/about-page/render.d.ts.map +0 -1
- package/dist/core/web/about-page/render.js +0 -773
- package/dist/core/web/about-page/render.js.map +0 -1
- /package/cli-template/{run/== START ==.run.xml → r/== START ==.xml} +0 -0
- /package/cli-template/{run/cb.run.xml → r/cb.xml} +0 -0
- /package/cli-template/{run/ci.run.xml → r/ci.xml} +0 -0
- /package/cli-template/{run/lint.run.xml → r/lint.xml} +0 -0
- /package/cli-template/{run/lint_fix.run.xml → r/lint_fix.xml} +0 -0
- /package/cli-template/{run/reinstall.run.xml → r/reinstall.xml} +0 -0
- /package/{cli-template/config → config}/test.yaml +0 -0
- /package/{src/template/asset/favicon.svg → dist/core/web/static/logo.svg} +0 -0
- /package/{cli-template/scripts → scripts}/kill-port.js +0 -0
- /package/{cli-template/scripts → scripts}/npm/patch_node_modules.js +0 -0
- /package/{cli-template/scripts → scripts}/npm/run.js +0 -0
- /package/{cli-template/scripts → scripts}/npm/yarn-ci.ps1 +0 -0
- /package/{cli-template/scripts → scripts}/npm/yarn-ci.sh +0 -0
- /package/{cli-template/scripts → scripts}/npm/yarn-reinstall.ps1 +0 -0
- /package/{cli-template/scripts → scripts}/npm/yarn-reinstall.sh +0 -0
- /package/{cli-template/scripts → scripts}/pre-commit +0 -0
- /package/{cli-template/scripts → scripts}/remove-nul.js +0 -0
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
createAuthMW,
|
|
9
9
|
getMultiAuthError,
|
|
10
10
|
checkMultiAuth,
|
|
11
|
-
checkCombinedAuth,
|
|
12
11
|
detectAuthConfiguration,
|
|
13
12
|
logAuthConfiguration,
|
|
14
13
|
McpServerData,
|
|
@@ -133,7 +132,6 @@ app.post('/api/test-token', async (req, res) => {
|
|
|
133
132
|
return res.json({
|
|
134
133
|
valid: result.success,
|
|
135
134
|
authType: result.authType,
|
|
136
|
-
tokenType: result.tokenType,
|
|
137
135
|
error: result.error,
|
|
138
136
|
username: result.username,
|
|
139
137
|
hasPayload: !!result.payload,
|
|
@@ -220,13 +218,12 @@ const customAuthValidator: CustomAuthValidator = async (req): Promise<AuthResult
|
|
|
220
218
|
return {
|
|
221
219
|
success: true,
|
|
222
220
|
authType: 'basic',
|
|
223
|
-
tokenType: 'apiKey',
|
|
224
221
|
username: userHeader,
|
|
225
222
|
payload: {
|
|
226
223
|
clientIP,
|
|
227
224
|
apiKeyPrefix: apiKey.substring(0, 8) + '...',
|
|
228
|
-
validatedAt: new Date().toISOString()
|
|
229
|
-
}
|
|
225
|
+
validatedAt: new Date().toISOString(),
|
|
226
|
+
},
|
|
230
227
|
};
|
|
231
228
|
}
|
|
232
229
|
|
|
@@ -249,51 +246,26 @@ const customAuthValidator: CustomAuthValidator = async (req): Promise<AuthResult
|
|
|
249
246
|
return {
|
|
250
247
|
success: true,
|
|
251
248
|
authType: 'basic',
|
|
252
|
-
tokenType: 'custom',
|
|
253
249
|
username: `guest-${clientIP}`,
|
|
254
250
|
payload: {
|
|
255
251
|
clientIP,
|
|
256
252
|
userAgent,
|
|
257
253
|
accessTime: new Date().toISOString(),
|
|
258
|
-
businessHoursAccess: isWorkingHours
|
|
259
|
-
}
|
|
254
|
+
businessHoursAccess: isWorkingHours,
|
|
255
|
+
},
|
|
260
256
|
};
|
|
261
257
|
} catch (error) {
|
|
262
258
|
return {
|
|
263
259
|
success: false,
|
|
264
|
-
error: `Custom authentication error: ${error instanceof Error ? error.message : 'Unknown error'}
|
|
260
|
+
error: `Custom authentication error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
265
261
|
};
|
|
266
262
|
}
|
|
267
263
|
};
|
|
268
264
|
|
|
269
|
-
// Демонстрация использования checkCombinedAuth напрямую
|
|
270
|
-
app.post('/api/combined-auth-test', async (req, res) => {
|
|
271
|
-
try {
|
|
272
|
-
// checkCombinedAuth проверяет и стандартную auth + кастомный валидатор
|
|
273
|
-
const result = await checkCombinedAuth(req);
|
|
274
|
-
|
|
275
|
-
if (result.success) {
|
|
276
|
-
res.json({
|
|
277
|
-
message: 'Combined authentication successful',
|
|
278
|
-
authType: result.authType,
|
|
279
|
-
tokenType: result.tokenType,
|
|
280
|
-
username: result.username,
|
|
281
|
-
});
|
|
282
|
-
} else {
|
|
283
|
-
res.status(401).json({
|
|
284
|
-
error: 'Combined authentication failed',
|
|
285
|
-
reason: result.error,
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
} catch {
|
|
289
|
-
res.status(500).json({ error: 'Authentication system error' });
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
|
|
293
265
|
// Пример middleware, который использует combined auth
|
|
294
266
|
const combinedAuthMiddleware = async (req: any, res: any, next: any) => {
|
|
295
267
|
try {
|
|
296
|
-
const result = await
|
|
268
|
+
const result = await checkMultiAuth(req);
|
|
297
269
|
|
|
298
270
|
if (!result.success) {
|
|
299
271
|
return res.status(401).json({ error: result.error });
|
|
@@ -302,7 +274,6 @@ const combinedAuthMiddleware = async (req: any, res: any, next: any) => {
|
|
|
302
274
|
// Добавляем информацию об аутентификации в request
|
|
303
275
|
req.authInfo = {
|
|
304
276
|
authType: result.authType,
|
|
305
|
-
tokenType: result.tokenType,
|
|
306
277
|
username: result.username,
|
|
307
278
|
payload: result.payload,
|
|
308
279
|
};
|
|
@@ -351,13 +322,12 @@ const mcpServerDataExample: McpServerData = {
|
|
|
351
322
|
return {
|
|
352
323
|
success: true,
|
|
353
324
|
authType: 'basic',
|
|
354
|
-
tokenType: 'specialToken',
|
|
355
325
|
username: 'company-user',
|
|
356
326
|
payload: {
|
|
357
327
|
tokenType: 'company',
|
|
358
328
|
issuedAt: new Date().toISOString(),
|
|
359
|
-
level: 'company-wide'
|
|
360
|
-
}
|
|
329
|
+
level: 'company-wide',
|
|
330
|
+
},
|
|
361
331
|
};
|
|
362
332
|
}
|
|
363
333
|
|
|
@@ -367,13 +337,12 @@ const mcpServerDataExample: McpServerData = {
|
|
|
367
337
|
return {
|
|
368
338
|
success: true,
|
|
369
339
|
authType: 'basic',
|
|
370
|
-
tokenType: 'clientCert',
|
|
371
340
|
username: 'cert-user',
|
|
372
341
|
payload: {
|
|
373
342
|
certificateFingerprint: clientCert.substring(0, 32) + '...',
|
|
374
343
|
validatedAt: new Date().toISOString(),
|
|
375
|
-
level: 'certificate-based'
|
|
376
|
-
}
|
|
344
|
+
level: 'certificate-based',
|
|
345
|
+
},
|
|
377
346
|
};
|
|
378
347
|
}
|
|
379
348
|
|
|
@@ -386,13 +355,12 @@ const mcpServerDataExample: McpServerData = {
|
|
|
386
355
|
return {
|
|
387
356
|
success: true,
|
|
388
357
|
authType: 'basic',
|
|
389
|
-
tokenType: 'externalToken',
|
|
390
358
|
username: 'external-user',
|
|
391
359
|
payload: {
|
|
392
360
|
tokenPrefix: token.substring(0, 8) + '...',
|
|
393
361
|
validatedAt: new Date().toISOString(),
|
|
394
|
-
level: 'external-system'
|
|
395
|
-
}
|
|
362
|
+
level: 'external-system',
|
|
363
|
+
},
|
|
396
364
|
};
|
|
397
365
|
}
|
|
398
366
|
}
|
|
@@ -403,7 +371,7 @@ const mcpServerDataExample: McpServerData = {
|
|
|
403
371
|
console.log('❌ Custom authentication error:', error);
|
|
404
372
|
return {
|
|
405
373
|
success: false,
|
|
406
|
-
error: `Custom authentication error: ${error instanceof Error ? error.message : 'Unknown error'}
|
|
374
|
+
error: `Custom authentication error: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
407
375
|
};
|
|
408
376
|
}
|
|
409
377
|
},
|
|
@@ -502,12 +470,11 @@ async function testCombinedAuth () {
|
|
|
502
470
|
|
|
503
471
|
try {
|
|
504
472
|
// @ts-ignore
|
|
505
|
-
const result = await
|
|
473
|
+
const result = await checkMultiAuth(mockRequest);
|
|
506
474
|
|
|
507
475
|
if (result.success) {
|
|
508
476
|
console.log('✅ Combined authentication test: PASSED');
|
|
509
477
|
console.log(` Auth Type: ${result.authType}`);
|
|
510
|
-
console.log(` Token Type: ${result.tokenType}`);
|
|
511
478
|
console.log(` Username: ${result.username || 'N/A'}`);
|
|
512
479
|
} else {
|
|
513
480
|
console.log('❌ Combined authentication test: FAILED');
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Пример расширения конфигурации fa-mcp-sdk кастомным блоком настроек.
|
|
3
|
+
*
|
|
4
|
+
* Этот файл демонстрирует, как добавить собственные настройки
|
|
5
|
+
* (например, для проверки членства пользователя в AD-группе).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { AppConfig } from '../../core/index.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Настройки проверки членства в AD-группе
|
|
12
|
+
*/
|
|
13
|
+
export interface IGroupAccessConfig {
|
|
14
|
+
groupAccess: {
|
|
15
|
+
/** AD-группа, членство в которой требуется для доступа */
|
|
16
|
+
requiredGroup: string;
|
|
17
|
+
|
|
18
|
+
/** Опционально: разрешить доступ без проверки группы (для отладки) */
|
|
19
|
+
bypassGroupCheck?: boolean;
|
|
20
|
+
|
|
21
|
+
/** Опционально: кэшировать результат проверки (секунды) */
|
|
22
|
+
cacheTtlSeconds?: number;
|
|
23
|
+
|
|
24
|
+
/** Опционально: список групп с разными уровнями доступа */
|
|
25
|
+
accessLevels?: {
|
|
26
|
+
/** Группа для полного доступа (read/write) */
|
|
27
|
+
fullAccess?: string;
|
|
28
|
+
/** Группа только для чтения */
|
|
29
|
+
readOnly?: string;
|
|
30
|
+
/** Группа администраторов */
|
|
31
|
+
admin?: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Расширенный конфиг приложения с настройками проверки групп
|
|
38
|
+
*/
|
|
39
|
+
export interface CustomAppConfig extends AppConfig, IGroupAccessConfig {}
|
|
40
|
+
|
|
41
|
+
// ========================================================================
|
|
42
|
+
// ПРИМЕР YAML-КОНФИГУРАЦИИ (config/default.yaml)
|
|
43
|
+
// ========================================================================
|
|
44
|
+
/*
|
|
45
|
+
groupAccess:
|
|
46
|
+
requiredGroup: "DOMAIN\\MCP-Users"
|
|
47
|
+
bypassGroupCheck: false
|
|
48
|
+
cacheTtlSeconds: 300
|
|
49
|
+
accessLevels:
|
|
50
|
+
fullAccess: "DOMAIN\\MCP-FullAccess"
|
|
51
|
+
readOnly: "DOMAIN\\MCP-ReadOnly"
|
|
52
|
+
admin: "DOMAIN\\MCP-Admins"
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
// ========================================================================
|
|
56
|
+
// ПРИМЕР ИСПОЛЬЗОВАНИЯ В КОДЕ
|
|
57
|
+
// ========================================================================
|
|
58
|
+
/*
|
|
59
|
+
import { appConfig } from '../core/index.js';
|
|
60
|
+
|
|
61
|
+
// Типизированный доступ к кастомным настройкам
|
|
62
|
+
const config = appConfig as CustomAppConfig;
|
|
63
|
+
|
|
64
|
+
const requiredGroup = config.groupAccess.requiredGroup;
|
|
65
|
+
const shouldBypass = config.groupAccess.bypassGroupCheck;
|
|
66
|
+
|
|
67
|
+
// Проверка уровня доступа из payload
|
|
68
|
+
function getUserAccessLevel(payload: { user: string; groups?: string[] }): 'admin' | 'full' | 'readonly' | 'none' {
|
|
69
|
+
const { accessLevels } = config.groupAccess;
|
|
70
|
+
const userGroups = payload.groups || [];
|
|
71
|
+
|
|
72
|
+
if (accessLevels?.admin && userGroups.includes(accessLevels.admin)) {
|
|
73
|
+
return 'admin';
|
|
74
|
+
}
|
|
75
|
+
if (accessLevels?.fullAccess && userGroups.includes(accessLevels.fullAccess)) {
|
|
76
|
+
return 'full';
|
|
77
|
+
}
|
|
78
|
+
if (accessLevels?.readOnly && userGroups.includes(accessLevels.readOnly)) {
|
|
79
|
+
return 'readonly';
|
|
80
|
+
}
|
|
81
|
+
return 'none';
|
|
82
|
+
}
|
|
83
|
+
*/
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
2
|
+
<path fill="currentColor"
|
|
3
|
+
d="m 17.622437,19.155864 v -2.611959 h 2.251659 v 2.611959 H 22.468 v 2.251688 h -2.593904 v 2.581936 h -2.251659 v -2.581936 h -2.632933 v -2.251688 z m -5.686183,2.592444 v 2.251688 H 1.4 V 0 H 22.404961 V 15.011256 H 20.153302 V 2.251689 H 3.6516577 V 21.748308 H 11.937755 Z M 7.4959862,7.535651 V 6.034525 h 8.9705968 v 1.501126 z m 0.02402,4.552914 v -1.501126 h 8.9180578 v 1.501126 z m 0.02252,4.420814 v -1.501125 h 5.9278628 v 1.501125 z" />
|
|
4
|
+
</svg>
|
package/src/template/start.ts
CHANGED
|
@@ -16,8 +16,8 @@ const isConsulProd = (process.env.NODE_CONSUL_ENV || process.env.NODE_ENV) === '
|
|
|
16
16
|
* Main function that assembles all project data and starts the MCP server
|
|
17
17
|
*/
|
|
18
18
|
const startProject = async (): Promise<void> => {
|
|
19
|
-
// Read
|
|
20
|
-
const
|
|
19
|
+
// Read logo from assets
|
|
20
|
+
const logoSvg = getAsset('logo.svg')!;
|
|
21
21
|
|
|
22
22
|
// Assemble all data to pass to the core
|
|
23
23
|
const serverData: McpServerData = {
|
|
@@ -45,7 +45,7 @@ const startProject = async (): Promise<void> => {
|
|
|
45
45
|
|
|
46
46
|
// Assets
|
|
47
47
|
assets: {
|
|
48
|
-
|
|
48
|
+
logoSvg: logoSvg,
|
|
49
49
|
maintainerHtml: '<a href="https://support.com/page/2805" target="_blank" rel="noopener" class="clickable">Support</a>',
|
|
50
50
|
},
|
|
51
51
|
// Function to get Consul UI address (if consul enabled: consul.service.enable = true)
|
|
@@ -21,8 +21,9 @@ export const handleToolCall = async (params: { name: string, arguments?: any }):
|
|
|
21
21
|
default:
|
|
22
22
|
throw new ToolExecutionError(name, `Unknown tool: ${name}`);
|
|
23
23
|
}
|
|
24
|
-
} catch (error) {
|
|
24
|
+
} catch (error: Error | any) {
|
|
25
25
|
logger.error(`Tool execution failed for ${name}:`, error);
|
|
26
|
+
error.printed = true;
|
|
26
27
|
throw error;
|
|
27
28
|
}
|
|
28
29
|
};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Uses McpHttpClient (simple POST requests)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { appConfig, McpHttpClient } from '../../../dist/core/index.js';
|
|
8
|
+
import { appConfig, McpHttpClient, getAuthHeadersForTests } from '../../../dist/core/index.js';
|
|
9
9
|
import TEMPLATE_TESTS from './test-cases.js';
|
|
10
10
|
|
|
11
11
|
const baseUrl = (process.env.TEST_MCP_SERVER_URL || `http://localhost:${appConfig.webServer.port}`).replace(/\/+$/,'');
|
|
@@ -37,7 +37,15 @@ async function main () {
|
|
|
37
37
|
console.log('🧪 HTTP tests for template MCP server');
|
|
38
38
|
console.log('='.repeat(60));
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
// Get authentication headers based on config
|
|
41
|
+
const headers = getAuthHeadersForTests();
|
|
42
|
+
if (Object.keys(headers).length) {
|
|
43
|
+
console.log(' Authentication enabled');
|
|
44
|
+
} else if (appConfig.webServer?.auth?.enabled) {
|
|
45
|
+
console.log('⚠️ Warning: Auth is enabled but no valid credentials found');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const client = new McpHttpClient(baseUrl, { headers });
|
|
41
49
|
try {
|
|
42
50
|
await client.initialize({
|
|
43
51
|
protocolVersion: '2024-11-05',
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Uses McpSseClient to send requests via HTTP and receive responses via SSE
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { appConfig, McpSseClient } from '../../../dist/core/index.js';
|
|
8
|
+
import { appConfig, McpSseClient, getAuthHeadersForTests } from '../../../dist/core/index.js';
|
|
9
9
|
import TEMPLATE_TESTS from './test-cases.js';
|
|
10
10
|
|
|
11
11
|
const baseUrl = (process.env.TEST_MCP_SERVER_URL || `http://localhost:${appConfig.webServer.port}`).replace(/\/+$/,'');
|
|
@@ -37,7 +37,15 @@ async function main () {
|
|
|
37
37
|
console.log('🧪 SSE tests for template MCP server');
|
|
38
38
|
console.log('='.repeat(60));
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
// Get authentication headers based on config
|
|
41
|
+
const headers = getAuthHeadersForTests();
|
|
42
|
+
if (Object.keys(headers).length) {
|
|
43
|
+
console.log(' Authentication enabled');
|
|
44
|
+
} else if (appConfig.webServer?.auth?.enabled) {
|
|
45
|
+
console.log('⚠️ Warning: Auth is enabled but no valid credentials found');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const client = new McpSseClient(baseUrl, headers);
|
|
41
49
|
try {
|
|
42
50
|
// Health check (optional)
|
|
43
51
|
await client.health().catch(() => undefined);
|
|
@@ -13,9 +13,8 @@ import { McpStdioClient } from '../../../dist/core/index.js';
|
|
|
13
13
|
|
|
14
14
|
const __filename = fileURLToPath(import.meta.url);
|
|
15
15
|
const __dirname = dirname(__filename);
|
|
16
|
-
const projectRoot = join(__dirname, '../../../');
|
|
17
16
|
|
|
18
|
-
const serverPath = join(
|
|
17
|
+
const serverPath = join(__dirname, '../../../dist/template/start.js');
|
|
19
18
|
|
|
20
19
|
async function runTestGroup (title, tests, client) {
|
|
21
20
|
console.log(`\n${title}:`);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<component name="ProjectRunConfigurationManager">
|
|
2
|
-
<configuration default="false" name="TEST search" type="JavaScriptTestRunnerJest">
|
|
3
|
-
<node-interpreter value="project" />
|
|
4
|
-
<jest-package value="$PROJECT_DIR$/node_modules/jest" />
|
|
5
|
-
<working-dir value="$PROJECT_DIR$" />
|
|
6
|
-
<envs />
|
|
7
|
-
<scope-kind value="TEST_FILE" />
|
|
8
|
-
<test-file value="$PROJECT_DIR$/tests/tools/search.test.ts" />
|
|
9
|
-
<method v="2" />
|
|
10
|
-
</configuration>
|
|
11
|
-
</component>
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
<component name="ProjectRunConfigurationManager">
|
|
2
|
-
<configuration default="false" name="remove-nul.js" type="NodeJSConfigurationType" nameIsGenerated="true" path-to-js-file="cli-template/scripts/remove-nul.js" working-dir="$PROJECT_DIR$">
|
|
3
|
-
<method v="2" />
|
|
4
|
-
</configuration>
|
|
5
|
-
</component>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-validation.d.ts","sourceRoot":"","sources":["../../../src/core/auth/jwt-validation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAC;AAmB9D,eAAO,MAAM,OAAO,QAAmC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAStC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,cAAc,MAAM,WAW3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,aAAa,MAAM,EAAE,UAAU,GAAG,KAAG,MAYhF,CAAC;AAGF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,KAAG,iBA2EH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-validation.js","sourceRoot":"","sources":["../../../src/core/auth/jwt-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/core/auth/token-generator/html.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,GAAI,aAAa,UAAU,KAAG,MAy1BrD,CAAC"}
|