@zivis/mcp 0.1.8 → 0.1.11

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 (346) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +19 -0
  3. package/dist/api-client.d.ts +2 -24
  4. package/dist/api-client.js +32 -52
  5. package/dist/auth/index.d.ts +1 -22
  6. package/dist/auth/index.js +17 -38
  7. package/dist/auth/jwt.d.ts +0 -16
  8. package/dist/auth/jwt.js +0 -13
  9. package/dist/auth/keychain.d.ts +6 -32
  10. package/dist/auth/keychain.js +83 -114
  11. package/dist/auth/oauth.d.ts +3 -32
  12. package/dist/auth/oauth.js +67 -61
  13. package/dist/auth/sessions.d.ts +5 -25
  14. package/dist/auth/sessions.js +20 -39
  15. package/dist/auth/token-refresh.d.ts +2 -22
  16. package/dist/auth/token-refresh.js +33 -36
  17. package/dist/cli.d.ts +1 -18
  18. package/dist/cli.js +30 -908
  19. package/dist/http-probe/capture.d.ts +51 -0
  20. package/dist/http-probe/capture.js +96 -0
  21. package/dist/http-probe/compare.d.ts +43 -0
  22. package/dist/http-probe/compare.js +117 -0
  23. package/dist/http-probe/index.d.ts +2 -0
  24. package/dist/http-probe/index.js +2 -0
  25. package/dist/index.d.ts +0 -6
  26. package/dist/index.js +0 -7
  27. package/dist/lib/inspect-cache.d.ts +10 -0
  28. package/dist/lib/inspect-cache.js +75 -0
  29. package/dist/lib/next-steps.d.ts +27 -0
  30. package/dist/lib/next-steps.js +21 -0
  31. package/dist/matcher/ast-eval.d.ts +8 -0
  32. package/dist/matcher/ast-eval.js +95 -0
  33. package/dist/matcher/finding.d.ts +55 -0
  34. package/dist/matcher/finding.js +1 -0
  35. package/dist/matcher/index.d.ts +8 -0
  36. package/dist/matcher/index.js +202 -0
  37. package/dist/matcher/inference-candidates.d.ts +26 -0
  38. package/dist/matcher/inference-candidates.js +81 -0
  39. package/dist/matcher/walker.d.ts +7 -0
  40. package/dist/matcher/walker.js +71 -0
  41. package/dist/pattern-pack/index.d.ts +125 -0
  42. package/dist/pattern-pack/index.js +189 -0
  43. package/dist/pattern-packs/zivis-public-0.2.0/capsules/agents/privilege-separation.yaml +224 -0
  44. package/dist/pattern-packs/zivis-public-0.2.0/capsules/prompting/self-consistency-no-isolation.yaml +237 -0
  45. package/dist/pattern-packs/zivis-public-0.2.0/capsules/retrieval/context-injection-no-validator.yaml +348 -0
  46. package/dist/pattern-packs/zivis-public-0.2.0/capsules/security/late-org-filter.yaml +266 -0
  47. package/dist/pattern-packs/zivis-public-0.2.0/controls/external_validator_on_facts.yaml +37 -0
  48. package/dist/pattern-packs/zivis-public-0.2.0/controls/fact_validator_present.yaml +68 -0
  49. package/dist/pattern-packs/zivis-public-0.2.0/controls/human_approval_gate.yaml +44 -0
  50. package/dist/pattern-packs/zivis-public-0.2.0/controls/langgraph_state_machine_with_per_node_tools.yaml +35 -0
  51. package/dist/pattern-packs/zivis-public-0.2.0/controls/per_sample_retrieval_diversification.yaml +38 -0
  52. package/dist/pattern-packs/zivis-public-0.2.0/controls/prisma_extension_or_middleware_attaching_org_filter.yaml +31 -0
  53. package/dist/pattern-packs/zivis-public-0.2.0/controls/row_level_security_policy.yaml +37 -0
  54. package/dist/pattern-packs/zivis-public-0.2.0/controls/source_attribution_present.yaml +58 -0
  55. package/dist/pattern-packs/zivis-public-0.2.0/manifest.json +167 -0
  56. package/dist/pattern-packs/zivis-public-0.2.0/prompts/agents/privilege-separation/identify.md +54 -0
  57. package/dist/pattern-packs/zivis-public-0.2.0/prompts/prompting/self-consistency-no-isolation/identify.md +60 -0
  58. package/dist/pattern-packs/zivis-public-0.2.0/prompts/retrieval/context-injection-no-validator/identify.md +109 -0
  59. package/dist/pattern-packs/zivis-public-0.2.0/prompts/security/late-org-filter/identify.md +78 -0
  60. package/dist/project-binding.d.ts +2 -19
  61. package/dist/project-binding.js +38 -21
  62. package/dist/prompts/audit-dependencies.d.ts +2 -0
  63. package/dist/prompts/audit-dependencies.js +47 -0
  64. package/dist/prompts/getting-started.d.ts +2 -0
  65. package/dist/prompts/getting-started.js +37 -0
  66. package/dist/prompts/index.d.ts +2 -0
  67. package/dist/prompts/index.js +6 -0
  68. package/dist/redact.d.ts +30 -0
  69. package/dist/redact.js +164 -0
  70. package/dist/resolve-application-id.d.ts +0 -4
  71. package/dist/resolve-application-id.js +0 -5
  72. package/dist/sanitize.d.ts +1 -21
  73. package/dist/sanitize.js +7 -41
  74. package/dist/scanners/index.d.ts +3 -0
  75. package/dist/scanners/index.js +2 -0
  76. package/dist/scanners/normalize.d.ts +6 -0
  77. package/dist/scanners/normalize.js +181 -0
  78. package/dist/scanners/run.d.ts +27 -0
  79. package/dist/scanners/run.js +142 -0
  80. package/dist/scanners/types.d.ts +40 -0
  81. package/dist/scanners/types.js +1 -0
  82. package/dist/server.d.ts +1 -13
  83. package/dist/server.js +142 -265
  84. package/dist/tools/artifacts.d.ts +76 -0
  85. package/dist/tools/artifacts.js +178 -0
  86. package/dist/tools/check-project.d.ts +5 -18
  87. package/dist/tools/check-project.js +122 -110
  88. package/dist/tools/check-repo-trust.d.ts +4 -19
  89. package/dist/tools/check-repo-trust.js +56 -47
  90. package/dist/tools/create-diagram.d.ts +0 -5
  91. package/dist/tools/create-diagram.js +0 -10
  92. package/dist/tools/create-document.d.ts +0 -5
  93. package/dist/tools/create-document.js +3 -9
  94. package/dist/tools/create-finding.d.ts +85 -0
  95. package/dist/tools/create-finding.js +136 -0
  96. package/dist/tools/delete-finding.d.ts +19 -0
  97. package/dist/tools/delete-finding.js +36 -0
  98. package/dist/tools/devx-run.d.ts +88 -0
  99. package/dist/tools/devx-run.js +175 -0
  100. package/dist/tools/discover-local-infra.d.ts +0 -10
  101. package/dist/tools/discover-local-infra.js +3 -73
  102. package/dist/tools/enterprise/get-org-zat.d.ts +0 -5
  103. package/dist/tools/enterprise/get-org-zat.js +0 -6
  104. package/dist/tools/explain-signal-for-diff.d.ts +34 -0
  105. package/dist/tools/explain-signal-for-diff.js +75 -0
  106. package/dist/tools/generate-diagram.d.ts +0 -6
  107. package/dist/tools/generate-diagram.js +21 -13
  108. package/dist/tools/get-application-overview.d.ts +0 -5
  109. package/dist/tools/get-application-overview.js +0 -6
  110. package/dist/tools/get-application.d.ts +0 -5
  111. package/dist/tools/get-application.js +0 -6
  112. package/dist/tools/get-diagram.d.ts +0 -5
  113. package/dist/tools/get-diagram.js +1 -11
  114. package/dist/tools/get-document.d.ts +0 -5
  115. package/dist/tools/get-document.js +0 -6
  116. package/dist/tools/get-oss-zat.d.ts +0 -5
  117. package/dist/tools/get-oss-zat.js +0 -7
  118. package/dist/tools/get-signal.d.ts +24 -0
  119. package/dist/tools/get-signal.js +75 -0
  120. package/dist/tools/get-started.d.ts +18 -0
  121. package/dist/tools/get-started.js +470 -0
  122. package/dist/tools/get-trust-keys.d.ts +0 -5
  123. package/dist/tools/get-trust-keys.js +0 -6
  124. package/dist/tools/import-openapi-endpoints.d.ts +0 -5
  125. package/dist/tools/import-openapi-endpoints.js +0 -6
  126. package/dist/tools/inspect-zat.d.ts +0 -5
  127. package/dist/tools/inspect-zat.js +0 -19
  128. package/dist/tools/inspect.d.ts +21 -0
  129. package/dist/tools/inspect.js +222 -0
  130. package/dist/tools/list-applications.d.ts +1 -6
  131. package/dist/tools/list-applications.js +0 -6
  132. package/dist/tools/list-diagrams.d.ts +0 -5
  133. package/dist/tools/list-diagrams.js +0 -6
  134. package/dist/tools/list-documents.d.ts +0 -5
  135. package/dist/tools/list-documents.js +0 -6
  136. package/dist/tools/list-endpoints.d.ts +1 -6
  137. package/dist/tools/list-endpoints.js +0 -6
  138. package/dist/tools/list-signals.d.ts +37 -0
  139. package/dist/tools/list-signals.js +83 -0
  140. package/dist/tools/manage-application.d.ts +64 -0
  141. package/dist/tools/manage-application.js +129 -0
  142. package/dist/tools/manage-diagram.d.ts +0 -5
  143. package/dist/tools/manage-diagram.js +0 -16
  144. package/dist/tools/manage-endpoint-lifecycle.d.ts +80 -0
  145. package/dist/tools/manage-endpoint-lifecycle.js +180 -0
  146. package/dist/tools/open-in-ide.d.ts +2 -14
  147. package/dist/tools/open-in-ide.js +0 -13
  148. package/dist/tools/review-change.d.ts +34 -0
  149. package/dist/tools/review-change.js +93 -0
  150. package/dist/tools/security-memory.d.ts +76 -0
  151. package/dist/tools/security-memory.js +202 -0
  152. package/dist/tools/security-review.d.ts +1 -21
  153. package/dist/tools/security-review.js +8 -108
  154. package/dist/tools/threat-get-capsule.d.ts +15 -0
  155. package/dist/tools/threat-get-capsule.js +53 -0
  156. package/dist/tools/threat-get-inference-prompt.d.ts +15 -0
  157. package/dist/tools/threat-get-inference-prompt.js +73 -0
  158. package/dist/tools/threat-list-relevant-capsules.d.ts +17 -0
  159. package/dist/tools/threat-list-relevant-capsules.js +158 -0
  160. package/dist/tools/threat-run-matcher.d.ts +17 -0
  161. package/dist/tools/threat-run-matcher.js +145 -0
  162. package/dist/tools/update-document.d.ts +0 -5
  163. package/dist/tools/update-document.js +3 -9
  164. package/dist/tools/update-endpoint.d.ts +1 -6
  165. package/dist/tools/update-endpoint.js +0 -7
  166. package/dist/tools/update-finding.d.ts +61 -0
  167. package/dist/tools/update-finding.js +80 -0
  168. package/dist/tools/update-mermaid-source.d.ts +0 -13
  169. package/dist/tools/update-mermaid-source.js +0 -14
  170. package/dist/tools/verify-trust-mark.d.ts +0 -5
  171. package/dist/tools/verify-trust-mark.js +0 -6
  172. package/dist/types.d.ts +14 -14
  173. package/dist/types.js +22 -28
  174. package/package.json +41 -15
  175. package/dist/api-client.js.map +0 -1
  176. package/dist/auth/index.js.map +0 -1
  177. package/dist/auth/jwt.js.map +0 -1
  178. package/dist/auth/keychain.js.map +0 -1
  179. package/dist/auth/oauth.js.map +0 -1
  180. package/dist/auth/sessions.js.map +0 -1
  181. package/dist/auth/token-refresh.js.map +0 -1
  182. package/dist/cli.js.map +0 -1
  183. package/dist/index.js.map +0 -1
  184. package/dist/project-binding.js.map +0 -1
  185. package/dist/resolve-application-id.js.map +0 -1
  186. package/dist/sanitize.js.map +0 -1
  187. package/dist/server.js.map +0 -1
  188. package/dist/tools/check-project.js.map +0 -1
  189. package/dist/tools/check-repo-trust.js.map +0 -1
  190. package/dist/tools/create-diagram.js.map +0 -1
  191. package/dist/tools/create-document.js.map +0 -1
  192. package/dist/tools/discover-local-infra.js.map +0 -1
  193. package/dist/tools/enterprise/capture-evidence.d.ts +0 -54
  194. package/dist/tools/enterprise/capture-evidence.js +0 -72
  195. package/dist/tools/enterprise/capture-evidence.js.map +0 -1
  196. package/dist/tools/enterprise/create-report-ticket.d.ts +0 -34
  197. package/dist/tools/enterprise/create-report-ticket.js +0 -44
  198. package/dist/tools/enterprise/create-report-ticket.js.map +0 -1
  199. package/dist/tools/enterprise/end-pentest-session.d.ts +0 -33
  200. package/dist/tools/enterprise/end-pentest-session.js +0 -42
  201. package/dist/tools/enterprise/end-pentest-session.js.map +0 -1
  202. package/dist/tools/enterprise/generate-report.d.ts +0 -55
  203. package/dist/tools/enterprise/generate-report.js +0 -111
  204. package/dist/tools/enterprise/generate-report.js.map +0 -1
  205. package/dist/tools/enterprise/get-org-zat.js.map +0 -1
  206. package/dist/tools/enterprise/get-report-status.d.ts +0 -27
  207. package/dist/tools/enterprise/get-report-status.js +0 -38
  208. package/dist/tools/enterprise/get-report-status.js.map +0 -1
  209. package/dist/tools/enterprise/get-threat-model.d.ts +0 -29
  210. package/dist/tools/enterprise/get-threat-model.js +0 -83
  211. package/dist/tools/enterprise/get-threat-model.js.map +0 -1
  212. package/dist/tools/enterprise/list-agents.d.ts +0 -42
  213. package/dist/tools/enterprise/list-agents.js +0 -95
  214. package/dist/tools/enterprise/list-agents.js.map +0 -1
  215. package/dist/tools/enterprise/list-report-issues.d.ts +0 -36
  216. package/dist/tools/enterprise/list-report-issues.js +0 -50
  217. package/dist/tools/enterprise/list-report-issues.js.map +0 -1
  218. package/dist/tools/enterprise/list-threat-models.d.ts +0 -36
  219. package/dist/tools/enterprise/list-threat-models.js +0 -82
  220. package/dist/tools/enterprise/list-threat-models.js.map +0 -1
  221. package/dist/tools/enterprise/manage-actor.d.ts +0 -58
  222. package/dist/tools/enterprise/manage-actor.js +0 -99
  223. package/dist/tools/enterprise/manage-actor.js.map +0 -1
  224. package/dist/tools/enterprise/manage-attack-scenario.d.ts +0 -70
  225. package/dist/tools/enterprise/manage-attack-scenario.js +0 -89
  226. package/dist/tools/enterprise/manage-attack-scenario.js.map +0 -1
  227. package/dist/tools/enterprise/manage-component.d.ts +0 -58
  228. package/dist/tools/enterprise/manage-component.js +0 -90
  229. package/dist/tools/enterprise/manage-component.js.map +0 -1
  230. package/dist/tools/enterprise/manage-data-asset.d.ts +0 -53
  231. package/dist/tools/enterprise/manage-data-asset.js +0 -90
  232. package/dist/tools/enterprise/manage-data-asset.js.map +0 -1
  233. package/dist/tools/enterprise/manage-data-flow.d.ts +0 -57
  234. package/dist/tools/enterprise/manage-data-flow.js +0 -98
  235. package/dist/tools/enterprise/manage-data-flow.js.map +0 -1
  236. package/dist/tools/enterprise/manage-finding.d.ts +0 -69
  237. package/dist/tools/enterprise/manage-finding.js +0 -106
  238. package/dist/tools/enterprise/manage-finding.js.map +0 -1
  239. package/dist/tools/enterprise/manage-security-control.d.ts +0 -59
  240. package/dist/tools/enterprise/manage-security-control.js +0 -96
  241. package/dist/tools/enterprise/manage-security-control.js.map +0 -1
  242. package/dist/tools/enterprise/manage-test-case.d.ts +0 -88
  243. package/dist/tools/enterprise/manage-test-case.js +0 -119
  244. package/dist/tools/enterprise/manage-test-case.js.map +0 -1
  245. package/dist/tools/enterprise/promote-finding-to-issue.d.ts +0 -36
  246. package/dist/tools/enterprise/promote-finding-to-issue.js +0 -65
  247. package/dist/tools/enterprise/promote-finding-to-issue.js.map +0 -1
  248. package/dist/tools/enterprise/publish-report-version.d.ts +0 -34
  249. package/dist/tools/enterprise/publish-report-version.js +0 -75
  250. package/dist/tools/enterprise/publish-report-version.js.map +0 -1
  251. package/dist/tools/enterprise/publish-test-to-library.d.ts +0 -31
  252. package/dist/tools/enterprise/publish-test-to-library.js +0 -40
  253. package/dist/tools/enterprise/publish-test-to-library.js.map +0 -1
  254. package/dist/tools/enterprise/record-test-result.d.ts +0 -67
  255. package/dist/tools/enterprise/record-test-result.js +0 -75
  256. package/dist/tools/enterprise/record-test-result.js.map +0 -1
  257. package/dist/tools/enterprise/start-pentest-session.d.ts +0 -35
  258. package/dist/tools/enterprise/start-pentest-session.js +0 -50
  259. package/dist/tools/enterprise/start-pentest-session.js.map +0 -1
  260. package/dist/tools/enterprise/sync-report-section.d.ts +0 -41
  261. package/dist/tools/enterprise/sync-report-section.js +0 -79
  262. package/dist/tools/enterprise/sync-report-section.js.map +0 -1
  263. package/dist/tools/enterprise/update-report-issue.d.ts +0 -55
  264. package/dist/tools/enterprise/update-report-issue.js +0 -69
  265. package/dist/tools/enterprise/update-report-issue.js.map +0 -1
  266. package/dist/tools/generate-diagram.js.map +0 -1
  267. package/dist/tools/get-agent-test-results.d.ts +0 -41
  268. package/dist/tools/get-agent-test-results.js +0 -86
  269. package/dist/tools/get-agent-test-results.js.map +0 -1
  270. package/dist/tools/get-application-overview.js.map +0 -1
  271. package/dist/tools/get-application.js.map +0 -1
  272. package/dist/tools/get-artifact-content.d.ts +0 -29
  273. package/dist/tools/get-artifact-content.js +0 -86
  274. package/dist/tools/get-artifact-content.js.map +0 -1
  275. package/dist/tools/get-diagram.js.map +0 -1
  276. package/dist/tools/get-document.js.map +0 -1
  277. package/dist/tools/get-finding-details.d.ts +0 -28
  278. package/dist/tools/get-finding-details.js +0 -43
  279. package/dist/tools/get-finding-details.js.map +0 -1
  280. package/dist/tools/get-findings.d.ts +0 -57
  281. package/dist/tools/get-findings.js +0 -103
  282. package/dist/tools/get-findings.js.map +0 -1
  283. package/dist/tools/get-oss-zat.js.map +0 -1
  284. package/dist/tools/get-recon-scan.d.ts +0 -27
  285. package/dist/tools/get-recon-scan.js +0 -46
  286. package/dist/tools/get-recon-scan.js.map +0 -1
  287. package/dist/tools/get-scan-output.d.ts +0 -27
  288. package/dist/tools/get-scan-output.js +0 -64
  289. package/dist/tools/get-scan-output.js.map +0 -1
  290. package/dist/tools/get-scenario-details.d.ts +0 -27
  291. package/dist/tools/get-scenario-details.js +0 -46
  292. package/dist/tools/get-scenario-details.js.map +0 -1
  293. package/dist/tools/get-test-case-results.d.ts +0 -37
  294. package/dist/tools/get-test-case-results.js +0 -66
  295. package/dist/tools/get-test-case-results.js.map +0 -1
  296. package/dist/tools/get-test-details.d.ts +0 -29
  297. package/dist/tools/get-test-details.js +0 -49
  298. package/dist/tools/get-test-details.js.map +0 -1
  299. package/dist/tools/get-trust-keys.js.map +0 -1
  300. package/dist/tools/import-openapi-endpoints.js.map +0 -1
  301. package/dist/tools/inspect-zat.js.map +0 -1
  302. package/dist/tools/list-agent-test-cases.d.ts +0 -41
  303. package/dist/tools/list-agent-test-cases.js +0 -73
  304. package/dist/tools/list-agent-test-cases.js.map +0 -1
  305. package/dist/tools/list-applications.js.map +0 -1
  306. package/dist/tools/list-diagrams.js.map +0 -1
  307. package/dist/tools/list-documents.js.map +0 -1
  308. package/dist/tools/list-endpoints.js.map +0 -1
  309. package/dist/tools/list-recon-scans.d.ts +0 -36
  310. package/dist/tools/list-recon-scans.js +0 -74
  311. package/dist/tools/list-recon-scans.js.map +0 -1
  312. package/dist/tools/list-scan-artifacts.d.ts +0 -41
  313. package/dist/tools/list-scan-artifacts.js +0 -63
  314. package/dist/tools/list-scan-artifacts.js.map +0 -1
  315. package/dist/tools/list-scans.d.ts +0 -44
  316. package/dist/tools/list-scans.js +0 -91
  317. package/dist/tools/list-scans.js.map +0 -1
  318. package/dist/tools/list-test-library.d.ts +0 -44
  319. package/dist/tools/list-test-library.js +0 -83
  320. package/dist/tools/list-test-library.js.map +0 -1
  321. package/dist/tools/list-test-scenarios.d.ts +0 -31
  322. package/dist/tools/list-test-scenarios.js +0 -66
  323. package/dist/tools/list-test-scenarios.js.map +0 -1
  324. package/dist/tools/local-scan.d.ts +0 -40
  325. package/dist/tools/local-scan.js +0 -261
  326. package/dist/tools/local-scan.js.map +0 -1
  327. package/dist/tools/manage-diagram.js.map +0 -1
  328. package/dist/tools/open-in-ide.js.map +0 -1
  329. package/dist/tools/run-test-scenario.d.ts +0 -37
  330. package/dist/tools/run-test-scenario.js +0 -70
  331. package/dist/tools/run-test-scenario.js.map +0 -1
  332. package/dist/tools/scan-pr.d.ts +0 -27
  333. package/dist/tools/scan-pr.js +0 -51
  334. package/dist/tools/scan-pr.js.map +0 -1
  335. package/dist/tools/security-review.js.map +0 -1
  336. package/dist/tools/setup-red-team-target.d.ts +0 -79
  337. package/dist/tools/setup-red-team-target.js +0 -430
  338. package/dist/tools/setup-red-team-target.js.map +0 -1
  339. package/dist/tools/triage-finding.d.ts +0 -47
  340. package/dist/tools/triage-finding.js +0 -116
  341. package/dist/tools/triage-finding.js.map +0 -1
  342. package/dist/tools/update-document.js.map +0 -1
  343. package/dist/tools/update-endpoint.js.map +0 -1
  344. package/dist/tools/update-mermaid-source.js.map +0 -1
  345. package/dist/tools/verify-trust-mark.js.map +0 -1
  346. package/dist/types.js.map +0 -1
