@burdenoff/mcp-libs 2026.511.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 (174) hide show
  1. package/README.md +76 -0
  2. package/dist/chunk-4GBVJ4OY.js +847 -0
  3. package/dist/chunk-4GBVJ4OY.js.map +1 -0
  4. package/dist/chunk-H2OYWLOA.js +919 -0
  5. package/dist/chunk-H2OYWLOA.js.map +1 -0
  6. package/dist/chunk-JFEQYSWM.js +174 -0
  7. package/dist/chunk-JFEQYSWM.js.map +1 -0
  8. package/dist/chunk-WWFVD7BO.js +273 -0
  9. package/dist/chunk-WWFVD7BO.js.map +1 -0
  10. package/dist/context-1jV4NsLv.d.cts +138 -0
  11. package/dist/context-1jV4NsLv.d.ts +138 -0
  12. package/dist/core/index.cjs +953 -0
  13. package/dist/core/index.cjs.map +1 -0
  14. package/dist/core/index.d.cts +59 -0
  15. package/dist/core/index.d.ts +59 -0
  16. package/dist/core/index.js +3 -0
  17. package/dist/core/index.js.map +1 -0
  18. package/dist/http-BP4c721D.d.cts +22 -0
  19. package/dist/http-DXTeCD5r.d.ts +22 -0
  20. package/dist/index.cjs +1013 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +7 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.js +4 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/module-DBcfA-i3.d.ts +67 -0
  27. package/dist/module-DFQBZNK6.d.cts +67 -0
  28. package/dist/modules/auth/index.cjs +533 -0
  29. package/dist/modules/auth/index.cjs.map +1 -0
  30. package/dist/modules/auth/index.d.cts +51 -0
  31. package/dist/modules/auth/index.d.ts +51 -0
  32. package/dist/modules/auth/index.js +159 -0
  33. package/dist/modules/auth/index.js.map +1 -0
  34. package/dist/modules/billing/index.cjs +655 -0
  35. package/dist/modules/billing/index.cjs.map +1 -0
  36. package/dist/modules/billing/index.d.cts +8 -0
  37. package/dist/modules/billing/index.d.ts +8 -0
  38. package/dist/modules/billing/index.js +606 -0
  39. package/dist/modules/billing/index.js.map +1 -0
  40. package/dist/modules/channels/index.cjs +443 -0
  41. package/dist/modules/channels/index.cjs.map +1 -0
  42. package/dist/modules/channels/index.d.cts +8 -0
  43. package/dist/modules/channels/index.d.ts +8 -0
  44. package/dist/modules/channels/index.js +394 -0
  45. package/dist/modules/channels/index.js.map +1 -0
  46. package/dist/modules/conversations/index.cjs +288 -0
  47. package/dist/modules/conversations/index.cjs.map +1 -0
  48. package/dist/modules/conversations/index.d.cts +8 -0
  49. package/dist/modules/conversations/index.d.ts +8 -0
  50. package/dist/modules/conversations/index.js +239 -0
  51. package/dist/modules/conversations/index.js.map +1 -0
  52. package/dist/modules/devportal/index.cjs +796 -0
  53. package/dist/modules/devportal/index.cjs.map +1 -0
  54. package/dist/modules/devportal/index.d.cts +8 -0
  55. package/dist/modules/devportal/index.d.ts +8 -0
  56. package/dist/modules/devportal/index.js +747 -0
  57. package/dist/modules/devportal/index.js.map +1 -0
  58. package/dist/modules/export/index.cjs +333 -0
  59. package/dist/modules/export/index.cjs.map +1 -0
  60. package/dist/modules/export/index.d.cts +8 -0
  61. package/dist/modules/export/index.d.ts +8 -0
  62. package/dist/modules/export/index.js +284 -0
  63. package/dist/modules/export/index.js.map +1 -0
  64. package/dist/modules/files/index.cjs +278 -0
  65. package/dist/modules/files/index.cjs.map +1 -0
  66. package/dist/modules/files/index.d.cts +8 -0
  67. package/dist/modules/files/index.d.ts +8 -0
  68. package/dist/modules/files/index.js +229 -0
  69. package/dist/modules/files/index.js.map +1 -0
  70. package/dist/modules/groups/index.cjs +451 -0
  71. package/dist/modules/groups/index.cjs.map +1 -0
  72. package/dist/modules/groups/index.d.cts +8 -0
  73. package/dist/modules/groups/index.d.ts +8 -0
  74. package/dist/modules/groups/index.js +402 -0
  75. package/dist/modules/groups/index.js.map +1 -0
  76. package/dist/modules/health/index.cjs +159 -0
  77. package/dist/modules/health/index.cjs.map +1 -0
  78. package/dist/modules/health/index.d.cts +8 -0
  79. package/dist/modules/health/index.d.ts +8 -0
  80. package/dist/modules/health/index.js +36 -0
  81. package/dist/modules/health/index.js.map +1 -0
  82. package/dist/modules/integrations/index.cjs +316 -0
  83. package/dist/modules/integrations/index.cjs.map +1 -0
  84. package/dist/modules/integrations/index.d.cts +8 -0
  85. package/dist/modules/integrations/index.d.ts +8 -0
  86. package/dist/modules/integrations/index.js +267 -0
  87. package/dist/modules/integrations/index.js.map +1 -0
  88. package/dist/modules/notifications/index.cjs +222 -0
  89. package/dist/modules/notifications/index.cjs.map +1 -0
  90. package/dist/modules/notifications/index.d.cts +8 -0
  91. package/dist/modules/notifications/index.d.ts +8 -0
  92. package/dist/modules/notifications/index.js +173 -0
  93. package/dist/modules/notifications/index.js.map +1 -0
  94. package/dist/modules/organizations/index.cjs +267 -0
  95. package/dist/modules/organizations/index.cjs.map +1 -0
  96. package/dist/modules/organizations/index.d.cts +8 -0
  97. package/dist/modules/organizations/index.d.ts +8 -0
  98. package/dist/modules/organizations/index.js +218 -0
  99. package/dist/modules/organizations/index.js.map +1 -0
  100. package/dist/modules/products/index.cjs +736 -0
  101. package/dist/modules/products/index.cjs.map +1 -0
  102. package/dist/modules/products/index.d.cts +8 -0
  103. package/dist/modules/products/index.d.ts +8 -0
  104. package/dist/modules/products/index.js +687 -0
  105. package/dist/modules/products/index.js.map +1 -0
  106. package/dist/modules/rbac/index.cjs +378 -0
  107. package/dist/modules/rbac/index.cjs.map +1 -0
  108. package/dist/modules/rbac/index.d.cts +8 -0
  109. package/dist/modules/rbac/index.d.ts +8 -0
  110. package/dist/modules/rbac/index.js +329 -0
  111. package/dist/modules/rbac/index.js.map +1 -0
  112. package/dist/modules/sandbox/index.cjs +318 -0
  113. package/dist/modules/sandbox/index.cjs.map +1 -0
  114. package/dist/modules/sandbox/index.d.cts +8 -0
  115. package/dist/modules/sandbox/index.d.ts +8 -0
  116. package/dist/modules/sandbox/index.js +225 -0
  117. package/dist/modules/sandbox/index.js.map +1 -0
  118. package/dist/modules/scheduler/index.cjs +267 -0
  119. package/dist/modules/scheduler/index.cjs.map +1 -0
  120. package/dist/modules/scheduler/index.d.cts +8 -0
  121. package/dist/modules/scheduler/index.d.ts +8 -0
  122. package/dist/modules/scheduler/index.js +218 -0
  123. package/dist/modules/scheduler/index.js.map +1 -0
  124. package/dist/modules/security/index.cjs +529 -0
  125. package/dist/modules/security/index.cjs.map +1 -0
  126. package/dist/modules/security/index.d.cts +8 -0
  127. package/dist/modules/security/index.d.ts +8 -0
  128. package/dist/modules/security/index.js +480 -0
  129. package/dist/modules/security/index.js.map +1 -0
  130. package/dist/modules/store/index.cjs +450 -0
  131. package/dist/modules/store/index.cjs.map +1 -0
  132. package/dist/modules/store/index.d.cts +8 -0
  133. package/dist/modules/store/index.d.ts +8 -0
  134. package/dist/modules/store/index.js +401 -0
  135. package/dist/modules/store/index.js.map +1 -0
  136. package/dist/modules/support/index.cjs +285 -0
  137. package/dist/modules/support/index.cjs.map +1 -0
  138. package/dist/modules/support/index.d.cts +8 -0
  139. package/dist/modules/support/index.d.ts +8 -0
  140. package/dist/modules/support/index.js +236 -0
  141. package/dist/modules/support/index.js.map +1 -0
  142. package/dist/modules/tags/index.cjs +421 -0
  143. package/dist/modules/tags/index.cjs.map +1 -0
  144. package/dist/modules/tags/index.d.cts +8 -0
  145. package/dist/modules/tags/index.d.ts +8 -0
  146. package/dist/modules/tags/index.js +372 -0
  147. package/dist/modules/tags/index.js.map +1 -0
  148. package/dist/modules/tours/index.cjs +225 -0
  149. package/dist/modules/tours/index.cjs.map +1 -0
  150. package/dist/modules/tours/index.d.cts +8 -0
  151. package/dist/modules/tours/index.d.ts +8 -0
  152. package/dist/modules/tours/index.js +176 -0
  153. package/dist/modules/tours/index.js.map +1 -0
  154. package/dist/modules/vibecontrols/index.cjs +5551 -0
  155. package/dist/modules/vibecontrols/index.cjs.map +1 -0
  156. package/dist/modules/vibecontrols/index.d.cts +8 -0
  157. package/dist/modules/vibecontrols/index.d.ts +8 -0
  158. package/dist/modules/vibecontrols/index.js +4380 -0
  159. package/dist/modules/vibecontrols/index.js.map +1 -0
  160. package/dist/modules/workspaces/index.cjs +552 -0
  161. package/dist/modules/workspaces/index.cjs.map +1 -0
  162. package/dist/modules/workspaces/index.d.cts +8 -0
  163. package/dist/modules/workspaces/index.d.ts +8 -0
  164. package/dist/modules/workspaces/index.js +503 -0
  165. package/dist/modules/workspaces/index.js.map +1 -0
  166. package/dist/tool-name-CQf_IqAj.d.cts +47 -0
  167. package/dist/tool-name-DlnrBsZ6.d.ts +47 -0
  168. package/dist/transports/index.cjs +183 -0
  169. package/dist/transports/index.cjs.map +1 -0
  170. package/dist/transports/index.d.cts +13 -0
  171. package/dist/transports/index.d.ts +13 -0
  172. package/dist/transports/index.js +3 -0
  173. package/dist/transports/index.js.map +1 -0
  174. package/package.json +125 -0
