@mcp-shark/mcp-shark 1.5.4 → 1.5.6
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 +32 -96
- package/bin/mcp-shark.js +1 -1
- package/core/configs/codex.js +68 -0
- package/core/configs/environment.js +51 -0
- package/{lib/common → core}/configs/index.js +16 -1
- package/core/constants/Defaults.js +15 -0
- package/core/constants/HttpStatus.js +14 -0
- package/core/constants/Server.js +20 -0
- package/core/constants/StatusCodes.js +25 -0
- package/core/constants/index.js +7 -0
- package/core/container/DependencyContainer.js +179 -0
- package/core/db/init.js +33 -0
- package/core/index.js +10 -0
- package/{mcp-server/lib/common/error.js → core/libraries/ErrorLibrary.js} +4 -0
- package/core/libraries/LoggerLibrary.js +91 -0
- package/core/libraries/SerializationLibrary.js +32 -0
- package/core/libraries/bootstrap-logger.js +19 -0
- package/core/libraries/errors/ApplicationError.js +97 -0
- package/core/libraries/index.js +17 -0
- package/{mcp-server/lib → core/mcp-server}/auditor/audit.js +77 -53
- package/core/mcp-server/index.js +192 -0
- package/{mcp-server/lib → core/mcp-server}/server/external/all.js +1 -1
- package/core/mcp-server/server/external/config.js +75 -0
- package/{mcp-server/lib → core/mcp-server}/server/external/single/client.js +1 -1
- package/{mcp-server/lib → core/mcp-server}/server/external/single/request.js +1 -1
- package/{mcp-server/lib → core/mcp-server}/server/external/single/run.js +20 -11
- package/{mcp-server/lib → core/mcp-server}/server/external/single/transport.js +1 -1
- package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/error.js +1 -1
- package/core/mcp-server/server/internal/handlers/prompts-get.js +28 -0
- package/core/mcp-server/server/internal/handlers/prompts-list.js +21 -0
- package/core/mcp-server/server/internal/handlers/resources-list.js +21 -0
- package/core/mcp-server/server/internal/handlers/resources-read.js +28 -0
- package/core/mcp-server/server/internal/handlers/tools-call.js +44 -0
- package/core/mcp-server/server/internal/handlers/tools-list.js +23 -0
- package/core/mcp-server/server/internal/run.js +53 -0
- package/{mcp-server/lib → core/mcp-server}/server/internal/server.js +11 -1
- package/core/models/ConversationFilters.js +31 -0
- package/core/models/ExportFormat.js +8 -0
- package/core/models/RequestFilters.js +43 -0
- package/core/models/SessionFilters.js +23 -0
- package/core/models/index.js +8 -0
- package/core/repositories/AuditRepository.js +233 -0
- package/core/repositories/ConversationRepository.js +182 -0
- package/core/repositories/PacketRepository.js +237 -0
- package/core/repositories/SchemaRepository.js +107 -0
- package/core/repositories/SessionRepository.js +59 -0
- package/core/repositories/StatisticsRepository.js +54 -0
- package/core/repositories/index.js +10 -0
- package/core/services/AuditService.js +144 -0
- package/core/services/BackupService.js +222 -0
- package/core/services/ConfigDetectionService.js +89 -0
- package/core/services/ConfigFileService.js +210 -0
- package/core/services/ConfigPatchingService.js +137 -0
- package/core/services/ConfigService.js +250 -0
- package/core/services/ConfigTransformService.js +178 -0
- package/core/services/ConversationService.js +19 -0
- package/core/services/ExportService.js +117 -0
- package/core/services/LogService.js +64 -0
- package/core/services/McpClientService.js +235 -0
- package/core/services/McpDiscoveryService.js +107 -0
- package/core/services/RequestService.js +56 -0
- package/core/services/ScanCacheService.js +242 -0
- package/core/services/ScanService.js +167 -0
- package/core/services/ServerManagementService.js +206 -0
- package/core/services/SessionService.js +34 -0
- package/core/services/SettingsService.js +163 -0
- package/core/services/StatisticsService.js +64 -0
- package/core/services/TokenService.js +94 -0
- package/core/services/index.js +25 -0
- package/core/services/parsers/ConfigParserFactory.js +113 -0
- package/core/services/parsers/JsonConfigParser.js +66 -0
- package/core/services/parsers/LegacyJsonConfigParser.js +71 -0
- package/core/services/parsers/TomlConfigParser.js +87 -0
- package/core/services/parsers/index.js +4 -0
- package/{ui/server → core}/utils/scan-cache/directory.js +1 -1
- package/core/utils/validation.js +77 -0
- package/package.json +14 -11
- package/ui/dist/assets/index-CArYxKxS.js +35 -0
- package/ui/dist/index.html +1 -1
- package/ui/server/controllers/BackupController.js +129 -0
- package/ui/server/controllers/ConfigController.js +92 -0
- package/ui/server/controllers/ConversationController.js +41 -0
- package/ui/server/controllers/LogController.js +44 -0
- package/ui/server/controllers/McpClientController.js +60 -0
- package/ui/server/controllers/McpDiscoveryController.js +44 -0
- package/ui/server/controllers/RequestController.js +129 -0
- package/ui/server/controllers/ScanController.js +122 -0
- package/ui/server/controllers/ServerManagementController.js +154 -0
- package/ui/server/controllers/SessionController.js +57 -0
- package/ui/server/controllers/SettingsController.js +24 -0
- package/ui/server/controllers/StatisticsController.js +54 -0
- package/ui/server/controllers/TokenController.js +58 -0
- package/ui/server/controllers/index.js +17 -0
- package/ui/server/routes/backups/index.js +15 -9
- package/ui/server/routes/composite/index.js +63 -32
- package/ui/server/routes/composite/servers.js +20 -15
- package/ui/server/routes/config.js +13 -172
- package/ui/server/routes/conversations.js +9 -19
- package/ui/server/routes/help.js +4 -3
- package/ui/server/routes/logs.js +14 -26
- package/ui/server/routes/playground.js +11 -174
- package/ui/server/routes/requests.js +12 -232
- package/ui/server/routes/sessions.js +10 -21
- package/ui/server/routes/settings.js +10 -192
- package/ui/server/routes/smartscan.js +26 -15
- package/ui/server/routes/statistics.js +8 -79
- package/ui/server/setup.js +163 -0
- package/ui/server/swagger/paths/backups.js +151 -0
- package/ui/server/swagger/paths/components.js +76 -0
- package/ui/server/swagger/paths/config.js +117 -0
- package/ui/server/swagger/paths/conversations.js +29 -0
- package/ui/server/swagger/paths/help.js +82 -0
- package/ui/server/swagger/paths/logs.js +87 -0
- package/ui/server/swagger/paths/playground.js +49 -0
- package/ui/server/swagger/paths/requests.js +178 -0
- package/ui/server/swagger/paths/serverManagement.js +205 -0
- package/ui/server/swagger/paths/sessions.js +61 -0
- package/ui/server/swagger/paths/settings.js +31 -0
- package/ui/server/swagger/paths/smartScan/discovery.js +97 -0
- package/ui/server/swagger/paths/smartScan/index.js +13 -0
- package/ui/server/swagger/paths/smartScan/scans.js +151 -0
- package/ui/server/swagger/paths/smartScan/token.js +71 -0
- package/ui/server/swagger/paths/statistics.js +40 -0
- package/ui/server/swagger/paths.js +38 -0
- package/ui/server/swagger/swagger.js +37 -0
- package/ui/server/utils/cleanup.js +99 -0
- package/ui/server/utils/config.js +18 -96
- package/ui/server/utils/errorHandler.js +43 -0
- package/ui/server/utils/logger.js +2 -2
- package/ui/server/utils/paths.js +27 -30
- package/ui/server/utils/port.js +21 -21
- package/ui/server/utils/process.js +18 -10
- package/ui/server/utils/processState.js +17 -0
- package/ui/server/utils/signals.js +34 -0
- package/ui/server/websocket/broadcast.js +33 -0
- package/ui/server/websocket/handler.js +52 -0
- package/ui/server.js +51 -230
- package/ui/src/App.jsx +2 -0
- package/ui/src/CompositeSetup.jsx +23 -9
- package/ui/src/PacketFilters.jsx +17 -3
- package/ui/src/components/AlertModal.jsx +116 -0
- package/ui/src/components/App/ApiDocsButton.jsx +57 -0
- package/ui/src/components/App/useAppState.js +43 -1
- package/ui/src/components/BackupList.jsx +27 -3
- package/ui/src/utils/requestPairing.js +35 -36
- package/ui/src/utils/requestUtils.js +1 -0
- package/lib/common/db/init.js +0 -132
- package/lib/common/db/logger.js +0 -349
- package/lib/common/db/query.js +0 -403
- package/lib/common/logger.js +0 -90
- package/mcp-server/index.js +0 -138
- package/mcp-server/lib/server/external/config.js +0 -57
- package/mcp-server/lib/server/internal/handlers/prompts-get.js +0 -20
- package/mcp-server/lib/server/internal/handlers/prompts-list.js +0 -13
- package/mcp-server/lib/server/internal/handlers/resources-list.js +0 -13
- package/mcp-server/lib/server/internal/handlers/resources-read.js +0 -20
- package/mcp-server/lib/server/internal/handlers/tools-call.js +0 -35
- package/mcp-server/lib/server/internal/handlers/tools-list.js +0 -15
- package/mcp-server/lib/server/internal/run.js +0 -37
- package/mcp-server/mcp-shark.js +0 -22
- package/ui/dist/assets/index-CFHeMNwd.js +0 -35
- package/ui/server/routes/backups/deleteBackup.js +0 -54
- package/ui/server/routes/backups/listBackups.js +0 -75
- package/ui/server/routes/backups/restoreBackup.js +0 -83
- package/ui/server/routes/backups/viewBackup.js +0 -47
- package/ui/server/routes/composite/setup.js +0 -129
- package/ui/server/routes/composite/status.js +0 -7
- package/ui/server/routes/composite/stop.js +0 -39
- package/ui/server/routes/composite/utils.js +0 -45
- package/ui/server/routes/smartscan/discover.js +0 -118
- package/ui/server/routes/smartscan/scans/clearCache.js +0 -23
- package/ui/server/routes/smartscan/scans/createBatchScans.js +0 -124
- package/ui/server/routes/smartscan/scans/createScan.js +0 -43
- package/ui/server/routes/smartscan/scans/getCachedResults.js +0 -52
- package/ui/server/routes/smartscan/scans/getScan.js +0 -42
- package/ui/server/routes/smartscan/scans/listScans.js +0 -25
- package/ui/server/routes/smartscan/scans.js +0 -13
- package/ui/server/routes/smartscan/token.js +0 -57
- package/ui/server/utils/config-update.js +0 -240
- package/ui/server/utils/scan-cache/all-results.js +0 -197
- package/ui/server/utils/scan-cache/file-operations.js +0 -107
- package/ui/server/utils/scan-cache/hash.js +0 -47
- package/ui/server/utils/scan-cache/server-operations.js +0 -85
- package/ui/server/utils/scan-cache.js +0 -12
- package/ui/server/utils/smartscan-token.js +0 -43
- /package/{mcp-server/lib → core/mcp-server}/server/external/kv.js +0 -0
- /package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/common.js +0 -0
- /package/{mcp-server/lib → core/mcp-server}/server/internal/session.js +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for standard MCP JSON configuration format
|
|
3
|
+
* Handles { mcpServers: { ... } } format (Cursor, Windsurf, etc.)
|
|
4
|
+
*/
|
|
5
|
+
export class JsonConfigParser {
|
|
6
|
+
/**
|
|
7
|
+
* Parse JSON content
|
|
8
|
+
* @param {string} content - JSON file content
|
|
9
|
+
* @returns {Object|null} Parsed config or null on error
|
|
10
|
+
*/
|
|
11
|
+
parse(content) {
|
|
12
|
+
try {
|
|
13
|
+
const parsed = JSON.parse(content);
|
|
14
|
+
if (parsed && typeof parsed === 'object') {
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
} catch (_error) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Check if config is in standard MCP JSON format
|
|
25
|
+
* @param {Object} config - Parsed config object
|
|
26
|
+
* @returns {boolean} True if config has mcpServers section
|
|
27
|
+
*/
|
|
28
|
+
isMcpServersFormat(config) {
|
|
29
|
+
return config && typeof config === 'object' && config.mcpServers !== undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Normalize standard MCP JSON format to internal format
|
|
34
|
+
* Standard format: { mcpServers: { "server-name": { type?, command?, args?, env?, url?, headers? } } }
|
|
35
|
+
* Internal format: Same structure, but ensures type is set
|
|
36
|
+
* @param {Object} config - Parsed config
|
|
37
|
+
* @returns {Object|null} Normalized config or null if invalid
|
|
38
|
+
*/
|
|
39
|
+
normalizeToInternalFormat(config) {
|
|
40
|
+
if (!this.isMcpServersFormat(config)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const normalized = {
|
|
45
|
+
mcpServers: {},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
for (const [serverName, serverConfig] of Object.entries(config.mcpServers)) {
|
|
49
|
+
if (!serverConfig || typeof serverConfig !== 'object') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const type = serverConfig.type || (serverConfig.url ? 'http' : 'stdio');
|
|
54
|
+
normalized.mcpServers[serverName] = {
|
|
55
|
+
type,
|
|
56
|
+
...serverConfig,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (Object.keys(normalized.mcpServers).length === 0) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return normalized;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for legacy MCP JSON configuration format
|
|
3
|
+
* Handles { servers: { ... } } format (old format)
|
|
4
|
+
*/
|
|
5
|
+
export class LegacyJsonConfigParser {
|
|
6
|
+
/**
|
|
7
|
+
* Parse JSON content
|
|
8
|
+
* @param {string} content - JSON file content
|
|
9
|
+
* @returns {Object|null} Parsed config or null on error
|
|
10
|
+
*/
|
|
11
|
+
parse(content) {
|
|
12
|
+
try {
|
|
13
|
+
const parsed = JSON.parse(content);
|
|
14
|
+
if (parsed && typeof parsed === 'object') {
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
} catch (_error) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Check if config is in legacy format
|
|
25
|
+
* @param {Object} config - Parsed config object
|
|
26
|
+
* @returns {boolean} True if config has servers section (but not mcpServers)
|
|
27
|
+
*/
|
|
28
|
+
isLegacyFormat(config) {
|
|
29
|
+
return (
|
|
30
|
+
config &&
|
|
31
|
+
typeof config === 'object' &&
|
|
32
|
+
config.servers !== undefined &&
|
|
33
|
+
config.mcpServers === undefined
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Convert legacy format to internal format
|
|
39
|
+
* Legacy format: { servers: { "server-name": { type, command?, args?, env?, url?, headers? } } }
|
|
40
|
+
* Internal format: { servers: { "server-name": { type, ... } } }
|
|
41
|
+
* @param {Object} config - Parsed legacy config
|
|
42
|
+
* @returns {Object|null} Converted config or null if invalid
|
|
43
|
+
*/
|
|
44
|
+
convertToInternalFormat(config) {
|
|
45
|
+
if (!this.isLegacyFormat(config)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const converted = {
|
|
50
|
+
servers: {},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
for (const [serverName, serverConfig] of Object.entries(config.servers)) {
|
|
54
|
+
if (!serverConfig || typeof serverConfig !== 'object') {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const type = serverConfig.type || 'stdio';
|
|
59
|
+
converted.servers[serverName] = {
|
|
60
|
+
type,
|
|
61
|
+
...serverConfig,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (Object.keys(converted.servers).length === 0) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return converted;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { parse as parseToml } from '@iarna/toml';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Parser for TOML configuration files (Codex format)
|
|
5
|
+
* Handles [mcp_servers] section with underscore notation
|
|
6
|
+
*/
|
|
7
|
+
export class TomlConfigParser {
|
|
8
|
+
/**
|
|
9
|
+
* Parse TOML content
|
|
10
|
+
* @param {string} content - TOML file content
|
|
11
|
+
* @returns {Object|null} Parsed config or null on error
|
|
12
|
+
*/
|
|
13
|
+
parse(content) {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = parseToml(content);
|
|
16
|
+
if (parsed && typeof parsed === 'object') {
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
} catch (_error) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Check if config is in TOML format (Codex format)
|
|
27
|
+
* @param {Object} config - Parsed config object
|
|
28
|
+
* @returns {boolean} True if config has mcp_servers section
|
|
29
|
+
*/
|
|
30
|
+
isCodexFormat(config) {
|
|
31
|
+
return config && typeof config === 'object' && config.mcp_servers !== undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Convert Codex TOML format to MCP Shark internal format
|
|
36
|
+
* Codex format: [mcp_servers."server-name"] with command, args, env, url
|
|
37
|
+
* Internal format: { mcpServers: { "server-name": { type, command, args, env, url, headers } } }
|
|
38
|
+
* @param {Object} codexConfig - Parsed Codex config
|
|
39
|
+
* @returns {Object|null} Converted config or null if invalid
|
|
40
|
+
*/
|
|
41
|
+
convertToMcpSharkFormat(codexConfig) {
|
|
42
|
+
if (!this.isCodexFormat(codexConfig)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const mcpServers = {};
|
|
47
|
+
|
|
48
|
+
for (const [serverName, serverConfig] of Object.entries(codexConfig.mcp_servers)) {
|
|
49
|
+
if (!serverConfig || typeof serverConfig !== 'object') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const converted = {
|
|
54
|
+
type: serverConfig.url ? 'http' : 'stdio',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
if (serverConfig.command) {
|
|
58
|
+
converted.command = serverConfig.command;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (Array.isArray(serverConfig.args)) {
|
|
62
|
+
converted.args = serverConfig.args;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (serverConfig.env && typeof serverConfig.env === 'object') {
|
|
66
|
+
converted.env = serverConfig.env;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (serverConfig.url) {
|
|
70
|
+
converted.url = serverConfig.url;
|
|
71
|
+
if (serverConfig.headers && typeof serverConfig.headers === 'object') {
|
|
72
|
+
converted.headers = serverConfig.headers;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
mcpServers[serverName] = converted;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (Object.keys(mcpServers).length === 0) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
mcpServers,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities
|
|
3
|
+
* Provides common validation functions for controllers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize string input
|
|
8
|
+
* @param {*} value - Value to sanitize
|
|
9
|
+
* @returns {string|null} Sanitized string or null
|
|
10
|
+
*/
|
|
11
|
+
export function sanitizeString(value) {
|
|
12
|
+
if (value === undefined || value === null) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const trimmed = String(value).trim();
|
|
16
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Validate and parse integer
|
|
21
|
+
* @param {*} value - Value to parse
|
|
22
|
+
* @param {number} [defaultValue] - Default value if invalid
|
|
23
|
+
* @returns {number|null} Parsed integer or null/default
|
|
24
|
+
*/
|
|
25
|
+
export function parseInteger(value, defaultValue = null) {
|
|
26
|
+
if (value === undefined || value === null) {
|
|
27
|
+
return defaultValue;
|
|
28
|
+
}
|
|
29
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
30
|
+
return Number.isNaN(parsed) ? defaultValue : parsed;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Validate file path format
|
|
35
|
+
* @param {string} filePath - File path to validate
|
|
36
|
+
* @returns {boolean} True if path appears valid
|
|
37
|
+
*/
|
|
38
|
+
export function isValidFilePath(filePath) {
|
|
39
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
// Basic validation - no null bytes, reasonable length
|
|
43
|
+
if (filePath.includes('\0') || filePath.length > 4096) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Validate array input
|
|
51
|
+
* @param {*} value - Value to validate
|
|
52
|
+
* @param {number} [minLength] - Minimum array length
|
|
53
|
+
* @returns {boolean} True if valid array
|
|
54
|
+
*/
|
|
55
|
+
export function isValidArray(value, minLength = 0) {
|
|
56
|
+
if (!Array.isArray(value)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return value.length >= minLength;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Validate required fields in object
|
|
64
|
+
* @param {Object} obj - Object to validate
|
|
65
|
+
* @param {string[]} requiredFields - Array of required field names
|
|
66
|
+
* @returns {{valid: boolean, missing: string[]}} Validation result
|
|
67
|
+
*/
|
|
68
|
+
export function validateRequiredFields(obj, requiredFields) {
|
|
69
|
+
if (!obj || typeof obj !== 'object') {
|
|
70
|
+
return { valid: false, missing: requiredFields };
|
|
71
|
+
}
|
|
72
|
+
const missing = requiredFields.filter((field) => {
|
|
73
|
+
const value = obj[field];
|
|
74
|
+
return value === undefined || value === null || value === '';
|
|
75
|
+
});
|
|
76
|
+
return { valid: missing.length === 0, missing };
|
|
77
|
+
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-shark/mcp-shark",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.6",
|
|
4
4
|
"description": "Aggregate multiple Model Context Protocol (MCP) servers into a single unified interface with a powerful monitoring UI. Prov deep visibility into every request and response.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./bin/mcp-shark.js",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./bin/mcp-shark.js",
|
|
9
|
-
"./mcp-server": "./mcp-server/index.js"
|
|
9
|
+
"./mcp-server": "./core/mcp-server/index.js"
|
|
10
10
|
},
|
|
11
11
|
"imports": {
|
|
12
|
-
"#
|
|
13
|
-
"#
|
|
14
|
-
"#
|
|
15
|
-
"#common/db/logger": "./lib/common/db/logger.js",
|
|
16
|
-
"#common/logger": "./lib/common/logger.js",
|
|
17
|
-
"#common/*": "./lib/common/*"
|
|
12
|
+
"#core": "./core/index.js",
|
|
13
|
+
"#core/*": "./core/*",
|
|
14
|
+
"#ui/server/*": "./ui/server/*"
|
|
18
15
|
},
|
|
19
16
|
"bin": {
|
|
20
17
|
"mcp-shark": "./bin/mcp-shark.js",
|
|
@@ -28,11 +25,11 @@
|
|
|
28
25
|
"bugs": {
|
|
29
26
|
"url": "https://github.com/mcp-shark/mcp-shark/issues"
|
|
30
27
|
},
|
|
31
|
-
"files": ["bin", "ui", "
|
|
28
|
+
"files": ["bin", "ui", "core", "README.md", "LICENSE", "package.json"],
|
|
32
29
|
"scripts": {
|
|
33
30
|
"start": "node scripts/start-ui.js",
|
|
34
31
|
"predev": "npm run build:ui",
|
|
35
|
-
"dev": "node scripts/start-ui.js
|
|
32
|
+
"dev": "node scripts/start-ui.js",
|
|
36
33
|
"build": "bash -c 'cd ui && vite build'",
|
|
37
34
|
"build:ui": "bash -c 'cd ui && vite build'",
|
|
38
35
|
"lint": "biome lint .",
|
|
@@ -42,6 +39,9 @@
|
|
|
42
39
|
"check:fix": "biome check --write .",
|
|
43
40
|
"prepare": "husky install || true",
|
|
44
41
|
"prepublishOnly": "npm run check:fix && npm run build:ui",
|
|
42
|
+
"pack:inspect": "npm run prepublishOnly && npm pack && tar -tzf mcp-shark-mcp-shark-*.tgz | head -50 && echo '...' && tar -tzf mcp-shark-mcp-shark-*.tgz | wc -l && echo 'files total'",
|
|
43
|
+
"pack:list": "npm run prepublishOnly && npm pack && tar -tzf mcp-shark-mcp-shark-*.tgz",
|
|
44
|
+
"pack:extract": "npm run prepublishOnly && npm pack && mkdir -p .package-inspect && tar -xzf mcp-shark-mcp-shark-*.tgz -C .package-inspect && echo 'Package extracted to .package-inspect/package/'",
|
|
45
45
|
"publish:public": "npm publish --access public",
|
|
46
46
|
"publish:dry-run": "npm publish --dry-run"
|
|
47
47
|
},
|
|
@@ -72,18 +72,21 @@
|
|
|
72
72
|
"node": ">=20.0.0"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
+
"@iarna/toml": "^2.2.5",
|
|
75
76
|
"@modelcontextprotocol/sdk": "^1.20.2",
|
|
76
77
|
"@tabler/icons-react": "^3.0.0",
|
|
77
78
|
"animejs": "^3.2.2",
|
|
79
|
+
"better-sqlite3": "^12.4.1",
|
|
78
80
|
"commander": "^14.0.2",
|
|
79
81
|
"consola": "^3.4.2",
|
|
80
82
|
"cors": "^2.8.5",
|
|
81
83
|
"express": "^4.18.2",
|
|
82
84
|
"jsonrpc-lite": "^2.2.0",
|
|
83
|
-
"better-sqlite3": "^12.4.1",
|
|
84
85
|
"open": "^11.0.0",
|
|
85
86
|
"react": "^18.2.0",
|
|
86
87
|
"react-dom": "^18.2.0",
|
|
88
|
+
"swagger-jsdoc": "^6.2.8",
|
|
89
|
+
"swagger-ui-express": "^5.0.1",
|
|
87
90
|
"ws": "^8.16.0"
|
|
88
91
|
},
|
|
89
92
|
"devDependencies": {
|