@checkview/mcp-server 1.1.0

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 (263) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/api-client.d.ts +44 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +164 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/format.d.ts +35 -0
  8. package/dist/format.d.ts.map +1 -0
  9. package/dist/format.js +57 -0
  10. package/dist/format.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +142 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/polling.d.ts +13 -0
  16. package/dist/polling.d.ts.map +1 -0
  17. package/dist/polling.js +55 -0
  18. package/dist/polling.js.map +1 -0
  19. package/dist/tools/abort-test.d.ts +4 -0
  20. package/dist/tools/abort-test.d.ts.map +1 -0
  21. package/dist/tools/abort-test.js +136 -0
  22. package/dist/tools/abort-test.js.map +1 -0
  23. package/dist/tools/add-test-comment.d.ts +4 -0
  24. package/dist/tools/add-test-comment.d.ts.map +1 -0
  25. package/dist/tools/add-test-comment.js +77 -0
  26. package/dist/tools/add-test-comment.js.map +1 -0
  27. package/dist/tools/add-website.d.ts +4 -0
  28. package/dist/tools/add-website.d.ts.map +1 -0
  29. package/dist/tools/add-website.js +106 -0
  30. package/dist/tools/add-website.js.map +1 -0
  31. package/dist/tools/check-website-availability.d.ts +4 -0
  32. package/dist/tools/check-website-availability.d.ts.map +1 -0
  33. package/dist/tools/check-website-availability.js +45 -0
  34. package/dist/tools/check-website-availability.js.map +1 -0
  35. package/dist/tools/check-website-health.d.ts +4 -0
  36. package/dist/tools/check-website-health.d.ts.map +1 -0
  37. package/dist/tools/check-website-health.js +61 -0
  38. package/dist/tools/check-website-health.js.map +1 -0
  39. package/dist/tools/compare-test-runs.d.ts +4 -0
  40. package/dist/tools/compare-test-runs.d.ts.map +1 -0
  41. package/dist/tools/compare-test-runs.js +75 -0
  42. package/dist/tools/compare-test-runs.js.map +1 -0
  43. package/dist/tools/create-form-test-flow.d.ts +4 -0
  44. package/dist/tools/create-form-test-flow.d.ts.map +1 -0
  45. package/dist/tools/create-form-test-flow.js +228 -0
  46. package/dist/tools/create-form-test-flow.js.map +1 -0
  47. package/dist/tools/create-test-flow.d.ts +4 -0
  48. package/dist/tools/create-test-flow.d.ts.map +1 -0
  49. package/dist/tools/create-test-flow.js +536 -0
  50. package/dist/tools/create-test-flow.js.map +1 -0
  51. package/dist/tools/delete-invitation.d.ts +4 -0
  52. package/dist/tools/delete-invitation.d.ts.map +1 -0
  53. package/dist/tools/delete-invitation.js +67 -0
  54. package/dist/tools/delete-invitation.js.map +1 -0
  55. package/dist/tools/delete-test-comment.d.ts +4 -0
  56. package/dist/tools/delete-test-comment.d.ts.map +1 -0
  57. package/dist/tools/delete-test-comment.js +67 -0
  58. package/dist/tools/delete-test-comment.js.map +1 -0
  59. package/dist/tools/get-ai-summary.d.ts +4 -0
  60. package/dist/tools/get-ai-summary.d.ts.map +1 -0
  61. package/dist/tools/get-ai-summary.js +61 -0
  62. package/dist/tools/get-ai-summary.js.map +1 -0
  63. package/dist/tools/get-current-organization.d.ts +4 -0
  64. package/dist/tools/get-current-organization.d.ts.map +1 -0
  65. package/dist/tools/get-current-organization.js +41 -0
  66. package/dist/tools/get-current-organization.js.map +1 -0
  67. package/dist/tools/get-generation-status.d.ts +4 -0
  68. package/dist/tools/get-generation-status.d.ts.map +1 -0
  69. package/dist/tools/get-generation-status.js +45 -0
  70. package/dist/tools/get-generation-status.js.map +1 -0
  71. package/dist/tools/get-metrics.d.ts +4 -0
  72. package/dist/tools/get-metrics.d.ts.map +1 -0
  73. package/dist/tools/get-metrics.js +90 -0
  74. package/dist/tools/get-metrics.js.map +1 -0
  75. package/dist/tools/get-organization-stats.d.ts +4 -0
  76. package/dist/tools/get-organization-stats.d.ts.map +1 -0
  77. package/dist/tools/get-organization-stats.js +53 -0
  78. package/dist/tools/get-organization-stats.js.map +1 -0
  79. package/dist/tools/get-organization.d.ts +4 -0
  80. package/dist/tools/get-organization.d.ts.map +1 -0
  81. package/dist/tools/get-organization.js +71 -0
  82. package/dist/tools/get-organization.js.map +1 -0
  83. package/dist/tools/get-results.d.ts +4 -0
  84. package/dist/tools/get-results.d.ts.map +1 -0
  85. package/dist/tools/get-results.js +154 -0
  86. package/dist/tools/get-results.js.map +1 -0
  87. package/dist/tools/get-settings.d.ts +4 -0
  88. package/dist/tools/get-settings.d.ts.map +1 -0
  89. package/dist/tools/get-settings.js +100 -0
  90. package/dist/tools/get-settings.js.map +1 -0
  91. package/dist/tools/get-step-screenshot.d.ts +4 -0
  92. package/dist/tools/get-step-screenshot.d.ts.map +1 -0
  93. package/dist/tools/get-step-screenshot.js +47 -0
  94. package/dist/tools/get-step-screenshot.js.map +1 -0
  95. package/dist/tools/get-test-flow.d.ts +4 -0
  96. package/dist/tools/get-test-flow.d.ts.map +1 -0
  97. package/dist/tools/get-test-flow.js +90 -0
  98. package/dist/tools/get-test-flow.js.map +1 -0
  99. package/dist/tools/get-test-history.d.ts +4 -0
  100. package/dist/tools/get-test-history.d.ts.map +1 -0
  101. package/dist/tools/get-test-history.js +100 -0
  102. package/dist/tools/get-test-history.js.map +1 -0
  103. package/dist/tools/get-test-run-video.d.ts +4 -0
  104. package/dist/tools/get-test-run-video.d.ts.map +1 -0
  105. package/dist/tools/get-test-run-video.js +66 -0
  106. package/dist/tools/get-test-run-video.js.map +1 -0
  107. package/dist/tools/get-test-step-details.d.ts +4 -0
  108. package/dist/tools/get-test-step-details.d.ts.map +1 -0
  109. package/dist/tools/get-test-step-details.js +166 -0
  110. package/dist/tools/get-test-step-details.js.map +1 -0
  111. package/dist/tools/get-usage-reports.d.ts +4 -0
  112. package/dist/tools/get-usage-reports.d.ts.map +1 -0
  113. package/dist/tools/get-usage-reports.js +73 -0
  114. package/dist/tools/get-usage-reports.js.map +1 -0
  115. package/dist/tools/get-usage.d.ts +4 -0
  116. package/dist/tools/get-usage.d.ts.map +1 -0
  117. package/dist/tools/get-usage.js +32 -0
  118. package/dist/tools/get-usage.js.map +1 -0
  119. package/dist/tools/get-ux-audit-report.d.ts +4 -0
  120. package/dist/tools/get-ux-audit-report.d.ts.map +1 -0
  121. package/dist/tools/get-ux-audit-report.js +52 -0
  122. package/dist/tools/get-ux-audit-report.js.map +1 -0
  123. package/dist/tools/get-website-analytics.d.ts +4 -0
  124. package/dist/tools/get-website-analytics.d.ts.map +1 -0
  125. package/dist/tools/get-website-analytics.js +54 -0
  126. package/dist/tools/get-website-analytics.js.map +1 -0
  127. package/dist/tools/get-website-logs.d.ts +4 -0
  128. package/dist/tools/get-website-logs.d.ts.map +1 -0
  129. package/dist/tools/get-website-logs.js +53 -0
  130. package/dist/tools/get-website-logs.js.map +1 -0
  131. package/dist/tools/get-website-screenshot.d.ts +4 -0
  132. package/dist/tools/get-website-screenshot.d.ts.map +1 -0
  133. package/dist/tools/get-website-screenshot.js +59 -0
  134. package/dist/tools/get-website-screenshot.js.map +1 -0
  135. package/dist/tools/get-website-settings.d.ts +4 -0
  136. package/dist/tools/get-website-settings.d.ts.map +1 -0
  137. package/dist/tools/get-website-settings.js +97 -0
  138. package/dist/tools/get-website-settings.js.map +1 -0
  139. package/dist/tools/get-website.d.ts +4 -0
  140. package/dist/tools/get-website.d.ts.map +1 -0
  141. package/dist/tools/get-website.js +45 -0
  142. package/dist/tools/get-website.js.map +1 -0
  143. package/dist/tools/invite-team-member.d.ts +4 -0
  144. package/dist/tools/invite-team-member.d.ts.map +1 -0
  145. package/dist/tools/invite-team-member.js +100 -0
  146. package/dist/tools/invite-team-member.js.map +1 -0
  147. package/dist/tools/list-forms.d.ts +4 -0
  148. package/dist/tools/list-forms.d.ts.map +1 -0
  149. package/dist/tools/list-forms.js +65 -0
  150. package/dist/tools/list-forms.js.map +1 -0
  151. package/dist/tools/list-organizations.d.ts +4 -0
  152. package/dist/tools/list-organizations.d.ts.map +1 -0
  153. package/dist/tools/list-organizations.js +78 -0
  154. package/dist/tools/list-organizations.js.map +1 -0
  155. package/dist/tools/list-team-members.d.ts +4 -0
  156. package/dist/tools/list-team-members.d.ts.map +1 -0
  157. package/dist/tools/list-team-members.js +58 -0
  158. package/dist/tools/list-team-members.js.map +1 -0
  159. package/dist/tools/list-test-comments.d.ts +4 -0
  160. package/dist/tools/list-test-comments.d.ts.map +1 -0
  161. package/dist/tools/list-test-comments.js +55 -0
  162. package/dist/tools/list-test-comments.js.map +1 -0
  163. package/dist/tools/list-test-flow-steps.d.ts +4 -0
  164. package/dist/tools/list-test-flow-steps.d.ts.map +1 -0
  165. package/dist/tools/list-test-flow-steps.js +59 -0
  166. package/dist/tools/list-test-flow-steps.js.map +1 -0
  167. package/dist/tools/list-test-flows.d.ts +4 -0
  168. package/dist/tools/list-test-flows.d.ts.map +1 -0
  169. package/dist/tools/list-test-flows.js +90 -0
  170. package/dist/tools/list-test-flows.js.map +1 -0
  171. package/dist/tools/list-test-runs.d.ts +4 -0
  172. package/dist/tools/list-test-runs.d.ts.map +1 -0
  173. package/dist/tools/list-test-runs.js +94 -0
  174. package/dist/tools/list-test-runs.js.map +1 -0
  175. package/dist/tools/list-ux-audits.d.ts +4 -0
  176. package/dist/tools/list-ux-audits.d.ts.map +1 -0
  177. package/dist/tools/list-ux-audits.js +59 -0
  178. package/dist/tools/list-ux-audits.js.map +1 -0
  179. package/dist/tools/list-websites.d.ts +4 -0
  180. package/dist/tools/list-websites.d.ts.map +1 -0
  181. package/dist/tools/list-websites.js +80 -0
  182. package/dist/tools/list-websites.js.map +1 -0
  183. package/dist/tools/manage-notification-settings.d.ts +4 -0
  184. package/dist/tools/manage-notification-settings.d.ts.map +1 -0
  185. package/dist/tools/manage-notification-settings.js +311 -0
  186. package/dist/tools/manage-notification-settings.js.map +1 -0
  187. package/dist/tools/pause-website.d.ts +4 -0
  188. package/dist/tools/pause-website.d.ts.map +1 -0
  189. package/dist/tools/pause-website.js +58 -0
  190. package/dist/tools/pause-website.js.map +1 -0
  191. package/dist/tools/regenerate-test-steps.d.ts +4 -0
  192. package/dist/tools/regenerate-test-steps.d.ts.map +1 -0
  193. package/dist/tools/regenerate-test-steps.js +173 -0
  194. package/dist/tools/regenerate-test-steps.js.map +1 -0
  195. package/dist/tools/reinitialize-test-flow.d.ts +4 -0
  196. package/dist/tools/reinitialize-test-flow.d.ts.map +1 -0
  197. package/dist/tools/reinitialize-test-flow.js +79 -0
  198. package/dist/tools/reinitialize-test-flow.js.map +1 -0
  199. package/dist/tools/remove-team-member.d.ts +4 -0
  200. package/dist/tools/remove-team-member.d.ts.map +1 -0
  201. package/dist/tools/remove-team-member.js +68 -0
  202. package/dist/tools/remove-team-member.js.map +1 -0
  203. package/dist/tools/remove-test-flow.d.ts +4 -0
  204. package/dist/tools/remove-test-flow.d.ts.map +1 -0
  205. package/dist/tools/remove-test-flow.js +74 -0
  206. package/dist/tools/remove-test-flow.js.map +1 -0
  207. package/dist/tools/remove-website.d.ts +4 -0
  208. package/dist/tools/remove-website.d.ts.map +1 -0
  209. package/dist/tools/remove-website.js +74 -0
  210. package/dist/tools/remove-website.js.map +1 -0
  211. package/dist/tools/resume-website.d.ts +4 -0
  212. package/dist/tools/resume-website.d.ts.map +1 -0
  213. package/dist/tools/resume-website.js +58 -0
  214. package/dist/tools/resume-website.js.map +1 -0
  215. package/dist/tools/run-all-tests.d.ts +4 -0
  216. package/dist/tools/run-all-tests.d.ts.map +1 -0
  217. package/dist/tools/run-all-tests.js +165 -0
  218. package/dist/tools/run-all-tests.js.map +1 -0
  219. package/dist/tools/run-test.d.ts +4 -0
  220. package/dist/tools/run-test.d.ts.map +1 -0
  221. package/dist/tools/run-test.js +186 -0
  222. package/dist/tools/run-test.js.map +1 -0
  223. package/dist/tools/run-ux-audit.d.ts +4 -0
  224. package/dist/tools/run-ux-audit.d.ts.map +1 -0
  225. package/dist/tools/run-ux-audit.js +192 -0
  226. package/dist/tools/run-ux-audit.js.map +1 -0
  227. package/dist/tools/set-organization.d.ts +4 -0
  228. package/dist/tools/set-organization.d.ts.map +1 -0
  229. package/dist/tools/set-organization.js +129 -0
  230. package/dist/tools/set-organization.js.map +1 -0
  231. package/dist/tools/test-url.d.ts +4 -0
  232. package/dist/tools/test-url.d.ts.map +1 -0
  233. package/dist/tools/test-url.js +334 -0
  234. package/dist/tools/test-url.js.map +1 -0
  235. package/dist/tools/update-organization.d.ts +4 -0
  236. package/dist/tools/update-organization.d.ts.map +1 -0
  237. package/dist/tools/update-organization.js +90 -0
  238. package/dist/tools/update-organization.js.map +1 -0
  239. package/dist/tools/update-schedule.d.ts +4 -0
  240. package/dist/tools/update-schedule.d.ts.map +1 -0
  241. package/dist/tools/update-schedule.js +157 -0
  242. package/dist/tools/update-schedule.js.map +1 -0
  243. package/dist/tools/update-settings.d.ts +4 -0
  244. package/dist/tools/update-settings.d.ts.map +1 -0
  245. package/dist/tools/update-settings.js +97 -0
  246. package/dist/tools/update-settings.js.map +1 -0
  247. package/dist/tools/update-team-member.d.ts +4 -0
  248. package/dist/tools/update-team-member.d.ts.map +1 -0
  249. package/dist/tools/update-team-member.js +102 -0
  250. package/dist/tools/update-team-member.js.map +1 -0
  251. package/dist/tools/update-test-flow-steps.d.ts +4 -0
  252. package/dist/tools/update-test-flow-steps.d.ts.map +1 -0
  253. package/dist/tools/update-test-flow-steps.js +440 -0
  254. package/dist/tools/update-test-flow-steps.js.map +1 -0
  255. package/dist/tools/update-test-flow.d.ts +4 -0
  256. package/dist/tools/update-test-flow.d.ts.map +1 -0
  257. package/dist/tools/update-test-flow.js +172 -0
  258. package/dist/tools/update-test-flow.js.map +1 -0
  259. package/dist/tools/update-website.d.ts +4 -0
  260. package/dist/tools/update-website.d.ts.map +1 -0
  261. package/dist/tools/update-website.js +86 -0
  262. package/dist/tools/update-website.js.map +1 -0
  263. package/package.json +57 -0
