@zivis/mcp 0.1.0-alpha.1

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 (253) hide show
  1. package/dist/api-client.d.ts +42 -0
  2. package/dist/api-client.js +145 -0
  3. package/dist/api-client.js.map +1 -0
  4. package/dist/auth/index.d.ts +29 -0
  5. package/dist/auth/index.js +73 -0
  6. package/dist/auth/index.js.map +1 -0
  7. package/dist/auth/jwt.d.ts +24 -0
  8. package/dist/auth/jwt.js +25 -0
  9. package/dist/auth/jwt.js.map +1 -0
  10. package/dist/auth/keychain.d.ts +34 -0
  11. package/dist/auth/keychain.js +272 -0
  12. package/dist/auth/keychain.js.map +1 -0
  13. package/dist/auth/oauth.d.ts +38 -0
  14. package/dist/auth/oauth.js +241 -0
  15. package/dist/auth/oauth.js.map +1 -0
  16. package/dist/auth/sessions.d.ts +28 -0
  17. package/dist/auth/sessions.js +69 -0
  18. package/dist/auth/sessions.js.map +1 -0
  19. package/dist/auth/token-refresh.d.ts +24 -0
  20. package/dist/auth/token-refresh.js +91 -0
  21. package/dist/auth/token-refresh.js.map +1 -0
  22. package/dist/cli.d.ts +23 -0
  23. package/dist/cli.js +962 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/index.d.ts +8 -0
  26. package/dist/index.js +15 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/project-binding.d.ts +25 -0
  29. package/dist/project-binding.js +67 -0
  30. package/dist/project-binding.js.map +1 -0
  31. package/dist/resolve-application-id.d.ts +12 -0
  32. package/dist/resolve-application-id.js +21 -0
  33. package/dist/resolve-application-id.js.map +1 -0
  34. package/dist/sanitize.d.ts +23 -0
  35. package/dist/sanitize.js +125 -0
  36. package/dist/sanitize.js.map +1 -0
  37. package/dist/server.d.ts +14 -0
  38. package/dist/server.js +447 -0
  39. package/dist/server.js.map +1 -0
  40. package/dist/tools/check-project.d.ts +32 -0
  41. package/dist/tools/check-project.js +180 -0
  42. package/dist/tools/check-project.js.map +1 -0
  43. package/dist/tools/check-repo-trust.d.ts +33 -0
  44. package/dist/tools/check-repo-trust.js +212 -0
  45. package/dist/tools/check-repo-trust.js.map +1 -0
  46. package/dist/tools/create-diagram.d.ts +114 -0
  47. package/dist/tools/create-diagram.js +176 -0
  48. package/dist/tools/create-diagram.js.map +1 -0
  49. package/dist/tools/create-document.d.ts +28 -0
  50. package/dist/tools/create-document.js +53 -0
  51. package/dist/tools/create-document.js.map +1 -0
  52. package/dist/tools/discover-local-infra.d.ts +24 -0
  53. package/dist/tools/discover-local-infra.js +763 -0
  54. package/dist/tools/discover-local-infra.js.map +1 -0
  55. package/dist/tools/enterprise/capture-evidence.d.ts +54 -0
  56. package/dist/tools/enterprise/capture-evidence.js +72 -0
  57. package/dist/tools/enterprise/capture-evidence.js.map +1 -0
  58. package/dist/tools/enterprise/create-report-ticket.d.ts +34 -0
  59. package/dist/tools/enterprise/create-report-ticket.js +44 -0
  60. package/dist/tools/enterprise/create-report-ticket.js.map +1 -0
  61. package/dist/tools/enterprise/end-pentest-session.d.ts +33 -0
  62. package/dist/tools/enterprise/end-pentest-session.js +42 -0
  63. package/dist/tools/enterprise/end-pentest-session.js.map +1 -0
  64. package/dist/tools/enterprise/generate-report.d.ts +55 -0
  65. package/dist/tools/enterprise/generate-report.js +111 -0
  66. package/dist/tools/enterprise/generate-report.js.map +1 -0
  67. package/dist/tools/enterprise/get-org-zat.d.ts +27 -0
  68. package/dist/tools/enterprise/get-org-zat.js +62 -0
  69. package/dist/tools/enterprise/get-org-zat.js.map +1 -0
  70. package/dist/tools/enterprise/get-report-status.d.ts +27 -0
  71. package/dist/tools/enterprise/get-report-status.js +38 -0
  72. package/dist/tools/enterprise/get-report-status.js.map +1 -0
  73. package/dist/tools/enterprise/get-threat-model.d.ts +29 -0
  74. package/dist/tools/enterprise/get-threat-model.js +83 -0
  75. package/dist/tools/enterprise/get-threat-model.js.map +1 -0
  76. package/dist/tools/enterprise/list-agents.d.ts +42 -0
  77. package/dist/tools/enterprise/list-agents.js +95 -0
  78. package/dist/tools/enterprise/list-agents.js.map +1 -0
  79. package/dist/tools/enterprise/list-report-issues.d.ts +36 -0
  80. package/dist/tools/enterprise/list-report-issues.js +50 -0
  81. package/dist/tools/enterprise/list-report-issues.js.map +1 -0
  82. package/dist/tools/enterprise/list-threat-models.d.ts +36 -0
  83. package/dist/tools/enterprise/list-threat-models.js +82 -0
  84. package/dist/tools/enterprise/list-threat-models.js.map +1 -0
  85. package/dist/tools/enterprise/manage-actor.d.ts +58 -0
  86. package/dist/tools/enterprise/manage-actor.js +99 -0
  87. package/dist/tools/enterprise/manage-actor.js.map +1 -0
  88. package/dist/tools/enterprise/manage-attack-scenario.d.ts +70 -0
  89. package/dist/tools/enterprise/manage-attack-scenario.js +89 -0
  90. package/dist/tools/enterprise/manage-attack-scenario.js.map +1 -0
  91. package/dist/tools/enterprise/manage-component.d.ts +58 -0
  92. package/dist/tools/enterprise/manage-component.js +90 -0
  93. package/dist/tools/enterprise/manage-component.js.map +1 -0
  94. package/dist/tools/enterprise/manage-data-asset.d.ts +53 -0
  95. package/dist/tools/enterprise/manage-data-asset.js +90 -0
  96. package/dist/tools/enterprise/manage-data-asset.js.map +1 -0
  97. package/dist/tools/enterprise/manage-data-flow.d.ts +57 -0
  98. package/dist/tools/enterprise/manage-data-flow.js +98 -0
  99. package/dist/tools/enterprise/manage-data-flow.js.map +1 -0
  100. package/dist/tools/enterprise/manage-finding.d.ts +69 -0
  101. package/dist/tools/enterprise/manage-finding.js +106 -0
  102. package/dist/tools/enterprise/manage-finding.js.map +1 -0
  103. package/dist/tools/enterprise/manage-security-control.d.ts +59 -0
  104. package/dist/tools/enterprise/manage-security-control.js +96 -0
  105. package/dist/tools/enterprise/manage-security-control.js.map +1 -0
  106. package/dist/tools/enterprise/manage-test-case.d.ts +88 -0
  107. package/dist/tools/enterprise/manage-test-case.js +119 -0
  108. package/dist/tools/enterprise/manage-test-case.js.map +1 -0
  109. package/dist/tools/enterprise/promote-finding-to-issue.d.ts +36 -0
  110. package/dist/tools/enterprise/promote-finding-to-issue.js +65 -0
  111. package/dist/tools/enterprise/promote-finding-to-issue.js.map +1 -0
  112. package/dist/tools/enterprise/publish-report-version.d.ts +34 -0
  113. package/dist/tools/enterprise/publish-report-version.js +75 -0
  114. package/dist/tools/enterprise/publish-report-version.js.map +1 -0
  115. package/dist/tools/enterprise/publish-test-to-library.d.ts +31 -0
  116. package/dist/tools/enterprise/publish-test-to-library.js +40 -0
  117. package/dist/tools/enterprise/publish-test-to-library.js.map +1 -0
  118. package/dist/tools/enterprise/record-test-result.d.ts +67 -0
  119. package/dist/tools/enterprise/record-test-result.js +75 -0
  120. package/dist/tools/enterprise/record-test-result.js.map +1 -0
  121. package/dist/tools/enterprise/start-pentest-session.d.ts +35 -0
  122. package/dist/tools/enterprise/start-pentest-session.js +50 -0
  123. package/dist/tools/enterprise/start-pentest-session.js.map +1 -0
  124. package/dist/tools/enterprise/sync-report-section.d.ts +41 -0
  125. package/dist/tools/enterprise/sync-report-section.js +79 -0
  126. package/dist/tools/enterprise/sync-report-section.js.map +1 -0
  127. package/dist/tools/enterprise/update-report-issue.d.ts +55 -0
  128. package/dist/tools/enterprise/update-report-issue.js +69 -0
  129. package/dist/tools/enterprise/update-report-issue.js.map +1 -0
  130. package/dist/tools/generate-diagram.d.ts +36 -0
  131. package/dist/tools/generate-diagram.js +153 -0
  132. package/dist/tools/generate-diagram.js.map +1 -0
  133. package/dist/tools/get-agent-test-results.d.ts +41 -0
  134. package/dist/tools/get-agent-test-results.js +86 -0
  135. package/dist/tools/get-agent-test-results.js.map +1 -0
  136. package/dist/tools/get-application-overview.d.ts +27 -0
  137. package/dist/tools/get-application-overview.js +143 -0
  138. package/dist/tools/get-application-overview.js.map +1 -0
  139. package/dist/tools/get-application.d.ts +27 -0
  140. package/dist/tools/get-application.js +83 -0
  141. package/dist/tools/get-application.js.map +1 -0
  142. package/dist/tools/get-artifact-content.d.ts +29 -0
  143. package/dist/tools/get-artifact-content.js +86 -0
  144. package/dist/tools/get-artifact-content.js.map +1 -0
  145. package/dist/tools/get-diagram.d.ts +27 -0
  146. package/dist/tools/get-diagram.js +109 -0
  147. package/dist/tools/get-diagram.js.map +1 -0
  148. package/dist/tools/get-document.d.ts +22 -0
  149. package/dist/tools/get-document.js +43 -0
  150. package/dist/tools/get-document.js.map +1 -0
  151. package/dist/tools/get-finding-details.d.ts +28 -0
  152. package/dist/tools/get-finding-details.js +43 -0
  153. package/dist/tools/get-finding-details.js.map +1 -0
  154. package/dist/tools/get-findings.d.ts +57 -0
  155. package/dist/tools/get-findings.js +103 -0
  156. package/dist/tools/get-findings.js.map +1 -0
  157. package/dist/tools/get-oss-zat.d.ts +27 -0
  158. package/dist/tools/get-oss-zat.js +105 -0
  159. package/dist/tools/get-oss-zat.js.map +1 -0
  160. package/dist/tools/get-recon-scan.d.ts +27 -0
  161. package/dist/tools/get-recon-scan.js +46 -0
  162. package/dist/tools/get-recon-scan.js.map +1 -0
  163. package/dist/tools/get-scan-output.d.ts +27 -0
  164. package/dist/tools/get-scan-output.js +64 -0
  165. package/dist/tools/get-scan-output.js.map +1 -0
  166. package/dist/tools/get-scenario-details.d.ts +27 -0
  167. package/dist/tools/get-scenario-details.js +46 -0
  168. package/dist/tools/get-scenario-details.js.map +1 -0
  169. package/dist/tools/get-test-case-results.d.ts +37 -0
  170. package/dist/tools/get-test-case-results.js +66 -0
  171. package/dist/tools/get-test-case-results.js.map +1 -0
  172. package/dist/tools/get-test-details.d.ts +29 -0
  173. package/dist/tools/get-test-details.js +49 -0
  174. package/dist/tools/get-test-details.js.map +1 -0
  175. package/dist/tools/get-trust-keys.d.ts +22 -0
  176. package/dist/tools/get-trust-keys.js +67 -0
  177. package/dist/tools/get-trust-keys.js.map +1 -0
  178. package/dist/tools/import-openapi-endpoints.d.ts +33 -0
  179. package/dist/tools/import-openapi-endpoints.js +93 -0
  180. package/dist/tools/import-openapi-endpoints.js.map +1 -0
  181. package/dist/tools/inspect-zat.d.ts +26 -0
  182. package/dist/tools/inspect-zat.js +247 -0
  183. package/dist/tools/inspect-zat.js.map +1 -0
  184. package/dist/tools/list-agent-test-cases.d.ts +41 -0
  185. package/dist/tools/list-agent-test-cases.js +73 -0
  186. package/dist/tools/list-agent-test-cases.js.map +1 -0
  187. package/dist/tools/list-applications.d.ts +34 -0
  188. package/dist/tools/list-applications.js +74 -0
  189. package/dist/tools/list-applications.js.map +1 -0
  190. package/dist/tools/list-diagrams.d.ts +42 -0
  191. package/dist/tools/list-diagrams.js +81 -0
  192. package/dist/tools/list-diagrams.js.map +1 -0
  193. package/dist/tools/list-documents.d.ts +24 -0
  194. package/dist/tools/list-documents.js +50 -0
  195. package/dist/tools/list-documents.js.map +1 -0
  196. package/dist/tools/list-endpoints.d.ts +47 -0
  197. package/dist/tools/list-endpoints.js +98 -0
  198. package/dist/tools/list-endpoints.js.map +1 -0
  199. package/dist/tools/list-recon-scans.d.ts +36 -0
  200. package/dist/tools/list-recon-scans.js +74 -0
  201. package/dist/tools/list-recon-scans.js.map +1 -0
  202. package/dist/tools/list-scan-artifacts.d.ts +41 -0
  203. package/dist/tools/list-scan-artifacts.js +63 -0
  204. package/dist/tools/list-scan-artifacts.js.map +1 -0
  205. package/dist/tools/list-scans.d.ts +44 -0
  206. package/dist/tools/list-scans.js +91 -0
  207. package/dist/tools/list-scans.js.map +1 -0
  208. package/dist/tools/list-test-library.d.ts +44 -0
  209. package/dist/tools/list-test-library.js +83 -0
  210. package/dist/tools/list-test-library.js.map +1 -0
  211. package/dist/tools/list-test-scenarios.d.ts +31 -0
  212. package/dist/tools/list-test-scenarios.js +66 -0
  213. package/dist/tools/list-test-scenarios.js.map +1 -0
  214. package/dist/tools/local-scan.d.ts +40 -0
  215. package/dist/tools/local-scan.js +261 -0
  216. package/dist/tools/local-scan.js.map +1 -0
  217. package/dist/tools/manage-diagram.d.ts +109 -0
  218. package/dist/tools/manage-diagram.js +316 -0
  219. package/dist/tools/manage-diagram.js.map +1 -0
  220. package/dist/tools/open-in-ide.d.ts +39 -0
  221. package/dist/tools/open-in-ide.js +61 -0
  222. package/dist/tools/open-in-ide.js.map +1 -0
  223. package/dist/tools/run-test-scenario.d.ts +37 -0
  224. package/dist/tools/run-test-scenario.js +70 -0
  225. package/dist/tools/run-test-scenario.js.map +1 -0
  226. package/dist/tools/scan-pr.d.ts +27 -0
  227. package/dist/tools/scan-pr.js +51 -0
  228. package/dist/tools/scan-pr.js.map +1 -0
  229. package/dist/tools/security-review.d.ts +65 -0
  230. package/dist/tools/security-review.js +378 -0
  231. package/dist/tools/security-review.js.map +1 -0
  232. package/dist/tools/setup-red-team-target.d.ts +79 -0
  233. package/dist/tools/setup-red-team-target.js +430 -0
  234. package/dist/tools/setup-red-team-target.js.map +1 -0
  235. package/dist/tools/triage-finding.d.ts +47 -0
  236. package/dist/tools/triage-finding.js +116 -0
  237. package/dist/tools/triage-finding.js.map +1 -0
  238. package/dist/tools/update-document.d.ts +28 -0
  239. package/dist/tools/update-document.js +63 -0
  240. package/dist/tools/update-document.js.map +1 -0
  241. package/dist/tools/update-endpoint.d.ts +65 -0
  242. package/dist/tools/update-endpoint.js +145 -0
  243. package/dist/tools/update-endpoint.js.map +1 -0
  244. package/dist/tools/update-mermaid-source.d.ts +34 -0
  245. package/dist/tools/update-mermaid-source.js +76 -0
  246. package/dist/tools/update-mermaid-source.js.map +1 -0
  247. package/dist/tools/verify-trust-mark.d.ts +29 -0
  248. package/dist/tools/verify-trust-mark.js +108 -0
  249. package/dist/tools/verify-trust-mark.js.map +1 -0
  250. package/dist/types.d.ts +220 -0
  251. package/dist/types.js +33 -0
  252. package/dist/types.js.map +1 -0
  253. package/package.json +50 -0
