@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,210 @@
1
+ /**
2
+ * @fileoverview Custom integrations MCP tools (webhooks + API keys)
3
+ * @module @skillsmith/mcp-server/tools/integration-tools
4
+ * @see SMI-3903: Custom Integrations MCP Tools
5
+ *
6
+ * Webhook signing uses HMAC-SHA256. API keys are stored as SHA-256 hashes
7
+ * only — the raw key is returned once on creation and never again.
8
+ *
9
+ * Tier gate: Enterprise (custom_integrations feature flag).
10
+ */
11
+ import { z } from 'zod';
12
+ import type { ToolContext } from '../context.js';
13
+ export { createStubIntegrationService } from './integration-tools.stub.js';
14
+ export declare const webhookConfigureInputSchema: z.ZodObject<{
15
+ action: z.ZodEnum<["create", "list", "get", "delete", "test", "rotate_secret"]>;
16
+ url: z.ZodOptional<z.ZodString>;
17
+ events: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
18
+ webhookId: z.ZodOptional<z.ZodString>;
19
+ description: z.ZodOptional<z.ZodString>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ action: "test" | "get" | "create" | "list" | "delete" | "rotate_secret";
22
+ description?: string | undefined;
23
+ url?: string | undefined;
24
+ events?: string[] | undefined;
25
+ webhookId?: string | undefined;
26
+ }, {
27
+ action: "test" | "get" | "create" | "list" | "delete" | "rotate_secret";
28
+ description?: string | undefined;
29
+ url?: string | undefined;
30
+ events?: string[] | undefined;
31
+ webhookId?: string | undefined;
32
+ }>;
33
+ export type WebhookConfigureInput = z.infer<typeof webhookConfigureInputSchema>;
34
+ export declare const apiKeyManageInputSchema: z.ZodObject<{
35
+ action: z.ZodEnum<["create", "list", "revoke", "get"]>;
36
+ name: z.ZodOptional<z.ZodString>;
37
+ keyId: z.ZodOptional<z.ZodString>;
38
+ permissions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
39
+ expiresIn: z.ZodDefault<z.ZodOptional<z.ZodEnum<["30d", "90d", "365d", "never"]>>>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ action: "get" | "create" | "list" | "revoke";
42
+ expiresIn: "30d" | "90d" | "365d" | "never";
43
+ name?: string | undefined;
44
+ permissions?: string[] | undefined;
45
+ keyId?: string | undefined;
46
+ }, {
47
+ action: "get" | "create" | "list" | "revoke";
48
+ name?: string | undefined;
49
+ permissions?: string[] | undefined;
50
+ keyId?: string | undefined;
51
+ expiresIn?: "30d" | "90d" | "365d" | "never" | undefined;
52
+ }>;
53
+ export type ApiKeyManageInput = z.infer<typeof apiKeyManageInputSchema>;
54
+ export declare const webhookConfigureToolSchema: {
55
+ name: "webhook_configure";
56
+ description: string;
57
+ inputSchema: {
58
+ type: "object";
59
+ properties: {
60
+ action: {
61
+ type: string;
62
+ enum: string[];
63
+ description: string;
64
+ };
65
+ url: {
66
+ type: string;
67
+ description: string;
68
+ };
69
+ events: {
70
+ type: string;
71
+ items: {
72
+ type: string;
73
+ };
74
+ description: string;
75
+ };
76
+ webhookId: {
77
+ type: string;
78
+ description: string;
79
+ };
80
+ description: {
81
+ type: string;
82
+ description: string;
83
+ };
84
+ };
85
+ required: string[];
86
+ };
87
+ };
88
+ export declare const apiKeyManageToolSchema: {
89
+ name: "api_key_manage";
90
+ description: string;
91
+ inputSchema: {
92
+ type: "object";
93
+ properties: {
94
+ action: {
95
+ type: string;
96
+ enum: string[];
97
+ description: string;
98
+ };
99
+ name: {
100
+ type: string;
101
+ description: string;
102
+ };
103
+ keyId: {
104
+ type: string;
105
+ description: string;
106
+ };
107
+ permissions: {
108
+ type: string;
109
+ items: {
110
+ type: string;
111
+ };
112
+ description: string;
113
+ };
114
+ expiresIn: {
115
+ type: string;
116
+ enum: string[];
117
+ description: string;
118
+ };
119
+ };
120
+ required: string[];
121
+ };
122
+ };
123
+ export interface Webhook {
124
+ id: string;
125
+ url: string;
126
+ events: string[];
127
+ description: string | null;
128
+ signingSecret: string;
129
+ status: 'active' | 'inactive';
130
+ createdAt: string;
131
+ lastDeliveryAt: string | null;
132
+ }
133
+ export interface WebhookMasked {
134
+ id: string;
135
+ url: string;
136
+ events: string[];
137
+ description: string | null;
138
+ signingSecretLast4: string;
139
+ status: 'active' | 'inactive';
140
+ createdAt: string;
141
+ lastDeliveryAt: string | null;
142
+ }
143
+ export interface ApiKey {
144
+ id: string;
145
+ name: string;
146
+ keyValue: string;
147
+ keyPrefix: string;
148
+ permissions: string[];
149
+ expiresAt: string | null;
150
+ createdAt: string;
151
+ }
152
+ export interface ApiKeyMasked {
153
+ id: string;
154
+ name: string;
155
+ keyLast4: string;
156
+ keyPrefix: string;
157
+ permissions: string[];
158
+ expiresAt: string | null;
159
+ createdAt: string;
160
+ status: 'active' | 'revoked';
161
+ }
162
+ export interface IntegrationService {
163
+ createWebhook(url: string, events: string[], description?: string): Promise<Webhook>;
164
+ listWebhooks(): Promise<WebhookMasked[]>;
165
+ getWebhook(webhookId: string): Promise<WebhookMasked | null>;
166
+ deleteWebhook(webhookId: string): Promise<boolean>;
167
+ testWebhook(webhookId: string): Promise<{
168
+ success: boolean;
169
+ statusCode: number;
170
+ message: string;
171
+ }>;
172
+ rotateSecret(webhookId: string): Promise<{
173
+ webhookId: string;
174
+ newSigningSecret: string;
175
+ }>;
176
+ createApiKey(name: string, permissions?: string[], expiresIn?: string): Promise<ApiKey>;
177
+ listApiKeys(): Promise<ApiKeyMasked[]>;
178
+ getApiKey(keyId: string): Promise<ApiKeyMasked | null>;
179
+ revokeApiKey(keyId: string): Promise<boolean>;
180
+ }
181
+ /** Replace the integration service implementation */
182
+ export declare function setIntegrationService(svc: IntegrationService): void;
183
+ export interface WebhookConfigureResult {
184
+ success: boolean;
185
+ dataSource: 'stub' | 'live';
186
+ webhook?: Webhook | WebhookMasked;
187
+ webhooks?: WebhookMasked[];
188
+ test?: {
189
+ success: boolean;
190
+ statusCode: number;
191
+ message: string;
192
+ };
193
+ rotated?: {
194
+ webhookId: string;
195
+ newSigningSecret: string;
196
+ };
197
+ message?: string;
198
+ error?: string;
199
+ }
200
+ export interface ApiKeyManageResult {
201
+ success: boolean;
202
+ dataSource: 'stub' | 'live';
203
+ key?: ApiKey | ApiKeyMasked;
204
+ keys?: ApiKeyMasked[];
205
+ message?: string;
206
+ error?: string;
207
+ }
208
+ export declare function executeWebhookConfigure(input: WebhookConfigureInput, _context: ToolContext): Promise<WebhookConfigureResult>;
209
+ export declare function executeApiKeyManage(input: ApiKeyManageInput, _context: ToolContext): Promise<ApiKeyManageResult>;
210
+ //# sourceMappingURL=integration-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/integration-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAKhD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAM1E,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;EAgBtC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAE/E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAUlC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAMvE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BtC,CAAA;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BlC,CAAA;AAMD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpF,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IACxC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAC5D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvF,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACtC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IACtD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9C;AAKD,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,CAEnE;AAMD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAA;IACjC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAChE,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;IAC3B,IAAI,CAAC,EAAE,YAAY,EAAE,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAWD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,sBAAsB,CAAC,CA0FjC;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,kBAAkB,CAAC,CA0D7B"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * @fileoverview Custom integrations MCP tools (webhooks + API keys)
3
+ * @module @skillsmith/mcp-server/tools/integration-tools
4
+ * @see SMI-3903: Custom Integrations MCP Tools
5
+ *
6
+ * Webhook signing uses HMAC-SHA256. API keys are stored as SHA-256 hashes
7
+ * only — the raw key is returned once on creation and never again.
8
+ *
9
+ * Tier gate: Enterprise (custom_integrations feature flag).
10
+ */
11
+ import { z } from 'zod';
12
+ import { isSupabaseConfigured } from '../supabase-client.js';
13
+ import { createStubIntegrationService } from './integration-tools.stub.js';
14
+ // Re-export stub factory for external consumers and tests
15
+ export { createStubIntegrationService } from './integration-tools.stub.js';
16
+ // ============================================================================
17
+ // Input schemas
18
+ // ============================================================================
19
+ export const webhookConfigureInputSchema = z.object({
20
+ action: z.enum(['create', 'list', 'get', 'delete', 'test', 'rotate_secret']),
21
+ url: z
22
+ .string()
23
+ .url('Must be a valid URL')
24
+ .optional()
25
+ .describe('Webhook URL (required for create)'),
26
+ events: z
27
+ .array(z.string())
28
+ .optional()
29
+ .describe('Event types to subscribe to (required for create)'),
30
+ webhookId: z
31
+ .string()
32
+ .optional()
33
+ .describe('Webhook ID (required for get/delete/test/rotate_secret)'),
34
+ description: z.string().max(256).optional().describe('Webhook description'),
35
+ });
36
+ export const apiKeyManageInputSchema = z.object({
37
+ action: z.enum(['create', 'list', 'revoke', 'get']),
38
+ name: z.string().min(1).max(128).optional().describe('Key name (required for create)'),
39
+ keyId: z.string().optional().describe('Key ID (required for revoke/get)'),
40
+ permissions: z.array(z.string()).optional().describe('Permission scopes (optional for create)'),
41
+ expiresIn: z
42
+ .enum(['30d', '90d', '365d', 'never'])
43
+ .optional()
44
+ .default('90d')
45
+ .describe('Expiration period (default: 90d)'),
46
+ });
47
+ // ============================================================================
48
+ // Tool schemas for MCP registration
49
+ // ============================================================================
50
+ export const webhookConfigureToolSchema = {
51
+ name: 'webhook_configure',
52
+ description: 'Configure webhooks for skill lifecycle events (skill.install, skill.publish, etc.). ' +
53
+ 'Webhooks are signed with HMAC-SHA256. ' +
54
+ 'Requires Enterprise tier (custom_integrations feature).',
55
+ inputSchema: {
56
+ type: 'object',
57
+ properties: {
58
+ action: {
59
+ type: 'string',
60
+ enum: ['create', 'list', 'get', 'delete', 'test', 'rotate_secret'],
61
+ description: 'Webhook operation',
62
+ },
63
+ url: { type: 'string', description: 'Webhook URL (required for create)' },
64
+ events: {
65
+ type: 'array',
66
+ items: { type: 'string' },
67
+ description: 'Event types (required for create)',
68
+ },
69
+ webhookId: {
70
+ type: 'string',
71
+ description: 'Webhook ID (required for get/delete/test/rotate_secret)',
72
+ },
73
+ description: { type: 'string', description: 'Webhook description' },
74
+ },
75
+ required: ['action'],
76
+ },
77
+ };
78
+ export const apiKeyManageToolSchema = {
79
+ name: 'api_key_manage',
80
+ description: 'Manage API keys for programmatic access. Keys are shown once on creation. ' +
81
+ 'Stored as SHA-256 hashes. Requires Enterprise tier (custom_integrations feature).',
82
+ inputSchema: {
83
+ type: 'object',
84
+ properties: {
85
+ action: {
86
+ type: 'string',
87
+ enum: ['create', 'list', 'revoke', 'get'],
88
+ description: 'API key operation',
89
+ },
90
+ name: { type: 'string', description: 'Key name (required for create)' },
91
+ keyId: { type: 'string', description: 'Key ID (required for revoke/get)' },
92
+ permissions: {
93
+ type: 'array',
94
+ items: { type: 'string' },
95
+ description: 'Permission scopes',
96
+ },
97
+ expiresIn: {
98
+ type: 'string',
99
+ enum: ['30d', '90d', '365d', 'never'],
100
+ description: 'Expiration period (default: 90d)',
101
+ },
102
+ },
103
+ required: ['action'],
104
+ },
105
+ };
106
+ // Module-level singleton
107
+ let service = createStubIntegrationService();
108
+ /** Replace the integration service implementation */
109
+ export function setIntegrationService(svc) {
110
+ service = svc;
111
+ }
112
+ // ============================================================================
113
+ // Handlers
114
+ // ============================================================================
115
+ /** Resolve the current data source based on Supabase configuration */
116
+ function getDataSource() {
117
+ return isSupabaseConfigured() ? 'live' : 'stub';
118
+ }
119
+ export async function executeWebhookConfigure(input, _context) {
120
+ const dataSource = getDataSource();
121
+ switch (input.action) {
122
+ case 'create': {
123
+ if (!input.url)
124
+ return { success: false, dataSource, error: 'url is required for action "create".' };
125
+ if (!input.events?.length)
126
+ return { success: false, dataSource, error: 'events is required for action "create".' };
127
+ const wh = await service.createWebhook(input.url, input.events, input.description);
128
+ return {
129
+ success: true,
130
+ dataSource,
131
+ webhook: wh,
132
+ message: `## Webhook Created\n\n` +
133
+ `- **ID:** ${wh.id}\n` +
134
+ `- **URL:** ${wh.url}\n` +
135
+ `- **Events:** ${wh.events.join(', ')}\n` +
136
+ `- **Signing Secret:** \`${wh.signingSecret}\`\n\n` +
137
+ `> **Store this secret now** -- it will not be shown again.\n\n` +
138
+ `### HMAC Verification\n\n` +
139
+ 'Each delivery includes an `X-Skillsmith-Signature` header computed as:\n\n' +
140
+ '```\nHMAC-SHA256(signing_secret, request_body)\n```\n\n' +
141
+ 'Verify this signature before processing the payload.',
142
+ };
143
+ }
144
+ case 'list': {
145
+ const webhooks = await service.listWebhooks();
146
+ return {
147
+ success: true,
148
+ dataSource,
149
+ webhooks,
150
+ message: `## Webhooks (${webhooks.length})\n\n` +
151
+ (webhooks.length === 0
152
+ ? 'No webhooks configured.'
153
+ : webhooks.map((w) => `- **${w.id}**: ${w.url} (${w.events.join(', ')})`).join('\n')),
154
+ };
155
+ }
156
+ case 'get': {
157
+ if (!input.webhookId)
158
+ return { success: false, dataSource, error: 'webhookId is required for action "get".' };
159
+ const wh = await service.getWebhook(input.webhookId);
160
+ if (!wh)
161
+ return { success: false, dataSource, error: `Webhook "${input.webhookId}" not found.` };
162
+ return { success: true, dataSource, webhook: wh };
163
+ }
164
+ case 'delete': {
165
+ if (!input.webhookId)
166
+ return { success: false, dataSource, error: 'webhookId is required for action "delete".' };
167
+ const deleted = await service.deleteWebhook(input.webhookId);
168
+ if (!deleted)
169
+ return { success: false, dataSource, error: `Webhook "${input.webhookId}" not found.` };
170
+ return { success: true, dataSource, message: `Webhook "${input.webhookId}" deleted.` };
171
+ }
172
+ case 'test': {
173
+ if (!input.webhookId)
174
+ return { success: false, dataSource, error: 'webhookId is required for action "test".' };
175
+ const result = await service.testWebhook(input.webhookId);
176
+ return { success: result.success, dataSource, test: result, message: result.message };
177
+ }
178
+ case 'rotate_secret': {
179
+ if (!input.webhookId)
180
+ return {
181
+ success: false,
182
+ dataSource,
183
+ error: 'webhookId is required for action "rotate_secret".',
184
+ };
185
+ try {
186
+ const rotated = await service.rotateSecret(input.webhookId);
187
+ return {
188
+ success: true,
189
+ dataSource,
190
+ rotated,
191
+ message: `## Secret Rotated\n\n` +
192
+ `- **Webhook:** ${rotated.webhookId}\n` +
193
+ `- **New Secret:** \`${rotated.newSigningSecret}\`\n\n` +
194
+ `> **Store this secret now** -- it will not be shown again.`,
195
+ };
196
+ }
197
+ catch (e) {
198
+ return {
199
+ success: false,
200
+ dataSource,
201
+ error: e instanceof Error ? e.message : 'Unknown error',
202
+ };
203
+ }
204
+ }
205
+ }
206
+ }
207
+ export async function executeApiKeyManage(input, _context) {
208
+ const dataSource = getDataSource();
209
+ switch (input.action) {
210
+ case 'create': {
211
+ if (!input.name)
212
+ return { success: false, dataSource, error: 'name is required for action "create".' };
213
+ const key = await service.createApiKey(input.name, input.permissions, input.expiresIn);
214
+ return {
215
+ success: true,
216
+ dataSource,
217
+ key,
218
+ message: `## API Key Created\n\n` +
219
+ `- **Name:** ${key.name}\n` +
220
+ `- **Key ID:** ${key.id}\n` +
221
+ `- **Key Value:** \`${key.keyValue}\`\n` +
222
+ `- **Prefix:** ${key.keyPrefix}\n` +
223
+ `- **Permissions:** ${key.permissions.join(', ')}\n` +
224
+ `- **Expires:** ${key.expiresAt ?? 'never'}\n\n` +
225
+ `> **Store it now -- it won't be shown again.**`,
226
+ };
227
+ }
228
+ case 'list': {
229
+ const keys = await service.listApiKeys();
230
+ return {
231
+ success: true,
232
+ dataSource,
233
+ keys,
234
+ message: `## API Keys (${keys.length})\n\n` +
235
+ (keys.length === 0
236
+ ? 'No API keys found.'
237
+ : keys
238
+ .map((k) => `- **${k.name}** (${k.id}): ...${k.keyLast4} [${k.status}]`)
239
+ .join('\n')),
240
+ };
241
+ }
242
+ case 'get': {
243
+ if (!input.keyId)
244
+ return { success: false, dataSource, error: 'keyId is required for action "get".' };
245
+ const key = await service.getApiKey(input.keyId);
246
+ if (!key)
247
+ return { success: false, dataSource, error: `API key "${input.keyId}" not found.` };
248
+ return { success: true, dataSource, key };
249
+ }
250
+ case 'revoke': {
251
+ if (!input.keyId)
252
+ return { success: false, dataSource, error: 'keyId is required for action "revoke".' };
253
+ const revoked = await service.revokeApiKey(input.keyId);
254
+ if (!revoked)
255
+ return {
256
+ success: false,
257
+ dataSource,
258
+ error: `API key "${input.keyId}" not found or already revoked.`,
259
+ };
260
+ return { success: true, dataSource, message: `API key "${input.keyId}" has been revoked.` };
261
+ }
262
+ }
263
+ }
264
+ //# sourceMappingURL=integration-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-tools.js","sourceRoot":"","sources":["../../../src/tools/integration-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @fileoverview Real IntegrationService backed by Supabase
3
+ * @module @skillsmith/mcp-server/tools/integration-tools.service
4
+ * @see SMI-3915: Wave 1 — Webhooks + API Keys (Real Implementation)
5
+ *
6
+ * Uses HMAC-SHA256 for webhook signing. API keys are hashed with SHA-256
7
+ * before storage — raw key is returned once on creation and never persisted.
8
+ *
9
+ * SSRF protection via validateExternalUrl() on all outbound URLs.
10
+ */
11
+ import type { IntegrationService } from './integration-tools.js';
12
+ /** Minimal Supabase client interface for query building */
13
+ export interface SupabaseClient {
14
+ from(table: string): SupabaseQueryBuilder;
15
+ rpc(fn: string, params?: Record<string, unknown>): Promise<SupabaseSingleResult>;
16
+ }
17
+ interface SupabaseQueryBuilder {
18
+ insert(row: Record<string, unknown>): SupabaseQueryBuilder;
19
+ update(row: Record<string, unknown>): SupabaseQueryBuilder;
20
+ delete(): SupabaseQueryBuilder;
21
+ select(columns?: string): SupabaseQueryBuilder;
22
+ eq(column: string, value: unknown): SupabaseQueryBuilder;
23
+ is(column: string, value: null): SupabaseQueryBuilder;
24
+ order(column: string, options?: {
25
+ ascending?: boolean;
26
+ }): SupabaseQueryBuilder;
27
+ single(): Promise<SupabaseSingleResult>;
28
+ then(resolve: (value: SupabaseListResult) => void): void;
29
+ }
30
+ interface SupabaseSingleResult {
31
+ data: Record<string, unknown> | null;
32
+ error: {
33
+ message: string;
34
+ } | null;
35
+ }
36
+ interface SupabaseListResult {
37
+ data: Record<string, unknown>[] | null;
38
+ error: {
39
+ message: string;
40
+ } | null;
41
+ }
42
+ /** Hash an API key for storage (one-way) */
43
+ export declare function hashApiKey(key: string): string;
44
+ /** Compute HMAC-SHA256 signature for webhook delivery */
45
+ export declare function computeHmacSignature(secret: string, payload: string): string;
46
+ /**
47
+ * Create a real IntegrationService backed by Supabase.
48
+ *
49
+ * @param supabase - Supabase client (anon or service-role)
50
+ * @param teamId - Team ID for row-level scoping
51
+ */
52
+ export declare function createRealIntegrationService(supabase: SupabaseClient, teamId: string): IntegrationService;
53
+ export {};
54
+ //# sourceMappingURL=integration-tools.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-tools.service.d.ts","sourceRoot":"","sources":["../../../src/tools/integration-tools.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAA+B,MAAM,wBAAwB,CAAA;AAM7F,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAAA;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;CACjF;AAED,UAAU,oBAAoB;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAA;IAC1D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAA;IAC1D,MAAM,IAAI,oBAAoB,CAAA;IAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAAA;IAC9C,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAAA;IACxD,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,oBAAoB,CAAA;IACrD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,oBAAoB,CAAA;IAC9E,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACvC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAA;CACzD;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACpC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAClC;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAA;IACtC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAClC;AAuBD,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E;AAiDD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAwPpB"}