package/dist/sanitize.js CHANGED
@@ -1,37 +1,18 @@
1
- /**
2
- * Response Sanitization — Prompt Injection Defense
3
- *
4
- * Sanitizes API response data before returning it to the AI assistant.
5
- * Finding content (titles, descriptions, code snippets, remediation text)
6
- * is untrusted data from automated scanners and external vulnerability
7
- * databases. This layer strips common injection patterns.
8
- *
9
- * Defense layers:
10
- * 1. Strip non-printable / control characters
11
- * 2. Truncate field lengths
12
- * 3. Strip common LLM prompt injection patterns
13
- * 4. Encode suspicious formatting
14
- */
15
- // Maximum field lengths (characters)
16
1
  const MAX_LENGTHS = {
17
2
  title: 500,
18
3
  description: 2000,
19
4
  codeSnippet: 500,
20
5
  code_snippet: 500,
21
6
  remediation: 1000,
22
- // Scan & test case result fields
23
7
  attackPayload: 500,
24
8
  targetResponse: 500,
25
9
  analysisNarrative: 1000,
26
10
  remediationGuidance: 1000,
27
11
  failureRationale: 1000,
28
- // Scan output fields (allow longer for narrative content)
29
12
  reconMarkdown: 50000,
30
13
  attackSurfaceBrief: 5000,
31
14
  };
