@mcp-shark/mcp-shark 1.5.13 → 1.7.2

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 (158) hide show
  1. package/README.md +482 -56
  2. package/bin/mcp-shark.js +146 -52
  3. package/core/cli/AutoFixEngine.js +93 -0
  4. package/core/cli/ConfigScanner.js +193 -0
  5. package/core/cli/DataLoader.js +200 -0
  6. package/core/cli/DeclarativeRuleEngine.js +363 -0
  7. package/core/cli/DoctorCommand.js +218 -0
  8. package/core/cli/FixHandlers.js +222 -0
  9. package/core/cli/HtmlReportGenerator.js +203 -0
  10. package/core/cli/IdeConfigPaths.js +175 -0
  11. package/core/cli/ListCommand.js +255 -0
  12. package/core/cli/LockCommand.js +164 -0
  13. package/core/cli/LockDiffEngine.js +152 -0
  14. package/core/cli/RuleRegistryConfig.js +131 -0
  15. package/core/cli/ScanCommand.js +244 -0
  16. package/core/cli/ScanService.js +200 -0
  17. package/core/cli/SecretDetector.js +92 -0
  18. package/core/cli/SharkScoreCalculator.js +109 -0
  19. package/core/cli/ToolClassifications.js +51 -0
  20. package/core/cli/ToxicFlowAnalyzer.js +212 -0
  21. package/core/cli/UpdateCommand.js +188 -0
  22. package/core/cli/WalkthroughGenerator.js +195 -0
  23. package/core/cli/WatchCommand.js +129 -0
  24. package/core/cli/YamlRuleEngine.js +197 -0
  25. package/core/cli/data/rule-packs/aauth-visibility.json +117 -0
  26. package/core/cli/data/rule-packs/agentic-security-2026.json +180 -0
  27. package/core/cli/data/rule-packs/general-security.json +173 -0
  28. package/core/cli/data/rule-packs/owasp-mcp-2026.json +244 -0
  29. package/core/cli/data/rule-packs/toxic-flow-heuristics.json +21 -0
  30. package/core/cli/data/rule-sources.json +5 -0
  31. package/core/cli/data/secret-patterns.json +18 -0
  32. package/core/cli/data/tool-classifications.json +111 -0
  33. package/core/cli/data/toxic-flow-rules.json +47 -0
  34. package/core/cli/index.js +23 -0
  35. package/core/cli/output/Banner.js +52 -0
  36. package/core/cli/output/Formatter.js +183 -0
  37. package/core/cli/output/JsonFormatter.js +106 -0
  38. package/core/cli/output/index.js +16 -0
  39. package/core/cli/secureRegistryFetch.js +157 -0
  40. package/core/cli/symbols.js +16 -0
  41. package/core/configs/environment.js +3 -1
  42. package/core/configs/index.js +3 -64
  43. package/core/container/DependencyContainer.js +4 -1
  44. package/core/mcp-server/index.js +4 -1
  45. package/core/mcp-server/server/external/all.js +10 -3
  46. package/core/mcp-server/server/external/config.js +62 -5
  47. package/core/models/RequestFilters.js +3 -0
  48. package/core/repositories/PacketRepository.js +16 -0
  49. package/core/services/AuditService.js +2 -0
  50. package/core/services/ConfigService.js +9 -1
  51. package/core/services/ConfigTransformService.js +34 -2
  52. package/core/services/RequestService.js +58 -5
  53. package/core/services/ServerManagementService.js +59 -4
  54. package/core/services/security/StaticRulesService.js +69 -13
  55. package/core/services/security/TrafficAnalysisService.js +19 -1
  56. package/core/services/security/TrafficToxicFlowService.js +154 -0
  57. package/core/services/security/aauthGraph.js +199 -0
  58. package/core/services/security/aauthParser.js +274 -0
  59. package/core/services/security/aauthSelfTest.js +346 -0
  60. package/core/services/security/index.js +2 -1
  61. package/core/services/security/rules/index.js +25 -59
  62. package/core/services/security/rules/scans/configPermissions.js +91 -0
  63. package/core/services/security/rules/scans/duplicateToolNames.js +85 -0
  64. package/core/services/security/rules/scans/insecureTransport.js +148 -0
  65. package/core/services/security/rules/scans/missingContainment.js +123 -0
  66. package/core/services/security/rules/scans/shellEnvInjection.js +101 -0
  67. package/core/services/security/rules/scans/unsafeDefaults.js +99 -0
  68. package/core/services/security/toolsListFromTrafficParser.js +70 -0
  69. package/core/tui/App.js +144 -0
  70. package/core/tui/FindingsPanel.js +115 -0
  71. package/core/tui/FixPanel.js +132 -0
  72. package/core/tui/Header.js +51 -0
  73. package/core/tui/HelpBar.js +42 -0
  74. package/core/tui/ServersPanel.js +109 -0
  75. package/core/tui/ToxicFlowsPanel.js +100 -0
  76. package/core/tui/h.js +8 -0
  77. package/core/tui/index.js +11 -0
  78. package/core/tui/render.js +22 -0
  79. package/package.json +24 -16
  80. package/ui/dist/assets/index-D6zDrtMV.js +81 -0
  81. package/ui/dist/index.html +1 -1
  82. package/ui/server/controllers/AauthController.js +279 -0
  83. package/ui/server/controllers/RequestController.js +12 -1
  84. package/ui/server/controllers/SecurityFindingsController.js +46 -1
  85. package/ui/server/routes/aauth.js +18 -0
  86. package/ui/server/routes/requests.js +8 -1
  87. package/ui/server/routes/security.js +5 -1
  88. package/ui/server/setup.js +224 -6
  89. package/ui/server/swagger/paths/components.js +55 -0
  90. package/ui/server/swagger/paths/securityTrafficFlows.js +59 -0
  91. package/ui/server/swagger/paths.js +2 -2
  92. package/ui/server/swagger/swagger.js +5 -2
  93. package/ui/server.js +1 -1
  94. package/ui/src/App.jsx +26 -52
  95. package/ui/src/PacketFilters.jsx +31 -1
  96. package/ui/src/PacketList.jsx +2 -2
  97. package/ui/src/Security.jsx +10 -0
  98. package/ui/src/TabNavigation.jsx +8 -0
  99. package/ui/src/components/AAuthBadge.jsx +92 -0
  100. package/ui/src/components/AauthExplorer/AauthExplorerGraph.jsx +231 -0
  101. package/ui/src/components/AauthExplorer/AauthExplorerView.jsx +387 -0
  102. package/ui/src/components/AauthExplorer/NodeDetailPanel.jsx +272 -0
  103. package/ui/src/components/App/ActionMenu.jsx +4 -31
  104. package/ui/src/components/App/ApiDocsButton.jsx +0 -1
  105. package/ui/src/components/App/ShutdownButton.jsx +0 -1
  106. package/ui/src/components/App/useAppState.js +19 -26
  107. package/ui/src/components/DetailsTab/AAuthIdentitySection.jsx +119 -0
  108. package/ui/src/components/DetailsTab/RequestDetailsSection.jsx +2 -0
  109. package/ui/src/components/DetailsTab/ResponseDetailsSection.jsx +2 -0
  110. package/ui/src/components/DetectedPathsList.jsx +1 -5
  111. package/ui/src/components/FileInput.jsx +0 -1
  112. package/ui/src/components/PacketFilters/AAuthPostureFilter.jsx +81 -0
  113. package/ui/src/components/RequestRow/RequestRowMain.jsx +7 -1
  114. package/ui/src/components/Security/AAuthPosturePanel.jsx +360 -0
  115. package/ui/src/components/Security/ScannerContent.jsx +33 -1
  116. package/ui/src/components/Security/TrafficToxicFlowsPanel.jsx +253 -0
  117. package/ui/src/components/Security/securityApi.js +15 -0
  118. package/ui/src/components/Security/useSecurity.js +60 -3
  119. package/ui/src/components/ServerControl.jsx +0 -1
  120. package/ui/src/components/TabNavigation/DesktopTabs.jsx +0 -11
  121. package/ui/src/components/TabNavigationIcons.jsx +5 -0
  122. package/ui/src/components/ViewModeTabs.jsx +0 -1
  123. package/ui/src/utils/animations.js +26 -9
  124. package/core/services/security/rules/scans/agentic01GoalHijack.js +0 -130
  125. package/core/services/security/rules/scans/agentic02ToolMisuse.js +0 -129
  126. package/core/services/security/rules/scans/agentic03IdentityAbuse.js +0 -130
  127. package/core/services/security/rules/scans/agentic04SupplyChain.js +0 -130
  128. package/core/services/security/rules/scans/agentic06MemoryPoisoning.js +0 -130
  129. package/core/services/security/rules/scans/agentic07InsecureCommunication.js +0 -135
  130. package/core/services/security/rules/scans/agentic08CascadingFailures.js +0 -135
  131. package/core/services/security/rules/scans/agentic09TrustExploitation.js +0 -135
  132. package/core/services/security/rules/scans/agentic10RogueAgent.js +0 -130
  133. package/core/services/security/rules/scans/hardcodedSecrets.js +0 -130
  134. package/core/services/security/rules/scans/mcp01TokenMismanagement.js +0 -127
  135. package/core/services/security/rules/scans/mcp02ScopeCreep.js +0 -130
  136. package/core/services/security/rules/scans/mcp03ToolPoisoning.js +0 -132
  137. package/core/services/security/rules/scans/mcp04SupplyChain.js +0 -131
  138. package/core/services/security/rules/scans/mcp06PromptInjection.js +0 -200
  139. package/core/services/security/rules/scans/mcp07InsufficientAuth.js +0 -130
  140. package/core/services/security/rules/scans/mcp08LackAudit.js +0 -129
  141. package/core/services/security/rules/scans/mcp09ShadowServers.js +0 -129
  142. package/core/services/security/rules/scans/mcp10ContextInjection.js +0 -130
  143. package/ui/dist/assets/index-CiCSDYf-.js +0 -97
  144. package/ui/server/routes/help.js +0 -44
  145. package/ui/server/swagger/paths/help.js +0 -82
  146. package/ui/src/HelpGuide/HelpGuideContent.jsx +0 -118
  147. package/ui/src/HelpGuide/HelpGuideFooter.jsx +0 -59
  148. package/ui/src/HelpGuide/HelpGuideHeader.jsx +0 -57
  149. package/ui/src/HelpGuide.jsx +0 -78
  150. package/ui/src/IntroTour.jsx +0 -154
  151. package/ui/src/components/App/HelpButton.jsx +0 -90
  152. package/ui/src/components/TourOverlay.jsx +0 -117
  153. package/ui/src/components/TourTooltip/TourTooltipButtons.jsx +0 -120
  154. package/ui/src/components/TourTooltip/TourTooltipHeader.jsx +0 -71
  155. package/ui/src/components/TourTooltip/TourTooltipIcons.jsx +0 -54
  156. package/ui/src/components/TourTooltip/useTooltipPosition.js +0 -135
  157. package/ui/src/components/TourTooltip.jsx +0 -91
  158. package/ui/src/config/tourSteps.jsx +0 -140
