@mcp-shark/mcp-shark 1.5.3 → 1.5.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.
Files changed (188) hide show
  1. package/README.md +32 -96
  2. package/bin/mcp-shark.js +1 -1
  3. package/core/configs/codex.js +68 -0
  4. package/core/configs/environment.js +51 -0
  5. package/{lib/common → core}/configs/index.js +16 -1
  6. package/core/constants/Defaults.js +15 -0
  7. package/core/constants/HttpStatus.js +14 -0
  8. package/core/constants/Server.js +20 -0
  9. package/core/constants/StatusCodes.js +25 -0
  10. package/core/constants/index.js +7 -0
  11. package/core/container/DependencyContainer.js +179 -0
  12. package/core/db/init.js +33 -0
  13. package/core/index.js +10 -0
  14. package/{mcp-server/lib/common/error.js → core/libraries/ErrorLibrary.js} +4 -0
  15. package/core/libraries/LoggerLibrary.js +91 -0
  16. package/core/libraries/SerializationLibrary.js +32 -0
  17. package/core/libraries/bootstrap-logger.js +19 -0
  18. package/core/libraries/errors/ApplicationError.js +97 -0
  19. package/core/libraries/index.js +17 -0
  20. package/{mcp-server/lib → core/mcp-server}/auditor/audit.js +77 -53
  21. package/core/mcp-server/index.js +192 -0
  22. package/{mcp-server/lib → core/mcp-server}/server/external/all.js +1 -1
  23. package/core/mcp-server/server/external/config.js +75 -0
  24. package/{mcp-server/lib → core/mcp-server}/server/external/single/client.js +1 -1
  25. package/{mcp-server/lib → core/mcp-server}/server/external/single/request.js +1 -1
  26. package/{mcp-server/lib → core/mcp-server}/server/external/single/run.js +20 -11
  27. package/{mcp-server/lib → core/mcp-server}/server/external/single/transport.js +1 -1
  28. package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/error.js +1 -1
  29. package/core/mcp-server/server/internal/handlers/prompts-get.js +28 -0
  30. package/core/mcp-server/server/internal/handlers/prompts-list.js +21 -0
  31. package/core/mcp-server/server/internal/handlers/resources-list.js +21 -0
  32. package/core/mcp-server/server/internal/handlers/resources-read.js +28 -0
  33. package/core/mcp-server/server/internal/handlers/tools-call.js +44 -0
  34. package/core/mcp-server/server/internal/handlers/tools-list.js +23 -0
  35. package/core/mcp-server/server/internal/run.js +53 -0
  36. package/{mcp-server/lib → core/mcp-server}/server/internal/server.js +11 -1
  37. package/core/models/ConversationFilters.js +31 -0
  38. package/core/models/ExportFormat.js +8 -0
  39. package/core/models/RequestFilters.js +43 -0
  40. package/core/models/SessionFilters.js +23 -0
  41. package/core/models/index.js +8 -0
  42. package/core/repositories/AuditRepository.js +233 -0
  43. package/core/repositories/ConversationRepository.js +182 -0
  44. package/core/repositories/PacketRepository.js +237 -0
  45. package/core/repositories/SchemaRepository.js +107 -0
  46. package/core/repositories/SessionRepository.js +59 -0
  47. package/core/repositories/StatisticsRepository.js +54 -0
  48. package/core/repositories/index.js +10 -0
  49. package/core/services/AuditService.js +144 -0
  50. package/core/services/BackupService.js +222 -0
  51. package/core/services/ConfigDetectionService.js +89 -0
  52. package/core/services/ConfigFileService.js +210 -0
  53. package/core/services/ConfigPatchingService.js +137 -0
  54. package/core/services/ConfigService.js +250 -0
  55. package/core/services/ConfigTransformService.js +178 -0
  56. package/core/services/ConversationService.js +19 -0
  57. package/core/services/ExportService.js +117 -0
  58. package/core/services/LogService.js +64 -0
  59. package/core/services/McpClientService.js +235 -0
  60. package/core/services/McpDiscoveryService.js +107 -0
  61. package/core/services/RequestService.js +56 -0
  62. package/core/services/ScanCacheService.js +242 -0
  63. package/core/services/ScanService.js +167 -0
  64. package/core/services/ServerManagementService.js +206 -0
  65. package/core/services/SessionService.js +34 -0
  66. package/core/services/SettingsService.js +163 -0
  67. package/core/services/StatisticsService.js +64 -0
  68. package/core/services/TokenService.js +94 -0
  69. package/core/services/index.js +25 -0
  70. package/core/services/parsers/ConfigParserFactory.js +113 -0
  71. package/core/services/parsers/JsonConfigParser.js +66 -0
  72. package/core/services/parsers/LegacyJsonConfigParser.js +71 -0
  73. package/core/services/parsers/TomlConfigParser.js +87 -0
  74. package/core/services/parsers/index.js +4 -0
  75. package/{ui/server → core}/utils/scan-cache/directory.js +1 -1
  76. package/core/utils/validation.js +77 -0
  77. package/package.json +14 -11
  78. package/ui/dist/assets/index-CArYxKxS.js +35 -0
  79. package/ui/dist/index.html +1 -1
  80. package/ui/server/controllers/BackupController.js +129 -0
  81. package/ui/server/controllers/ConfigController.js +92 -0
  82. package/ui/server/controllers/ConversationController.js +41 -0
  83. package/ui/server/controllers/LogController.js +44 -0
  84. package/ui/server/controllers/McpClientController.js +60 -0
  85. package/ui/server/controllers/McpDiscoveryController.js +44 -0
  86. package/ui/server/controllers/RequestController.js +129 -0
  87. package/ui/server/controllers/ScanController.js +122 -0
  88. package/ui/server/controllers/ServerManagementController.js +134 -0
  89. package/ui/server/controllers/SessionController.js +57 -0
  90. package/ui/server/controllers/SettingsController.js +24 -0
  91. package/ui/server/controllers/StatisticsController.js +54 -0
  92. package/ui/server/controllers/TokenController.js +58 -0
  93. package/ui/server/controllers/index.js +17 -0
  94. package/ui/server/routes/backups/index.js +15 -9
  95. package/ui/server/routes/composite/index.js +62 -32
  96. package/ui/server/routes/composite/servers.js +20 -15
  97. package/ui/server/routes/config.js +13 -172
  98. package/ui/server/routes/conversations.js +9 -19
  99. package/ui/server/routes/help.js +4 -3
  100. package/ui/server/routes/logs.js +14 -26
  101. package/ui/server/routes/playground.js +11 -174
  102. package/ui/server/routes/requests.js +12 -232
  103. package/ui/server/routes/sessions.js +10 -21
  104. package/ui/server/routes/settings.js +10 -192
  105. package/ui/server/routes/smartscan.js +26 -15
  106. package/ui/server/routes/statistics.js +8 -79
  107. package/ui/server/setup.js +162 -0
  108. package/ui/server/swagger/paths/backups.js +151 -0
  109. package/ui/server/swagger/paths/components.js +76 -0
  110. package/ui/server/swagger/paths/config.js +117 -0
  111. package/ui/server/swagger/paths/conversations.js +29 -0
  112. package/ui/server/swagger/paths/help.js +82 -0
  113. package/ui/server/swagger/paths/logs.js +87 -0
  114. package/ui/server/swagger/paths/playground.js +49 -0
  115. package/ui/server/swagger/paths/requests.js +178 -0
  116. package/ui/server/swagger/paths/serverManagement.js +169 -0
  117. package/ui/server/swagger/paths/sessions.js +61 -0
  118. package/ui/server/swagger/paths/settings.js +31 -0
  119. package/ui/server/swagger/paths/smartScan/discovery.js +97 -0
  120. package/ui/server/swagger/paths/smartScan/index.js +13 -0
  121. package/ui/server/swagger/paths/smartScan/scans.js +151 -0
  122. package/ui/server/swagger/paths/smartScan/token.js +71 -0
  123. package/ui/server/swagger/paths/statistics.js +40 -0
  124. package/ui/server/swagger/paths.js +38 -0
  125. package/ui/server/swagger/swagger.js +37 -0
  126. package/ui/server/utils/cleanup.js +99 -0
  127. package/ui/server/utils/config.js +18 -96
  128. package/ui/server/utils/errorHandler.js +43 -0
  129. package/ui/server/utils/logger.js +2 -2
  130. package/ui/server/utils/paths.js +27 -30
  131. package/ui/server/utils/port.js +21 -21
  132. package/ui/server/utils/process.js +18 -10
  133. package/ui/server/utils/processState.js +17 -0
  134. package/ui/server/utils/signals.js +34 -0
  135. package/ui/server/websocket/broadcast.js +33 -0
  136. package/ui/server/websocket/handler.js +52 -0
  137. package/ui/server.js +51 -230
  138. package/ui/src/App.jsx +2 -0
  139. package/ui/src/CompositeSetup.jsx +23 -9
  140. package/ui/src/PacketFilters.jsx +17 -3
  141. package/ui/src/components/AlertModal.jsx +116 -0
  142. package/ui/src/components/App/ApiDocsButton.jsx +57 -0
  143. package/ui/src/components/App/useAppState.js +43 -1
  144. package/ui/src/components/BackupList.jsx +27 -3
  145. package/ui/src/utils/requestPairing.js +35 -36
  146. package/ui/src/utils/requestUtils.js +1 -0
  147. package/lib/common/db/init.js +0 -132
  148. package/lib/common/db/logger.js +0 -349
  149. package/lib/common/db/query.js +0 -403
  150. package/lib/common/logger.js +0 -90
  151. package/mcp-server/index.js +0 -111
  152. package/mcp-server/lib/server/external/config.js +0 -57
  153. package/mcp-server/lib/server/internal/handlers/prompts-get.js +0 -20
  154. package/mcp-server/lib/server/internal/handlers/prompts-list.js +0 -13
  155. package/mcp-server/lib/server/internal/handlers/resources-list.js +0 -13
  156. package/mcp-server/lib/server/internal/handlers/resources-read.js +0 -20
  157. package/mcp-server/lib/server/internal/handlers/tools-call.js +0 -35
  158. package/mcp-server/lib/server/internal/handlers/tools-list.js +0 -15
  159. package/mcp-server/lib/server/internal/run.js +0 -37
  160. package/mcp-server/mcp-shark.js +0 -22
  161. package/ui/dist/assets/index-CFHeMNwd.js +0 -35
  162. package/ui/server/routes/backups/deleteBackup.js +0 -54
  163. package/ui/server/routes/backups/listBackups.js +0 -75
  164. package/ui/server/routes/backups/restoreBackup.js +0 -83
  165. package/ui/server/routes/backups/viewBackup.js +0 -47
  166. package/ui/server/routes/composite/setup.js +0 -129
  167. package/ui/server/routes/composite/status.js +0 -7
  168. package/ui/server/routes/composite/stop.js +0 -39
  169. package/ui/server/routes/composite/utils.js +0 -45
  170. package/ui/server/routes/smartscan/discover.js +0 -118
  171. package/ui/server/routes/smartscan/scans/clearCache.js +0 -23
  172. package/ui/server/routes/smartscan/scans/createBatchScans.js +0 -124
  173. package/ui/server/routes/smartscan/scans/createScan.js +0 -43
  174. package/ui/server/routes/smartscan/scans/getCachedResults.js +0 -52
  175. package/ui/server/routes/smartscan/scans/getScan.js +0 -42
  176. package/ui/server/routes/smartscan/scans/listScans.js +0 -25
  177. package/ui/server/routes/smartscan/scans.js +0 -13
  178. package/ui/server/routes/smartscan/token.js +0 -57
  179. package/ui/server/utils/config-update.js +0 -240
  180. package/ui/server/utils/scan-cache/all-results.js +0 -197
  181. package/ui/server/utils/scan-cache/file-operations.js +0 -107
  182. package/ui/server/utils/scan-cache/hash.js +0 -47
  183. package/ui/server/utils/scan-cache/server-operations.js +0 -85
  184. package/ui/server/utils/scan-cache.js +0 -12
  185. package/ui/server/utils/smartscan-token.js +0 -43
  186. /package/{mcp-server/lib → core/mcp-server}/server/external/kv.js +0 -0
  187. /package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/common.js +0 -0
  188. /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,4 @@
1
+ export { TomlConfigParser } from './TomlConfigParser.js';
2
+ export { JsonConfigParser } from './JsonConfigParser.js';
3
+ export { LegacyJsonConfigParser } from './LegacyJsonConfigParser.js';
4
+ export { ConfigParserFactory } from './ConfigParserFactory.js';
@@ -1,6 +1,6 @@
1
1
  import { existsSync, mkdirSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { getWorkingDirectory } from '#common/configs';
3
+ import { getWorkingDirectory } from '#core/configs/index.js';
4
4
 
5
5
  const SCAN_RESULTS_DIR_NAME = 'scan-results';
6
6
 
@@ -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",
3
+ "version": "1.5.5",
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
- "#common/configs": "./lib/common/configs/index.js",
13
- "#common/db/query": "./lib/common/db/query.js",
14
- "#common/db/init": "./lib/common/db/init.js",
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", "mcp-server", "lib", "README.md", "LICENSE", "package.json"],
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": {