vanta-auditor-api-sdk 0.1.1 → 0.3.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 (321) hide show
  1. package/.devcontainer/README.md +5 -0
  2. package/.devcontainer/devcontainer.json +45 -0
  3. package/FUNCTIONS.md +5 -22
  4. package/README.md +157 -58
  5. package/bin/mcp-server.js +39200 -0
  6. package/bin/mcp-server.js.map +322 -0
  7. package/docs/sdks/auditors/README.md +7 -11
  8. package/docs/sdks/audits/README.md +71 -102
  9. package/examples/README.md +31 -0
  10. package/examples/auditsList.example.ts +26 -0
  11. package/examples/package-lock.json +626 -0
  12. package/examples/package.json +18 -0
  13. package/funcs/auditorsCreate.d.ts +4 -2
  14. package/funcs/auditorsCreate.d.ts.map +1 -1
  15. package/funcs/auditorsCreate.js +17 -9
  16. package/funcs/auditorsCreate.js.map +1 -1
  17. package/funcs/auditsCreateCommentForEvidence.d.ts +4 -2
  18. package/funcs/auditsCreateCommentForEvidence.d.ts.map +1 -1
  19. package/funcs/auditsCreateCommentForEvidence.js +17 -9
  20. package/funcs/auditsCreateCommentForEvidence.js.map +1 -1
  21. package/funcs/auditsCreateCustomControl.d.ts +4 -2
  22. package/funcs/auditsCreateCustomControl.d.ts.map +1 -1
  23. package/funcs/auditsCreateCustomControl.js +17 -9
  24. package/funcs/auditsCreateCustomControl.js.map +1 -1
  25. package/funcs/auditsCreateCustomEvidenceRequest.d.ts +4 -2
  26. package/funcs/auditsCreateCustomEvidenceRequest.d.ts.map +1 -1
  27. package/funcs/auditsCreateCustomEvidenceRequest.js +17 -9
  28. package/funcs/auditsCreateCustomEvidenceRequest.js.map +1 -1
  29. package/funcs/auditsGetEvidenceUrls.d.ts +6 -3
  30. package/funcs/auditsGetEvidenceUrls.d.ts.map +1 -1
  31. package/funcs/auditsGetEvidenceUrls.js +19 -10
  32. package/funcs/auditsGetEvidenceUrls.js.map +1 -1
  33. package/funcs/auditsList.d.ts +4 -2
  34. package/funcs/auditsList.d.ts.map +1 -1
  35. package/funcs/auditsList.js +18 -9
  36. package/funcs/auditsList.js.map +1 -1
  37. package/funcs/auditsListComments.d.ts +4 -2
  38. package/funcs/auditsListComments.d.ts.map +1 -1
  39. package/funcs/auditsListComments.js +17 -9
  40. package/funcs/auditsListComments.js.map +1 -1
  41. package/funcs/auditsListControls.d.ts +4 -2
  42. package/funcs/auditsListControls.d.ts.map +1 -1
  43. package/funcs/auditsListControls.js +17 -9
  44. package/funcs/auditsListControls.js.map +1 -1
  45. package/funcs/auditsListEvidence.d.ts +4 -2
  46. package/funcs/auditsListEvidence.d.ts.map +1 -1
  47. package/funcs/auditsListEvidence.js +17 -9
  48. package/funcs/auditsListEvidence.js.map +1 -1
  49. package/funcs/auditsUpdateEvidence.d.ts +4 -2
  50. package/funcs/auditsUpdateEvidence.d.ts.map +1 -1
  51. package/funcs/auditsUpdateEvidence.js +17 -9
  52. package/funcs/auditsUpdateEvidence.js.map +1 -1
  53. package/hooks/types.d.ts +4 -1
  54. package/hooks/types.d.ts.map +1 -1
  55. package/index.d.ts +2 -0
  56. package/index.d.ts.map +1 -1
  57. package/index.js +3 -1
  58. package/index.js.map +1 -1
  59. package/jsr.json +27 -0
  60. package/lib/config.d.ts +11 -7
  61. package/lib/config.d.ts.map +1 -1
  62. package/lib/config.js +14 -3
  63. package/lib/config.js.map +1 -1
  64. package/lib/encodings.d.ts +10 -9
  65. package/lib/encodings.d.ts.map +1 -1
  66. package/lib/encodings.js +73 -47
  67. package/lib/encodings.js.map +1 -1
  68. package/lib/files.d.ts +5 -0
  69. package/lib/files.d.ts.map +1 -1
  70. package/lib/files.js +41 -0
  71. package/lib/files.js.map +1 -1
  72. package/lib/matchers.d.ts +6 -11
  73. package/lib/matchers.d.ts.map +1 -1
  74. package/lib/matchers.js +45 -31
  75. package/lib/matchers.js.map +1 -1
  76. package/lib/primitives.d.ts +4 -0
  77. package/lib/primitives.d.ts.map +1 -1
  78. package/lib/primitives.js +17 -0
  79. package/lib/primitives.js.map +1 -1
  80. package/lib/retries.js +0 -1
  81. package/lib/retries.js.map +1 -1
  82. package/lib/schemas.d.ts +1 -1
  83. package/lib/schemas.d.ts.map +1 -1
  84. package/lib/schemas.js +4 -1
  85. package/lib/schemas.js.map +1 -1
  86. package/lib/sdks.d.ts +5 -2
  87. package/lib/sdks.d.ts.map +1 -1
  88. package/lib/sdks.js +21 -24
  89. package/lib/sdks.js.map +1 -1
  90. package/lib/security.d.ts +6 -5
  91. package/lib/security.d.ts.map +1 -1
  92. package/lib/security.js +6 -1
  93. package/lib/security.js.map +1 -1
  94. package/mcp-server/build.d.mts.map +1 -0
  95. package/mcp-server/build.mjs +14 -0
  96. package/mcp-server/build.mjs.map +1 -0
  97. package/mcp-server/cli/start/command.d.ts +2 -0
  98. package/mcp-server/cli/start/command.d.ts.map +1 -0
  99. package/mcp-server/cli/start/command.js +126 -0
  100. package/mcp-server/cli/start/command.js.map +1 -0
  101. package/mcp-server/cli/start/impl.d.ts +16 -0
  102. package/mcp-server/cli/start/impl.d.ts.map +1 -0
  103. package/mcp-server/cli/start/impl.js +102 -0
  104. package/mcp-server/cli/start/impl.js.map +1 -0
  105. package/mcp-server/cli.d.ts +6 -0
  106. package/mcp-server/cli.d.ts.map +1 -0
  107. package/mcp-server/cli.js +10 -0
  108. package/mcp-server/cli.js.map +1 -0
  109. package/mcp-server/console-logger.d.ts +7 -0
  110. package/mcp-server/console-logger.d.ts.map +1 -0
  111. package/mcp-server/console-logger.js +59 -0
  112. package/mcp-server/console-logger.js.map +1 -0
  113. package/mcp-server/extensions.d.ts +11 -0
  114. package/mcp-server/extensions.d.ts.map +1 -0
  115. package/mcp-server/extensions.js +6 -0
  116. package/mcp-server/extensions.js.map +1 -0
  117. package/mcp-server/mcp-server.d.ts +2 -0
  118. package/mcp-server/mcp-server.d.ts.map +1 -0
  119. package/mcp-server/mcp-server.js +29 -0
  120. package/mcp-server/mcp-server.js.map +1 -0
  121. package/mcp-server/prompts.d.ts +26 -0
  122. package/mcp-server/prompts.d.ts.map +1 -0
  123. package/mcp-server/prompts.js +51 -0
  124. package/mcp-server/prompts.js.map +1 -0
  125. package/mcp-server/resources.d.ts +32 -0
  126. package/mcp-server/resources.d.ts.map +1 -0
  127. package/mcp-server/resources.js +87 -0
  128. package/mcp-server/resources.js.map +1 -0
  129. package/mcp-server/scopes.d.ts +3 -0
  130. package/mcp-server/scopes.d.ts.map +1 -0
  131. package/mcp-server/scopes.js +8 -0
  132. package/mcp-server/scopes.js.map +1 -0
  133. package/mcp-server/server.d.ts +13 -0
  134. package/mcp-server/server.d.ts.map +1 -0
  135. package/mcp-server/server.js +52 -0
  136. package/mcp-server/server.js.map +1 -0
  137. package/mcp-server/shared.d.ts +7 -0
  138. package/mcp-server/shared.d.ts.map +1 -0
  139. package/mcp-server/shared.js +98 -0
  140. package/mcp-server/shared.js.map +1 -0
  141. package/mcp-server/tools/auditorsCreate.d.ts +8 -0
  142. package/mcp-server/tools/auditorsCreate.d.ts.map +1 -0
  143. package/mcp-server/tools/auditorsCreate.js +64 -0
  144. package/mcp-server/tools/auditorsCreate.js.map +1 -0
  145. package/mcp-server/tools/auditsCreateCommentForEvidence.d.ts +8 -0
  146. package/mcp-server/tools/auditsCreateCommentForEvidence.d.ts.map +1 -0
  147. package/mcp-server/tools/auditsCreateCommentForEvidence.js +64 -0
  148. package/mcp-server/tools/auditsCreateCommentForEvidence.js.map +1 -0
  149. package/mcp-server/tools/auditsCreateCustomControl.d.ts +8 -0
  150. package/mcp-server/tools/auditsCreateCustomControl.d.ts.map +1 -0
  151. package/mcp-server/tools/auditsCreateCustomControl.js +64 -0
  152. package/mcp-server/tools/auditsCreateCustomControl.js.map +1 -0
  153. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.d.ts +8 -0
  154. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.d.ts.map +1 -0
  155. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.js +64 -0
  156. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.js.map +1 -0
  157. package/mcp-server/tools/auditsGetEvidenceUrls.d.ts +8 -0
  158. package/mcp-server/tools/auditsGetEvidenceUrls.d.ts.map +1 -0
  159. package/mcp-server/tools/auditsGetEvidenceUrls.js +65 -0
  160. package/mcp-server/tools/auditsGetEvidenceUrls.js.map +1 -0
  161. package/mcp-server/tools/auditsList.d.ts +8 -0
  162. package/mcp-server/tools/auditsList.d.ts.map +1 -0
  163. package/mcp-server/tools/auditsList.js +64 -0
  164. package/mcp-server/tools/auditsList.js.map +1 -0
  165. package/mcp-server/tools/auditsListComments.d.ts +8 -0
  166. package/mcp-server/tools/auditsListComments.d.ts.map +1 -0
  167. package/mcp-server/tools/auditsListComments.js +64 -0
  168. package/mcp-server/tools/auditsListComments.js.map +1 -0
  169. package/mcp-server/tools/auditsListControls.d.ts +8 -0
  170. package/mcp-server/tools/auditsListControls.d.ts.map +1 -0
  171. package/mcp-server/tools/auditsListControls.js +64 -0
  172. package/mcp-server/tools/auditsListControls.js.map +1 -0
  173. package/mcp-server/tools/auditsListEvidence.d.ts +8 -0
  174. package/mcp-server/tools/auditsListEvidence.d.ts.map +1 -0
  175. package/mcp-server/tools/auditsListEvidence.js +64 -0
  176. package/mcp-server/tools/auditsListEvidence.js.map +1 -0
  177. package/mcp-server/tools/auditsUpdateEvidence.d.ts +8 -0
  178. package/mcp-server/tools/auditsUpdateEvidence.d.ts.map +1 -0
  179. package/mcp-server/tools/auditsUpdateEvidence.js +64 -0
  180. package/mcp-server/tools/auditsUpdateEvidence.js.map +1 -0
  181. package/mcp-server/tools.d.ts +25 -0
  182. package/mcp-server/tools.d.ts.map +1 -0
  183. package/mcp-server/tools.js +82 -0
  184. package/mcp-server/tools.js.map +1 -0
  185. package/models/components/audit.d.ts +5 -2
  186. package/models/components/audit.d.ts.map +1 -1
  187. package/models/components/audit.js +5 -2
  188. package/models/components/audit.js.map +1 -1
  189. package/models/components/auditfocus.d.ts +28 -0
  190. package/models/components/auditfocus.d.ts.map +1 -0
  191. package/models/components/auditfocus.js +61 -0
  192. package/models/components/auditfocus.js.map +1 -0
  193. package/models/components/auditorcontrol.d.ts +14 -2
  194. package/models/components/auditorcontrol.d.ts.map +1 -1
  195. package/models/components/auditorcontrol.js +8 -2
  196. package/models/components/auditorcontrol.js.map +1 -1
  197. package/models/components/auditorenabledstatetransition.d.ts +3 -0
  198. package/models/components/auditorenabledstatetransition.d.ts.map +1 -1
  199. package/models/components/auditorenabledstatetransition.js +1 -0
  200. package/models/components/auditorenabledstatetransition.js.map +1 -1
  201. package/models/components/comment.d.ts +5 -0
  202. package/models/components/comment.d.ts.map +1 -1
  203. package/models/components/comment.js +2 -0
  204. package/models/components/comment.js.map +1 -1
  205. package/models/components/control.d.ts +8 -2
  206. package/models/components/control.d.ts.map +1 -1
  207. package/models/components/control.js +5 -2
  208. package/models/components/control.js.map +1 -1
  209. package/models/components/createcustomevidencerequestinput.d.ts +5 -0
  210. package/models/components/createcustomevidencerequestinput.d.ts.map +1 -1
  211. package/models/components/createcustomevidencerequestinput.js +2 -0
  212. package/models/components/createcustomevidencerequestinput.js.map +1 -1
  213. package/models/components/customfield.d.ts +52 -0
  214. package/models/components/customfield.d.ts.map +1 -0
  215. package/models/components/customfield.js +95 -0
  216. package/models/components/customfield.js.map +1 -0
  217. package/models/components/index.d.ts +3 -0
  218. package/models/components/index.d.ts.map +1 -1
  219. package/models/components/index.js +3 -0
  220. package/models/components/index.js.map +1 -1
  221. package/models/components/section.d.ts +37 -0
  222. package/models/components/section.d.ts.map +1 -0
  223. package/models/components/section.js +71 -0
  224. package/models/components/section.js.map +1 -0
  225. package/models/errors/apierror.d.ts +8 -6
  226. package/models/errors/apierror.d.ts.map +1 -1
  227. package/models/errors/apierror.js +23 -10
  228. package/models/errors/apierror.js.map +1 -1
  229. package/models/errors/index.d.ts +1 -0
  230. package/models/errors/index.d.ts.map +1 -1
  231. package/models/errors/index.js +1 -0
  232. package/models/errors/index.js.map +1 -1
  233. package/models/errors/responsevalidationerror.d.ts +26 -0
  234. package/models/errors/responsevalidationerror.d.ts.map +1 -0
  235. package/models/errors/responsevalidationerror.js +66 -0
  236. package/models/errors/responsevalidationerror.js.map +1 -0
  237. package/models/errors/sdkvalidationerror.d.ts +1 -0
  238. package/models/errors/sdkvalidationerror.d.ts.map +1 -1
  239. package/models/errors/sdkvalidationerror.js +14 -0
  240. package/models/errors/sdkvalidationerror.js.map +1 -1
  241. package/models/errors/vantaerror.d.ts +19 -0
  242. package/models/errors/vantaerror.d.ts.map +1 -0
  243. package/models/errors/vantaerror.js +20 -0
  244. package/models/errors/vantaerror.js.map +1 -0
  245. package/models/operations/listaudits.d.ts +5 -0
  246. package/models/operations/listaudits.d.ts.map +1 -1
  247. package/models/operations/listaudits.js +2 -0
  248. package/models/operations/listaudits.js.map +1 -1
  249. package/package.json +27 -10
  250. package/sdk/audits.d.ts +2 -1
  251. package/sdk/audits.d.ts.map +1 -1
  252. package/sdk/audits.js +2 -1
  253. package/sdk/audits.js.map +1 -1
  254. package/src/funcs/auditorsCreate.ts +58 -22
  255. package/src/funcs/auditsCreateCommentForEvidence.ts +58 -22
  256. package/src/funcs/auditsCreateCustomControl.ts +58 -22
  257. package/src/funcs/auditsCreateCustomEvidenceRequest.ts +58 -22
  258. package/src/funcs/auditsGetEvidenceUrls.ts +60 -23
  259. package/src/funcs/auditsList.ts +59 -22
  260. package/src/funcs/auditsListComments.ts +58 -22
  261. package/src/funcs/auditsListControls.ts +58 -22
  262. package/src/funcs/auditsListEvidence.ts +58 -22
  263. package/src/funcs/auditsUpdateEvidence.ts +58 -22
  264. package/src/hooks/types.ts +4 -1
  265. package/src/index.ts +2 -0
  266. package/src/lib/config.ts +21 -6
  267. package/src/lib/encodings.ts +95 -61
  268. package/src/lib/files.ts +43 -1
  269. package/src/lib/matchers.ts +64 -41
  270. package/src/lib/primitives.ts +28 -0
  271. package/src/lib/retries.ts +0 -1
  272. package/src/lib/schemas.ts +5 -0
  273. package/src/lib/sdks.ts +35 -25
  274. package/src/lib/security.ts +12 -5
  275. package/src/mcp-server/cli/start/command.ts +94 -0
  276. package/src/mcp-server/cli/start/impl.ts +130 -0
  277. package/src/mcp-server/cli.ts +13 -0
  278. package/src/mcp-server/console-logger.ts +71 -0
  279. package/src/mcp-server/extensions.ts +17 -0
  280. package/src/mcp-server/mcp-server.ts +26 -0
  281. package/src/mcp-server/prompts.ts +117 -0
  282. package/src/mcp-server/resources.ts +172 -0
  283. package/src/mcp-server/scopes.ts +7 -0
  284. package/src/mcp-server/server.ts +79 -0
  285. package/src/mcp-server/shared.ts +75 -0
  286. package/src/mcp-server/tools/auditorsCreate.ts +37 -0
  287. package/src/mcp-server/tools/auditsCreateCommentForEvidence.ts +38 -0
  288. package/src/mcp-server/tools/auditsCreateCustomControl.ts +37 -0
  289. package/src/mcp-server/tools/auditsCreateCustomEvidenceRequest.ts +39 -0
  290. package/src/mcp-server/tools/auditsGetEvidenceUrls.ts +38 -0
  291. package/src/mcp-server/tools/auditsList.ts +37 -0
  292. package/src/mcp-server/tools/auditsListComments.ts +37 -0
  293. package/src/mcp-server/tools/auditsListControls.ts +37 -0
  294. package/src/mcp-server/tools/auditsListEvidence.ts +37 -0
  295. package/src/mcp-server/tools/auditsUpdateEvidence.ts +37 -0
  296. package/src/mcp-server/tools.ts +129 -0
  297. package/src/models/components/audit.ts +13 -4
  298. package/src/models/components/auditfocus.ts +31 -0
  299. package/src/models/components/auditorcontrol.ts +30 -4
  300. package/src/models/components/auditorenabledstatetransition.ts +1 -0
  301. package/src/models/components/comment.ts +9 -0
  302. package/src/models/components/control.ts +17 -4
  303. package/src/models/components/createcustomevidencerequestinput.ts +7 -0
  304. package/src/models/components/customfield.ts +109 -0
  305. package/src/models/components/index.ts +3 -0
  306. package/src/models/components/section.ts +69 -0
  307. package/src/models/errors/apierror.ts +29 -16
  308. package/src/models/errors/index.ts +1 -0
  309. package/src/models/errors/responsevalidationerror.ts +50 -0
  310. package/src/models/errors/sdkvalidationerror.ts +12 -0
  311. package/src/models/errors/vantaerror.ts +35 -0
  312. package/src/models/operations/listaudits.ts +7 -0
  313. package/src/sdk/audits.ts +2 -1
  314. package/src/types/async.ts +68 -0
  315. package/src/types/constdatetime.ts +1 -1
  316. package/tsconfig.json +41 -0
  317. package/types/async.d.ts +23 -0
  318. package/types/async.d.ts.map +1 -0
  319. package/types/async.js +44 -0
  320. package/types/async.js.map +1 -0
  321. package/types/constdatetime.js +1 -1