@@ -1,129 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'mcp09-shadow-servers';
5
- const OWASP_ID = 'MCP09';
6
- const RECOMMENDATION =
7
- 'Maintain an inventory of all MCP servers. Implement server registration and approval processes. Monitor for unauthorized deployments.';
8
-
9
- const SHADOW_SERVER_PATTERNS = [
10
- /(?:unauthorized|unmanaged|unapproved|unofficial|unofficial)\s+(?:server|service|instance|deployment)/i,
11
- /(?:shadow|rogue|hidden|concealed|undocumented)\s+(?:server|service|instance|deployment)/i,
12
- /(?:bypass|circumvent|avoid)\s+(?:approval|review|governance|management|control)/i,
13
- /(?:unregistered|unlisted|unmonitored)\s+(?:server|service|instance|deployment)/i,
14
- ];
15
-
16
- function scanText(text) {
17
- if (!text) {
18
- return null;
19
- }
20
- const matches = [];
21
- for (const pattern of SHADOW_SERVER_PATTERNS) {
22
- const match = text.match(pattern);
23
- if (match) {
24
- matches.push(match[0]);
25
- }
26
- }
27
- return matches.length > 0 ? matches : null;
28
- }
29
-
30
- function buildReason(entity, matches) {
31
- return `Potential shadow MCP server indicators in ${entity}: ${matches.join(', ')}`;
32
- }
33
-
34
- export function scanMCP09ShadowServers(mcpData = {}) {
35
- const results = {
36
- toolFindings: [],
37
- resourceFindings: [],
38
- promptFindings: [],
39
- notablePatterns: [],
40
- recommendations: [RECOMMENDATION],
41
- };
42
-
43
- for (const tool of mcpData.tools || []) {
44
- const matches = scanText(toolToText(tool));
45
- if (matches) {
46
- results.toolFindings.push({
47
- issueType: 'Shadow Server',
48
- name: tool?.name || 'tool',
49
- severity: 'high',
50
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
51
- tags: ['shadow-server', 'unauthorized'],
52
- mcpCategory: OWASP_ID,
53
- safeUseNotes:
54
- 'Verify server registration and approval status. Ensure all servers are properly managed and monitored.',
55
- });
56
- }
57
- }
58
-
59
- for (const resource of mcpData.resources || []) {
60
- const matches = scanText(resourceToText(resource));
61
- if (matches) {
62
- results.resourceFindings.push({
63
- issueType: 'Shadow Server',
64
- uri: resource?.uri || resource?.name || 'resource',
65
- severity: 'high',
66
- reasons: [
67
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
68
- ],
69
- tags: ['shadow-server', 'unauthorized'],
70
- mcpCategory: OWASP_ID,
71
- });
72
- }
73
- }
74
-
75
- for (const prompt of mcpData.prompts || []) {
76
- const matches = scanText(promptToText(prompt));
77
- if (matches) {
78
- results.promptFindings.push({
79
- issueType: 'Shadow Server',
80
- name: prompt?.name || 'prompt',
81
- severity: 'medium',
82
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
83
- tags: ['shadow-server', 'unauthorized'],
84
- mcpCategory: OWASP_ID,
85
- });
86
- }
87
- }
88
-
89
- return results;
90
- }
91
-
92
- const adapter = createRuleAdapter(scanMCP09ShadowServers, RULE_ID, OWASP_ID, RECOMMENDATION);
93
-
94
- export const analyzeTool = adapter.analyzeTool;
95
- export const analyzePrompt = adapter.analyzePrompt;
96
- export const analyzeResource = adapter.analyzeResource;
97
-
98
- export function analyzePacket(packet) {
99
- const text = packetToText(packet);
100
- const matches = scanText(text);
101
- if (!matches) {
102
- return [];
103
- }
104
- return [
105
- convertPacketFinding(
106
- {
107
- issueType: 'Shadow Server',
108
- severity: 'high',
109
- title: 'Shadow Server Pattern in Traffic',
110
- description: `Potential shadow server indicators in packet: ${matches.join(', ')}`,
111
- evidence: matches[0]?.substring(0, 50) || '',
112
- },
113
- RULE_ID,
114
- OWASP_ID,
115
- RECOMMENDATION,
116
- packet
117
- ),
118
- ];
119
- }
120
-
121
- export const ruleMetadata = {
122
- id: RULE_ID,
123
- name: 'Shadow Server Detection',
124
- owasp_id: OWASP_ID,
125
- severity: 'high',
126
- description: 'Detects potential unauthorized or shadow MCP server deployments.',
127
- source: 'static',
128
- type: 'owasp-mcp',
129
- };
@@ -1,130 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'mcp10-context-injection';
5
- const OWASP_ID = 'MCP10';
6
- const RECOMMENDATION =
7
- 'Implement context isolation and filtering. Limit context sharing between tools and servers. Validate all context data.';
8
-
9
- const CONTEXT_INJECTION_PATTERNS = [
10
- /(?:over-share|overshare|excessive|too\s+much)\s+(?:context|information|data|details)/i,
11
- /(?:share|expose|reveal|leak)\s+(?:all|entire|full|complete|everything)\s+(?:context|information|data)/i,
12
- /(?:inject|insert|inject)\s+(?:context|information|data|payload)\s+(?:into|to|in)/i,
13
- /(?:context|information|data)\s+(?:injection|manipulation|tampering|poisoning)/i,
14
- /(?:unrestricted|unlimited|unfiltered)\s+(?:context|information|data)\s+(?:sharing|access|transfer)/i,
15
- ];
16
-
17
- function scanText(text) {
18
- if (!text) {
19
- return null;
20
- }
21
- const matches = [];
22
- for (const pattern of CONTEXT_INJECTION_PATTERNS) {
23
- const match = text.match(pattern);
24
- if (match) {
25
- matches.push(match[0]);
26
- }
27
- }
28
- return matches.length > 0 ? matches : null;
29
- }
30
-
31
- function buildReason(entity, matches) {
32
- return `Potential context injection/over-sharing in ${entity}: ${matches.join(', ')}`;
33
- }
34
-
35
- export function scanMCP10ContextInjection(mcpData = {}) {
36
- const results = {
37
- toolFindings: [],
38
- resourceFindings: [],
39
- promptFindings: [],
40
- notablePatterns: [],
41
- recommendations: [RECOMMENDATION],
42
- };
43
-
44
- for (const tool of mcpData.tools || []) {
45
- const matches = scanText(toolToText(tool));
46
- if (matches) {
47
- results.toolFindings.push({
48
- issueType: 'Context Injection',
49
- name: tool?.name || 'tool',
50
- severity: 'medium',
51
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
52
- tags: ['context-injection', 'over-sharing'],
53
- mcpCategory: OWASP_ID,
54
- safeUseNotes:
55
- 'Review context sharing mechanisms. Ensure only necessary context is shared between tools.',
56
- });
57
- }
58
- }
59
-
60
- for (const resource of mcpData.resources || []) {
61
- const matches = scanText(resourceToText(resource));
62
- if (matches) {
63
- results.resourceFindings.push({
64
- issueType: 'Context Injection',
65
- uri: resource?.uri || resource?.name || 'resource',
66
- severity: 'medium',
67
- reasons: [
68
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
69
- ],
70
- tags: ['context-injection', 'over-sharing'],
71
- mcpCategory: OWASP_ID,
72
- });
73
- }
74
- }
75
-
76
- for (const prompt of mcpData.prompts || []) {
77
- const matches = scanText(promptToText(prompt));
78
- if (matches) {
79
- results.promptFindings.push({
80
- issueType: 'Context Injection',
81
- name: prompt?.name || 'prompt',
82
- severity: 'high',
83
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
84
- tags: ['context-injection', 'over-sharing'],
85
- mcpCategory: OWASP_ID,
86
- });
87
- }
88
- }
89
-
90
- return results;
91
- }
92
-
93
- const adapter = createRuleAdapter(scanMCP10ContextInjection, RULE_ID, OWASP_ID, RECOMMENDATION);
94
-
95
- export const analyzeTool = adapter.analyzeTool;
96
- export const analyzePrompt = adapter.analyzePrompt;
97
- export const analyzeResource = adapter.analyzeResource;
98
-
99
- export function analyzePacket(packet) {
100
- const text = packetToText(packet);
101
- const matches = scanText(text);
102
- if (!matches) {
103
- return [];
104
- }
105
- return [
106
- convertPacketFinding(
107
- {
108
- issueType: 'Context Injection',
109
- severity: 'medium',
110
- title: 'Context Injection Pattern in Traffic',
111
- description: `Potential context injection in packet: ${matches.join(', ')}`,
112
- evidence: matches[0]?.substring(0, 50) || '',
113
- },
114
- RULE_ID,
115
- OWASP_ID,
116
- RECOMMENDATION,
117
- packet
118
- ),
119
- ];
120
- }
121
-
122
- export const ruleMetadata = {
123
- id: RULE_ID,
124
- name: 'Context Injection Detection',
125
- owasp_id: OWASP_ID,
126
- severity: 'medium',
127
- description: 'Detects context injection and over-sharing vulnerabilities.',
128
- source: 'static',
129
- type: 'owasp-mcp',
130
- };