@ferrvault/mcp 10.13.0 → 11.0.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 (54) hide show
  1. package/dist/api.d.ts +19 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +32 -0
  4. package/dist/generate.d.ts +9 -0
  5. package/dist/generate.d.ts.map +1 -0
  6. package/dist/generate.js +14 -0
  7. package/dist/register.js +12 -12
  8. package/dist/results.d.ts +13 -0
  9. package/dist/results.d.ts.map +1 -0
  10. package/dist/results.js +33 -0
  11. package/dist/schemas.d.ts +18 -0
  12. package/dist/schemas.d.ts.map +1 -0
  13. package/dist/schemas.js +40 -0
  14. package/dist/secret.d.ts +18 -0
  15. package/dist/secret.d.ts.map +1 -0
  16. package/dist/secret.js +4 -0
  17. package/dist/tools/secret-copy.d.ts +3 -0
  18. package/dist/tools/secret-copy.d.ts.map +1 -0
  19. package/dist/tools/secret-copy.js +33 -0
  20. package/dist/tools/secret-requests.d.ts +3 -0
  21. package/dist/tools/secret-requests.d.ts.map +1 -0
  22. package/dist/tools/secret-requests.js +58 -0
  23. package/dist/tools/secret-writes.d.ts +3 -0
  24. package/dist/tools/secret-writes.d.ts.map +1 -0
  25. package/dist/tools/secret-writes.js +52 -0
  26. package/dist/tools/secrets.d.ts +1 -1
  27. package/dist/tools/secrets.d.ts.map +1 -1
  28. package/dist/tools/secrets.js +21 -29
  29. package/dist/tools/service-tokens.d.ts +3 -0
  30. package/dist/tools/service-tokens.d.ts.map +1 -0
  31. package/dist/tools/service-tokens.js +82 -0
  32. package/dist/tools/vaults.d.ts +1 -1
  33. package/dist/tools/vaults.d.ts.map +1 -1
  34. package/dist/tools/vaults.js +21 -50
  35. package/dist/upsert.d.ts +9 -0
  36. package/dist/upsert.d.ts.map +1 -0
  37. package/dist/upsert.js +28 -0
  38. package/package.json +4 -4
  39. package/LICENSE +0 -373
  40. package/dist/resources/vaults.d.ts +0 -3
  41. package/dist/resources/vaults.d.ts.map +0 -1
  42. package/dist/resources/vaults.js +0 -16
  43. package/dist/tools/__tests__/mutations.test.d.ts +0 -2
  44. package/dist/tools/__tests__/mutations.test.d.ts.map +0 -1
  45. package/dist/tools/__tests__/mutations.test.js +0 -120
  46. package/dist/tools/audit.d.ts +0 -3
  47. package/dist/tools/audit.d.ts.map +0 -1
  48. package/dist/tools/audit.js +0 -39
  49. package/dist/tools/secret-mutations.d.ts +0 -3
  50. package/dist/tools/secret-mutations.d.ts.map +0 -1
  51. package/dist/tools/secret-mutations.js +0 -86
  52. package/dist/tools/vault-details.d.ts +0 -13
  53. package/dist/tools/vault-details.d.ts.map +0 -1
  54. package/dist/tools/vault-details.js +0 -18