@@ -0,0 +1,117 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
7
+ import { GetPromptResult } from "@modelcontextprotocol/sdk/types.js";
8
+ import {
9
+ objectOutputType,
10
+ ZodOptional,
11
+ ZodType,
12
+ ZodTypeAny,
13
+ ZodTypeDef,
14
+ } from "zod";
15
+ import { VantaCore } from "../core.js";
16
+ import { ConsoleLogger } from "./console-logger.js";
17
+ import { MCPScope } from "./scopes.js";
18
+
19
+ // '@modelcontextprotocol/sdk' currently does not export this type
20
+ export type PromptArgsRawShape = {
21
+ [k: string]:
22
+ | ZodType<string, ZodTypeDef, string>
23
+ | ZodOptional<ZodType<string, ZodTypeDef, string>>;
24
+ };
25
+
26
+ export type PromptDefinition<
27
+ Args extends undefined | PromptArgsRawShape = undefined,
28
+ > = Args extends PromptArgsRawShape ? {
29
+ name: string;
30
+ description?: string;
31
+ scopes?: MCPScope[];
32
+ args: Args;
33
+ prompt: (
34
+ client: VantaCore,
35
+ args: objectOutputType<Args, ZodTypeAny>,
36
+ extra: RequestHandlerExtra,
37
+ ) => GetPromptResult | Promise<GetPromptResult>;
38
+ }
39
+ : {
40
+ name: string;
41
+ description?: string;
42
+ scopes?: MCPScope[];
43
+ args?: undefined;
44
+ prompt: (
45
+ client: VantaCore,
46
+ extra: RequestHandlerExtra,
47
+ ) => GetPromptResult | Promise<GetPromptResult>;
48
+ };
49
+
50
+ // Optional function to assist with formatting prompt results
51
+ export async function formatResult(value: string): Promise<GetPromptResult> {
52
+ return {
53
+ messages: [
54
+ {
55
+ role: "user",
56
+ content: {
57
+ type: "text",
58
+ text: value,
59
+ },
60
+ },
61
+ ],
62
+ };
63
+ }
64
+
65
+ export function createRegisterPrompt(
66
+ logger: ConsoleLogger,
67
+ server: McpServer,
68
+ sdk: VantaCore,
69
+ allowedScopes: Set<MCPScope>,
70
+ ): <A extends PromptArgsRawShape | undefined>(
71
+ prompt: PromptDefinition<A>,
72
+ ) => void {
73
+ return <A extends PromptArgsRawShape | undefined>(
74
+ prompt: PromptDefinition<A>,
75
+ ): void => {
76
+ const scopes = prompt.scopes ?? [];
77
+ if (allowedScopes.size > 0 && scopes.length === 0) {
78
+ return;
79
+ }
80
+
81
+ if (
82
+ allowedScopes.size > 0
83
+ && !scopes.every((s: MCPScope) => allowedScopes.has(s))
84
+ ) {
85
+ return;
86
+ }
87
+
88
+ if (prompt.args) {
89
+ if (prompt.description) {
90
+ server.prompt(
91
+ prompt.name,
92
+ prompt.description,
93
+ prompt.args,
94
+ async (args, ctx) => prompt.prompt(sdk, args, ctx),
95
+ );
96
+ } else {
97
+ server.prompt(
98
+ prompt.name,
99
+ prompt.args,
100
+ async (args, ctx) => prompt.prompt(sdk, args, ctx),
101
+ );
102
+ }
103
+ } else {
104
+ if (prompt.description) {
105
+ server.prompt(
106
+ prompt.name,
107
+ prompt.description,
108
+ async (ctx) => prompt.prompt(sdk, ctx),
109
+ );
110
+ } else {
111
+ server.prompt(prompt.name, async (ctx) => prompt.prompt(sdk, ctx));
112
+ }
113
+ }
114
+
115
+ logger.debug("Registered prompt", { name: prompt.name });
116
+ };
117
+ }
@@ -0,0 +1,172 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import {
6
+ McpServer,
7
+ ResourceMetadata,
8
+ ResourceTemplate,
9
+ } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
11
+ import { Variables } from "@modelcontextprotocol/sdk/shared/uriTemplate.js";
12
+ import { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
13
+ import { VantaCore } from "../core.js";
14
+ import { ConsoleLogger } from "./console-logger.js";
15
+ import { MCPScope } from "./scopes.js";
16
+ import { isAsyncIterable, isBinaryData, valueToBase64 } from "./shared.js";
17
+
18
+ export type ReadResourceCallback = (
19
+ client: VantaCore,
20
+ uri: URL,
21
+ extra: RequestHandlerExtra,
22
+ ) => ReadResourceResult | Promise<ReadResourceResult>;
23
+
24
+ export type ResourceDefinition = {
25
+ name: string;
26
+ description?: string;
27
+ metadata?: ResourceMetadata;
28
+ scopes?: MCPScope[];
29
+ resource: string;
30
+ read: ReadResourceCallback;
31
+ };
32
+
33
+ export type ReadResourceTemplateCallback = (
34
+ client: VantaCore,
35
+ uri: URL,
36
+ vars: Variables,
37
+ extra: RequestHandlerExtra,
38
+ ) => ReadResourceResult | Promise<ReadResourceResult>;
39
+
40
+ export type ResourceTemplateDefinition = {
41
+ name: string;
42
+ description: string;
43
+ metadata?: ResourceMetadata;
44
+ scopes?: MCPScope[];
45
+ resource: ResourceTemplate;
46
+ read: ReadResourceTemplateCallback;
47
+ };
48
+
49
+ // Optional function to assist with formatting resource results
50
+ export async function formatResult(
51
+ value: unknown,
52
+ uri: URL,
53
+ init: { mimeType?: string | undefined; response?: Response | undefined },
54
+ ): Promise<ReadResourceResult> {
55
+ if (typeof value === "undefined") {
56
+ return { contents: [] };
57
+ }
58
+
59
+ let contents: ReadResourceResult["contents"] = [];
60
+
61
+ const mimeType = init.mimeType ?? init.response?.headers.get("content-type")
62
+ ?? "";
63
+
64
+ if (mimeType.search(/\bjson\b/g) !== -1) {
65
+ contents = [{ uri: uri.toString(), mimeType, text: JSON.stringify(value) }];
66
+ } else if (
67
+ mimeType.startsWith("text/event-stream")
68
+ && isAsyncIterable(value)
69
+ ) {
70
+ contents = [
71
+ {
72
+ uri: uri.toString(),
73
+ mimeType: "application/json",
74
+ text: await stringifySSEToJSON(value),
75
+ },
76
+ ];
77
+ } else if (
78
+ (mimeType.startsWith("text/") || mimeType.startsWith("application/"))
79
+ && typeof value === "string"
80
+ ) {
81
+ contents = [{ uri: uri.toString(), mimeType, text: value }];
82
+ } else if (isBinaryData(value)) {
83
+ const blob = await valueToBase64(value);
84
+ contents = blob == null ? [] : [{ uri: uri.toString(), blob, mimeType }];
85
+ } else {
86
+ throw new Error(`Unsupported content type: "${mimeType}"`);
87
+ }
88
+
89
+ return { contents };
90
+ }
91
+
92
+ async function stringifySSEToJSON(
93
+ value: AsyncIterable<unknown>,
94
+ ): Promise<string> {
95
+ const payloads = [];
96
+
97
+ for await (const chunk of value) {
98
+ payloads.push(chunk);
99
+ }
100
+
101
+ return JSON.stringify(payloads);
102
+ }
103
+
104
+ export function createRegisterResource(
105
+ logger: ConsoleLogger,
106
+ server: McpServer,
107
+ sdk: VantaCore,
108
+ allowedScopes: Set<MCPScope>,
109
+ ): (resource: ResourceDefinition) => void {
110
+ return (resource: ResourceDefinition): void => {
111
+ const scopes = resource.scopes ?? [];
112
+ if (allowedScopes.size > 0 && scopes.length === 0) {
113
+ return;
114
+ }
115
+
116
+ if (
117
+ allowedScopes.size > 0
118
+ && !scopes.every((s: MCPScope) => allowedScopes.has(s))
119
+ ) {
120
+ return;
121
+ }
122
+
123
+ const metadata: ResourceMetadata = {
124
+ ...resource.metadata,
125
+ description: resource.description,
126
+ };
127
+
128
+ server.resource(
129
+ resource.name,
130
+ resource.resource,
131
+ metadata,
132
+ async (uri, ctx) => resource.read(sdk, uri, ctx),
133
+ );
134
+
135
+ logger.debug("Registered resource", { name: resource.name });
136
+ };
137
+ }
138
+
139
+ export function createRegisterResourceTemplate(
140
+ logger: ConsoleLogger,
141
+ server: McpServer,
142
+ sdk: VantaCore,
143
+ allowedScopes: Set<MCPScope>,
144
+ ): (resource: ResourceTemplateDefinition) => void {
145
+ return (resource: ResourceTemplateDefinition): void => {
146
+ const scopes = resource.scopes ?? [];
147
+ if (allowedScopes.size > 0 && scopes.length === 0) {
148
+ return;
149
+ }
150
+
151
+ if (
152
+ allowedScopes.size > 0
153
+ && !scopes.every((s: MCPScope) => allowedScopes.has(s))
154
+ ) {
155
+ return;
156
+ }
157
+
158
+ const metadata: ResourceMetadata = {
159
+ ...resource.metadata,
160
+ description: resource.description,
161
+ };
162
+
163
+ server.resource(
164
+ resource.name,
165
+ resource.resource,
166
+ metadata,
167
+ async (uri, vars, ctx) => resource.read(sdk, uri, vars, ctx),
168
+ );
169
+
170
+ logger.debug("Registered resource template", { name: resource.name });
171
+ };
172
+ }
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ export const mcpScopes = [] as const;
6
+
7
+ export type MCPScope = (typeof mcpScopes)[number];
@@ -0,0 +1,79 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { VantaCore } from "../core.js";
7
+ import { SDKOptions } from "../lib/config.js";
8
+ import type { ConsoleLogger } from "./console-logger.js";
9
+ import { createRegisterPrompt } from "./prompts.js";
10
+ import {
11
+ createRegisterResource,
12
+ createRegisterResourceTemplate,
13
+ } from "./resources.js";
14
+ import { MCPScope } from "./scopes.js";
15
+ import { createRegisterTool } from "./tools.js";
16
+ import { tool$auditorsCreate } from "./tools/auditorsCreate.js";
17
+ import { tool$auditsCreateCommentForEvidence } from "./tools/auditsCreateCommentForEvidence.js";
18
+ import { tool$auditsCreateCustomControl } from "./tools/auditsCreateCustomControl.js";
19
+ import { tool$auditsCreateCustomEvidenceRequest } from "./tools/auditsCreateCustomEvidenceRequest.js";
20
+ import { tool$auditsGetEvidenceUrls } from "./tools/auditsGetEvidenceUrls.js";
21
+ import { tool$auditsList } from "./tools/auditsList.js";
22
+ import { tool$auditsListComments } from "./tools/auditsListComments.js";
23
+ import { tool$auditsListControls } from "./tools/auditsListControls.js";
24
+ import { tool$auditsListEvidence } from "./tools/auditsListEvidence.js";
25
+ import { tool$auditsUpdateEvidence } from "./tools/auditsUpdateEvidence.js";
26
+
27
+ export function createMCPServer(deps: {
28
+ logger: ConsoleLogger;
29
+ allowedTools?: string[] | undefined;
30
+ scopes?: MCPScope[] | undefined;
31
+ serverURL?: string | undefined;
32
+ bearerAuth?: SDKOptions["bearerAuth"] | undefined;
33
+ serverIdx?: SDKOptions["serverIdx"] | undefined;
34
+ }) {
35
+ const server = new McpServer({
36
+ name: "Vanta",
37
+ version: "0.3.0",
38
+ });
39
+
40
+ const client = new VantaCore({
41
+ bearerAuth: deps.bearerAuth,
42
+ serverURL: deps.serverURL,
43
+ serverIdx: deps.serverIdx,
44
+ });
45
+
46
+ const scopes = new Set(deps.scopes);
47
+
48
+ const allowedTools = deps.allowedTools && new Set(deps.allowedTools);
49
+ const tool = createRegisterTool(
50
+ deps.logger,
51
+ server,
52
+ client,
53
+ scopes,
54
+ allowedTools,
55
+ );
56
+ const resource = createRegisterResource(deps.logger, server, client, scopes);
57
+ const resourceTemplate = createRegisterResourceTemplate(
58
+ deps.logger,
59
+ server,
60
+ client,
61
+ scopes,
62
+ );
63
+ const prompt = createRegisterPrompt(deps.logger, server, client, scopes);
64
+ const register = { tool, resource, resourceTemplate, prompt };
65
+ void register; // suppress unused warnings
66
+
67
+ tool(tool$auditsList);
68
+ tool(tool$auditsGetEvidenceUrls);
69
+ tool(tool$auditsListEvidence);
70
+ tool(tool$auditsListComments);
71
+ tool(tool$auditsListControls);
72
+ tool(tool$auditsCreateCommentForEvidence);
73
+ tool(tool$auditsUpdateEvidence);
74
+ tool(tool$auditsCreateCustomEvidenceRequest);
75
+ tool(tool$auditsCreateCustomControl);
76
+ tool(tool$auditorsCreate);
77
+
78
+ return server;
79
+ }
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import * as z from "zod";
6
+ import { bytesToBase64 } from "../lib/base64.js";
7
+
8
+ type BinaryData =
9
+ | Uint8Array
10
+ | ArrayBuffer
11
+ | Blob
12
+ | ReadableStream
13
+ | Response
14
+ | string;
15
+
16
+ export async function consumeStream(
17
+ stream: ReadableStream<Uint8Array>,
18
+ ): Promise<Uint8Array> {
19
+ const reader = stream.getReader();
20
+ const chunks: Uint8Array[] = [];
21
+
22
+ try {
23
+ while (true) {
24
+ const { done, value } = await reader.read();
25
+ if (value != null) chunks.push(value);
26
+ if (done) break;
27
+ }
28
+ } finally {
29
+ reader.releaseLock();
30
+ }
31
+
32
+ return new Uint8Array(await new Blob(chunks).arrayBuffer());
33
+ }
34
+
35
+ export function isAsyncIterable(
36
+ value: unknown,
37
+ ): value is AsyncIterable<string> {
38
+ return (
39
+ typeof value === "object" && value != null && Symbol.asyncIterator in value
40
+ );
41
+ }
42
+
43
+ export function isBinaryData(value: unknown): value is BinaryData {
44
+ return (
45
+ value instanceof Uint8Array
46
+ || value instanceof ArrayBuffer
47
+ || value instanceof Blob
48
+ || value instanceof ReadableStream
49
+ || value instanceof Response
50
+ || typeof value === "string"
51
+ );
52
+ }
53
+
54
+ const base64Schema = z.string().base64();
55
+
56
+ export async function valueToBase64(
57
+ value: BinaryData | null | undefined,
58
+ ): Promise<string | null> {
59
+ if (value == null) {
60
+ return null;
61
+ } else if (value instanceof Uint8Array) {
62
+ return bytesToBase64(value);
63
+ } else if (value instanceof ArrayBuffer) {
64
+ return bytesToBase64(new Uint8Array(value));
65
+ } else if (value instanceof Response || value instanceof Blob) {
66
+ return bytesToBase64(new Uint8Array(await value.arrayBuffer()));
67
+ } else if (value instanceof ReadableStream) {
68
+ return bytesToBase64(await consumeStream(value));
69
+ } else if (typeof value === "string") {
70
+ return base64Schema.parse(value);
71
+ } else {
72
+ value satisfies never;
73
+ throw new Error(`Unsupported image value type: ${typeof value}`);
74
+ }
75
+ }
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditorsCreate } from "../../funcs/auditorsCreate.js";
6
+ import * as components from "../../models/components/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: components.AddAuditorInput$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditorsCreate: ToolDefinition<typeof args> = {
14
+ name: "auditors-create",
15
+ description: `Create an auditor
16
+
17
+ Create an auditor in Vanta.`,
18
+ args,
19
+ tool: async (client, args, ctx) => {
20
+ const [result, apiCall] = await auditorsCreate(
21
+ client,
22
+ args.request,
23
+ { fetchOptions: { signal: ctx.signal } },
24
+ ).$inspect();
25
+
26
+ if (!result.ok) {
27
+ return {
28
+ content: [{ type: "text", text: result.error.message }],
29
+ isError: true,
30
+ };
31
+ }
32
+
33
+ const value = result.value;
34
+
35
+ return formatResult(value, apiCall);
36
+ },
37
+ };
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditsCreateCommentForEvidence } from "../../funcs/auditsCreateCommentForEvidence.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.CreateCommentForAuditEvidenceRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditsCreateCommentForEvidence: ToolDefinition<typeof args> =
14
+ {
15
+ name: "audits-create-comment-for-evidence",
16
+ description: `Create a comment for audit evidence
17
+
18
+ Create a comment in Vanta for a piece of evidence.`,
19
+ args,
20
+ tool: async (client, args, ctx) => {
21
+ const [result, apiCall] = await auditsCreateCommentForEvidence(
22
+ client,
23
+ args.request,
24
+ { fetchOptions: { signal: ctx.signal } },
25
+ ).$inspect();
26
+
27
+ if (!result.ok) {
28
+ return {
29
+ content: [{ type: "text", text: result.error.message }],
30
+ isError: true,
31
+ };
32
+ }
33
+
34
+ const value = result.value;
35
+
36
+ return formatResult(value, apiCall);
37
+ },
38
+ };
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditsCreateCustomControl } from "../../funcs/auditsCreateCustomControl.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.CreateCustomControlRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditsCreateCustomControl: ToolDefinition<typeof args> = {
14
+ name: "audits-create-custom-control",
15
+ description: `Create a custom control for an audit
16
+
17
+ Create a custom control for an audit.`,
18
+ args,
19
+ tool: async (client, args, ctx) => {
20
+ const [result, apiCall] = await auditsCreateCustomControl(
21
+ client,
22
+ args.request,
23
+ { fetchOptions: { signal: ctx.signal } },
24
+ ).$inspect();
25
+
26
+ if (!result.ok) {
27
+ return {
28
+ content: [{ type: "text", text: result.error.message }],
29
+ isError: true,
30
+ };
31
+ }
32
+
33
+ const value = result.value;
34
+
35
+ return formatResult(value, apiCall);
36
+ },
37
+ };
@@ -0,0 +1,39 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditsCreateCustomEvidenceRequest } from "../../funcs/auditsCreateCustomEvidenceRequest.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.CreateCustomEvidenceRequestRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditsCreateCustomEvidenceRequest: ToolDefinition<
14
+ typeof args
15
+ > = {
16
+ name: "audits-create-custom-evidence-request",
17
+ description: `Create a custom evidence request for an audit
18
+
19
+ Create a custom evidence request for an audit.`,
20
+ args,
21
+ tool: async (client, args, ctx) => {
22
+ const [result, apiCall] = await auditsCreateCustomEvidenceRequest(
23
+ client,
24
+ args.request,
25
+ { fetchOptions: { signal: ctx.signal } },
26
+ ).$inspect();
27
+
28
+ if (!result.ok) {
29
+ return {
30
+ content: [{ type: "text", text: result.error.message }],
31
+ isError: true,
32
+ };
33
+ }
34
+
35
+ const value = result.value;
36
+
37
+ return formatResult(value, apiCall);
38
+ },
39
+ };
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditsGetEvidenceUrls } from "../../funcs/auditsGetEvidenceUrls.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.ListAuditEvidenceUrlsRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditsGetEvidenceUrls: ToolDefinition<typeof args> = {
14
+ name: "audits-get-evidence-urls",
15
+ description: `List audit evidence url
16
+
17
+ Returns a paginated list of evidence urls for an audit. This endpoint should be called whenever an
18
+ evidence is created or has a statusUpdatedAt field that is more recent than the most recent polling event.`,
19
+ args,
20
+ tool: async (client, args, ctx) => {
21
+ const [result, apiCall] = await auditsGetEvidenceUrls(
22
+ client,
23
+ args.request,
24
+ { fetchOptions: { signal: ctx.signal } },
25
+ ).$inspect();
26
+
27
+ if (!result.ok) {
28
+ return {
29
+ content: [{ type: "text", text: result.error.message }],
30
+ isError: true,
31
+ };
32
+ }
33
+
34
+ const value = result.value;
35
+
36
+ return formatResult(value, apiCall);
37
+ },
38
+ };
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { auditsList } from "../../funcs/auditsList.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.ListAuditsRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$auditsList: ToolDefinition<typeof args> = {
14
+ name: "audits-list",
15
+ description: `List audits
16
+
17
+ Returns a paginated list of audits scoped to the audit firm.`,
18
+ args,
19
+ tool: async (client, args, ctx) => {
20
+ const [result, apiCall] = await auditsList(
21
+ client,
22
+ args.request,
23
+ { fetchOptions: { signal: ctx.signal } },
24
+ ).$inspect();
25
+
26
+ if (!result.ok) {
27
+ return {
28
+ content: [{ type: "text", text: result.error.message }],
29
+ isError: true,
30
+ };
31
+ }
32
+
33
+ const value = result.value;
34
+
35
+ return formatResult(value, apiCall);
36
+ },
37
+ };