32
- // Patterns that look like LLM prompt injection attempts
33
15
  const INJECTION_PATTERNS = [
34
- // Common LLM instruction delimiters
35
16
  /\[INST\]/gi,
36
17
  /\[\/INST\]/gi,
37
18
  /<\|system\|>/gi,
@@ -40,16 +21,13 @@ const INJECTION_PATTERNS = [
40
21
  /<\|im_start\|>/gi,
41
22
  /<\|im_end\|>/gi,
42
23
  /<\|endoftext\|>/gi,
43
- // Role injection attempts
44
24
  /^Human:/gim,
45
25
  /^Assistant:/gim,
46
26
  /^System:/gim,
47
- // XML-like tags that mimic prompt formatting
48
27
  /<system>/gi,
49
28
  /<\/system>/gi,
50
29
  /<instruction>/gi,
51
30
  /<\/instruction>/gi,
52
- // Common injection prefixes
53
31
  /ignore (?:all )?previous instructions/gi,
54
32
  /disregard (?:all )?(?:previous |above )?instructions/gi,
55
33
  /you are now/gi,
@@ -57,17 +35,16 @@ const INJECTION_PATTERNS = [
57
35
  /override:/gi,
58
36
  /IMPORTANT: from now on/gi,
59
37
  ];
60
- /**
61
- * Strip non-printable and control characters, preserving newlines and tabs
62
- */
63
38
  function stripControlChars(text) {
64
- // Allow printable ASCII, newlines, tabs, and common Unicode
65
- // Strip C0 controls except \t \n \r, and C1 controls
66
39
  return text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, "");
67
40
  }
68
- /**
69
- * Strip known LLM prompt injection patterns
70
- */
41
+ const INVISIBLE_UNICODE = /[\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g;
42
+ export function sanitizeInboundText(value, maxLength) {
43
+ if (value === undefined || value === null)
44
+ return value;
45
+ const cleaned = stripControlChars(value).replace(INVISIBLE_UNICODE, "");
46
+ return truncate(cleaned, maxLength);
47
+ }
71
48
  function stripInjectionPatterns(text) {
72
49
  let result = text;
73
50
  for (const pattern of INJECTION_PATTERNS) {
@@ -75,17 +52,11 @@ function stripInjectionPatterns(text) {
75
52
  }
76
53
  return result;
77
54
  }
78
- /**
79
- * Truncate a string to max length with ellipsis
80
- */
81
55
  function truncate(text, maxLength) {
82
56
  if (text.length <= maxLength)
83
57
  return text;
84
58
  return text.slice(0, maxLength - 3) + "...";
85
59
  }
86
- /**
87
- * Sanitize a single string field
88
- */
89
60
  export function sanitizeField(value, fieldName) {
90
61
  let result = stripControlChars(value);
91
62
  result = stripInjectionPatterns(result);
@@ -95,10 +66,6 @@ export function sanitizeField(value, fieldName) {
95
66
  }
96
67
  return result;
97
68
  }
98
- /**
99
- * Recursively sanitize all string fields in an object.
100
- * Handles nested objects and arrays.
101
- */
102
69
  export function sanitizeResponse(data) {
103
70
  if (data === null || data === undefined)
104
71
  return data;
@@ -122,4 +89,3 @@ export function sanitizeResponse(data) {
122
89
  }
123
90
  return data;
124
91
  }
125
- //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1,3 @@
1
+ export type { ScannerId, LeadSeverity, LeadLocation, NormalizedLead, ScannerRunResult, LocalScanReport, } from "./types.js";
2
+ export { normalizeScannerOutput, normalizeGitleaks, normalizeTrivy, normalizeSemgrep, normalizeOsvScanner, } from "./normalize.js";
3
+ export { SUPPORTED_SCANNERS, SCANNER_BINARIES, scannerCommand, runOneScanner, runLocalScanners, aggregate, defaultExecEnv, type ScannerCommand, type ScannerExecEnv, type RunLocalScannersOptions, } from "./run.js";
@@ -0,0 +1,2 @@
1
+ export { normalizeScannerOutput, normalizeGitleaks, normalizeTrivy, normalizeSemgrep, normalizeOsvScanner, } from "./normalize.js";
2
+ export { SUPPORTED_SCANNERS, SCANNER_BINARIES, scannerCommand, runOneScanner, runLocalScanners, aggregate, defaultExecEnv, } from "./run.js";
@@ -0,0 +1,6 @@
1
+ import type { NormalizedLead, ScannerId } from "./types.js";
2
+ export declare function normalizeGitleaks(parsed: unknown): NormalizedLead[];
3
+ export declare function normalizeTrivy(parsed: unknown): NormalizedLead[];
4
+ export declare function normalizeSemgrep(parsed: unknown): NormalizedLead[];
5
+ export declare function normalizeOsvScanner(parsed: unknown): NormalizedLead[];
6
+ export declare function normalizeScannerOutput(source: ScannerId, parsed: unknown): NormalizedLead[];
@@ -0,0 +1,181 @@
1
+ import { redactString } from "../redact.js";
2
+ function redact(text) {
3
+ if (text === undefined || text === null || text === "")
4
+ return undefined;
5
+ return redactString(String(text)).text;
6
+ }
7
+ function normalizeSeverity(raw) {
8
+ const s = String(raw ?? "").toLowerCase();
9
+ if (s.startsWith("crit"))
10
+ return "critical";
11
+ if (s === "high" || s === "error")
12
+ return "high";
13
+ if (s === "medium" || s === "moderate" || s === "warning" || s === "warn")
14
+ return "medium";
15
+ if (s === "low")
16
+ return "low";
17
+ if (s === "info" || s === "informational" || s === "unknown" || s === "none" || s === "") {
18
+ return s === "" || s === "unknown" || s === "none" ? "unknown" : "info";
19
+ }
20
+ return "unknown";
21
+ }
22
+ function asArray(v) {
23
+ return Array.isArray(v) ? v : [];
24
+ }
25
+ function lead(base) {
26
+ return { lane: "lead", ...base };
27
+ }
28
+ export function normalizeGitleaks(parsed) {
29
+ const findings = asArray(parsed);
30
+ return findings.map((f) => {
31
+ const tags = Array.isArray(f.Tags) ? f.Tags : [];
32
+ const sevTag = tags.find((t) => ["critical", "high", "medium", "low"].includes(String(t).toLowerCase()));
33
+ return lead({
34
+ source: "gitleaks",
35
+ rule_id: f.RuleID ?? "gitleaks-secret",
36
+ title: f.Description ?? f.RuleID ?? "Potential secret",
37
+ severity: sevTag ? normalizeSeverity(sevTag) : "high",
38
+ location: { file: f.File, start_line: f.StartLine, end_line: f.EndLine },
39
+ excerpt: redact(f.Match),
40
+ metadata: tags.length ? { tags } : undefined,
41
+ });
42
+ });
43
+ }
44
+ export function normalizeTrivy(parsed) {
45
+ const results = asArray(parsed?.Results);
46
+ const out = [];
47
+ for (const r of results) {
48
+ for (const v of asArray(r.Vulnerabilities)) {
49
+ out.push(lead({
50
+ source: "trivy",
51
+ rule_id: v.VulnerabilityID ?? "trivy-vuln",
52
+ title: v.Title ?? `${v.PkgName ?? "dependency"} ${v.VulnerabilityID ?? ""}`.trim(),
53
+ severity: normalizeSeverity(v.Severity),
54
+ location: { file: r.Target },
55
+ package: v.PkgName,
56
+ cwe: Array.isArray(v.CweIDs) && v.CweIDs.length ? v.CweIDs : undefined,
57
+ references: dedupeRefs(v.PrimaryURL, v.References),
58
+ metadata: {
59
+ installed_version: v.InstalledVersion,
60
+ fixed_version: v.FixedVersion,
61
+ },
62
+ }));
63
+ }
64
+ for (const s of asArray(r.Secrets)) {
65
+ out.push(lead({
66
+ source: "trivy",
67
+ rule_id: s.RuleID ?? "trivy-secret",
68
+ title: s.Title ?? "Potential secret",
69
+ severity: normalizeSeverity(s.Severity ?? "high"),
70
+ location: { file: r.Target, start_line: s.StartLine, end_line: s.EndLine },
71
+ excerpt: redact(s.Match),
72
+ }));
73
+ }
74
+ for (const m of asArray(r.Misconfigurations)) {
75
+ out.push(lead({
76
+ source: "trivy",
77
+ rule_id: m.ID ?? "trivy-misconfig",
78
+ title: m.Title ?? m.ID ?? "Misconfiguration",
79
+ severity: normalizeSeverity(m.Severity),
80
+ location: { file: r.Target },
81
+ references: dedupeRefs(m.PrimaryURL, m.References),
82
+ }));
83
+ }
84
+ }
85
+ return out;
86
+ }
87
+ export function normalizeSemgrep(parsed) {
88
+ const results = asArray(parsed?.results);
89
+ return results.map((r) => {
90
+ const meta = r.extra?.metadata ?? {};
91
+ return lead({
92
+ source: "semgrep",
93
+ rule_id: r.check_id ?? "semgrep-rule",
94
+ title: r.extra?.message ?? r.check_id ?? "Semgrep match",
95
+ severity: normalizeSeverity(r.extra?.severity),
96
+ location: { file: r.path, start_line: r.start?.line, end_line: r.end?.line },
97
+ cwe: toStringArray(meta.cwe),
98
+ owasp: toStringArray(meta.owasp),
99
+ references: Array.isArray(meta.references) ? meta.references : undefined,
100
+ excerpt: redact(r.extra?.lines),
101
+ });
102
+ });
103
+ }
104
+ export function normalizeOsvScanner(parsed) {
105
+ const results = asArray(parsed?.results);
106
+ const out = [];
107
+ for (const src of results) {
108
+ const file = src.source?.path;
109
+ for (const pkg of asArray(src.packages)) {
110
+ const pkgName = pkg.package?.name;
111
+ const groupSeverity = new Map();
112
+ for (const g of asArray(pkg.groups)) {
113
+ for (const id of asArray(g.ids)) {
114
+ if (g.max_severity)
115
+ groupSeverity.set(id, g.max_severity);
116
+ }
117
+ }
118
+ for (const v of asArray(pkg.vulnerabilities)) {
119
+ out.push(lead({
120
+ source: "osv-scanner",
121
+ rule_id: v.id ?? "osv-vuln",
122
+ title: v.summary ?? `${pkgName ?? "dependency"} ${v.id ?? ""}`.trim(),
123
+ severity: cvssScoreToSeverity(groupSeverity.get(v.id ?? "")),
124
+ location: { file },
125
+ package: pkgName,
126
+ references: asArray(v.references)
127
+ .map((r) => r.url)
128
+ .filter((u) => typeof u === "string"),
129
+ metadata: { version: pkg.package?.version, ecosystem: pkg.package?.ecosystem },
130
+ }));
131
+ }
132
+ }
133
+ }
134
+ return out;
135
+ }
136
+ function toStringArray(v) {
137
+ if (v === undefined || v === null)
138
+ return undefined;
139
+ const arr = Array.isArray(v) ? v : [v];
140
+ const out = arr.map((x) => String(x)).filter(Boolean);
141
+ return out.length ? out : undefined;
142
+ }
143
+ function dedupeRefs(primary, refs) {
144
+ const set = new Set();
145
+ if (primary)
146
+ set.add(primary);
147
+ for (const r of Array.isArray(refs) ? refs : [])
148
+ if (r)
149
+ set.add(r);
150
+ return set.size ? [...set] : undefined;
151
+ }
152
+ function cvssScoreToSeverity(score) {
153
+ if (!score)
154
+ return "unknown";
155
+ const n = Number.parseFloat(score);
156
+ if (Number.isNaN(n))
157
+ return "unknown";
158
+ if (n >= 9.0)
159
+ return "critical";
160
+ if (n >= 7.0)
161
+ return "high";
162
+ if (n >= 4.0)
163
+ return "medium";
164
+ if (n > 0)
165
+ return "low";
166
+ return "unknown";
167
+ }
168
+ export function normalizeScannerOutput(source, parsed) {
169
+ switch (source) {
170
+ case "gitleaks":
171
+ return normalizeGitleaks(parsed);
172
+ case "trivy":
173
+ return normalizeTrivy(parsed);
174
+ case "semgrep":
175
+ return normalizeSemgrep(parsed);
176
+ case "osv-scanner":
177
+ return normalizeOsvScanner(parsed);
178
+ default:
179
+ return [];
180
+ }
181
+ }
@@ -0,0 +1,27 @@
1
+ import type { LocalScanReport, ScannerId, ScannerRunResult } from "./types.js";
2
+ export declare const SUPPORTED_SCANNERS: readonly ScannerId[];
3
+ export declare const SCANNER_BINARIES: Record<ScannerId, string>;
4
+ export interface ScannerCommand {
5
+ bin: string;
6
+ args: string[];
7
+ }
8
+ export declare function scannerCommand(source: ScannerId, dir: string, outPath: string): ScannerCommand;
9
+ export interface ScannerExecEnv {
10
+ isAvailable(bin: string): Promise<boolean>;
11
+ execute(cmd: ScannerCommand, opts: {
12
+ timeoutMs: number;
13
+ }): Promise<{
14
+ reportText: string | null;
15
+ error?: string;
16
+ }>;
17
+ }
18
+ export declare const defaultExecEnv: ScannerExecEnv;
19
+ export interface RunLocalScannersOptions {
20
+ sources?: ScannerId[];
21
+ timeoutMs?: number;
22
+ env?: ScannerExecEnv;
23
+ tmpDir?: string;
24
+ }
25
+ export declare function runOneScanner(source: ScannerId, dir: string, opts?: RunLocalScannersOptions): Promise<ScannerRunResult>;
26
+ export declare function runLocalScanners(dir: string, opts?: RunLocalScannersOptions): Promise<LocalScanReport>;
27
+ export declare function aggregate(results: ScannerRunResult[]): LocalScanReport;
@@ -0,0 +1,142 @@
1
+ import * as os from "node:os";
2
+ import * as path from "node:path";
3
+ import * as fs from "node:fs/promises";
4
+ import * as crypto from "node:crypto";
5
+ import { execFile } from "node:child_process";
6
+ import { normalizeScannerOutput } from "./normalize.js";
7
+ export const SUPPORTED_SCANNERS = ["gitleaks", "trivy", "semgrep", "osv-scanner"];
8
+ export const SCANNER_BINARIES = {
9
+ gitleaks: "gitleaks",
10
+ trivy: "trivy",
11
+ semgrep: "semgrep",
12
+ "osv-scanner": "osv-scanner",
13
+ };
14
+ export function scannerCommand(source, dir, outPath) {
15
+ switch (source) {
16
+ case "gitleaks":
17
+ return {
18
+ bin: "gitleaks",
19
+ args: ["detect", "--source", dir, "--no-banner", "--report-format", "json", "--report-path", outPath, "--exit-code", "0"],
20
+ };
21
+ case "trivy":
22
+ return {
23
+ bin: "trivy",
24
+ args: ["fs", "--quiet", "--format", "json", "--output", outPath, "--scanners", "vuln,secret,misconfig", dir],
25
+ };
26
+ case "semgrep":
27
+ return {
28
+ bin: "semgrep",
29
+ args: ["scan", "--json", "--output", outPath, "--quiet", "--config", process.env.ZIVIS_SEMGREP_CONFIG || "auto", dir],
30
+ };
31
+ case "osv-scanner":
32
+ return {
33
+ bin: "osv-scanner",
34
+ args: ["--format", "json", "--output", outPath, "--recursive", dir],
35
+ };
36
+ default:
37
+ throw new Error(`unknown scanner: ${source}`);
38
+ }
39
+ }
40
+ const execFileAsync = (bin, args, timeoutMs) => new Promise((resolve) => {
41
+ execFile(bin, args, { timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024 }, (err) => {
42
+ const code = err && typeof err.code === "number" ? (err.code) : err ? 1 : 0;
43
+ resolve({ code, stderr: err ? String(err.message ?? "") : "" });
44
+ });
45
+ });
46
+ export const defaultExecEnv = {
47
+ async isAvailable(bin) {
48
+ return new Promise((resolve) => {
49
+ execFile(process.platform === "win32" ? "where" : "command", process.platform === "win32" ? [bin] : ["-v", bin], { shell: true, timeout: 5000 }, (err) => {
50
+ resolve(!err);
51
+ });
52
+ });
53
+ },
54
+ async execute(cmd, opts) {
55
+ const outIdx = cmd.args.findIndex((a) => a === "--output" || a === "--report-path");
56
+ const outPath = outIdx >= 0 ? cmd.args[outIdx + 1] : undefined;
57
+ if (!outPath)
58
+ return { reportText: null, error: "no output path in command" };
59
+ try {
60
+ await execFileAsync(cmd.bin, cmd.args, opts.timeoutMs);
61
+ const text = await fs.readFile(outPath, "utf8").catch(() => null);
62
+ return { reportText: text };
63
+ }
64
+ catch (err) {
65
+ return { reportText: null, error: err instanceof Error ? err.message : String(err) };
66
+ }
67
+ finally {
68
+ if (outPath)
69
+ await fs.rm(outPath, { force: true }).catch(() => { });
70
+ }
71
+ },
72
+ };
73
+ export async function runOneScanner(source, dir, opts = {}) {
74
+ const env = opts.env ?? defaultExecEnv;
75
+ const bin = SCANNER_BINARIES[source];
76
+ const started = Date.now();
77
+ if (!(await env.isAvailable(bin))) {
78
+ return { source, status: "not_installed", leads: [] };
79
+ }
80
+ const tmpDir = opts.tmpDir ?? os.tmpdir();
81
+ const outPath = path.join(tmpDir, `zivis-${source}-${crypto.randomUUID()}.json`);
82
+ const cmd = scannerCommand(source, dir, outPath);
83
+ try {
84
+ const { reportText, error } = await env.execute(cmd, { timeoutMs: opts.timeoutMs ?? 120_000 });
85
+ if (error && reportText === null) {
86
+ return { source, status: "error", leads: [], error, duration_ms: Date.now() - started };
87
+ }
88
+ if (reportText === null || reportText.trim() === "") {
89
+ return { source, status: "ok", leads: [], duration_ms: Date.now() - started };
90
+ }
91
+ let parsed;
92
+ try {
93
+ parsed = JSON.parse(reportText);
94
+ }
95
+ catch (e) {
96
+ return { source, status: "error", leads: [], error: `unparseable ${source} JSON: ${e instanceof Error ? e.message : String(e)}`, duration_ms: Date.now() - started };
97
+ }
98
+ const leads = normalizeScannerOutput(source, parsed);
99
+ return { source, status: "ok", leads, duration_ms: Date.now() - started };
100
+ }
101
+ catch (err) {
102
+ return { source, status: "error", leads: [], error: err instanceof Error ? err.message : String(err), duration_ms: Date.now() - started };
103
+ }
104
+ }
105
+ export async function runLocalScanners(dir, opts = {}) {
106
+ const sources = opts.sources ?? [...SUPPORTED_SCANNERS];
107
+ const results = [];
108
+ for (const source of sources) {
109
+ results.push(await runOneScanner(source, dir, opts));
110
+ }
111
+ return aggregate(results);
112
+ }
113
+ export function aggregate(results) {
114
+ const leads = [];
115
+ const bySource = {};
116
+ const bySeverity = {};
117
+ const scannersRun = [];
118
+ const scannersMissing = [];
119
+ for (const r of results) {
120
+ if (r.status === "not_installed")
121
+ scannersMissing.push(r.source);
122
+ else
123
+ scannersRun.push(r.source);
124
+ for (const l of r.leads) {
125
+ leads.push(l);
126
+ bySource[l.source] = (bySource[l.source] ?? 0) + 1;
127
+ bySeverity[l.severity] = (bySeverity[l.severity] ?? 0) + 1;
128
+ }
129
+ }
130
+ return {
131
+ ran_at: new Date().toISOString(),
132
+ results,
133
+ leads,
134
+ summary: {
135
+ total_leads: leads.length,
136
+ by_source: bySource,
137
+ by_severity: bySeverity,
138
+ scanners_run: scannersRun,
139
+ scanners_missing: scannersMissing,
140
+ },
141
+ };
142
+ }
@@ -0,0 +1,40 @@
1
+ export type ScannerId = "gitleaks" | "trivy" | "semgrep" | "osv-scanner";
2
+ export type LeadSeverity = "critical" | "high" | "medium" | "low" | "info" | "unknown";
3
+ export interface LeadLocation {
4
+ file?: string;
5
+ start_line?: number;
6
+ end_line?: number;
7
+ }
8
+ export interface NormalizedLead {
9
+ lane: "lead";
10
+ source: ScannerId;
11
+ rule_id: string;
12
+ title: string;
13
+ severity: LeadSeverity;
14
+ location?: LeadLocation;
15
+ package?: string;
16
+ cwe?: string[];
17
+ owasp?: string[];
18
+ references?: string[];
19
+ excerpt?: string;
20
+ metadata?: Record<string, unknown>;
21
+ }
22
+ export interface ScannerRunResult {
23
+ source: ScannerId;
24
+ status: "ok" | "not_installed" | "error";
25
+ leads: NormalizedLead[];
26
+ error?: string;
27
+ duration_ms?: number;
28
+ }
29
+ export interface LocalScanReport {
30
+ ran_at: string;
31
+ results: ScannerRunResult[];
32
+ leads: NormalizedLead[];
33
+ summary: {
34
+ total_leads: number;
35
+ by_source: Record<string, number>;
36
+ by_severity: Record<string, number>;
37
+ scanners_run: ScannerId[];
38
+ scanners_missing: ScannerId[];
39
+ };
40
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/server.d.ts CHANGED
@@ -1,14 +1,2 @@
1
- /**
2
- * MCP Server
3
- *
4
- * Sets up the Model Context Protocol server using the official SDK
5
- * with stdio transport. Registers all ZIVIS security tools.
6
- *
7
- * IMPORTANT: This server communicates over stdout (JSON-RPC 2.0).
8
- * Never use console.log() — use console.error() for all logging.
9
- */
10
1
  import type { ZivisConfig } from "./types.js";
11
- /**
12
- * Create and start the MCP server with all tools registered
13
- */
14
- export declare function startServer(config?: ZivisConfig): Promise<void>;
2
+ export declare function startServer(incoming?: ZivisConfig): Promise<void>;