@@ -1,3 +0,0 @@
1
- import { type McpServer } from '@ferrlabs/mcp-core';
2
- export declare function registerVaultAuditTools(server: McpServer): void;
3
- //# sourceMappingURL=audit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/tools/audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAqBtF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QAqDxD"}
@@ -1,39 +0,0 @@
1
- import { z } from 'zod';
2
- import { apiRequest, getToken, toToolText } from '@ferrlabs/mcp-core';
3
- export function registerVaultAuditTools(server) {
4
- server.tool('get_vault_audit_log', 'Recent audit-log entries for a FerrVault vault — who read/wrote/rotated what, when.', {
5
- org_slug: z.string().min(1).describe('Organization slug'),
6
- project_slug: z.string().min(1).describe('Project slug'),
7
- vault_id: z.string().min(1).describe('Vault id'),
8
- limit: z
9
- .number()
10
- .int()
11
- .min(1)
12
- .max(200)
13
- .optional()
14
- .describe('Max entries to return (default 50).'),
15
- }, async ({ org_slug, project_slug, vault_id, limit }) => {
16
- const token = await getToken();
17
- const qs = limit !== undefined ? `?limit=${limit}` : '';
18
- const entries = await apiRequest(`/orgs/${encodeURIComponent(org_slug)}/projects/${encodeURIComponent(project_slug)}/vaults/${encodeURIComponent(vault_id)}/audit-log${qs}`, { token });
19
- return {
20
- content: [
21
- {
22
- type: 'text',
23
- text: toToolText(entries, { narrowWith: 'Pass a smaller limit.' }),
24
- },
25
- ],
26
- };
27
- });
28
- server.tool('list_secret_requests', 'List pending "missing secret" requests filed by operators/SDKs when a name lookup misses. Useful to spot secrets that need to be provisioned.', {
29
- org_slug: z.string().min(1).describe('Organization slug'),
30
- project_slug: z.string().min(1).describe('Project slug'),
31
- vault_id: z.string().min(1).describe('Vault id'),
32
- }, async ({ org_slug, project_slug, vault_id }) => {
33
- const token = await getToken();
34
- const requests = await apiRequest(`/orgs/${encodeURIComponent(org_slug)}/projects/${encodeURIComponent(project_slug)}/vaults/${encodeURIComponent(vault_id)}/secret-requests`, { token });
35
- return {
36
- content: [{ type: 'text', text: toToolText(requests) }],
37
- };
38
- });
39
- }
@@ -1,3 +0,0 @@
1
- import { type McpServer } from '@ferrlabs/mcp-core';
2
- export declare function registerSecretMutationTools(server: McpServer): void;
3
- //# sourceMappingURL=secret-mutations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secret-mutations.d.ts","sourceRoot":"","sources":["../../src/tools/secret-mutations.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAetF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QA2H5D"}
@@ -1,86 +0,0 @@
1
- import { z } from 'zod';
2
- import { apiRequest, getToken, toToolText } from '@ferrlabs/mcp-core';
3
- function vaultBase(org_slug, project_slug, vault_id) {
4
- return `/orgs/${encodeURIComponent(org_slug)}/projects/${encodeURIComponent(project_slug)}/vaults/${encodeURIComponent(vault_id)}`;
5
- }
6
- export function registerSecretMutationTools(server) {
7
- server.tool('create_secret', 'Create a new secret inside a vault. The value is encrypted server-side under the org KEK (envelope encryption) — it never lands in clear in the DB.', {
8
- org_slug: z.string().min(1).describe('Organization slug'),
9
- project_slug: z.string().min(1).describe('Project slug'),
10
- vault_id: z.string().min(1).describe('Vault id'),
11
- name: z
12
- .string()
13
- .min(1)
14
- .max(200)
15
- .regex(/^[A-Z][A-Z0-9_]*$/, 'name must be SCREAMING_SNAKE_CASE')
16
- .describe('Secret name (e.g. STRIPE_API_KEY)'),
17
- value: z.string().min(1).describe('Plaintext value — encrypted at rest by the server.'),
18
- description: z.string().max(500).optional().describe('Optional human-readable note.'),
19
- }, async ({ org_slug, project_slug, vault_id, name, value, description }) => {
20
- const token = await getToken();
21
- const secret = await apiRequest(`${vaultBase(org_slug, project_slug, vault_id)}/secrets`, {
22
- token,
23
- method: 'POST',
24
- body: { name, value, description: description ?? null },
25
- });
26
- return {
27
- content: [{ type: 'text', text: toToolText(secret) }],
28
- };
29
- });
30
- server.tool('update_secret', 'Update a secret. Pass `value` to rotate it in place (preserves name + id); pass `description` to retitle it. Either or both may be omitted; nothing is touched unless you pass it.', {
31
- org_slug: z.string().min(1).describe('Organization slug'),
32
- project_slug: z.string().min(1).describe('Project slug'),
33
- vault_id: z.string().min(1).describe('Vault id'),
34
- secret_id: z.string().min(1).describe('Secret id'),
35
- value: z.string().min(1).optional().describe('New plaintext value.'),
36
- description: z.string().max(500).nullable().optional(),
37
- }, async ({ org_slug, project_slug, vault_id, secret_id, ...patch }) => {
38
- const token = await getToken();
39
- const body = {};
40
- for (const [k, v] of Object.entries(patch)) {
41
- if (v !== undefined)
42
- body[k] = v;
43
- }
44
- const secret = await apiRequest(`${vaultBase(org_slug, project_slug, vault_id)}/secrets/${encodeURIComponent(secret_id)}`, { token, method: 'PATCH', body });
45
- return {
46
- content: [{ type: 'text', text: toToolText(secret) }],
47
- };
48
- });
49
- server.tool('delete_secret', 'Permanently delete a secret. Irreversible at the API level — recovery only via the soft-delete window on the FerrVault dashboard.', {
50
- org_slug: z.string().min(1).describe('Organization slug'),
51
- project_slug: z.string().min(1).describe('Project slug'),
52
- vault_id: z.string().min(1).describe('Vault id'),
53
- secret_id: z.string().min(1).describe('Secret id'),
54
- }, async ({ org_slug, project_slug, vault_id, secret_id }) => {
55
- const token = await getToken();
56
- await apiRequest(`${vaultBase(org_slug, project_slug, vault_id)}/secrets/${encodeURIComponent(secret_id)}`, { token, method: 'DELETE' });
57
- return {
58
- content: [{ type: 'text', text: `Secret ${secret_id} deleted.` }],
59
- };
60
- });
61
- server.tool('rotate_secret', 'Rotate a secret in-place — fans the new value through any FerrVault K8s operator deployments that mount it via SecretRef, so consumers pick up the new value on next sync without an app restart.', {
62
- org_slug: z.string().min(1).describe('Organization slug'),
63
- project_slug: z.string().min(1).describe('Project slug'),
64
- vault_id: z.string().min(1).describe('Vault id'),
65
- secret_id: z.string().min(1).describe('Secret id'),
66
- value: z.string().min(1).describe('New plaintext value (will replace the current).'),
67
- }, async ({ org_slug, project_slug, vault_id, secret_id, value }) => {
68
- const token = await getToken();
69
- const secret = await apiRequest(`${vaultBase(org_slug, project_slug, vault_id)}/secrets/${encodeURIComponent(secret_id)}/rotate`, { token, method: 'POST', body: { value } });
70
- return {
71
- content: [{ type: 'text', text: toToolText(secret) }],
72
- };
73
- });
74
- server.tool('archive_secret_request', 'Archive a "missing secret" request — marks it handled and removes it from the active list. Use after provisioning the secret (or deciding it should not be provisioned).', {
75
- org_slug: z.string().min(1).describe('Organization slug'),
76
- project_slug: z.string().min(1).describe('Project slug'),
77
- vault_id: z.string().min(1).describe('Vault id'),
78
- request_id: z.string().min(1).describe('Secret-request id'),
79
- }, async ({ org_slug, project_slug, vault_id, request_id }) => {
80
- const token = await getToken();
81
- await apiRequest(`${vaultBase(org_slug, project_slug, vault_id)}/secret-requests/${encodeURIComponent(request_id)}/archive`, { token, method: 'POST' });
82
- return {
83
- content: [{ type: 'text', text: `Secret request ${request_id} archived.` }],
84
- };
85
- });
86
- }
@@ -1,13 +0,0 @@
1
- import { type McpServer } from '@ferrlabs/mcp-core';
2
- interface VaultDetails {
3
- id: string;
4
- name: string;
5
- description: string | null;
6
- secret_count: number;
7
- created_at: string;
8
- updated_at: string;
9
- }
10
- export declare function fetchVaultDetails(orgSlug: string, projectSlug: string, vaultId: string): Promise<VaultDetails>;
11
- export declare function registerVaultDetailsTool(server: McpServer): void;
12
- export {};
13
- //# sourceMappingURL=vault-details.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault-details.d.ts","sourceRoot":"","sources":["../../src/tools/vault-details.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAEtF,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAgBzD"}
@@ -1,18 +0,0 @@
1
- import { z } from 'zod';
2
- import { apiRequest, getToken, toToolText } from '@ferrlabs/mcp-core';
3
- export async function fetchVaultDetails(orgSlug, projectSlug, vaultId) {
4
- const token = await getToken();
5
- return apiRequest(`/orgs/${encodeURIComponent(orgSlug)}/projects/${encodeURIComponent(projectSlug)}/vaults/${encodeURIComponent(vaultId)}`, { token });
6
- }
7
- export function registerVaultDetailsTool(server) {
8
- server.tool('get_vault', 'Get detailed information about a single FerrVault vault — name, description, secret count, timestamps.', {
9
- org_slug: z.string().min(1).describe('Organization slug'),
10
- project_slug: z.string().min(1).describe('Project slug'),
11
- vault_id: z.string().min(1).describe('Vault id'),
12
- }, async ({ org_slug, project_slug, vault_id }) => {
13
- const vault = await fetchVaultDetails(org_slug, project_slug, vault_id);
14
- return {
15
- content: [{ type: 'text', text: toToolText(vault) }],
16
- };
17
- });
18
- }