@skillsmith/mcp-server 0.4.6 → 0.4.8

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 (196) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +20 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/__tests__/tool-dispatch.test.d.ts +8 -0
  5. package/dist/src/__tests__/tool-dispatch.test.d.ts.map +1 -0
  6. package/dist/src/__tests__/tool-dispatch.test.js +144 -0
  7. package/dist/src/__tests__/tool-dispatch.test.js.map +1 -0
  8. package/dist/src/index.js +31 -2
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/middleware/license.d.ts +23 -0
  11. package/dist/src/middleware/license.d.ts.map +1 -1
  12. package/dist/src/middleware/license.js +28 -0
  13. package/dist/src/middleware/license.js.map +1 -1
  14. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
  15. package/dist/src/middleware/toolFeatureMapping.js +4 -1
  16. package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
  17. package/dist/src/supabase-client.d.ts +24 -0
  18. package/dist/src/supabase-client.d.ts.map +1 -0
  19. package/dist/src/supabase-client.js +63 -0
  20. package/dist/src/supabase-client.js.map +1 -0
  21. package/dist/src/tool-dispatch.d.ts.map +1 -1
  22. package/dist/src/tool-dispatch.js +71 -62
  23. package/dist/src/tool-dispatch.js.map +1 -1
  24. package/dist/src/tools/analytics.d.ts +155 -0
  25. package/dist/src/tools/analytics.d.ts.map +1 -0
  26. package/dist/src/tools/analytics.js +321 -0
  27. package/dist/src/tools/analytics.js.map +1 -0
  28. package/dist/src/tools/analytics.service.d.ts +46 -0
  29. package/dist/src/tools/analytics.service.d.ts.map +1 -0
  30. package/dist/src/tools/analytics.service.js +69 -0
  31. package/dist/src/tools/analytics.service.js.map +1 -0
  32. package/dist/src/tools/analytics.service.test.d.ts +6 -0
  33. package/dist/src/tools/analytics.service.test.d.ts.map +1 -0
  34. package/dist/src/tools/analytics.service.test.js +151 -0
  35. package/dist/src/tools/analytics.service.test.js.map +1 -0
  36. package/dist/src/tools/analytics.stub.d.ts +27 -0
  37. package/dist/src/tools/analytics.stub.d.ts.map +1 -0
  38. package/dist/src/tools/analytics.stub.js +200 -0
  39. package/dist/src/tools/analytics.stub.js.map +1 -0
  40. package/dist/src/tools/analytics.test.d.ts +6 -0
  41. package/dist/src/tools/analytics.test.d.ts.map +1 -0
  42. package/dist/src/tools/analytics.test.js +146 -0
  43. package/dist/src/tools/analytics.test.js.map +1 -0
  44. package/dist/src/tools/analyze.d.ts.map +1 -1
  45. package/dist/src/tools/analyze.js +7 -1
  46. package/dist/src/tools/analyze.js.map +1 -1
  47. package/dist/src/tools/audit-tools.d.ts +172 -0
  48. package/dist/src/tools/audit-tools.d.ts.map +1 -0
  49. package/dist/src/tools/audit-tools.js +187 -0
  50. package/dist/src/tools/audit-tools.js.map +1 -0
  51. package/dist/src/tools/audit-tools.test.d.ts +10 -0
  52. package/dist/src/tools/audit-tools.test.d.ts.map +1 -0
  53. package/dist/src/tools/audit-tools.test.js +147 -0
  54. package/dist/src/tools/audit-tools.test.js.map +1 -0
  55. package/dist/src/tools/compliance-tools.d.ts +103 -0
  56. package/dist/src/tools/compliance-tools.d.ts.map +1 -0
  57. package/dist/src/tools/compliance-tools.js +257 -0
  58. package/dist/src/tools/compliance-tools.js.map +1 -0
  59. package/dist/src/tools/compliance-tools.service.d.ts +19 -0
  60. package/dist/src/tools/compliance-tools.service.d.ts.map +1 -0
  61. package/dist/src/tools/compliance-tools.service.js +107 -0
  62. package/dist/src/tools/compliance-tools.service.js.map +1 -0
  63. package/dist/src/tools/compliance-tools.service.test.d.ts +6 -0
  64. package/dist/src/tools/compliance-tools.service.test.d.ts.map +1 -0
  65. package/dist/src/tools/compliance-tools.service.test.js +140 -0
  66. package/dist/src/tools/compliance-tools.service.test.js.map +1 -0
  67. package/dist/src/tools/compliance-tools.test.d.ts +6 -0
  68. package/dist/src/tools/compliance-tools.test.d.ts.map +1 -0
  69. package/dist/src/tools/compliance-tools.test.js +136 -0
  70. package/dist/src/tools/compliance-tools.test.js.map +1 -0
  71. package/dist/src/tools/get-skill.d.ts.map +1 -1
  72. package/dist/src/tools/get-skill.js +24 -1
  73. package/dist/src/tools/get-skill.js.map +1 -1
  74. package/dist/src/tools/index-local.d.ts.map +1 -1
  75. package/dist/src/tools/index-local.js +4 -0
  76. package/dist/src/tools/index-local.js.map +1 -1
  77. package/dist/src/tools/install.d.ts.map +1 -1
  78. package/dist/src/tools/install.js +2 -0
  79. package/dist/src/tools/install.js.map +1 -1
  80. package/dist/src/tools/install.tool.d.ts +4 -0
  81. package/dist/src/tools/install.tool.d.ts.map +1 -1
  82. package/dist/src/tools/install.tool.js +4 -0
  83. package/dist/src/tools/install.tool.js.map +1 -1
  84. package/dist/src/tools/install.types.d.ts +4 -0
  85. package/dist/src/tools/install.types.d.ts.map +1 -1
  86. package/dist/src/tools/install.types.js +5 -0
  87. package/dist/src/tools/install.types.js.map +1 -1
  88. package/dist/src/tools/integration-tools.d.ts +210 -0
  89. package/dist/src/tools/integration-tools.d.ts.map +1 -0
  90. package/dist/src/tools/integration-tools.js +264 -0
  91. package/dist/src/tools/integration-tools.js.map +1 -0
  92. package/dist/src/tools/integration-tools.service.d.ts +54 -0
  93. package/dist/src/tools/integration-tools.service.d.ts.map +1 -0
  94. package/dist/src/tools/integration-tools.service.js +299 -0
  95. package/dist/src/tools/integration-tools.service.js.map +1 -0
  96. package/dist/src/tools/integration-tools.service.test.d.ts +8 -0
  97. package/dist/src/tools/integration-tools.service.test.d.ts.map +1 -0
  98. package/dist/src/tools/integration-tools.service.test.js +401 -0
  99. package/dist/src/tools/integration-tools.service.test.js.map +1 -0
  100. package/dist/src/tools/integration-tools.stub.d.ts +13 -0
  101. package/dist/src/tools/integration-tools.stub.d.ts.map +1 -0
  102. package/dist/src/tools/integration-tools.stub.js +133 -0
  103. package/dist/src/tools/integration-tools.stub.js.map +1 -0
  104. package/dist/src/tools/integration-tools.test.d.ts +6 -0
  105. package/dist/src/tools/integration-tools.test.d.ts.map +1 -0
  106. package/dist/src/tools/integration-tools.test.js +259 -0
  107. package/dist/src/tools/integration-tools.test.js.map +1 -0
  108. package/dist/src/tools/publish-private.d.ts +60 -0
  109. package/dist/src/tools/publish-private.d.ts.map +1 -0
  110. package/dist/src/tools/publish-private.js +85 -0
  111. package/dist/src/tools/publish-private.js.map +1 -0
  112. package/dist/src/tools/publish-private.test.d.ts +6 -0
  113. package/dist/src/tools/publish-private.test.d.ts.map +1 -0
  114. package/dist/src/tools/publish-private.test.js +118 -0
  115. package/dist/src/tools/publish-private.test.js.map +1 -0
  116. package/dist/src/tools/publish.types.d.ts +2 -2
  117. package/dist/src/tools/rbac-tools.d.ts +180 -0
  118. package/dist/src/tools/rbac-tools.d.ts.map +1 -0
  119. package/dist/src/tools/rbac-tools.js +300 -0
  120. package/dist/src/tools/rbac-tools.js.map +1 -0
  121. package/dist/src/tools/rbac-tools.test.d.ts +6 -0
  122. package/dist/src/tools/rbac-tools.test.d.ts.map +1 -0
  123. package/dist/src/tools/rbac-tools.test.js +299 -0
  124. package/dist/src/tools/rbac-tools.test.js.map +1 -0
  125. package/dist/src/tools/rbac-tools.types.d.ts +70 -0
  126. package/dist/src/tools/rbac-tools.types.d.ts.map +1 -0
  127. package/dist/src/tools/rbac-tools.types.js +119 -0
  128. package/dist/src/tools/rbac-tools.types.js.map +1 -0
  129. package/dist/src/tools/recommend.helpers.d.ts.map +1 -1
  130. package/dist/src/tools/recommend.helpers.js +2 -1
  131. package/dist/src/tools/recommend.helpers.js.map +1 -1
  132. package/dist/src/tools/recommend.js +3 -3
  133. package/dist/src/tools/recommend.js.map +1 -1
  134. package/dist/src/tools/recommend.types.d.ts +3 -3
  135. package/dist/src/tools/registry-tools.d.ts +133 -0
  136. package/dist/src/tools/registry-tools.d.ts.map +1 -0
  137. package/dist/src/tools/registry-tools.js +246 -0
  138. package/dist/src/tools/registry-tools.js.map +1 -0
  139. package/dist/src/tools/registry-tools.test.d.ts +6 -0
  140. package/dist/src/tools/registry-tools.test.d.ts.map +1 -0
  141. package/dist/src/tools/registry-tools.test.js +167 -0
  142. package/dist/src/tools/registry-tools.test.js.map +1 -0
  143. package/dist/src/tools/search.formatter.d.ts.map +1 -1
  144. package/dist/src/tools/search.formatter.js +11 -1
  145. package/dist/src/tools/search.formatter.js.map +1 -1
  146. package/dist/src/tools/skill-audit.d.ts +3 -3
  147. package/dist/src/tools/skill-audit.d.ts.map +1 -1
  148. package/dist/src/tools/skill-audit.js +5 -5
  149. package/dist/src/tools/skill-audit.js.map +1 -1
  150. package/dist/src/tools/skill-audit.test.js +5 -5
  151. package/dist/src/tools/skill-audit.test.js.map +1 -1
  152. package/dist/src/tools/skill-diff.d.ts +2 -2
  153. package/dist/src/tools/skill-rescan.d.ts.map +1 -1
  154. package/dist/src/tools/skill-rescan.js +2 -3
  155. package/dist/src/tools/skill-rescan.js.map +1 -1
  156. package/dist/src/tools/skill-rescan.test.js +2 -2
  157. package/dist/src/tools/skill-rescan.test.js.map +1 -1
  158. package/dist/src/tools/sso-tools.d.ts +136 -0
  159. package/dist/src/tools/sso-tools.d.ts.map +1 -0
  160. package/dist/src/tools/sso-tools.js +214 -0
  161. package/dist/src/tools/sso-tools.js.map +1 -0
  162. package/dist/src/tools/sso-tools.test.d.ts +6 -0
  163. package/dist/src/tools/sso-tools.test.d.ts.map +1 -0
  164. package/dist/src/tools/sso-tools.test.js +167 -0
  165. package/dist/src/tools/sso-tools.test.js.map +1 -0
  166. package/dist/src/tools/suggest.d.ts +4 -4
  167. package/dist/src/tools/suggest.d.ts.map +1 -1
  168. package/dist/src/tools/suggest.js +7 -1
  169. package/dist/src/tools/suggest.js.map +1 -1
  170. package/dist/src/tools/team-workspace.d.ts +179 -0
  171. package/dist/src/tools/team-workspace.d.ts.map +1 -0
  172. package/dist/src/tools/team-workspace.js +243 -0
  173. package/dist/src/tools/team-workspace.js.map +1 -0
  174. package/dist/src/tools/team-workspace.stub.d.ts +13 -0
  175. package/dist/src/tools/team-workspace.stub.d.ts.map +1 -0
  176. package/dist/src/tools/team-workspace.stub.js +76 -0
  177. package/dist/src/tools/team-workspace.stub.js.map +1 -0
  178. package/dist/src/tools/team-workspace.test.d.ts +7 -0
  179. package/dist/src/tools/team-workspace.test.d.ts.map +1 -0
  180. package/dist/src/tools/team-workspace.test.js +273 -0
  181. package/dist/src/tools/team-workspace.test.js.map +1 -0
  182. package/dist/src/tools/uninstall.d.ts +1 -1
  183. package/dist/src/utils/team-resolver.d.ts +20 -0
  184. package/dist/src/utils/team-resolver.d.ts.map +1 -0
  185. package/dist/src/utils/team-resolver.js +52 -0
  186. package/dist/src/utils/team-resolver.js.map +1 -0
  187. package/dist/src/utils/url-validator.d.ts +24 -0
  188. package/dist/src/utils/url-validator.d.ts.map +1 -0
  189. package/dist/src/utils/url-validator.js +59 -0
  190. package/dist/src/utils/url-validator.js.map +1 -0
  191. package/dist/tests/integration/recommend.integration.test.js +1 -1
  192. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  193. package/dist/tests/recommend.test.js +1 -1
  194. package/dist/tests/recommend.test.js.map +1 -1
  195. package/package.json +3 -3
  196. package/server.json +2 -2
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @fileoverview Enterprise audit MCP tools — query audit logs and export to SIEM
3
+ * @module @skillsmith/mcp-server/tools/audit-tools
4
+ * @see SMI-3894: Tier feature gap remediation (Wave 3)
5
+ *
6
+ * Bridges the existing EnterpriseAuditLogger backend to MCP tool handlers.
7
+ * Uses dynamic import() for @skillsmith/enterprise (optional peer dependency)
8
+ * to avoid crashing the MCP server for community users.
9
+ *
10
+ * Tier gate: Enterprise (audit_logging / siem_export feature flags).
11
+ */
12
+ import { z } from 'zod';
13
+ import type { ToolContext } from '../context.js';
14
+ export declare const auditExportInputSchema: z.ZodObject<{
15
+ startDate: z.ZodOptional<z.ZodString>;
16
+ endDate: z.ZodOptional<z.ZodString>;
17
+ eventType: z.ZodOptional<z.ZodString>;
18
+ limit: z.ZodOptional<z.ZodNumber>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ limit?: number | undefined;
21
+ startDate?: string | undefined;
22
+ endDate?: string | undefined;
23
+ eventType?: string | undefined;
24
+ }, {
25
+ limit?: number | undefined;
26
+ startDate?: string | undefined;
27
+ endDate?: string | undefined;
28
+ eventType?: string | undefined;
29
+ }>;
30
+ export type AuditExportInput = z.infer<typeof auditExportInputSchema>;
31
+ export declare const auditQueryInputSchema: z.ZodObject<{
32
+ actor: z.ZodOptional<z.ZodString>;
33
+ resource: z.ZodOptional<z.ZodString>;
34
+ eventType: z.ZodOptional<z.ZodString>;
35
+ result: z.ZodOptional<z.ZodEnum<["success", "failure", "warning"]>>;
36
+ startDate: z.ZodOptional<z.ZodString>;
37
+ endDate: z.ZodOptional<z.ZodString>;
38
+ limit: z.ZodOptional<z.ZodNumber>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ limit?: number | undefined;
41
+ result?: "warning" | "success" | "failure" | undefined;
42
+ actor?: string | undefined;
43
+ resource?: string | undefined;
44
+ startDate?: string | undefined;
45
+ endDate?: string | undefined;
46
+ eventType?: string | undefined;
47
+ }, {
48
+ limit?: number | undefined;
49
+ result?: "warning" | "success" | "failure" | undefined;
50
+ actor?: string | undefined;
51
+ resource?: string | undefined;
52
+ startDate?: string | undefined;
53
+ endDate?: string | undefined;
54
+ eventType?: string | undefined;
55
+ }>;
56
+ export type AuditQueryInput = z.infer<typeof auditQueryInputSchema>;
57
+ export declare const siemExportInputSchema: z.ZodObject<{
58
+ startDate: z.ZodOptional<z.ZodString>;
59
+ endDate: z.ZodOptional<z.ZodString>;
60
+ format: z.ZodOptional<z.ZodEnum<["json", "syslog", "cef"]>>;
61
+ }, "strip", z.ZodTypeAny, {
62
+ format?: "json" | "syslog" | "cef" | undefined;
63
+ startDate?: string | undefined;
64
+ endDate?: string | undefined;
65
+ }, {
66
+ format?: "json" | "syslog" | "cef" | undefined;
67
+ startDate?: string | undefined;
68
+ endDate?: string | undefined;
69
+ }>;
70
+ export type SiemExportInput = z.infer<typeof siemExportInputSchema>;
71
+ export declare const auditExportToolSchema: {
72
+ name: "audit_export";
73
+ description: string;
74
+ inputSchema: {
75
+ type: "object";
76
+ properties: {
77
+ startDate: {
78
+ type: string;
79
+ description: string;
80
+ };
81
+ endDate: {
82
+ type: string;
83
+ description: string;
84
+ };
85
+ eventType: {
86
+ type: string;
87
+ description: string;
88
+ };
89
+ limit: {
90
+ type: string;
91
+ description: string;
92
+ };
93
+ };
94
+ };
95
+ };
96
+ export declare const auditQueryToolSchema: {
97
+ name: "audit_query";
98
+ description: string;
99
+ inputSchema: {
100
+ type: "object";
101
+ properties: {
102
+ actor: {
103
+ type: string;
104
+ description: string;
105
+ };
106
+ resource: {
107
+ type: string;
108
+ description: string;
109
+ };
110
+ eventType: {
111
+ type: string;
112
+ description: string;
113
+ };
114
+ result: {
115
+ type: string;
116
+ enum: string[];
117
+ description: string;
118
+ };
119
+ startDate: {
120
+ type: string;
121
+ description: string;
122
+ };
123
+ endDate: {
124
+ type: string;
125
+ description: string;
126
+ };
127
+ limit: {
128
+ type: string;
129
+ description: string;
130
+ };
131
+ };
132
+ };
133
+ };
134
+ export declare const siemExportToolSchema: {
135
+ name: "siem_export";
136
+ description: string;
137
+ inputSchema: {
138
+ type: "object";
139
+ properties: {
140
+ startDate: {
141
+ type: string;
142
+ description: string;
143
+ };
144
+ endDate: {
145
+ type: string;
146
+ description: string;
147
+ };
148
+ format: {
149
+ type: string;
150
+ enum: string[];
151
+ description: string;
152
+ };
153
+ };
154
+ };
155
+ };
156
+ export declare function executeAuditExport(input: AuditExportInput, toolContext: ToolContext): Promise<{
157
+ events: Record<string, unknown>[];
158
+ total: number;
159
+ returned: number;
160
+ }>;
161
+ export declare function executeAuditQuery(input: AuditQueryInput, toolContext: ToolContext): Promise<{
162
+ events: Record<string, unknown>[];
163
+ total: number;
164
+ returned: number;
165
+ }>;
166
+ export declare function executeSiemExport(input: SiemExportInput, toolContext: ToolContext): Promise<{
167
+ events: Record<string, unknown>[];
168
+ total: number;
169
+ format: "json" | "syslog" | "cef";
170
+ exportedAt: string;
171
+ }>;
172
+ //# sourceMappingURL=audit-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/audit-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAoBjC,CAAA;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAQhC,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAOhC,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAMnE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;CAejC,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBhC,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;CAkBhC,CAAA;AA8BD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW;;;;GAazF;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW;;;;GAgBvF;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW;;;;;GAgBvF"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * @fileoverview Enterprise audit MCP tools — query audit logs and export to SIEM
3
+ * @module @skillsmith/mcp-server/tools/audit-tools
4
+ * @see SMI-3894: Tier feature gap remediation (Wave 3)
5
+ *
6
+ * Bridges the existing EnterpriseAuditLogger backend to MCP tool handlers.
7
+ * Uses dynamic import() for @skillsmith/enterprise (optional peer dependency)
8
+ * to avoid crashing the MCP server for community users.
9
+ *
10
+ * Tier gate: Enterprise (audit_logging / siem_export feature flags).
11
+ */
12
+ import { z } from 'zod';
13
+ // ============================================================================
14
+ // Input schemas
15
+ // ============================================================================
16
+ export const auditExportInputSchema = z.object({
17
+ startDate: z
18
+ .string()
19
+ .optional()
20
+ .describe('ISO 8601 start date for export range (defaults to 24 hours ago)'),
21
+ endDate: z.string().optional().describe('ISO 8601 end date for export range (defaults to now)'),
22
+ eventType: z
23
+ .string()
24
+ .optional()
25
+ .describe('Filter by event type: sso_login, rbac_check, license_validation, ' +
26
+ 'exporter_registered, exporter_unregistered, export_completed, export_failed'),
27
+ limit: z
28
+ .number()
29
+ .int()
30
+ .min(1)
31
+ .max(1000)
32
+ .optional()
33
+ .describe('Maximum number of events to return (default 100, max 1000)'),
34
+ });
35
+ export const auditQueryInputSchema = z.object({
36
+ actor: z.string().optional().describe('Filter by actor (user ID or email)'),
37
+ resource: z.string().optional().describe('Filter by resource name'),
38
+ eventType: z.string().optional().describe('Filter by event type'),
39
+ result: z.enum(['success', 'failure', 'warning']).optional().describe('Filter by result'),
40
+ startDate: z.string().optional().describe('ISO 8601 start date'),
41
+ endDate: z.string().optional().describe('ISO 8601 end date'),
42
+ limit: z.number().int().min(1).max(1000).optional().describe('Max results (default 100)'),
43
+ });
44
+ export const siemExportInputSchema = z.object({
45
+ startDate: z
46
+ .string()
47
+ .optional()
48
+ .describe('ISO 8601 start date for export range (defaults to 1 hour ago)'),
49
+ endDate: z.string().optional().describe('ISO 8601 end date (defaults to now)'),
50
+ format: z.enum(['json', 'syslog', 'cef']).optional().describe('Export format (default json)'),
51
+ });
52
+ // ============================================================================
53
+ // Tool schemas
54
+ // ============================================================================
55
+ export const auditExportToolSchema = {
56
+ name: 'audit_export',
57
+ description: 'Export audit log events for a given time range. ' +
58
+ 'Requires Enterprise tier (audit_logging feature). ' +
59
+ 'Returns structured audit events in JSON format.',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ startDate: { type: 'string', description: 'ISO 8601 start date (defaults to 24h ago)' },
64
+ endDate: { type: 'string', description: 'ISO 8601 end date (defaults to now)' },
65
+ eventType: { type: 'string', description: 'Filter by event type' },
66
+ limit: { type: 'number', description: 'Max events to return (default 100, max 1000)' },
67
+ },
68
+ },
69
+ };
70
+ export const auditQueryToolSchema = {
71
+ name: 'audit_query',
72
+ description: 'Query audit logs with filters (actor, resource, event type, result, date range). ' +
73
+ 'Requires Enterprise tier (audit_logging feature).',
74
+ inputSchema: {
75
+ type: 'object',
76
+ properties: {
77
+ actor: { type: 'string', description: 'Filter by actor (user ID or email)' },
78
+ resource: { type: 'string', description: 'Filter by resource name' },
79
+ eventType: { type: 'string', description: 'Filter by event type' },
80
+ result: {
81
+ type: 'string',
82
+ enum: ['success', 'failure', 'warning'],
83
+ description: 'Filter by result',
84
+ },
85
+ startDate: { type: 'string', description: 'ISO 8601 start date' },
86
+ endDate: { type: 'string', description: 'ISO 8601 end date' },
87
+ limit: { type: 'number', description: 'Max results (default 100, max 1000)' },
88
+ },
89
+ },
90
+ };
91
+ export const siemExportToolSchema = {
92
+ name: 'siem_export',
93
+ description: 'Export audit events for SIEM ingestion (CloudWatch, Splunk, Datadog). ' +
94
+ 'Requires Enterprise tier (siem_export feature). ' +
95
+ 'SIEM destination is configured via environment variables, not tool arguments.',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ startDate: { type: 'string', description: 'ISO 8601 start date (defaults to 1h ago)' },
100
+ endDate: { type: 'string', description: 'ISO 8601 end date (defaults to now)' },
101
+ format: {
102
+ type: 'string',
103
+ enum: ['json', 'syslog', 'cef'],
104
+ description: 'Export format (default json)',
105
+ },
106
+ },
107
+ },
108
+ };
109
+ /**
110
+ * Dynamically load EnterpriseAuditLogger from the optional @skillsmith/enterprise package.
111
+ * Returns a logger with queryEnterprise() and dispose() methods.
112
+ */
113
+ async function getAuditLogger(toolContext) {
114
+ try {
115
+ // @skillsmith/enterprise is an optional peer dep — suppress TS2307.
116
+ // @ts-expect-error -- optional peer dependency, may not be installed
117
+ const enterprise = await import('@skillsmith/enterprise');
118
+ return new enterprise.EnterpriseAuditLogger(toolContext.db);
119
+ }
120
+ catch {
121
+ throw new Error('Enterprise audit logging requires the @skillsmith/enterprise package. ' +
122
+ 'This feature is available on the Enterprise tier.');
123
+ }
124
+ }
125
+ export async function executeAuditExport(input, toolContext) {
126
+ const logger = await getAuditLogger(toolContext);
127
+ try {
128
+ const filter = {};
129
+ if (input.startDate)
130
+ filter.startDate = input.startDate;
131
+ if (input.endDate)
132
+ filter.endDate = input.endDate;
133
+ if (input.eventType)
134
+ filter.enterpriseEventType = input.eventType;
135
+ const entries = logger.queryEnterprise(filter);
136
+ const limited = entries.slice(0, input.limit ?? 100);
137
+ return { events: limited, total: entries.length, returned: limited.length };
138
+ }
139
+ finally {
140
+ logger.dispose();
141
+ }
142
+ }
143
+ export async function executeAuditQuery(input, toolContext) {
144
+ const logger = await getAuditLogger(toolContext);
145
+ try {
146
+ const filter = {};
147
+ if (input.actor)
148
+ filter.actor = input.actor;
149
+ if (input.resource)
150
+ filter.resource = input.resource;
151
+ if (input.eventType)
152
+ filter.enterpriseEventType = input.eventType;
153
+ if (input.result)
154
+ filter.result = input.result;
155
+ if (input.startDate)
156
+ filter.startDate = input.startDate;
157
+ if (input.endDate)
158
+ filter.endDate = input.endDate;
159
+ const entries = logger.queryEnterprise(filter);
160
+ const limited = entries.slice(0, input.limit ?? 100);
161
+ return { events: limited, total: entries.length, returned: limited.length };
162
+ }
163
+ finally {
164
+ logger.dispose();
165
+ }
166
+ }
167
+ export async function executeSiemExport(input, toolContext) {
168
+ const logger = await getAuditLogger(toolContext);
169
+ try {
170
+ const filter = {};
171
+ if (input.startDate)
172
+ filter.startDate = input.startDate;
173
+ if (input.endDate)
174
+ filter.endDate = input.endDate;
175
+ const entries = logger.queryEnterprise(filter);
176
+ return {
177
+ events: entries,
178
+ total: entries.length,
179
+ format: input.format ?? 'json',
180
+ exportedAt: new Date().toISOString(),
181
+ };
182
+ }
183
+ finally {
184
+ logger.dispose();
185
+ }
186
+ }
187
+ //# sourceMappingURL=audit-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-tools.js","sourceRoot":"","sources":["../../../src/tools/audit-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Tests for enterprise audit MCP tools
3
+ * @see SMI-3894: Tier feature gap remediation (Wave 3)
4
+ *
5
+ * Tests the audit_export, audit_query, and siem_export tool handlers.
6
+ * Since @skillsmith/enterprise is an optional peer dep, we mock the
7
+ * dynamic import to test handler logic without requiring the package.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=audit-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-tools.test.d.ts","sourceRoot":"","sources":["../../../src/tools/audit-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * @fileoverview Tests for enterprise audit MCP tools
3
+ * @see SMI-3894: Tier feature gap remediation (Wave 3)
4
+ *
5
+ * Tests the audit_export, audit_query, and siem_export tool handlers.
6
+ * Since @skillsmith/enterprise is an optional peer dep, we mock the
7
+ * dynamic import to test handler logic without requiring the package.
8
+ */
9
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
10
+ import { auditExportInputSchema, auditQueryInputSchema, siemExportInputSchema, executeAuditExport, executeAuditQuery, executeSiemExport, } from './audit-tools.js';
11
+ // Mock enterprise package — dynamic import returns this
12
+ const mockEntries = [
13
+ { id: '1', event_type: 'sso_login', actor: 'user@test.com', result: 'success' },
14
+ { id: '2', event_type: 'rbac_check', actor: 'admin@test.com', result: 'failure' },
15
+ { id: '3', event_type: 'license_validation', actor: 'user@test.com', result: 'success' },
16
+ ];
17
+ const mockDispose = vi.fn();
18
+ const mockQueryEnterprise = vi.fn().mockReturnValue(mockEntries);
19
+ vi.mock('@skillsmith/enterprise', () => ({
20
+ EnterpriseAuditLogger: class MockAuditLogger {
21
+ queryEnterprise = mockQueryEnterprise;
22
+ dispose = mockDispose;
23
+ },
24
+ }));
25
+ const mockToolContext = { db: {} };
26
+ describe('audit-tools', () => {
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ mockQueryEnterprise.mockReturnValue(mockEntries);
30
+ });
31
+ describe('input schemas', () => {
32
+ it('auditExportInputSchema accepts empty input', () => {
33
+ expect(auditExportInputSchema.parse({})).toEqual({});
34
+ });
35
+ it('auditExportInputSchema accepts all fields', () => {
36
+ const input = {
37
+ startDate: '2026-01-01T00:00:00Z',
38
+ endDate: '2026-01-02T00:00:00Z',
39
+ eventType: 'sso_login',
40
+ limit: 50,
41
+ };
42
+ expect(auditExportInputSchema.parse(input)).toEqual(input);
43
+ });
44
+ it('auditExportInputSchema rejects limit > 1000', () => {
45
+ expect(() => auditExportInputSchema.parse({ limit: 1001 })).toThrow();
46
+ });
47
+ it('auditExportInputSchema rejects limit < 1', () => {
48
+ expect(() => auditExportInputSchema.parse({ limit: 0 })).toThrow();
49
+ });
50
+ it('auditQueryInputSchema accepts result enum values', () => {
51
+ expect(auditQueryInputSchema.parse({ result: 'success' })).toEqual({ result: 'success' });
52
+ expect(auditQueryInputSchema.parse({ result: 'failure' })).toEqual({ result: 'failure' });
53
+ expect(auditQueryInputSchema.parse({ result: 'warning' })).toEqual({ result: 'warning' });
54
+ });
55
+ it('auditQueryInputSchema rejects invalid result', () => {
56
+ expect(() => auditQueryInputSchema.parse({ result: 'unknown' })).toThrow();
57
+ });
58
+ it('siemExportInputSchema accepts format enum', () => {
59
+ expect(siemExportInputSchema.parse({ format: 'json' })).toEqual({ format: 'json' });
60
+ expect(siemExportInputSchema.parse({ format: 'syslog' })).toEqual({ format: 'syslog' });
61
+ expect(siemExportInputSchema.parse({ format: 'cef' })).toEqual({ format: 'cef' });
62
+ });
63
+ it('siemExportInputSchema rejects invalid format', () => {
64
+ expect(() => siemExportInputSchema.parse({ format: 'xml' })).toThrow();
65
+ });
66
+ });
67
+ describe('executeAuditExport', () => {
68
+ it('returns all entries with no filters', async () => {
69
+ const result = await executeAuditExport({}, mockToolContext);
70
+ expect(result.total).toBe(3);
71
+ expect(result.returned).toBe(3);
72
+ expect(result.events).toHaveLength(3);
73
+ expect(mockDispose).toHaveBeenCalled();
74
+ });
75
+ it('passes filters to queryEnterprise', async () => {
76
+ await executeAuditExport({ startDate: '2026-01-01', eventType: 'sso_login' }, mockToolContext);
77
+ expect(mockQueryEnterprise).toHaveBeenCalledWith({
78
+ startDate: '2026-01-01',
79
+ enterpriseEventType: 'sso_login',
80
+ });
81
+ });
82
+ it('respects limit parameter', async () => {
83
+ const result = await executeAuditExport({ limit: 2 }, mockToolContext);
84
+ expect(result.returned).toBe(2);
85
+ expect(result.total).toBe(3);
86
+ expect(result.events).toHaveLength(2);
87
+ });
88
+ it('defaults limit to 100', async () => {
89
+ const manyEntries = Array.from({ length: 150 }, (_, i) => ({ id: String(i) }));
90
+ mockQueryEnterprise.mockReturnValue(manyEntries);
91
+ const result = await executeAuditExport({}, mockToolContext);
92
+ expect(result.returned).toBe(100);
93
+ expect(result.total).toBe(150);
94
+ });
95
+ it('disposes logger even on error', async () => {
96
+ mockQueryEnterprise.mockImplementation(() => {
97
+ throw new Error('query failed');
98
+ });
99
+ await expect(executeAuditExport({}, mockToolContext)).rejects.toThrow('query failed');
100
+ expect(mockDispose).toHaveBeenCalled();
101
+ });
102
+ });
103
+ describe('executeAuditQuery', () => {
104
+ it('passes all filter fields to queryEnterprise', async () => {
105
+ await executeAuditQuery({
106
+ actor: 'user@test.com',
107
+ resource: 'skills',
108
+ eventType: 'rbac_check',
109
+ result: 'failure',
110
+ startDate: '2026-01-01',
111
+ endDate: '2026-01-02',
112
+ }, mockToolContext);
113
+ expect(mockQueryEnterprise).toHaveBeenCalledWith({
114
+ actor: 'user@test.com',
115
+ resource: 'skills',
116
+ enterpriseEventType: 'rbac_check',
117
+ result: 'failure',
118
+ startDate: '2026-01-01',
119
+ endDate: '2026-01-02',
120
+ });
121
+ });
122
+ it('returns paginated results', async () => {
123
+ const result = await executeAuditQuery({ limit: 1 }, mockToolContext);
124
+ expect(result.returned).toBe(1);
125
+ expect(result.total).toBe(3);
126
+ });
127
+ });
128
+ describe('executeSiemExport', () => {
129
+ it('returns events with format and timestamp', async () => {
130
+ const result = await executeSiemExport({ format: 'syslog' }, mockToolContext);
131
+ expect(result.format).toBe('syslog');
132
+ expect(result.total).toBe(3);
133
+ expect(result.exportedAt).toBeDefined();
134
+ expect(new Date(result.exportedAt).getTime()).not.toBeNaN();
135
+ });
136
+ it('defaults format to json', async () => {
137
+ const result = await executeSiemExport({}, mockToolContext);
138
+ expect(result.format).toBe('json');
139
+ });
140
+ it('returns all events (no limit)', async () => {
141
+ const result = await executeSiemExport({}, mockToolContext);
142
+ expect(result.events).toHaveLength(3);
143
+ expect(result.total).toBe(3);
144
+ });
145
+ });
146
+ });
147
+ //# sourceMappingURL=audit-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-tools.test.js","sourceRoot":"","sources":["../../../src/tools/audit-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @fileoverview Compliance report MCP tool
3
+ * @module @skillsmith/mcp-server/tools/compliance-tools
4
+ * @see SMI-3906: Compliance Report MCP Tool
5
+ *
6
+ * Generates compliance reports in SOC2 (markdown), CycloneDX (JSON SBOM),
7
+ * or raw JSON format from local skill inventory and audit data.
8
+ *
9
+ * Scope: local inventory only. For server-side audit data, use audit_export.
10
+ *
11
+ * Tier gate: Enterprise (compliance_reports feature flag).
12
+ */
13
+ import { z } from 'zod';
14
+ import type { ToolContext } from '../context.js';
15
+ export declare const complianceReportInputSchema: z.ZodObject<{
16
+ format: z.ZodEnum<["soc2", "cyclonedx", "json"]>;
17
+ period: z.ZodDefault<z.ZodOptional<z.ZodEnum<["30d", "90d", "365d"]>>>;
18
+ includeUserActivity: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ format: "json" | "soc2" | "cyclonedx";
21
+ period: "30d" | "90d" | "365d";
22
+ includeUserActivity: boolean;
23
+ }, {
24
+ format: "json" | "soc2" | "cyclonedx";
25
+ period?: "30d" | "90d" | "365d" | undefined;
26
+ includeUserActivity?: boolean | undefined;
27
+ }>;
28
+ export type ComplianceReportInput = z.infer<typeof complianceReportInputSchema>;
29
+ export declare const complianceReportToolSchema: {
30
+ name: "compliance_report";
31
+ description: string;
32
+ inputSchema: {
33
+ type: "object";
34
+ properties: {
35
+ format: {
36
+ type: string;
37
+ enum: string[];
38
+ description: string;
39
+ };
40
+ period: {
41
+ type: string;
42
+ enum: string[];
43
+ description: string;
44
+ };
45
+ includeUserActivity: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ };
50
+ required: string[];
51
+ };
52
+ };
53
+ export interface SkillInventoryItem {
54
+ skillId: string;
55
+ version: string;
56
+ trustTier: 'verified' | 'community' | 'experimental' | 'unknown';
57
+ installedAt: string;
58
+ lastUpdated: string;
59
+ }
60
+ export interface AuditSummary {
61
+ totalEvents: number;
62
+ installCount: number;
63
+ uninstallCount: number;
64
+ searchCount: number;
65
+ periodStart: string;
66
+ periodEnd: string;
67
+ }
68
+ export interface UserActivitySummary {
69
+ uniqueUsers: number;
70
+ topTools: Array<{
71
+ tool: string;
72
+ count: number;
73
+ }>;
74
+ activeDays: number;
75
+ }
76
+ export interface ComplianceData {
77
+ skills: SkillInventoryItem[];
78
+ auditSummary: AuditSummary;
79
+ userActivity: UserActivitySummary | null;
80
+ configState: {
81
+ ssoEnabled: boolean;
82
+ rbacEnabled: boolean;
83
+ auditLoggingEnabled: boolean;
84
+ webhooksConfigured: number;
85
+ };
86
+ }
87
+ export interface ComplianceService {
88
+ gatherData(periodDays: number, includeUserActivity: boolean): Promise<ComplianceData>;
89
+ }
90
+ /** @internal Exported for testing */
91
+ export declare function createStubComplianceService(): ComplianceService;
92
+ /** Replace the compliance service implementation */
93
+ export declare function setComplianceService(svc: ComplianceService): void;
94
+ export interface ComplianceReportResult {
95
+ format: 'soc2' | 'cyclonedx' | 'json';
96
+ dataSource: 'stub' | 'live';
97
+ generatedAt: string;
98
+ scope: 'local';
99
+ period: string;
100
+ report: string | Record<string, unknown>;
101
+ }
102
+ export declare function executeComplianceReport(input: ComplianceReportInput, context: ToolContext): Promise<ComplianceReportResult>;
103
+ //# sourceMappingURL=compliance-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/compliance-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAQhD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;EAYtC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAM/E,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;CA0BtC,CAAA;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,SAAS,CAAA;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChD,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,kBAAkB,EAAE,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACxC,WAAW,EAAE;QACX,UAAU,EAAE,OAAO,CAAA;QACnB,WAAW,EAAE,OAAO,CAAA;QACpB,mBAAmB,EAAE,OAAO,CAAA;QAC5B,kBAAkB,EAAE,MAAM,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACtF;AAMD,qCAAqC;AACrC,wBAAgB,2BAA2B,IAAI,iBAAiB,CAkD/D;AAKD,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAEjE;AAMD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;IACrC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACzC;AAsGD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAgDjC"}