@@ -0,0 +1,480 @@
1
+ import { mcpToolName, errorResult, jsonResult } from '../../chunk-H2OYWLOA.js';
2
+ import { z } from 'zod';
3
+
4
+ // src/modules/security/operations.ts
5
+ var GET_VAULTS = `
6
+ query GetVaults($filter: VaultFilterInput, $pagination: SecurityPaginationInput) {
7
+ getVaults(filter: $filter, pagination: $pagination) {
8
+ items { id name description scope status createdAt }
9
+ total hasMore
10
+ }
11
+ }
12
+ `;
13
+ var GET_VAULT = `
14
+ query GetVault($id: ID!) {
15
+ getVault(id: $id) {
16
+ id name description scope scopeId status lockAfterMinutes createdAt updatedAt
17
+ }
18
+ }
19
+ `;
20
+ var CREATE_VAULT = `
21
+ mutation CreateVault($input: CreateVaultInput!) {
22
+ createVault(input: $input) {
23
+ id name scope scopeId status
24
+ }
25
+ }
26
+ `;
27
+ var DELETE_VAULT = `
28
+ mutation DeleteVault($id: ID!) {
29
+ deleteVault(id: $id)
30
+ }
31
+ `;
32
+ var ARCHIVE_VAULT = `
33
+ mutation ArchiveVault($id: ID!) {
34
+ archiveVault(id: $id) { id status }
35
+ }
36
+ `;
37
+ var GET_SECRETS = `
38
+ query GetSecrets($vaultId: ID!, $filter: SecretFilterInput, $pagination: SecurityPaginationInput) {
39
+ getSecrets(vaultId: $vaultId, filter: $filter, pagination: $pagination) {
40
+ items { id key name description type status isEphemeral createdAt }
41
+ total hasMore
42
+ }
43
+ }
44
+ `;
45
+ var GET_SECRET = `
46
+ query GetSecret($id: ID!) {
47
+ getSecret(id: $id) {
48
+ id key name description type status isEphemeral expiresAt createdAt updatedAt
49
+ }
50
+ }
51
+ `;
52
+ var DECRYPT_SECRET = `
53
+ query DecryptSecret($id: ID!) {
54
+ decryptSecret(id: $id) {
55
+ id key value
56
+ }
57
+ }
58
+ `;
59
+ var CREATE_SECRET = `
60
+ mutation CreateSecret($input: CreateSecretInput!) {
61
+ createSecret(input: $input) {
62
+ id key name type status
63
+ }
64
+ }
65
+ `;
66
+ var UPDATE_SECRET = `
67
+ mutation UpdateSecret($id: ID!, $input: UpdateSecretInput!) {
68
+ updateSecret(id: $id, input: $input) {
69
+ id key name status updatedAt
70
+ }
71
+ }
72
+ `;
73
+ var DELETE_SECRET = `
74
+ mutation DeleteSecret($id: ID!) {
75
+ deleteSecret(id: $id)
76
+ }
77
+ `;
78
+ var ROTATE_SECRET = `
79
+ mutation RotateSecret($id: ID!, $newValue: String!) {
80
+ rotateSecret(id: $id, newValue: $newValue) {
81
+ id key updatedAt
82
+ }
83
+ }
84
+ `;
85
+
86
+ // src/modules/security/tools.ts
87
+ var VaultScopeEnum = z.enum(["WORKSPACE", "GLOBAL", "VIBE"]);
88
+ var VaultStatusEnum = z.enum(["ACTIVE", "LOCKED", "ARCHIVED"]);
89
+ var SecretTypeEnum = z.enum(["API_KEY", "PASSWORD", "CERTIFICATE", "TOKEN", "OTHER"]);
90
+ var SecretStatusEnum = z.enum(["ACTIVE", "EXPIRED", "REVOKED"]);
91
+ function readWorkspaceContext(ctx) {
92
+ const auth = ctx.auth.read();
93
+ if (!auth?.workspaceId) return null;
94
+ return { workspaceId: auth.workspaceId };
95
+ }
96
+ function registerSecurityTools(server, ctx, track) {
97
+ server.registerTool(
98
+ track(mcpToolName(ctx.productName, "security_vaults_list")),
99
+ {
100
+ title: "List Vaults",
101
+ description: "List vaults in the current workspace with optional filters and pagination.",
102
+ inputSchema: {
103
+ scope: VaultScopeEnum.optional().describe("Filter by vault scope"),
104
+ status: VaultStatusEnum.optional().describe("Filter by status"),
105
+ search: z.string().optional().describe("Free-text search"),
106
+ limit: z.number().optional().describe("Page size (default 50)"),
107
+ offset: z.number().optional().describe("Skip results")
108
+ }
109
+ },
110
+ async ({ scope, status, search, limit, offset }) => {
111
+ try {
112
+ const workspaceCtx = readWorkspaceContext(ctx);
113
+ if (!workspaceCtx) {
114
+ return errorResult(
115
+ "No active workspace. Bind a workspace via the auth login flow first."
116
+ );
117
+ }
118
+ const filter = { context: workspaceCtx };
119
+ if (scope !== void 0) filter.scope = scope;
120
+ if (status !== void 0) filter.status = status;
121
+ if (search !== void 0) filter.search = search;
122
+ const pagination = {};
123
+ if (limit !== void 0) pagination.limit = limit;
124
+ if (offset !== void 0) pagination.offset = offset;
125
+ const data = await ctx.gql.workspace.request(GET_VAULTS, {
126
+ filter,
127
+ pagination: Object.keys(pagination).length > 0 ? pagination : void 0
128
+ });
129
+ return jsonResult(data.getVaults);
130
+ } catch (error) {
131
+ ctx.logger.error("security_vaults_list failed", { error });
132
+ return errorResult(
133
+ `Failed to list vaults: ${error instanceof Error ? error.message : String(error)}`
134
+ );
135
+ }
136
+ }
137
+ );
138
+ server.registerTool(
139
+ track(mcpToolName(ctx.productName, "security_vaults_get")),
140
+ {
141
+ title: "Get Vault",
142
+ description: "Get a vault by ID.",
143
+ inputSchema: {
144
+ id: z.string().describe("Vault ID")
145
+ }
146
+ },
147
+ async ({ id }) => {
148
+ try {
149
+ const data = await ctx.gql.workspace.request(GET_VAULT, {
150
+ id
151
+ });
152
+ if (!data.getVault) {
153
+ return errorResult(`Vault ${id} not found`);
154
+ }
155
+ return jsonResult(data.getVault);
156
+ } catch (error) {
157
+ ctx.logger.error("security_vaults_get failed", { error });
158
+ return errorResult(
159
+ `Failed to get vault: ${error instanceof Error ? error.message : String(error)}`
160
+ );
161
+ }
162
+ }
163
+ );
164
+ server.registerTool(
165
+ track(mcpToolName(ctx.productName, "security_vaults_create")),
166
+ {
167
+ title: "Create Vault",
168
+ description: "Create a new vault scoped to the current workspace.",
169
+ inputSchema: {
170
+ name: z.string().describe("Vault name"),
171
+ description: z.string().optional().describe("Vault description"),
172
+ scope: VaultScopeEnum.optional().describe("Vault scope (default: WORKSPACE)"),
173
+ scopeId: z.string().optional().describe("Scope ID (defaults to current workspace ID when scope is WORKSPACE)"),
174
+ lockAfterMinutes: z.number().optional().describe("Auto-lock after N minutes of inactivity")
175
+ }
176
+ },
177
+ async ({ name, description, scope, scopeId, lockAfterMinutes }) => {
178
+ try {
179
+ const workspaceCtx = readWorkspaceContext(ctx);
180
+ if (!workspaceCtx) {
181
+ return errorResult(
182
+ "No active workspace. Bind a workspace via the auth login flow first."
183
+ );
184
+ }
185
+ const resolvedScope = scope ?? "WORKSPACE";
186
+ const input = {
187
+ context: workspaceCtx,
188
+ name,
189
+ scope: resolvedScope,
190
+ scopeId: scopeId ?? workspaceCtx.workspaceId
191
+ };
192
+ if (description !== void 0) input.description = description;
193
+ if (lockAfterMinutes !== void 0) input.lockAfterMinutes = lockAfterMinutes;
194
+ const data = await ctx.gql.workspace.request(CREATE_VAULT, {
195
+ input
196
+ });
197
+ return jsonResult(data.createVault);
198
+ } catch (error) {
199
+ ctx.logger.error("security_vaults_create failed", { error });
200
+ return errorResult(
201
+ `Failed to create vault: ${error instanceof Error ? error.message : String(error)}`
202
+ );
203
+ }
204
+ }
205
+ );
206
+ server.registerTool(
207
+ track(mcpToolName(ctx.productName, "security_vaults_delete")),
208
+ {
209
+ title: "Delete Vault",
210
+ description: "Delete a vault. Set archive=true to soft-archive instead of permanently deleting.",
211
+ inputSchema: {
212
+ id: z.string().describe("Vault ID"),
213
+ archive: z.boolean().optional().describe("Archive instead of hard delete")
214
+ }
215
+ },
216
+ async ({ id, archive }) => {
217
+ try {
218
+ if (archive === true) {
219
+ const data2 = await ctx.gql.workspace.request(ARCHIVE_VAULT, { id });
220
+ return jsonResult({ archived: true, vault: data2.archiveVault });
221
+ }
222
+ const data = await ctx.gql.workspace.request(DELETE_VAULT, {
223
+ id
224
+ });
225
+ return jsonResult({ deleted: data.deleteVault, vaultId: id });
226
+ } catch (error) {
227
+ ctx.logger.error("security_vaults_delete failed", { error });
228
+ return errorResult(
229
+ `Failed to delete vault: ${error instanceof Error ? error.message : String(error)}`
230
+ );
231
+ }
232
+ }
233
+ );
234
+ server.registerTool(
235
+ track(mcpToolName(ctx.productName, "security_secrets_list")),
236
+ {
237
+ title: "List Secrets",
238
+ description: "List secrets in a vault with optional filters and pagination.",
239
+ inputSchema: {
240
+ vaultId: z.string().describe("Vault ID"),
241
+ type: SecretTypeEnum.optional().describe("Filter by secret type"),
242
+ search: z.string().optional().describe("Free-text search"),
243
+ limit: z.number().optional().describe("Page size (default 100)"),
244
+ offset: z.number().optional().describe("Skip results")
245
+ }
246
+ },
247
+ async ({ vaultId, type, search, limit, offset }) => {
248
+ try {
249
+ const workspaceCtx = readWorkspaceContext(ctx);
250
+ if (!workspaceCtx) {
251
+ return errorResult(
252
+ "No active workspace. Bind a workspace via the auth login flow first."
253
+ );
254
+ }
255
+ const filter = { context: workspaceCtx };
256
+ if (type !== void 0) filter.type = type;
257
+ if (search !== void 0) filter.search = search;
258
+ const pagination = {};
259
+ if (limit !== void 0) pagination.limit = limit;
260
+ if (offset !== void 0) pagination.offset = offset;
261
+ const data = await ctx.gql.workspace.request(GET_SECRETS, {
262
+ vaultId,
263
+ filter,
264
+ pagination: Object.keys(pagination).length > 0 ? pagination : void 0
265
+ });
266
+ return jsonResult(data.getSecrets);
267
+ } catch (error) {
268
+ ctx.logger.error("security_secrets_list failed", { error });
269
+ return errorResult(
270
+ `Failed to list secrets: ${error instanceof Error ? error.message : String(error)}`
271
+ );
272
+ }
273
+ }
274
+ );
275
+ server.registerTool(
276
+ track(mcpToolName(ctx.productName, "security_secrets_get")),
277
+ {
278
+ title: "Get Secret Metadata",
279
+ description: "Get a secret's metadata. Does NOT decrypt the value \u2014 use security_secrets_reveal for that.",
280
+ inputSchema: {
281
+ id: z.string().describe("Secret ID")
282
+ }
283
+ },
284
+ async ({ id }) => {
285
+ try {
286
+ const data = await ctx.gql.workspace.request(GET_SECRET, {
287
+ id
288
+ });
289
+ if (!data.getSecret) {
290
+ return errorResult(`Secret ${id} not found`);
291
+ }
292
+ return jsonResult(data.getSecret);
293
+ } catch (error) {
294
+ ctx.logger.error("security_secrets_get failed", { error });
295
+ return errorResult(
296
+ `Failed to get secret: ${error instanceof Error ? error.message : String(error)}`
297
+ );
298
+ }
299
+ }
300
+ );
301
+ server.registerTool(
302
+ track(mcpToolName(ctx.productName, "security_secrets_reveal")),
303
+ {
304
+ title: "Reveal Secret Value",
305
+ description: "Decrypt and return the secret value. This action is audited server-side. Treat the result as sensitive and avoid persisting it.",
306
+ inputSchema: {
307
+ id: z.string().describe("Secret ID")
308
+ }
309
+ },
310
+ async ({ id }) => {
311
+ try {
312
+ const data = await ctx.gql.workspace.request(DECRYPT_SECRET, { id });
313
+ return jsonResult(data.decryptSecret);
314
+ } catch (error) {
315
+ ctx.logger.error("security_secrets_reveal failed", { error });
316
+ return errorResult(
317
+ `Failed to reveal secret: ${error instanceof Error ? error.message : String(error)}`
318
+ );
319
+ }
320
+ }
321
+ );
322
+ server.registerTool(
323
+ track(mcpToolName(ctx.productName, "security_secrets_set")),
324
+ {
325
+ title: "Create Secret",
326
+ description: "Create a new secret in a vault. The value is encrypted server-side.",
327
+ inputSchema: {
328
+ vaultId: z.string().describe("Vault ID"),
329
+ key: z.string().describe("Secret key (unique within the vault)"),
330
+ name: z.string().describe("Human-readable secret name"),
331
+ value: z.string().describe("Secret value (will be encrypted server-side)"),
332
+ description: z.string().optional().describe("Secret description"),
333
+ type: SecretTypeEnum.optional().describe("Secret type (default: OTHER)"),
334
+ isEphemeral: z.boolean().optional().describe("Mark as ephemeral"),
335
+ expiresAt: z.string().optional().describe("Expiry timestamp in ISO 8601")
336
+ }
337
+ },
338
+ async ({ vaultId, key, name, value, description, type, isEphemeral, expiresAt }) => {
339
+ try {
340
+ const workspaceCtx = readWorkspaceContext(ctx);
341
+ if (!workspaceCtx) {
342
+ return errorResult(
343
+ "No active workspace. Bind a workspace via the auth login flow first."
344
+ );
345
+ }
346
+ const input = {
347
+ context: workspaceCtx,
348
+ vaultId,
349
+ key,
350
+ name,
351
+ value,
352
+ type: type ?? "OTHER",
353
+ isEphemeral: isEphemeral === true
354
+ };
355
+ if (description !== void 0) input.description = description;
356
+ if (expiresAt !== void 0) input.expiresAt = expiresAt;
357
+ const data = await ctx.gql.workspace.request(CREATE_SECRET, {
358
+ input
359
+ });
360
+ return jsonResult(data.createSecret);
361
+ } catch (error) {
362
+ ctx.logger.error("security_secrets_set failed", { error });
363
+ return errorResult(
364
+ `Failed to create secret: ${error instanceof Error ? error.message : String(error)}`
365
+ );
366
+ }
367
+ }
368
+ );
369
+ server.registerTool(
370
+ track(mcpToolName(ctx.productName, "security_secrets_update")),
371
+ {
372
+ title: "Update Secret Metadata",
373
+ description: "Update secret metadata (name, description, status). To rotate the value, use security_secrets_rotate.",
374
+ inputSchema: {
375
+ id: z.string().describe("Secret ID"),
376
+ name: z.string().optional().describe("Updated name"),
377
+ description: z.string().optional().describe("Updated description"),
378
+ status: SecretStatusEnum.optional().describe("Updated status")
379
+ }
380
+ },
381
+ async ({ id, name, description, status }) => {
382
+ try {
383
+ const workspaceCtx = readWorkspaceContext(ctx);
384
+ if (!workspaceCtx) {
385
+ return errorResult(
386
+ "No active workspace. Bind a workspace via the auth login flow first."
387
+ );
388
+ }
389
+ const input = { context: workspaceCtx };
390
+ if (name !== void 0) input.name = name;
391
+ if (description !== void 0) input.description = description;
392
+ if (status !== void 0) input.status = status;
393
+ if (Object.keys(input).length === 1) {
394
+ return errorResult("No updates specified");
395
+ }
396
+ const data = await ctx.gql.workspace.request(UPDATE_SECRET, {
397
+ id,
398
+ input
399
+ });
400
+ return jsonResult(data.updateSecret);
401
+ } catch (error) {
402
+ ctx.logger.error("security_secrets_update failed", { error });
403
+ return errorResult(
404
+ `Failed to update secret: ${error instanceof Error ? error.message : String(error)}`
405
+ );
406
+ }
407
+ }
408
+ );
409
+ server.registerTool(
410
+ track(mcpToolName(ctx.productName, "security_secrets_rotate")),
411
+ {
412
+ title: "Rotate Secret Value",
413
+ description: "Replace a secret's encrypted value with a new one.",
414
+ inputSchema: {
415
+ id: z.string().describe("Secret ID"),
416
+ newValue: z.string().describe("New secret value")
417
+ }
418
+ },
419
+ async ({ id, newValue }) => {
420
+ try {
421
+ const data = await ctx.gql.workspace.request(ROTATE_SECRET, {
422
+ id,
423
+ newValue
424
+ });
425
+ return jsonResult(data.rotateSecret);
426
+ } catch (error) {
427
+ ctx.logger.error("security_secrets_rotate failed", { error });
428
+ return errorResult(
429
+ `Failed to rotate secret: ${error instanceof Error ? error.message : String(error)}`
430
+ );
431
+ }
432
+ }
433
+ );
434
+ server.registerTool(
435
+ track(mcpToolName(ctx.productName, "security_secrets_delete")),
436
+ {
437
+ title: "Delete Secret",
438
+ description: "Delete a secret by ID.",
439
+ inputSchema: {
440
+ id: z.string().describe("Secret ID")
441
+ }
442
+ },
443
+ async ({ id }) => {
444
+ try {
445
+ const data = await ctx.gql.workspace.request(DELETE_SECRET, {
446
+ id
447
+ });
448
+ return jsonResult({ deleted: data.deleteSecret, secretId: id });
449
+ } catch (error) {
450
+ ctx.logger.error("security_secrets_delete failed", { error });
451
+ return errorResult(
452
+ `Failed to delete secret: ${error instanceof Error ? error.message : String(error)}`
453
+ );
454
+ }
455
+ }
456
+ );
457
+ }
458
+
459
+ // src/modules/security/index.ts
460
+ var securityModule = {
461
+ id: "security",
462
+ version: "0.0.1",
463
+ displayName: "Security",
464
+ dependsOn: ["auth"],
465
+ capabilities: { tools: {} },
466
+ register(server, ctx) {
467
+ const tools = [];
468
+ const track = (n) => {
469
+ tools.push(n);
470
+ return n;
471
+ };
472
+ registerSecurityTools(server, ctx, track);
473
+ return { tools, resources: [], prompts: [] };
474
+ }
475
+ };
476
+ var security_default = securityModule;
477
+
478
+ export { security_default as default };
479
+ //# sourceMappingURL=index.js.map
480
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/security/operations.ts","../../../src/modules/security/tools.ts","../../../src/modules/security/index.ts"],"names":["data"],"mappings":"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","file":"index.js","sourcesContent":["export const GET_VAULTS = `\n query GetVaults($filter: VaultFilterInput, $pagination: SecurityPaginationInput) {\n getVaults(filter: $filter, pagination: $pagination) {\n items { id name description scope status createdAt }\n total hasMore\n }\n }\n`;\n\nexport const GET_VAULT = `\n query GetVault($id: ID!) {\n getVault(id: $id) {\n id name description scope scopeId status lockAfterMinutes createdAt updatedAt\n }\n }\n`;\n\nexport const CREATE_VAULT = `\n mutation CreateVault($input: CreateVaultInput!) {\n createVault(input: $input) {\n id name scope scopeId status\n }\n }\n`;\n\nexport const DELETE_VAULT = `\n mutation DeleteVault($id: ID!) {\n deleteVault(id: $id)\n }\n`;\n\nexport const ARCHIVE_VAULT = `\n mutation ArchiveVault($id: ID!) {\n archiveVault(id: $id) { id status }\n }\n`;\n\nexport const GET_SECRETS = `\n query GetSecrets($vaultId: ID!, $filter: SecretFilterInput, $pagination: SecurityPaginationInput) {\n getSecrets(vaultId: $vaultId, filter: $filter, pagination: $pagination) {\n items { id key name description type status isEphemeral createdAt }\n total hasMore\n }\n }\n`;\n\nexport const GET_SECRET = `\n query GetSecret($id: ID!) {\n getSecret(id: $id) {\n id key name description type status isEphemeral expiresAt createdAt updatedAt\n }\n }\n`;\n\nexport const DECRYPT_SECRET = `\n query DecryptSecret($id: ID!) {\n decryptSecret(id: $id) {\n id key value\n }\n }\n`;\n\nexport const CREATE_SECRET = `\n mutation CreateSecret($input: CreateSecretInput!) {\n createSecret(input: $input) {\n id key name type status\n }\n }\n`;\n\nexport const UPDATE_SECRET = `\n mutation UpdateSecret($id: ID!, $input: UpdateSecretInput!) {\n updateSecret(id: $id, input: $input) {\n id key name status updatedAt\n }\n }\n`;\n\nexport const DELETE_SECRET = `\n mutation DeleteSecret($id: ID!) {\n deleteSecret(id: $id)\n }\n`;\n\nexport const ROTATE_SECRET = `\n mutation RotateSecret($id: ID!, $newValue: String!) {\n rotateSecret(id: $id, newValue: $newValue) {\n id key updatedAt\n }\n }\n`;\n","import { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { jsonResult, errorResult, mcpToolName, type McpContext } from '../../core/index.js';\nimport {\n GET_VAULTS,\n GET_VAULT,\n CREATE_VAULT,\n DELETE_VAULT,\n ARCHIVE_VAULT,\n GET_SECRETS,\n GET_SECRET,\n DECRYPT_SECRET,\n CREATE_SECRET,\n UPDATE_SECRET,\n DELETE_SECRET,\n ROTATE_SECRET,\n} from './operations.js';\n\nconst VaultScopeEnum = z.enum(['WORKSPACE', 'GLOBAL', 'VIBE']);\nconst VaultStatusEnum = z.enum(['ACTIVE', 'LOCKED', 'ARCHIVED']);\nconst SecretTypeEnum = z.enum(['API_KEY', 'PASSWORD', 'CERTIFICATE', 'TOKEN', 'OTHER']);\nconst SecretStatusEnum = z.enum(['ACTIVE', 'EXPIRED', 'REVOKED']);\n\ninterface VaultRow {\n id: string;\n name: string;\n description?: string | null;\n scope?: string;\n scopeId?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n lockAfterMinutes?: number;\n}\n\ninterface SecretRow {\n id: string;\n key: string;\n name: string;\n description?: string | null;\n type?: string;\n status?: string;\n isEphemeral?: boolean;\n expiresAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\nfunction readWorkspaceContext(ctx: McpContext): { workspaceId: string } | null {\n const auth = ctx.auth.read();\n if (!auth?.workspaceId) return null;\n return { workspaceId: auth.workspaceId };\n}\n\nexport function registerSecurityTools(\n server: McpServer,\n ctx: McpContext,\n track: (n: string) => string,\n): void {\n // ── Vaults ─────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_vaults_list')),\n {\n title: 'List Vaults',\n description: 'List vaults in the current workspace with optional filters and pagination.',\n inputSchema: {\n scope: VaultScopeEnum.optional().describe('Filter by vault scope'),\n status: VaultStatusEnum.optional().describe('Filter by status'),\n search: z.string().optional().describe('Free-text search'),\n limit: z.number().optional().describe('Page size (default 50)'),\n offset: z.number().optional().describe('Skip results'),\n },\n },\n async ({ scope, status, search, limit, offset }) => {\n try {\n const workspaceCtx = readWorkspaceContext(ctx);\n if (!workspaceCtx) {\n return errorResult(\n 'No active workspace. Bind a workspace via the auth login flow first.',\n );\n }\n const filter: Record<string, unknown> = { context: workspaceCtx };\n if (scope !== undefined) filter.scope = scope;\n if (status !== undefined) filter.status = status;\n if (search !== undefined) filter.search = search;\n\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const data = await ctx.gql.workspace.request<{\n getVaults: { items: VaultRow[]; total: number; hasMore: boolean };\n }>(GET_VAULTS, {\n filter,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n });\n return jsonResult(data.getVaults);\n } catch (error) {\n ctx.logger.error('security_vaults_list failed', { error });\n return errorResult(\n `Failed to list vaults: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_vaults_get')),\n {\n title: 'Get Vault',\n description: 'Get a vault by ID.',\n inputSchema: {\n id: z.string().describe('Vault ID'),\n },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getVault: VaultRow | null }>(GET_VAULT, {\n id,\n });\n if (!data.getVault) {\n return errorResult(`Vault ${id} not found`);\n }\n return jsonResult(data.getVault);\n } catch (error) {\n ctx.logger.error('security_vaults_get failed', { error });\n return errorResult(\n `Failed to get vault: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_vaults_create')),\n {\n title: 'Create Vault',\n description: 'Create a new vault scoped to the current workspace.',\n inputSchema: {\n name: z.string().describe('Vault name'),\n description: z.string().optional().describe('Vault description'),\n scope: VaultScopeEnum.optional().describe('Vault scope (default: WORKSPACE)'),\n scopeId: z\n .string()\n .optional()\n .describe('Scope ID (defaults to current workspace ID when scope is WORKSPACE)'),\n lockAfterMinutes: z.number().optional().describe('Auto-lock after N minutes of inactivity'),\n },\n },\n async ({ name, description, scope, scopeId, lockAfterMinutes }) => {\n try {\n const workspaceCtx = readWorkspaceContext(ctx);\n if (!workspaceCtx) {\n return errorResult(\n 'No active workspace. Bind a workspace via the auth login flow first.',\n );\n }\n const resolvedScope = scope ?? 'WORKSPACE';\n const input: Record<string, unknown> = {\n context: workspaceCtx,\n name,\n scope: resolvedScope,\n scopeId: scopeId ?? workspaceCtx.workspaceId,\n };\n if (description !== undefined) input.description = description;\n if (lockAfterMinutes !== undefined) input.lockAfterMinutes = lockAfterMinutes;\n\n const data = await ctx.gql.workspace.request<{ createVault: VaultRow }>(CREATE_VAULT, {\n input,\n });\n return jsonResult(data.createVault);\n } catch (error) {\n ctx.logger.error('security_vaults_create failed', { error });\n return errorResult(\n `Failed to create vault: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_vaults_delete')),\n {\n title: 'Delete Vault',\n description:\n 'Delete a vault. Set archive=true to soft-archive instead of permanently deleting.',\n inputSchema: {\n id: z.string().describe('Vault ID'),\n archive: z.boolean().optional().describe('Archive instead of hard delete'),\n },\n },\n async ({ id, archive }) => {\n try {\n if (archive === true) {\n const data = await ctx.gql.workspace.request<{\n archiveVault: { id: string; status: string };\n }>(ARCHIVE_VAULT, { id });\n return jsonResult({ archived: true, vault: data.archiveVault });\n }\n const data = await ctx.gql.workspace.request<{ deleteVault: boolean }>(DELETE_VAULT, {\n id,\n });\n return jsonResult({ deleted: data.deleteVault, vaultId: id });\n } catch (error) {\n ctx.logger.error('security_vaults_delete failed', { error });\n return errorResult(\n `Failed to delete vault: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n // ── Secrets ────────────────────────────────────────────────────────────\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_list')),\n {\n title: 'List Secrets',\n description: 'List secrets in a vault with optional filters and pagination.',\n inputSchema: {\n vaultId: z.string().describe('Vault ID'),\n type: SecretTypeEnum.optional().describe('Filter by secret type'),\n search: z.string().optional().describe('Free-text search'),\n limit: z.number().optional().describe('Page size (default 100)'),\n offset: z.number().optional().describe('Skip results'),\n },\n },\n async ({ vaultId, type, search, limit, offset }) => {\n try {\n const workspaceCtx = readWorkspaceContext(ctx);\n if (!workspaceCtx) {\n return errorResult(\n 'No active workspace. Bind a workspace via the auth login flow first.',\n );\n }\n const filter: Record<string, unknown> = { context: workspaceCtx };\n if (type !== undefined) filter.type = type;\n if (search !== undefined) filter.search = search;\n\n const pagination: Record<string, unknown> = {};\n if (limit !== undefined) pagination.limit = limit;\n if (offset !== undefined) pagination.offset = offset;\n\n const data = await ctx.gql.workspace.request<{\n getSecrets: { items: SecretRow[]; total: number; hasMore: boolean };\n }>(GET_SECRETS, {\n vaultId,\n filter,\n pagination: Object.keys(pagination).length > 0 ? pagination : undefined,\n });\n return jsonResult(data.getSecrets);\n } catch (error) {\n ctx.logger.error('security_secrets_list failed', { error });\n return errorResult(\n `Failed to list secrets: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_get')),\n {\n title: 'Get Secret Metadata',\n description:\n \"Get a secret's metadata. Does NOT decrypt the value — use security_secrets_reveal for that.\",\n inputSchema: {\n id: z.string().describe('Secret ID'),\n },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ getSecret: SecretRow | null }>(GET_SECRET, {\n id,\n });\n if (!data.getSecret) {\n return errorResult(`Secret ${id} not found`);\n }\n return jsonResult(data.getSecret);\n } catch (error) {\n ctx.logger.error('security_secrets_get failed', { error });\n return errorResult(\n `Failed to get secret: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_reveal')),\n {\n title: 'Reveal Secret Value',\n description:\n 'Decrypt and return the secret value. This action is audited server-side. Treat the result as sensitive and avoid persisting it.',\n inputSchema: {\n id: z.string().describe('Secret ID'),\n },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{\n decryptSecret: { id: string; key: string; value: string };\n }>(DECRYPT_SECRET, { id });\n return jsonResult(data.decryptSecret);\n } catch (error) {\n ctx.logger.error('security_secrets_reveal failed', { error });\n return errorResult(\n `Failed to reveal secret: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_set')),\n {\n title: 'Create Secret',\n description: 'Create a new secret in a vault. The value is encrypted server-side.',\n inputSchema: {\n vaultId: z.string().describe('Vault ID'),\n key: z.string().describe('Secret key (unique within the vault)'),\n name: z.string().describe('Human-readable secret name'),\n value: z.string().describe('Secret value (will be encrypted server-side)'),\n description: z.string().optional().describe('Secret description'),\n type: SecretTypeEnum.optional().describe('Secret type (default: OTHER)'),\n isEphemeral: z.boolean().optional().describe('Mark as ephemeral'),\n expiresAt: z.string().optional().describe('Expiry timestamp in ISO 8601'),\n },\n },\n async ({ vaultId, key, name, value, description, type, isEphemeral, expiresAt }) => {\n try {\n const workspaceCtx = readWorkspaceContext(ctx);\n if (!workspaceCtx) {\n return errorResult(\n 'No active workspace. Bind a workspace via the auth login flow first.',\n );\n }\n const input: Record<string, unknown> = {\n context: workspaceCtx,\n vaultId,\n key,\n name,\n value,\n type: type ?? 'OTHER',\n isEphemeral: isEphemeral === true,\n };\n if (description !== undefined) input.description = description;\n if (expiresAt !== undefined) input.expiresAt = expiresAt;\n\n const data = await ctx.gql.workspace.request<{ createSecret: SecretRow }>(CREATE_SECRET, {\n input,\n });\n return jsonResult(data.createSecret);\n } catch (error) {\n ctx.logger.error('security_secrets_set failed', { error });\n return errorResult(\n `Failed to create secret: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_update')),\n {\n title: 'Update Secret Metadata',\n description:\n 'Update secret metadata (name, description, status). To rotate the value, use security_secrets_rotate.',\n inputSchema: {\n id: z.string().describe('Secret ID'),\n name: z.string().optional().describe('Updated name'),\n description: z.string().optional().describe('Updated description'),\n status: SecretStatusEnum.optional().describe('Updated status'),\n },\n },\n async ({ id, name, description, status }) => {\n try {\n const workspaceCtx = readWorkspaceContext(ctx);\n if (!workspaceCtx) {\n return errorResult(\n 'No active workspace. Bind a workspace via the auth login flow first.',\n );\n }\n const input: Record<string, unknown> = { context: workspaceCtx };\n if (name !== undefined) input.name = name;\n if (description !== undefined) input.description = description;\n if (status !== undefined) input.status = status;\n if (Object.keys(input).length === 1) {\n return errorResult('No updates specified');\n }\n const data = await ctx.gql.workspace.request<{ updateSecret: SecretRow }>(UPDATE_SECRET, {\n id,\n input,\n });\n return jsonResult(data.updateSecret);\n } catch (error) {\n ctx.logger.error('security_secrets_update failed', { error });\n return errorResult(\n `Failed to update secret: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_rotate')),\n {\n title: 'Rotate Secret Value',\n description: \"Replace a secret's encrypted value with a new one.\",\n inputSchema: {\n id: z.string().describe('Secret ID'),\n newValue: z.string().describe('New secret value'),\n },\n },\n async ({ id, newValue }) => {\n try {\n const data = await ctx.gql.workspace.request<{ rotateSecret: SecretRow }>(ROTATE_SECRET, {\n id,\n newValue,\n });\n return jsonResult(data.rotateSecret);\n } catch (error) {\n ctx.logger.error('security_secrets_rotate failed', { error });\n return errorResult(\n `Failed to rotate secret: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n\n server.registerTool(\n track(mcpToolName(ctx.productName, 'security_secrets_delete')),\n {\n title: 'Delete Secret',\n description: 'Delete a secret by ID.',\n inputSchema: {\n id: z.string().describe('Secret ID'),\n },\n },\n async ({ id }) => {\n try {\n const data = await ctx.gql.workspace.request<{ deleteSecret: boolean }>(DELETE_SECRET, {\n id,\n });\n return jsonResult({ deleted: data.deleteSecret, secretId: id });\n } catch (error) {\n ctx.logger.error('security_secrets_delete failed', { error });\n return errorResult(\n `Failed to delete secret: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n );\n}\n","/**\n * Security module — workspace vaults & secrets\n * (<product>_security_vaults_{list,get,create,delete},\n * <product>_security_secrets_{list,get,reveal,set,update,rotate,delete}).\n *\n * Backend: ~/products/wspace/security/wspace-security-svc/.\n * Ported from cli-sdk/src/modules/security/. The CLI reads secret values from\n * stdin; in MCP they come in as the `value` / `newValue` tool arguments.\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { McpContext, McpModule, ModuleRegistration } from '../../core/index.js';\nimport { registerSecurityTools } from './tools.js';\n\nconst securityModule: McpModule = {\n id: 'security',\n version: '0.0.1',\n displayName: 'Security',\n dependsOn: ['auth'],\n capabilities: { tools: {} },\n\n register(server: McpServer, ctx: McpContext): ModuleRegistration {\n const tools: string[] = [];\n const track = (n: string): string => {\n tools.push(n);\n return n;\n };\n\n registerSecurityTools(server, ctx, track);\n\n return { tools, resources: [], prompts: [] };\n },\n};\n\nexport default securityModule;\n"]}