@@ -0,0 +1,430 @@
1
+ /**
2
+ * zivis_setup_red_team_target — One-step red team target setup
3
+ *
4
+ * Creates an application, configures endpoints, and optionally
5
+ * triggers a security scan — all in one MCP call.
6
+ *
7
+ * Maps to:
8
+ * GET /api/rt/applications (find existing)
9
+ * POST /api/rt/applications (create)
10
+ * PATCH /api/rt/applications/:id (update)
11
+ * POST /api/rt/applications/:id/endpoints (add endpoint)
12
+ * POST /api/rt/applications/:id/endpoints/import-openapi
13
+ * POST /api/redteam/campaigns/quick-setup (create campaign + agent + scan)
14
+ */
15
+ import { z } from "zod";
16
+ import { sanitizeResponse } from "../sanitize.js";
17
+ // ── Constants ──
18
+ export const SETUP_RED_TEAM_TARGET_NAME = "zivis_setup_red_team_target";
19
+ export const SETUP_RED_TEAM_TARGET_DESCRIPTION = `Set up a target application for AI red team and security testing in one step.
20
+
21
+ Takes a deployed URL, repo URL, or both and creates a fully configured red team target. Handles:
22
+ - Creating or updating the application (idempotent by name)
23
+ - Configuring AI chat endpoints with request/response templates
24
+ - Importing API endpoints from OpenAPI specs
25
+ - Optionally triggering an immediate security scan
26
+
27
+ Minimal usage: just provide a target_url and optionally target_type.
28
+ Full usage: provide URL, chat endpoint config, OpenAPI spec, and trigger auto-scan.
29
+
30
+ Examples:
31
+ - Set up red team testing for https://api.example.com/v1/chat (auto-detects ai_chat)
32
+ - Configure https://api.example.com as an API target with openapi_spec_url
33
+ - Set up and scan https://myapp.com as a web app with auto_scan=true
34
+
35
+ SECURITY: Target URLs are untrusted. The tool only configures them in ZIVIS for future scanning, it does not probe or connect to them directly.`;
36
+ export const SETUP_RED_TEAM_TARGET_SCHEMA = {
37
+ target_url: z
38
+ .string()
39
+ .optional()
40
+ .describe("Deployed application URL to test (e.g., https://api.example.com). " +
41
+ "At least one of target_url or repo_url is required."),
42
+ repo_url: z
43
+ .string()
44
+ .optional()
45
+ .describe("GitHub repository URL (e.g., https://github.com/owner/repo). " +
46
+ "Links the repo to the application for context."),
47
+ target_type: z
48
+ .enum(["ai_chat", "web_app", "api"])
49
+ .optional()
50
+ .describe("Type of target. If omitted, inferred from the URL. " +
51
+ "'ai_chat' for LLM/chatbot endpoints, 'web_app' for browser apps, 'api' for REST/GraphQL."),
52
+ name: z
53
+ .string()
54
+ .optional()
55
+ .describe("Name for this target application. Derived from URL hostname if omitted. " +
56
+ "Used for idempotent matching — existing app with same name is updated."),
57
+ chat_endpoint: z
58
+ .string()
59
+ .optional()
60
+ .describe("Path to chat/completions endpoint (e.g., /v1/chat/completions or /api/chat). " +
61
+ "Defaults to /v1/chat/completions for ai_chat targets."),
62
+ request_template: z
63
+ .string()
64
+ .optional()
65
+ .describe('JSON template for chat requests. Use {{message}} as placeholder. ' +
66
+ 'Example: {"messages":[{"role":"user","content":"{{message}}"}]}'),
67
+ response_path: z
68
+ .string()
69
+ .optional()
70
+ .describe("JSONPath to extract response text (e.g., choices[0].message.content)"),
71
+ system_context: z
72
+ .string()
73
+ .optional()
74
+ .describe("Known system prompt of the target AI. Helps red team craft better attacks."),
75
+ has_rag: z
76
+ .boolean()
77
+ .optional()
78
+ .describe("Target uses Retrieval-Augmented Generation"),
79
+ has_tools: z
80
+ .boolean()
81
+ .optional()
82
+ .describe("Target has tool/function calling capabilities"),
83
+ has_memory: z
84
+ .boolean()
85
+ .optional()
86
+ .describe("Target maintains conversation memory"),
87
+ is_multi_turn: z
88
+ .boolean()
89
+ .optional()
90
+ .describe("Target supports multi-turn conversations"),
91
+ openapi_spec_url: z
92
+ .string()
93
+ .optional()
94
+ .describe("URL to OpenAPI/Swagger spec for auto-importing endpoints " +
95
+ "(e.g., https://api.example.com/openapi.json)"),
96
+ auth_type: z
97
+ .enum(["none", "static_token"])
98
+ .optional()
99
+ .default("none")
100
+ .describe("Auth method for the target. 'none' for unauthenticated testing."),
101
+ bearer_token: z
102
+ .string()
103
+ .optional()
104
+ .describe("Bearer token when auth_type is 'static_token'"),
105
+ auto_scan: z
106
+ .boolean()
107
+ .optional()
108
+ .default(false)
109
+ .describe("Immediately queue a red team scan after setup"),
110
+ campaigns: z
111
+ .array(z.enum(["ai_red_team", "pen_test", "recon"]))
112
+ .optional()
113
+ .describe("Campaigns to run if auto_scan is true. Defaults based on target_type."),
114
+ };
115
+ // ── Helpers ──
116
+ function deriveAppName(targetUrl, repoUrl) {
117
+ if (targetUrl) {
118
+ try {
119
+ const url = new URL(targetUrl);
120
+ const hostname = url.hostname;
121
+ if (hostname.startsWith("api.")) {
122
+ return hostname.replace("api.", "") + " API";
123
+ }
124
+ return hostname;
125
+ }
126
+ catch {
127
+ return targetUrl;
128
+ }
129
+ }
130
+ if (repoUrl) {
131
+ const match = repoUrl.match(/github\.com\/([^/]+\/[^/]+)/);
132
+ return match ? match[1] : "Untitled Application";
133
+ }
134
+ return "Untitled Application";
135
+ }
136
+ function inferTargetType(targetUrl, chatEndpoint) {
137
+ if (chatEndpoint)
138
+ return "ai_chat";
139
+ if (!targetUrl)
140
+ return "web_app";
141
+ const url = targetUrl.toLowerCase();
142
+ if (url.includes("/chat") ||
143
+ url.includes("/completions") ||
144
+ url.includes("/v1/") ||
145
+ url.includes("openai") ||
146
+ url.includes("anthropic")) {
147
+ return "ai_chat";
148
+ }
149
+ if (url.includes("/api/") || url.includes("api.")) {
150
+ return "api";
151
+ }
152
+ return "web_app";
153
+ }
154
+ function defaultCampaigns(targetType) {
155
+ switch (targetType) {
156
+ case "ai_chat":
157
+ return ["ai_red_team"];
158
+ case "api":
159
+ return ["pen_test", "recon"];
160
+ case "web_app":
161
+ return ["pen_test", "recon"];
162
+ default:
163
+ return ["recon"];
164
+ }
165
+ }
166
+ // ── Handler ──
167
+ export function createSetupRedTeamTargetHandler(apiClient) {
168
+ return async (params) => {
169
+ try {
170
+ // ── Step 0: Validate ──
171
+ if (!params.target_url && !params.repo_url) {
172
+ return {
173
+ content: [
174
+ {
175
+ type: "text",
176
+ text: "Error: At least one of target_url or repo_url is required.",
177
+ },
178
+ ],
179
+ isError: true,
180
+ };
181
+ }
182
+ if (params.auth_type === "static_token" && !params.bearer_token) {
183
+ return {
184
+ content: [
185
+ {
186
+ type: "text",
187
+ text: "Error: bearer_token is required when auth_type is 'static_token'.",
188
+ },
189
+ ],
190
+ isError: true,
191
+ };
192
+ }
193
+ // Validate URLs
194
+ const baseUrl = params.target_url;
195
+ if (baseUrl) {
196
+ try {
197
+ const parsed = new URL(baseUrl);
198
+ if (!["http:", "https:"].includes(parsed.protocol)) {
199
+ return {
200
+ content: [
201
+ {
202
+ type: "text",
203
+ text: "Error: target_url must use HTTP or HTTPS protocol.",
204
+ },
205
+ ],
206
+ isError: true,
207
+ };
208
+ }
209
+ }
210
+ catch {
211
+ return {
212
+ content: [
213
+ {
214
+ type: "text",
215
+ text: `Error: Invalid target_url "${baseUrl}". Must be a valid URL (e.g., https://api.example.com).`,
216
+ },
217
+ ],
218
+ isError: true,
219
+ };
220
+ }
221
+ }
222
+ // ── Step 1: Derive defaults ──
223
+ const appName = params.name || deriveAppName(params.target_url, params.repo_url);
224
+ const targetType = params.target_type ||
225
+ inferTargetType(params.target_url, params.chat_endpoint);
226
+ const authType = params.auth_type || "none";
227
+ // ── Step 2: Find existing application ──
228
+ let application = null;
229
+ let isNew = false;
230
+ try {
231
+ const list = await apiClient.get(`/api/rt/applications?limit=100`);
232
+ application =
233
+ (list.applications || []).find((a) => a.name.toLowerCase() === appName.toLowerCase()) || null;
234
+ }
235
+ catch {
236
+ // If listing fails (e.g., no apps yet), continue to create
237
+ }
238
+ // ── Step 3: Create or Update ──
239
+ const appPayload = {
240
+ name: appName,
241
+ ...(baseUrl && { baseUrl }),
242
+ ...(baseUrl && { apiUrl: baseUrl }),
243
+ authType,
244
+ ...(params.system_context && { systemContext: params.system_context }),
245
+ ...(params.has_rag !== undefined && { hasRag: params.has_rag }),
246
+ ...(params.has_tools !== undefined && { hasTools: params.has_tools }),
247
+ ...(params.has_memory !== undefined && { hasMemory: params.has_memory }),
248
+ ...(params.is_multi_turn !== undefined && {
249
+ isMultiTurn: params.is_multi_turn,
250
+ }),
251
+ ...(params.openapi_spec_url && {
252
+ openApiSpecUrl: params.openapi_spec_url,
253
+ }),
254
+ ...(params.bearer_token && { bearerToken: params.bearer_token }),
255
+ };
256
+ // Set chat endpoint at application level for ai_chat targets
257
+ if (targetType === "ai_chat") {
258
+ const chatPath = params.chat_endpoint || "/v1/chat/completions";
259
+ appPayload.chatEndpoint = chatPath;
260
+ }
261
+ if (application) {
262
+ // Update existing
263
+ application = await apiClient.patch(`/api/rt/applications/${application.id}`, appPayload);
264
+ }
265
+ else {
266
+ // Create new — baseUrl is required for creation
267
+ if (!baseUrl) {
268
+ return {
269
+ content: [
270
+ {
271
+ type: "text",
272
+ text: "Error: target_url is required when creating a new application (no existing app found with this name).",
273
+ },
274
+ ],
275
+ isError: true,
276
+ };
277
+ }
278
+ const createResult = await apiClient.post("/api/rt/applications", appPayload);
279
+ application = createResult.application;
280
+ isNew = true;
281
+ }
282
+ if (!application || !application.id) {
283
+ return {
284
+ content: [
285
+ {
286
+ type: "text",
287
+ text: "Error: Failed to create or find application. Check API credentials and permissions.",
288
+ },
289
+ ],
290
+ isError: true,
291
+ };
292
+ }
293
+ // ── Step 4: Configure chat endpoint ──
294
+ let chatConfigured = false;
295
+ if (targetType === "ai_chat") {
296
+ const chatPath = params.chat_endpoint || "/v1/chat/completions";
297
+ const requestTemplate = params.request_template ||
298
+ '{"messages":[{"role":"user","content":"{{message}}"}]}';
299
+ const responsePath = params.response_path || "choices[0].message.content";
300
+ try {
301
+ await apiClient.post(`/api/rt/applications/${application.id}/endpoints`, {
302
+ path: chatPath,
303
+ method: "POST",
304
+ endpointType: "chat",
305
+ requestTemplate: requestTemplate,
306
+ responsePath: responsePath,
307
+ streamingEnabled: false,
308
+ summary: "AI Chat endpoint (auto-configured)",
309
+ requestContentType: "application/json",
310
+ });
311
+ chatConfigured = true;
312
+ }
313
+ catch (err) {
314
+ // 409 = endpoint already exists, that's fine
315
+ if (err instanceof Error && err.message.includes("409")) {
316
+ chatConfigured = true;
317
+ }
318
+ // Other errors: log but don't fail the whole operation
319
+ }
320
+ }
321
+ // ── Step 5: Import OpenAPI ──
322
+ let openApiImported = null;
323
+ if (params.openapi_spec_url) {
324
+ try {
325
+ const importResult = await apiClient.post(`/api/rt/applications/${application.id}/endpoints/import-openapi`, { specUrl: params.openapi_spec_url });
326
+ openApiImported = importResult.imported || importResult.endpoints?.length || 0;
327
+ }
328
+ catch {
329
+ // OpenAPI import failure shouldn't block setup
330
+ openApiImported = null;
331
+ }
332
+ }
333
+ // ── Step 6: Create campaign + agent + optional scan via quick-setup ──
334
+ const scanCampaigns = params.campaigns || defaultCampaigns(targetType);
335
+ let quickSetup = null;
336
+ if (baseUrl) {
337
+ try {
338
+ quickSetup = await apiClient.post("/api/redteam/campaigns/quick-setup", {
339
+ targetUrl: baseUrl,
340
+ targetType,
341
+ targetName: appName,
342
+ applicationId: application.id,
343
+ systemPrompt: params.system_context,
344
+ autoScan: params.auto_scan || false,
345
+ scanDepth: "standard",
346
+ campaigns: scanCampaigns,
347
+ authConfig: params.bearer_token
348
+ ? { type: "bearer", token: params.bearer_token }
349
+ : { type: "none" },
350
+ });
351
+ }
352
+ catch {
353
+ // Campaign setup failure shouldn't block the response
354
+ }
355
+ }
356
+ // ── Step 7: Build response ──
357
+ const nextSteps = [];
358
+ if (authType === "none") {
359
+ nextSteps.push("Add authentication credentials in the ZIVIS dashboard for deeper testing");
360
+ }
361
+ if (quickSetup?.scan?.id) {
362
+ nextSteps.push(`Monitor scan progress at https://app.zivis.ai/rt/scans/${quickSetup.scan.id}`);
363
+ }
364
+ else if (!params.auto_scan) {
365
+ nextSteps.push("Run a scan with auto_scan=true or from the ZIVIS dashboard");
366
+ }
367
+ if (!params.openapi_spec_url && targetType === "api") {
368
+ nextSteps.push("Provide an openapi_spec_url to auto-import all API endpoints");
369
+ }
370
+ const result = sanitizeResponse({
371
+ status: isNew ? "created" : "updated",
372
+ application: {
373
+ id: application.id,
374
+ name: appName,
375
+ baseUrl: baseUrl || null,
376
+ targetType,
377
+ authType,
378
+ isNew,
379
+ },
380
+ endpoints: {
381
+ chatConfigured,
382
+ openApiImported,
383
+ },
384
+ campaign: quickSetup
385
+ ? {
386
+ id: quickSetup.campaign.id,
387
+ name: quickSetup.campaign.name,
388
+ status: quickSetup.campaign.status,
389
+ isNew: quickSetup.status === "created",
390
+ }
391
+ : null,
392
+ agent: quickSetup?.agent
393
+ ? {
394
+ id: quickSetup.agent.id,
395
+ name: quickSetup.agent.name,
396
+ type: quickSetup.agent.type,
397
+ strategy: quickSetup.agent.strategy,
398
+ }
399
+ : null,
400
+ scan: quickSetup?.scan?.id
401
+ ? {
402
+ triggered: true,
403
+ scanId: quickSetup.scan.id,
404
+ campaigns: scanCampaigns,
405
+ status: quickSetup.scan.status,
406
+ }
407
+ : { triggered: false },
408
+ nextSteps,
409
+ });
410
+ return {
411
+ content: [
412
+ {
413
+ type: "text",
414
+ text: JSON.stringify(result, null, 2),
415
+ },
416
+ ],
417
+ };
418
+ }
419
+ catch (err) {
420
+ const message = err instanceof Error
421
+ ? err.message
422
+ : "Failed to set up red team target";
423
+ return {
424
+ content: [{ type: "text", text: `Error: ${message}` }],
425
+ isError: true,
426
+ };
427
+ }
428
+ };
429
+ }
430
+ //# sourceMappingURL=setup-red-team-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-red-team-target.js","sourceRoot":"","sources":["../../src/tools/setup-red-team-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,kBAAkB;AAElB,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC;AAExE,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;;;;;;;;;;;gJAgB+F,CAAC;AAEjJ,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,oEAAoE;QAClE,qDAAqD,CACxD;IACH,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,+DAA+D;QAC7D,gDAAgD,CACnD;IACH,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;SACnC,QAAQ,EAAE;SACV,QAAQ,CACP,qDAAqD;QACnD,0FAA0F,CAC7F;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0EAA0E;QACxE,wEAAwE,CAC3E;IACH,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,+EAA+E;QAC7E,uDAAuD,CAC1D;IACH,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,mEAAmE;QACjE,iEAAiE,CACpE;IACH,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,sEAAsE,CACvE;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4EAA4E,CAC7E;IACH,OAAO,EAAE,CAAC;SACP,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,UAAU,EAAE,CAAC;SACV,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;IACvD,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,2DAA2D;QACzD,8CAA8C,CACjD;IACH,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;SAC9B,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,iEAAiE,CAAC;IAC9E,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,SAAS,EAAE,CAAC;SACT,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;SACnD,QAAQ,EAAE;SACV,QAAQ,CACP,uEAAuE,CACxE;CACJ,CAAC;AAsDF,gBAAgB;AAEhB,SAAS,aAAa,CAAC,SAAkB,EAAE,OAAgB;IACzD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC9B,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;YAC/C,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACnD,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,eAAe,CACtB,SAAkB,EAClB,YAAqB;IAErB,IAAI,YAAY;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,IACE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtB,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EACzB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CACvB,UAAkB;IAElB,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,KAAK;YACR,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,SAAS;YACZ,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/B;YACE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,gBAAgB;AAEhB,MAAM,UAAU,+BAA+B,CAAC,SAAoB;IAClE,OAAO,KAAK,EAAE,MAkBb,EAAE,EAAE;QACH,IAAI,CAAC;YACH,yBAAyB;YAEzB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,4DAA4D;yBACnE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,SAAS,KAAK,cAAc,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAChE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,mEAAmE;yBAC1E;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,gBAAgB;YAChB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YAClC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;oBAChC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACnD,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,oDAAoD;iCAC3D;6BACF;4BACD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,8BAA8B,OAAO,yDAAyD;6BACrG;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,gCAAgC;YAEhC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjF,MAAM,UAAU,GACd,MAAM,CAAC,WAAW;gBAClB,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;YAE5C,0CAA0C;YAE1C,IAAI,WAAW,GAA+B,IAAI,CAAC;YACnD,IAAI,KAAK,GAAG,KAAK,CAAC;YAElB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAC9B,gCAAgC,CACjC,CAAC;gBACF,WAAW;oBACT,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CACtD,IAAI,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;YAC7D,CAAC;YAED,iCAAiC;YAEjC,MAAM,UAAU,GAA4B;gBAC1C,IAAI,EAAE,OAAO;gBACb,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC3B,GAAG,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBACnC,QAAQ;gBACR,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;gBACtE,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/D,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI;oBACxC,WAAW,EAAE,MAAM,CAAC,aAAa;iBAClC,CAAC;gBACF,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI;oBAC7B,cAAc,EAAE,MAAM,CAAC,gBAAgB;iBACxC,CAAC;gBACF,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;aACjE,CAAC;YAEF,6DAA6D;YAC7D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,sBAAsB,CAAC;gBAChE,UAAU,CAAC,YAAY,GAAG,QAAQ,CAAC;YACrC,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,kBAAkB;gBAClB,WAAW,GAAG,MAAM,SAAS,CAAC,KAAK,CACjC,wBAAwB,WAAW,CAAC,EAAE,EAAE,EACxC,UAAU,CACX,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,gDAAgD;gBAChD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,uGAAuG;6BAC9G;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBACD,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,IAAI,CAEtC,sBAAsB,EAAE,UAAU,CAAC,CAAC;gBACvC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;gBACvC,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YAED,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACpC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,qFAAqF;yBAC5F;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,wCAAwC;YAExC,IAAI,cAAc,GAAG,KAAK,CAAC;YAE3B,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,sBAAsB,CAAC;gBAChE,MAAM,eAAe,GACnB,MAAM,CAAC,gBAAgB;oBACvB,wDAAwD,CAAC;gBAC3D,MAAM,YAAY,GAChB,MAAM,CAAC,aAAa,IAAI,4BAA4B,CAAC;gBAEvD,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,IAAI,CAClB,wBAAwB,WAAW,CAAC,EAAE,YAAY,EAClD;wBACE,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,MAAM;wBACd,YAAY,EAAE,MAAM;wBACpB,eAAe,EAAE,eAAe;wBAChC,YAAY,EAAE,YAAY;wBAC1B,gBAAgB,EAAE,KAAK;wBACvB,OAAO,EAAE,oCAAoC;wBAC7C,kBAAkB,EAAE,kBAAkB;qBACvC,CACF,CAAC;oBACF,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,6CAA6C;oBAC7C,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBACxD,cAAc,GAAG,IAAI,CAAC;oBACxB,CAAC;oBACD,uDAAuD;gBACzD,CAAC;YACH,CAAC;YAED,+BAA+B;YAE/B,IAAI,eAAe,GAAkB,IAAI,CAAC;YAE1C,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,IAAI,CAIvC,wBAAwB,WAAW,CAAC,EAAE,2BAA2B,EACjE,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,CACrC,CAAC;oBACF,eAAe,GAAG,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC;gBACjF,CAAC;gBAAC,MAAM,CAAC;oBACP,+CAA+C;oBAC/C,eAAe,GAAG,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,wEAAwE;YAExE,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,UAAU,GAA8B,IAAI,CAAC;YAEjD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CAC/B,oCAAoC,EACpC;wBACE,SAAS,EAAE,OAAO;wBAClB,UAAU;wBACV,UAAU,EAAE,OAAO;wBACnB,aAAa,EAAE,WAAW,CAAC,EAAE;wBAC7B,YAAY,EAAE,MAAM,CAAC,cAAc;wBACnC,QAAQ,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;wBACnC,SAAS,EAAE,UAAU;wBACrB,SAAS,EAAE,aAAa;wBACxB,UAAU,EAAE,MAAM,CAAC,YAAY;4BAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE;4BAChD,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;qBACrB,CACF,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,sDAAsD;gBACxD,CAAC;YACH,CAAC;YAED,+BAA+B;YAE/B,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,SAAS,CAAC,IAAI,CACZ,0EAA0E,CAC3E,CAAC;YACJ,CAAC;YACD,IAAI,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;gBACzB,SAAS,CAAC,IAAI,CACZ,0DAA0D,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,CAC/E,CAAC;YACJ,CAAC;iBAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC7B,SAAS,CAAC,IAAI,CACZ,4DAA4D,CAC7D,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBACrD,SAAS,CAAC,IAAI,CACZ,8DAA8D,CAC/D,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAAC;gBAC9B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBACrC,WAAW,EAAE;oBACX,EAAE,EAAE,WAAW,CAAC,EAAE;oBAClB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,OAAO,IAAI,IAAI;oBACxB,UAAU;oBACV,QAAQ;oBACR,KAAK;iBACN;gBACD,SAAS,EAAE;oBACT,cAAc;oBACd,eAAe;iBAChB;gBACD,QAAQ,EAAE,UAAU;oBAClB,CAAC,CAAC;wBACE,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE;wBAC1B,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI;wBAC9B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM;wBAClC,KAAK,EAAE,UAAU,CAAC,MAAM,KAAK,SAAS;qBACvC;oBACH,CAAC,CAAC,IAAI;gBACR,KAAK,EAAE,UAAU,EAAE,KAAK;oBACtB,CAAC,CAAC;wBACE,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE;wBACvB,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI;wBAC3B,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI;wBAC3B,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ;qBACpC;oBACH,CAAC,CAAC,IAAI;gBACR,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;oBACxB,CAAC,CAAC;wBACE,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE;wBAC1B,SAAS,EAAE,aAAa;wBACxB,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM;qBAC/B;oBACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;gBACxB,SAAS;aACV,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK;gBAClB,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,kCAAkC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * zivis_triage_finding — Send triage decision and reasoning back to ZIVIS
3
+ *
4
+ * Maps to: PATCH /api/findings/unified/:id
5
+ *
6
+ * This is the "write-back" that makes the platform smarter. The AI's
7
+ * triage decisions and reasoning are recorded as audit notes (via the
8
+ * `note` field), tagged as AI-generated so humans can distinguish them
9
+ * in the dashboard.
10
+ */
11
+ import { z } from "zod";
12
+ import type { ApiClient } from "../api-client.js";
13
+ export declare const TRIAGE_FINDING_NAME = "zivis_triage_finding";
14
+ export declare const TRIAGE_FINDING_DESCRIPTION = "Submit a triage decision for a security finding back to ZIVIS.\n\nUse this after investigating a finding to record the outcome:\n- \"resolve\" \u2014 the vulnerability has been fixed\n- \"dismiss\" \u2014 the finding is a false positive or not applicable\n- \"accept_risk\" \u2014 the risk is known and accepted\n\nA reasoning field is REQUIRED. Explain why this action is appropriate \u2014 this creates an audit trail and helps ZIVIS learn from your decisions.\n\nThis action is logged with your identity and timestamp. Bulk operations are not supported \u2014 triage one finding at a time.\n\nIMPORTANT: After resolving a finding (action=\"resolve\"), you MUST document the fix:\n1. Create .zivis/ directory if it doesn't exist\n2. Append to .zivis/remediations.md using the markdown template in the response\n3. This creates a security audit trail that stays with the project\n\nThe response includes a \"documentation\" field with pre-formatted markdown to append.";
15
+ export declare const TRIAGE_FINDING_SCHEMA: {
16
+ finding_id: z.ZodString;
17
+ action: z.ZodEnum<{
18
+ resolve: "resolve";
19
+ dismiss: "dismiss";
20
+ accept_risk: "accept_risk";
21
+ }>;
22
+ reasoning: z.ZodString;
23
+ dismiss_reason: z.ZodOptional<z.ZodEnum<{
24
+ false_positive: "false_positive";
25
+ not_applicable: "not_applicable";
26
+ wont_fix: "wont_fix";
27
+ duplicate: "duplicate";
28
+ }>>;
29
+ };
30
+ export declare function createTriageFindingHandler(apiClient: ApiClient): (params: {
31
+ finding_id: string;
32
+ action: "resolve" | "dismiss" | "accept_risk";
33
+ reasoning: string;
34
+ dismiss_reason?: string;
35
+ }) => Promise<{
36
+ content: {
37
+ type: "text";
38
+ text: string;
39
+ }[];
40
+ isError: boolean;
41
+ } | {
42
+ content: {
43
+ type: "text";
44
+ text: string;
45
+ }[];
46
+ isError?: undefined;
47
+ }>;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * zivis_triage_finding — Send triage decision and reasoning back to ZIVIS
3
+ *
4
+ * Maps to: PATCH /api/findings/unified/:id
5
+ *
6
+ * This is the "write-back" that makes the platform smarter. The AI's
7
+ * triage decisions and reasoning are recorded as audit notes (via the
8
+ * `note` field), tagged as AI-generated so humans can distinguish them
9
+ * in the dashboard.
10
+ */
11
+ import { z } from "zod";
12
+ export const TRIAGE_FINDING_NAME = "zivis_triage_finding";
13
+ export const TRIAGE_FINDING_DESCRIPTION = `Submit a triage decision for a security finding back to ZIVIS.
14
+
15
+ Use this after investigating a finding to record the outcome:
16
+ - "resolve" — the vulnerability has been fixed
17
+ - "dismiss" — the finding is a false positive or not applicable
18
+ - "accept_risk" — the risk is known and accepted
19
+
20
+ A reasoning field is REQUIRED. Explain why this action is appropriate — this creates an audit trail and helps ZIVIS learn from your decisions.
21
+
22
+ This action is logged with your identity and timestamp. Bulk operations are not supported — triage one finding at a time.
23
+
24
+ IMPORTANT: After resolving a finding (action="resolve"), you MUST document the fix:
25
+ 1. Create .zivis/ directory if it doesn't exist
26
+ 2. Append to .zivis/remediations.md using the markdown template in the response
27
+ 3. This creates a security audit trail that stays with the project
28
+
29
+ The response includes a "documentation" field with pre-formatted markdown to append.`;
30
+ export const TRIAGE_FINDING_SCHEMA = {
31
+ finding_id: z.string().describe("The finding ID to triage"),
32
+ action: z
33
+ .enum(["resolve", "dismiss", "accept_risk"])
34
+ .describe("Triage action: resolve (fixed), dismiss (FP/NA), or accept_risk"),
35
+ reasoning: z
36
+ .string()
37
+ .min(10)
38
+ .describe("Explanation of why this action is appropriate. Must be at least 10 characters. This is logged as an audit note."),
39
+ dismiss_reason: z
40
+ .enum(["false_positive", "not_applicable", "wont_fix", "duplicate"])
41
+ .optional()
42
+ .describe("Required when action is 'dismiss'. Reason for dismissal."),
43
+ };
44
+ export function createTriageFindingHandler(apiClient) {
45
+ return async (params) => {
46
+ // Validate dismiss_reason is provided when dismissing
47
+ if (params.action === "dismiss" && !params.dismiss_reason) {
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: "Error: dismiss_reason is required when action is 'dismiss'",
53
+ },
54
+ ],
55
+ isError: true,
56
+ };
57
+ }
58
+ try {
59
+ // Map action to finding status
60
+ const statusMap = {
61
+ resolve: "resolved",
62
+ dismiss: "dismissed",
63
+ accept_risk: "accepted",
64
+ };
65
+ // Update finding status with note for audit trail
66
+ // The unified findings API logs history entries automatically when note is provided
67
+ const patchBody = {
68
+ status: statusMap[params.action],
69
+ note: `[MCP AI Triage] ${params.reasoning}`,
70
+ };
71
+ if (params.dismiss_reason) {
72
+ patchBody.dismissReason = params.dismiss_reason;
73
+ }
74
+ await apiClient.patch(`/api/findings/unified/${params.finding_id}`, patchBody);
75
+ const response = {
76
+ success: true,
77
+ findingId: params.finding_id,
78
+ newStatus: statusMap[params.action],
79
+ message: `Finding ${params.finding_id} marked as ${statusMap[params.action]}. Reasoning logged as audit note.`,
80
+ };
81
+ // Generate documentation markdown for resolved findings
82
+ const today = new Date().toISOString().split("T")[0];
83
+ const documentation = params.action === "resolve"
84
+ ? {
85
+ shouldDocument: true,
86
+ filePath: ".zivis/remediations.md",
87
+ markdownToAppend: `
88
+ ## ${today} — ${params.finding_id}
89
+
90
+ **Status:** Resolved
91
+ **Reasoning:** ${params.reasoning}
92
+
93
+ ---
94
+ `,
95
+ instructions: "Append the markdownToAppend to .zivis/remediations.md (create directory and file if needed). Add finding title, severity, vulnerable code description, and files changed above the reasoning.",
96
+ }
97
+ : { shouldDocument: false };
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: JSON.stringify({ ...response, documentation }, null, 2),
103
+ },
104
+ ],
105
+ };
106
+ }
107
+ catch (err) {
108
+ const message = err instanceof Error ? err.message : "Failed to triage finding";
109
+ return {
110
+ content: [{ type: "text", text: `Error: ${message}` }],
111
+ isError: true,
112
+ };
113
+ }
114
+ };
115
+ }
116
+ //# sourceMappingURL=triage-finding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-finding.js","sourceRoot":"","sources":["../../src/tools/triage-finding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAE1D,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;qFAgB2C,CAAC;AAEtF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC3D,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;SAC3C,QAAQ,CAAC,iEAAiE,CAAC;IAC9E,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CACP,iHAAiH,CAClH;IACH,cAAc,EAAE,CAAC;SACd,IAAI,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;SACnE,QAAQ,EAAE;SACV,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,SAAoB;IAC7D,OAAO,KAAK,EAAE,MAKb,EAAE,EAAE;QACH,sDAAsD;QACtD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,4DAA4D;qBACnE;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,SAAS,GAA2B;gBACxC,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,UAAU;aACxB,CAAC;YAEF,kDAAkD;YAClD,oFAAoF;YACpF,MAAM,SAAS,GAA4B;gBACzC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;gBAChC,IAAI,EAAE,mBAAmB,MAAM,CAAC,SAAS,EAAE;aAC5C,CAAC;YACF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC1B,SAAS,CAAC,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;YAClD,CAAC;YAED,MAAM,SAAS,CAAC,KAAK,CACnB,yBAAyB,MAAM,CAAC,UAAU,EAAE,EAC5C,SAAS,CACV,CAAC;YAEF,MAAM,QAAQ,GAAmB;gBAC/B,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,MAAM,CAAC,UAAU;gBAC5B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;gBACnC,OAAO,EAAE,WAAW,MAAM,CAAC,UAAU,cAAc,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,mCAAmC;aAC/G,CAAC;YAEF,wDAAwD;YACxD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,aAAa,GACjB,MAAM,CAAC,MAAM,KAAK,SAAS;gBACzB,CAAC,CAAC;oBACE,cAAc,EAAE,IAAI;oBACpB,QAAQ,EAAE,wBAAwB;oBAClC,gBAAgB,EAAE;KAC3B,KAAK,MAAM,MAAM,CAAC,UAAU;;;iBAGhB,MAAM,CAAC,SAAS;;;CAGhC;oBACa,YAAY,EACV,+LAA+L;iBAClM;gBACH,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;YAEhC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC9D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * zivis_update_document — Update a document's title, markdown content, or tags.
3
+ *
4
+ * Maps to: PATCH /api/documents/:id
5
+ */
6
+ import { z } from "zod";
7
+ import type { ApiClient } from "../api-client.js";
8
+ export declare const UPDATE_DOCUMENT_NAME = "zivis_update_document";
9
+ export declare const UPDATE_DOCUMENT_DESCRIPTION = "Update a document's title, markdown content, or tags. At least one of these fields must be provided.\n\n**Workflow:**\n 1. Call zivis_get_document to read the current content.\n 2. Reason about the change the user requested.\n 3. Produce a complete, valid markdown string for `content` \u2014 this REPLACES the entire content.\n 4. Call this tool.\n\n**Embedding diagrams in content:**\n - Inline mermaid: ```mermaid\\n<source>\\n```\n - Reference an existing Diagram record: ```zivis:diagram\\n<uuid>\\n``` (edits to that Diagram reflect in every document that embeds it)\n\n**Keep structure intact.** Only change what the user asked for \u2014 preserve sections, headings, diagrams, links, formatting.";
10
+ export declare const UPDATE_DOCUMENT_SCHEMA: {
11
+ document_id: z.ZodString;
12
+ title: z.ZodOptional<z.ZodString>;
13
+ content: z.ZodOptional<z.ZodString>;
14
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ };
16
+ type UpdateDocumentParams = {
17
+ document_id: string;
18
+ title?: string;
19
+ content?: string;
20
+ tags?: string[];
21
+ };
22
+ export declare function createUpdateDocumentHandler(apiClient: ApiClient): (params: UpdateDocumentParams) => Promise<{
23
+ content: {
24
+ type: "text";
25
+ text: string;
26
+ }[];
27
+ }>;
28
+ export {};