@@ -0,0 +1,311 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ import { ApiError, idempotencyKey } from "../api-client.js";
4
+ // HTTPS-only URL validator that also rejects javascript:/data:/etc.
5
+ const httpsUrl = z.string().refine((u) => {
6
+ try {
7
+ return new URL(u).protocol === "https:";
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ }, { message: "URL must be a valid HTTPS URL" });
13
+ // Per-scope body schemas (mirror server DTOs at notification-settings.dto.ts)
14
+ const EmailReportSchema = z.object({
15
+ emailAddresses: z.array(z.string().email()).min(1).max(50),
16
+ typeId: z.enum(["daily", "weekly", "monthly"]),
17
+ enabled: z.boolean(),
18
+ });
19
+ const TestNotifSchema = z.object({
20
+ emailAddresses: z.array(z.string().email()).min(1).max(50),
21
+ testNotificationTypeId: z
22
+ .union([z.string().uuid(), z.literal("use-global-settings"), z.null()])
23
+ .optional(),
24
+ enabled: z.boolean(),
25
+ });
26
+ const WebhookSchema = z.object({
27
+ enabled: z.boolean(),
28
+ webhooks: z
29
+ .array(z.object({
30
+ url: httpsUrl,
31
+ trigger: z.enum(["all", "success_only", "failure_only"]),
32
+ }))
33
+ .optional(),
34
+ });
35
+ const SlackSchema = z.object({
36
+ enabled: z.boolean(),
37
+ channels: z.array(z.string().regex(/^#.+/)).optional(),
38
+ typeId: z
39
+ .union([z.string().uuid(), z.literal("use-global-settings"), z.null()])
40
+ .optional(),
41
+ });
42
+ const BODY_SCHEMAS = {
43
+ emails: EmailReportSchema,
44
+ tests: TestNotifSchema,
45
+ webhooks: WebhookSchema,
46
+ slack: SlackSchema,
47
+ };
48
+ function bodyForScope(scope, body, ctx) {
49
+ const schema = BODY_SCHEMAS[scope];
50
+ if (!schema) {
51
+ ctx.addIssue({
52
+ code: z.ZodIssueCode.custom,
53
+ message: `No body schema defined for scope "${scope}"`,
54
+ });
55
+ return;
56
+ }
57
+ const result = schema.safeParse(body);
58
+ if (!result.success) {
59
+ for (const issue of result.error.issues) {
60
+ ctx.addIssue({
61
+ code: z.ZodIssueCode.custom,
62
+ path: ["body", ...issue.path],
63
+ message: issue.message,
64
+ });
65
+ }
66
+ }
67
+ }
68
+ // SHA-256 hash for idempotency-key stability (server DB column is varchar(255)).
69
+ function hashBody(body) {
70
+ return createHash("sha256")
71
+ .update(JSON.stringify(body ?? {}))
72
+ .digest("hex");
73
+ }
74
+ // Server's GET response DTOs use snake_case (email_addresses, type_id) but
75
+ // the PUT request DTOs use camelCase (emailAddresses, typeId). Normalize GET
76
+ // output to the UPDATE shape so LLMs can round-trip settings natively.
77
+ function normalizeGetResponse(scope, body) {
78
+ if (!body || typeof body !== "object" || Array.isArray(body))
79
+ return body;
80
+ const normalizeEmailOrTest = (section) => {
81
+ const normalized = { ...section };
82
+ if ("email_addresses" in normalized) {
83
+ normalized.emailAddresses = normalized.email_addresses;
84
+ delete normalized.email_addresses;
85
+ }
86
+ if (scope === "tests" && "type_id" in normalized) {
87
+ normalized.testNotificationTypeId = normalized.type_id;
88
+ delete normalized.type_id;
89
+ }
90
+ else if ("type_id" in normalized) {
91
+ normalized.typeId = normalized.type_id;
92
+ delete normalized.type_id;
93
+ }
94
+ return normalized;
95
+ };
96
+ if (scope === "emails" || scope === "tests") {
97
+ return normalizeEmailOrTest(body);
98
+ }
99
+ if (scope === "all") {
100
+ // Organization-wide response has nested `email_reports` and `test_notifications`.
101
+ const root = body;
102
+ const result = { ...root };
103
+ if (root.email_reports && typeof root.email_reports === "object") {
104
+ result.email_reports = normalizeEmailOrTest(root.email_reports);
105
+ }
106
+ if (root.test_notifications &&
107
+ typeof root.test_notifications === "object") {
108
+ // Tests have testNotificationTypeId; temporarily scope-override.
109
+ const ts = root.test_notifications;
110
+ const tn = { ...ts };
111
+ if ("email_addresses" in tn) {
112
+ tn.emailAddresses = tn.email_addresses;
113
+ delete tn.email_addresses;
114
+ }
115
+ if ("type_id" in tn) {
116
+ tn.testNotificationTypeId = tn.type_id;
117
+ delete tn.type_id;
118
+ }
119
+ result.test_notifications = tn;
120
+ }
121
+ return result;
122
+ }
123
+ // webhooks, slack, types: no known asymmetry; pass through.
124
+ return body;
125
+ }
126
+ export function registerManageNotificationSettingsTool(server, client) {
127
+ server.registerTool("checkview_manage_notification_settings", {
128
+ description: `Manage organization notification settings via the /notifications controller.
129
+ - action:"get" + scope:"all"|"emails"|"tests"|"webhooks"|"slack"|"types" — read settings
130
+ - action:"update" + scope:"emails"|"tests"|"webhooks"|"slack" — update (body shape per scope)
131
+ - action:"delete" + scope:"webhooks"|"slack" — clear that scope
132
+ - action:"test" + scope:"webhooks" — send a test delivery to {url}
133
+ Admin role required.
134
+
135
+ Note: GET responses are normalized to match the UPDATE body shape (camelCase emailAddresses/typeId), so you can round-trip: get settings, modify a field, pass the modified body back to update.`,
136
+ inputSchema: z
137
+ .discriminatedUnion("action", [
138
+ z.object({
139
+ action: z.literal("get"),
140
+ scope: z.enum([
141
+ "all",
142
+ "emails",
143
+ "tests",
144
+ "webhooks",
145
+ "slack",
146
+ "types",
147
+ ]),
148
+ }),
149
+ z.object({
150
+ action: z.literal("update"),
151
+ scope: z.enum(["emails", "tests", "webhooks", "slack"]),
152
+ body: z.unknown(),
153
+ }),
154
+ z.object({
155
+ action: z.literal("delete"),
156
+ scope: z.enum(["webhooks", "slack"]),
157
+ }),
158
+ z.object({
159
+ action: z.literal("test"),
160
+ scope: z.literal("webhooks"),
161
+ body: z.object({
162
+ url: httpsUrl,
163
+ }),
164
+ }),
165
+ ])
166
+ .superRefine((v, ctx) => {
167
+ if (v.action === "update") {
168
+ bodyForScope(v.scope, v.body, ctx);
169
+ }
170
+ }),
171
+ annotations: {
172
+ readOnlyHint: false,
173
+ destructiveHint: false,
174
+ idempotentHint: true,
175
+ },
176
+ }, async (args, extra) => {
177
+ try {
178
+ const scopePath = args.scope === "all" ? "" : `/${args.scope}`;
179
+ const path = `/notifications${scopePath}`;
180
+ if (args.action === "get") {
181
+ const { body } = await client.get(path, undefined, extra.signal);
182
+ const normalized = normalizeGetResponse(args.scope, body);
183
+ return {
184
+ content: [
185
+ { type: "text", text: JSON.stringify(normalized, null, 2) },
186
+ ],
187
+ };
188
+ }
189
+ if (args.action === "update") {
190
+ const idemKey = idempotencyKey(`notif:update:${args.scope}:${hashBody(args.body)}`);
191
+ try {
192
+ await client.put(path, args.body, idemKey, extra.signal);
193
+ }
194
+ catch (error) {
195
+ if (error instanceof ApiError) {
196
+ if (error.status === 403) {
197
+ return {
198
+ content: [
199
+ {
200
+ type: "text",
201
+ text: "Forbidden: admin role required to update notification settings.",
202
+ },
203
+ ],
204
+ isError: true,
205
+ };
206
+ }
207
+ if (error.isReplay && error.status >= 400) {
208
+ const freshKey = idempotencyKey(`notif:update:${args.scope}:${hashBody(args.body)}:${Date.now()}`);
209
+ await client.put(path, args.body, freshKey, extra.signal);
210
+ }
211
+ else {
212
+ throw error;
213
+ }
214
+ }
215
+ else {
216
+ throw error;
217
+ }
218
+ }
219
+ return {
220
+ content: [
221
+ {
222
+ type: "text",
223
+ text: `Notification settings updated: ${args.scope} scope saved.`,
224
+ },
225
+ ],
226
+ };
227
+ }
228
+ if (args.action === "delete") {
229
+ // Fresh key per call so delete → re-add → delete within the server's
230
+ // 60-min idempotency TTL doesn't replay the original delete response.
231
+ const idemKey = idempotencyKey(`notif:delete:${args.scope}:${Date.now()}`);
232
+ try {
233
+ await client.delete(path, idemKey, extra.signal);
234
+ }
235
+ catch (error) {
236
+ if (error instanceof ApiError) {
237
+ if (error.status === 403) {
238
+ return {
239
+ content: [
240
+ {
241
+ type: "text",
242
+ text: "Forbidden: admin role required to delete notification settings.",
243
+ },
244
+ ],
245
+ isError: true,
246
+ };
247
+ }
248
+ throw error;
249
+ }
250
+ else {
251
+ throw error;
252
+ }
253
+ }
254
+ return {
255
+ content: [
256
+ {
257
+ type: "text",
258
+ text: `Notification settings cleared: ${args.scope} scope removed.`,
259
+ },
260
+ ],
261
+ };
262
+ }
263
+ if (args.action === "test") {
264
+ // Fresh key per invocation so tests always fire (not idempotent by intent).
265
+ const testPath = "/notifications/webhooks/test";
266
+ const idemKey = idempotencyKey(`notif:test:webhooks:${args.body.url}:${Date.now()}`);
267
+ try {
268
+ const { body } = await client.post(testPath, args.body, idemKey, extra.signal);
269
+ return {
270
+ content: [
271
+ {
272
+ type: "text",
273
+ text: `Webhook test result:\n${JSON.stringify(body, null, 2)}`,
274
+ },
275
+ ],
276
+ };
277
+ }
278
+ catch (error) {
279
+ if (error instanceof ApiError && error.status === 403) {
280
+ return {
281
+ content: [
282
+ {
283
+ type: "text",
284
+ text: "Forbidden: admin role required to test webhooks.",
285
+ },
286
+ ],
287
+ isError: true,
288
+ };
289
+ }
290
+ throw error;
291
+ }
292
+ }
293
+ // Exhaustiveness guard — if a new action is added to the DU without
294
+ // handler coverage, throw rather than silently misroute.
295
+ const unreachable = args;
296
+ throw new Error(`Unhandled action: ${JSON.stringify(unreachable)}`);
297
+ }
298
+ catch (error) {
299
+ return {
300
+ content: [
301
+ {
302
+ type: "text",
303
+ text: `Failed to manage notification settings: ${error instanceof Error ? error.message : String(error)}`,
304
+ },
305
+ ],
306
+ isError: true,
307
+ };
308
+ }
309
+ });
310
+ }
311
+ //# sourceMappingURL=manage-notification-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage-notification-settings.js","sourceRoot":"","sources":["../../src/tools/manage-notification-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type ApiClient } from "../api-client.js";
3
+ export declare function registerPauseWebsiteTool(server: McpServer, client: ApiClient): void;
4
+ //# sourceMappingURL=pause-website.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause-website.d.ts","sourceRoot":"","sources":["../../src/tools/pause-website.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE5E,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,GAChB,IAAI,CAwEN"}
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { ApiError, idempotencyKey } from "../api-client.js";
3
+ export function registerPauseWebsiteTool(server, client) {
4
+ server.registerTool("checkview_pause_website", {
5
+ description: "Pause all scheduled tests on a website. Tests will not run until resumed.",
6
+ inputSchema: {
7
+ website_id: z.string().uuid().describe("The website ID to pause"),
8
+ },
9
+ annotations: {
10
+ readOnlyHint: false,
11
+ destructiveHint: false,
12
+ idempotentHint: true,
13
+ },
14
+ }, async (args, extra) => {
15
+ try {
16
+ const idemKey = idempotencyKey(`pause:website:${args.website_id}`);
17
+ let response;
18
+ try {
19
+ response = await client.post(`/websites/${args.website_id}/pause`, undefined, idemKey, extra.signal);
20
+ }
21
+ catch (error) {
22
+ if (error instanceof ApiError) {
23
+ if (error.status === 404) {
24
+ return {
25
+ content: [{ type: "text", text: "Website not found." }],
26
+ isError: true,
27
+ };
28
+ }
29
+ if (error.isReplay && error.status >= 400) {
30
+ const freshKey = idempotencyKey(`pause:website:${args.website_id}:${Date.now()}`);
31
+ response = await client.post(`/websites/${args.website_id}/pause`, undefined, freshKey, extra.signal);
32
+ }
33
+ else {
34
+ throw error;
35
+ }
36
+ }
37
+ else {
38
+ throw error;
39
+ }
40
+ }
41
+ return {
42
+ content: [{ type: "text", text: response.body.message }],
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `Failed to pause website: ${error instanceof Error ? error.message : String(error)}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=pause-website.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause-website.js","sourceRoot":"","sources":["../../src/tools/pause-website.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAC;AAE5E,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,MAAiB;IAEjB,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EACT,2EAA2E;QAC7E,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SAClE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,iBAAiB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YAEnE,IAAI,QAAyD,CAAC;YAC9D,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAC1B,aAAa,IAAI,CAAC,UAAU,QAAQ,EACpC,SAAS,EACT,OAAO,EACP,KAAK,CAAC,MAAM,CACb,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;oBAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBACzB,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;4BACvD,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBACD,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;wBAC1C,MAAM,QAAQ,GAAG,cAAc,CAC7B,iBAAiB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CACjD,CAAC;wBACF,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAI1B,aAAa,IAAI,CAAC,UAAU,QAAQ,EACpC,SAAS,EACT,QAAQ,EACR,KAAK,CAAC,MAAM,CACb,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aACzD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type ApiClient } from "../api-client.js";
3
+ export declare function registerRegenerateTestStepsTool(server: McpServer, client: ApiClient): void;
4
+ //# sourceMappingURL=regenerate-test-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regenerate-test-steps.d.ts","sourceRoot":"","sources":["../../src/tools/regenerate-test-steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAwB5E,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,GAChB,IAAI,CA4KN"}
@@ -0,0 +1,173 @@
1
+ import { createHash } from "node:crypto";
2
+ import stringify from "json-stable-stringify";
3
+ import { z } from "zod";
4
+ import { ApiError, idempotencyKey } from "../api-client.js";
5
+ /**
6
+ * Build a stable deterministic hash of the inputs that materially affect a
7
+ * regeneration. Without this in the idempotency key, two consecutive edits
8
+ * with different `user_context` would collide on the same key (everything
9
+ * else equal) and the second call would silently replay the first response.
10
+ */
11
+ function buildInputHash(args) {
12
+ const canonical = stringify({
13
+ user_context: args.user_context ?? null,
14
+ test_type: args.test_type ?? null,
15
+ merge: args.merge ?? false,
16
+ });
17
+ return createHash("sha256")
18
+ .update(canonical ?? "")
19
+ .digest("hex")
20
+ .slice(0, 12);
21
+ }
22
+ export function registerRegenerateTestStepsTool(server, client) {
23
+ server.registerTool("checkview_regenerate_test_steps", {
24
+ description: "Trigger AI-powered regeneration of test steps for an existing test flow. " +
25
+ "By default (`merge: false`), incoming fields replace saved values — this clears any saved `user_context`. " +
26
+ "Pass `merge: true` to **preserve omitted fields** and **shallow-merge** `user_context` with the saved context — " +
27
+ "this is the right mode when editing an existing flow's prompt or credentials. " +
28
+ "Allowed `user_context` keys: `prompt`, `message`, `username`, `password`. " +
29
+ "In merge mode, empty string for `prompt` or `message` clears the saved value; " +
30
+ "for `username`/`password`, empty string preserves the saved value (use a non-empty value to replace). " +
31
+ "Each value max 2000 characters; aggregate `user_context` max 8000 characters. " +
32
+ "Use `checkview_get_generation_status` to poll progress. " +
33
+ "For form-type test flows where only the form structure changed (same URL), consider `checkview_reinitialize_test_flow` instead.",
34
+ inputSchema: {
35
+ test_flow_id: z
36
+ .string()
37
+ .uuid()
38
+ .describe("The test flow ID to regenerate steps for"),
39
+ url: z
40
+ .string()
41
+ .url()
42
+ .optional()
43
+ .describe("Override URL for step generation. With `merge: true` and omitted, falls back to the saved `mcpCustomUrl`."),
44
+ test_type: z
45
+ .enum([
46
+ "form",
47
+ "login",
48
+ "search",
49
+ "membership",
50
+ "ecommerce",
51
+ "lms",
52
+ "other",
53
+ ])
54
+ .optional()
55
+ .describe("Override the test type for generation. With `merge: true` and omitted, falls back to the saved `mcpTestType`."),
56
+ user_context: z
57
+ .record(z.string(), z.string().max(2000))
58
+ .refine((o) => Object.keys(o).length <= 50, "Maximum 50 keys")
59
+ .optional()
60
+ .describe("Context fields for the AI generator. In merge mode the allowlist is enforced (`prompt`, `message`, `username`, `password`); " +
61
+ "in replace mode unknown keys pass through with a deprecation telemetry log. Max 50 keys, 2000 chars per value."),
62
+ merge: z
63
+ .boolean()
64
+ .optional()
65
+ .describe("Default `false` (replace). Pass `true` to preserve omitted fields and shallow-merge `user_context`."),
66
+ },
67
+ annotations: {
68
+ readOnlyHint: false,
69
+ destructiveHint: true,
70
+ // Idempotency hint flipped from true to false in v1.1.0 because the
71
+ // idempotency-key cache (when keyed only on the URL+type) silently
72
+ // replayed responses across edits with different `user_context`. We
73
+ // now hash the inputs into the key so each distinct edit gets a
74
+ // distinct cache entry, but the operation itself is destructive of
75
+ // saved steps and is not idempotent across edits.
76
+ idempotentHint: false,
77
+ },
78
+ }, async (args, extra) => {
79
+ try {
80
+ const inputHash = buildInputHash({
81
+ user_context: args.user_context,
82
+ test_type: args.test_type,
83
+ merge: args.merge,
84
+ });
85
+ const idemKey = idempotencyKey(`regenerate:${args.test_flow_id}:${args.url ?? ""}:${inputHash}`);
86
+ const body = {};
87
+ if (args.url)
88
+ body.url = args.url;
89
+ if (args.test_type)
90
+ body.testType = args.test_type;
91
+ if (args.user_context)
92
+ body.userContext = args.user_context;
93
+ if (args.merge !== undefined)
94
+ body.merge = args.merge;
95
+ try {
96
+ await client.post(`/test-flows/${args.test_flow_id}/ai-generate`, Object.keys(body).length > 0 ? body : undefined, idemKey, extra.signal);
97
+ }
98
+ catch (error) {
99
+ if (error instanceof ApiError) {
100
+ if (error.status === 404) {
101
+ return {
102
+ content: [{ type: "text", text: "Test flow not found." }],
103
+ isError: true,
104
+ };
105
+ }
106
+ if (error.status === 409) {
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: "Step generation is already in progress for this test flow, or the flow is not in a re-generatable state.",
112
+ },
113
+ ],
114
+ isError: true,
115
+ };
116
+ }
117
+ if (error.status === 400) {
118
+ return {
119
+ content: [
120
+ {
121
+ type: "text",
122
+ text: `Validation error: ${error.message ?? "invalid request"}`,
123
+ },
124
+ ],
125
+ isError: true,
126
+ };
127
+ }
128
+ if (error.status === 502) {
129
+ return {
130
+ content: [
131
+ {
132
+ type: "text",
133
+ text: "Could not start the rebuild — the queue is delayed or a credential write failed. Wait a moment and try again.",
134
+ },
135
+ ],
136
+ isError: true,
137
+ };
138
+ }
139
+ if (error.isReplay && error.status >= 400) {
140
+ const freshKey = idempotencyKey(`regenerate:${args.test_flow_id}:${args.url ?? ""}:${inputHash}:retry:${Date.now()}`);
141
+ await client.post(`/test-flows/${args.test_flow_id}/ai-generate`, Object.keys(body).length > 0 ? body : undefined, freshKey, extra.signal);
142
+ }
143
+ else {
144
+ throw error;
145
+ }
146
+ }
147
+ else {
148
+ throw error;
149
+ }
150
+ }
151
+ return {
152
+ content: [
153
+ {
154
+ type: "text",
155
+ text: `Step generation triggered for test flow ${args.test_flow_id} (mode: ${args.merge ? "merge" : "replace"}).\n\nUse checkview_get_generation_status to track progress.`,
156
+ },
157
+ ],
158
+ };
159
+ }
160
+ catch (error) {
161
+ return {
162
+ content: [
163
+ {
164
+ type: "text",
165
+ text: `Failed to regenerate test steps: ${error instanceof Error ? error.message : String(error)}`,
166
+ },
167
+ ],
168
+ isError: true,
169
+ };
170
+ }
171
+ });
172
+ }
173
+ //# sourceMappingURL=regenerate-test-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regenerate-test-steps.js","sourceRoot":"","sources":["../../src/tools/regenerate-test-steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type ApiClient } from "../api-client.js";
3
+ export declare function registerReinitializeTestFlowTool(server: McpServer, client: ApiClient): void;
4
+ //# sourceMappingURL=reinitialize-test-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reinitialize-test-flow.d.ts","sourceRoot":"","sources":["../../src/tools/reinitialize-test-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQ5E,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,GAChB,IAAI,CA0FN"}