@skillsmith/mcp-server 0.3.3 → 0.3.4
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.
- package/README.md +5 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/context.test.d.ts +10 -0
- package/dist/src/__tests__/context.test.d.ts.map +1 -0
- package/dist/src/__tests__/context.test.js +345 -0
- package/dist/src/__tests__/context.test.js.map +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -1
- package/dist/src/__tests__/get-skill.test.js +84 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -1
- package/dist/src/__tests__/middleware/license.test.js +180 -78
- package/dist/src/__tests__/middleware/license.test.js.map +1 -1
- package/dist/src/__tests__/search.test.js +2 -1
- package/dist/src/__tests__/search.test.js.map +1 -1
- package/dist/src/__tests__/utils/validation.test.d.ts +7 -0
- package/dist/src/__tests__/utils/validation.test.d.ts.map +1 -0
- package/dist/src/__tests__/utils/validation.test.js +82 -0
- package/dist/src/__tests__/utils/validation.test.js.map +1 -0
- package/dist/src/context.d.ts +16 -0
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +57 -9
- package/dist/src/context.js.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/failover.d.ts +200 -0
- package/dist/src/llm/failover.d.ts.map +1 -0
- package/dist/src/llm/failover.js +329 -0
- package/dist/src/llm/failover.js.map +1 -0
- package/dist/src/middleware/license.d.ts +5 -0
- package/dist/src/middleware/license.d.ts.map +1 -1
- package/dist/src/middleware/license.js +2 -1
- package/dist/src/middleware/license.js.map +1 -1
- package/dist/src/tools/compare.d.ts +3 -102
- package/dist/src/tools/compare.d.ts.map +1 -1
- package/dist/src/tools/compare.helpers.d.ts +36 -0
- package/dist/src/tools/compare.helpers.d.ts.map +1 -0
- package/dist/src/tools/compare.helpers.js +252 -0
- package/dist/src/tools/compare.helpers.js.map +1 -0
- package/dist/src/tools/compare.js +6 -288
- package/dist/src/tools/compare.js.map +1 -1
- package/dist/src/tools/compare.types.d.ts +133 -0
- package/dist/src/tools/compare.types.d.ts.map +1 -0
- package/dist/src/tools/compare.types.js +45 -0
- package/dist/src/tools/compare.types.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +35 -2
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/install.d.ts +6 -60
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.helpers.d.ts +82 -0
- package/dist/src/tools/install.helpers.d.ts.map +1 -0
- package/dist/src/tools/install.helpers.js +324 -0
- package/dist/src/tools/install.helpers.js.map +1 -0
- package/dist/src/tools/install.js +117 -252
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.types.d.ts +114 -0
- package/dist/src/tools/install.types.d.ts.map +1 -0
- package/dist/src/tools/install.types.js +91 -0
- package/dist/src/tools/install.types.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +2 -148
- package/dist/src/tools/recommend.d.ts.map +1 -1
- package/dist/src/tools/recommend.helpers.d.ts +42 -0
- package/dist/src/tools/recommend.helpers.d.ts.map +1 -0
- package/dist/src/tools/recommend.helpers.js +155 -0
- package/dist/src/tools/recommend.helpers.js.map +1 -0
- package/dist/src/tools/recommend.js +75 -140
- package/dist/src/tools/recommend.js.map +1 -1
- package/dist/src/tools/recommend.types.d.ts +164 -0
- package/dist/src/tools/recommend.types.d.ts.map +1 -0
- package/dist/src/tools/recommend.types.js +87 -0
- package/dist/src/tools/recommend.types.js.map +1 -0
- package/dist/src/tools/search.d.ts +18 -4
- package/dist/src/tools/search.d.ts.map +1 -1
- package/dist/src/tools/search.js +60 -12
- package/dist/src/tools/search.js.map +1 -1
- package/dist/src/tools/validate.d.ts +3 -70
- package/dist/src/tools/validate.d.ts.map +1 -1
- package/dist/src/tools/validate.helpers.d.ts +22 -0
- package/dist/src/tools/validate.helpers.d.ts.map +1 -0
- package/dist/src/tools/validate.helpers.js +276 -0
- package/dist/src/tools/validate.helpers.js.map +1 -0
- package/dist/src/tools/validate.js +4 -337
- package/dist/src/tools/validate.js.map +1 -1
- package/dist/src/tools/validate.types.d.ts +96 -0
- package/dist/src/tools/validate.types.d.ts.map +1 -0
- package/dist/src/tools/validate.types.js +71 -0
- package/dist/src/tools/validate.types.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +1 -0
- package/dist/src/webhooks/index.d.ts.map +1 -1
- package/dist/src/webhooks/index.js +2 -0
- package/dist/src/webhooks/index.js.map +1 -1
- package/dist/src/webhooks/stripe-webhook-endpoint.d.ts +68 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.js +213 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.js.map +1 -0
- package/dist/tests/integration/install.integration.test.js +148 -1
- package/dist/tests/integration/install.integration.test.js.map +1 -1
- package/dist/tests/integration/recommend.integration.test.js +2 -1
- package/dist/tests/integration/recommend.integration.test.js.map +1 -1
- package/dist/tests/llm/failover.test.d.ts +13 -0
- package/dist/tests/llm/failover.test.d.ts.map +1 -0
- package/dist/tests/llm/failover.test.js +250 -0
- package/dist/tests/llm/failover.test.js.map +1 -0
- package/dist/tests/recommend.test.js +133 -1
- package/dist/tests/recommend.test.js.map +1 -1
- package/dist/tests/tools.test.d.ts +1 -0
- package/dist/tests/tools.test.d.ts.map +1 -1
- package/dist/tests/tools.test.js +59 -1
- package/dist/tests/tools.test.js.map +1 -1
- package/dist/tests/unit/compare-helpers.test.d.ts +8 -0
- package/dist/tests/unit/compare-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/compare-helpers.test.js +224 -0
- package/dist/tests/unit/compare-helpers.test.js.map +1 -0
- package/dist/tests/unit/install-helpers.test.d.ts +8 -0
- package/dist/tests/unit/install-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/install-helpers.test.js +460 -0
- package/dist/tests/unit/install-helpers.test.js.map +1 -0
- package/dist/tests/unit/recommend-helpers.test.d.ts +8 -0
- package/dist/tests/unit/recommend-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/recommend-helpers.test.js +117 -0
- package/dist/tests/unit/recommend-helpers.test.js.map +1 -0
- package/dist/tests/unit/validate-helpers.test.d.ts +8 -0
- package/dist/tests/unit/validate-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/validate-helpers.test.js +243 -0
- package/dist/tests/unit/validate-helpers.test.js.map +1 -0
- package/package.json +1 -1
- package/src/assets/docs/USER_GUIDE.md +0 -220
- package/src/assets/skills/skillsmith/docs/QUOTAS.md +0 -182
- package/src/assets/skills/skillsmith/docs/SECURITY.md +0 -174
- package/src/assets/skills/skillsmith/docs/TRUST_TIERS.md +0 -142
|
@@ -22,344 +22,13 @@
|
|
|
22
22
|
* strict: true
|
|
23
23
|
* });
|
|
24
24
|
*/
|
|
25
|
-
import { z } from 'zod';
|
|
26
25
|
import { promises as fs } from 'fs';
|
|
27
26
|
import { join } from 'path';
|
|
28
27
|
import { SkillsmithError, ErrorCodes } from '@skillsmith/core';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export
|
|
33
|
-
/** Path to SKILL.md file or skill directory */
|
|
34
|
-
skill_path: z.string().min(1, 'skill_path is required'),
|
|
35
|
-
/** Enable strict validation (default false) */
|
|
36
|
-
strict: z.boolean().default(false),
|
|
37
|
-
});
|
|
38
|
-
/**
|
|
39
|
-
* MCP tool schema definition for skill_validate
|
|
40
|
-
*/
|
|
41
|
-
export const validateToolSchema = {
|
|
42
|
-
name: 'skill_validate',
|
|
43
|
-
description: 'Validate a SKILL.md file or skill directory against Skillsmith specification. Checks structure, required fields, and security patterns.',
|
|
44
|
-
inputSchema: {
|
|
45
|
-
type: 'object',
|
|
46
|
-
properties: {
|
|
47
|
-
skill_path: {
|
|
48
|
-
type: 'string',
|
|
49
|
-
description: 'Path to SKILL.md file or skill directory containing SKILL.md',
|
|
50
|
-
},
|
|
51
|
-
strict: {
|
|
52
|
-
type: 'boolean',
|
|
53
|
-
description: 'Enable strict validation mode (default false). Strict mode treats warnings as errors.',
|
|
54
|
-
default: false,
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
required: ['skill_path'],
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* Maximum field lengths for validation
|
|
62
|
-
*/
|
|
63
|
-
const FIELD_LIMITS = {
|
|
64
|
-
name: 64,
|
|
65
|
-
description: 1024,
|
|
66
|
-
author: 128,
|
|
67
|
-
version: 32,
|
|
68
|
-
category: 64,
|
|
69
|
-
license: 64,
|
|
70
|
-
tagLength: 32,
|
|
71
|
-
maxTags: 20,
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* Dangerous URL patterns for SSRF prevention
|
|
75
|
-
*/
|
|
76
|
-
const SSRF_PATTERNS = [
|
|
77
|
-
/^file:\/\//i,
|
|
78
|
-
/^gopher:\/\//i,
|
|
79
|
-
/^dict:\/\//i,
|
|
80
|
-
/^ldap:\/\//i,
|
|
81
|
-
/localhost/i,
|
|
82
|
-
/127\.0\.0\.\d+/,
|
|
83
|
-
/0\.0\.0\.0/,
|
|
84
|
-
/\[::1\]/,
|
|
85
|
-
/10\.\d+\.\d+\.\d+/,
|
|
86
|
-
/172\.(1[6-9]|2\d|3[01])\.\d+\.\d+/,
|
|
87
|
-
/192\.168\.\d+\.\d+/,
|
|
88
|
-
];
|
|
89
|
-
/**
|
|
90
|
-
* Path traversal patterns
|
|
91
|
-
*/
|
|
92
|
-
const PATH_TRAVERSAL_PATTERNS = [/\.\./, /\.\.%2[fF]/, /%2[eE]%2[eE]/, /\\\.\\./];
|
|
93
|
-
/**
|
|
94
|
-
* Parse YAML frontmatter from markdown content
|
|
95
|
-
*/
|
|
96
|
-
function parseYamlFrontmatter(content) {
|
|
97
|
-
const trimmed = content.trim();
|
|
98
|
-
if (!trimmed.startsWith('---')) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
const endIndex = trimmed.indexOf('---', 3);
|
|
102
|
-
if (endIndex === -1) {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
const yamlContent = trimmed.slice(3, endIndex).trim();
|
|
106
|
-
const result = {};
|
|
107
|
-
const lines = yamlContent.split('\n');
|
|
108
|
-
let currentKey = null;
|
|
109
|
-
let arrayBuffer = [];
|
|
110
|
-
let inArray = false;
|
|
111
|
-
for (const line of lines) {
|
|
112
|
-
const trimmedLine = line.trim();
|
|
113
|
-
if (!trimmedLine || trimmedLine.startsWith('#')) {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
if (trimmedLine.startsWith('- ')) {
|
|
117
|
-
if (currentKey && inArray) {
|
|
118
|
-
const value = trimmedLine
|
|
119
|
-
.slice(2)
|
|
120
|
-
.trim()
|
|
121
|
-
.replace(/^["']|["']$/g, '');
|
|
122
|
-
arrayBuffer.push(value);
|
|
123
|
-
}
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
const colonIndex = trimmedLine.indexOf(':');
|
|
127
|
-
if (colonIndex > 0) {
|
|
128
|
-
if (currentKey && inArray && arrayBuffer.length > 0) {
|
|
129
|
-
result[currentKey] = arrayBuffer;
|
|
130
|
-
arrayBuffer = [];
|
|
131
|
-
}
|
|
132
|
-
const key = trimmedLine.slice(0, colonIndex).trim();
|
|
133
|
-
const value = trimmedLine.slice(colonIndex + 1).trim();
|
|
134
|
-
if (value === '' || value === '|' || value === '>') {
|
|
135
|
-
currentKey = key;
|
|
136
|
-
inArray = true;
|
|
137
|
-
arrayBuffer = [];
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
currentKey = null;
|
|
141
|
-
inArray = false;
|
|
142
|
-
let parsedValue = value;
|
|
143
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
144
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
145
|
-
parsedValue = value.slice(1, -1);
|
|
146
|
-
}
|
|
147
|
-
else if (value === 'true') {
|
|
148
|
-
parsedValue = true;
|
|
149
|
-
}
|
|
150
|
-
else if (value === 'false') {
|
|
151
|
-
parsedValue = false;
|
|
152
|
-
}
|
|
153
|
-
else if (/^-?\d+(\.\d+)?$/.test(value)) {
|
|
154
|
-
parsedValue = parseFloat(value);
|
|
155
|
-
}
|
|
156
|
-
else if (value.startsWith('[') && value.endsWith(']')) {
|
|
157
|
-
parsedValue = value
|
|
158
|
-
.slice(1, -1)
|
|
159
|
-
.split(',')
|
|
160
|
-
.map((item) => item.trim().replace(/^["']|["']$/g, ''))
|
|
161
|
-
.filter((item) => item.length > 0);
|
|
162
|
-
}
|
|
163
|
-
result[key] = parsedValue;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (currentKey && inArray && arrayBuffer.length > 0) {
|
|
168
|
-
result[currentKey] = arrayBuffer;
|
|
169
|
-
}
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Check for SSRF patterns in a URL
|
|
174
|
-
*/
|
|
175
|
-
function hasSsrfPattern(url) {
|
|
176
|
-
return SSRF_PATTERNS.some((pattern) => pattern.test(url));
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Check for path traversal patterns
|
|
180
|
-
*/
|
|
181
|
-
function hasPathTraversal(path) {
|
|
182
|
-
return PATH_TRAVERSAL_PATTERNS.some((pattern) => pattern.test(path));
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Validate skill metadata
|
|
186
|
-
*/
|
|
187
|
-
function validateMetadata(metadata, strict) {
|
|
188
|
-
const errors = [];
|
|
189
|
-
// Required fields
|
|
190
|
-
if (!metadata.name) {
|
|
191
|
-
errors.push({
|
|
192
|
-
field: 'name',
|
|
193
|
-
message: 'Required field "name" is missing',
|
|
194
|
-
severity: 'error',
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
else if (typeof metadata.name !== 'string') {
|
|
198
|
-
errors.push({
|
|
199
|
-
field: 'name',
|
|
200
|
-
message: 'Field "name" must be a string',
|
|
201
|
-
severity: 'error',
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
else if (metadata.name.length > FIELD_LIMITS.name) {
|
|
205
|
-
errors.push({
|
|
206
|
-
field: 'name',
|
|
207
|
-
message: `Field "name" exceeds maximum length of ${FIELD_LIMITS.name} characters`,
|
|
208
|
-
severity: 'error',
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
// Description validation
|
|
212
|
-
if (!metadata.description) {
|
|
213
|
-
errors.push({
|
|
214
|
-
field: 'description',
|
|
215
|
-
message: 'Required field "description" is missing',
|
|
216
|
-
severity: strict ? 'error' : 'warning',
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
else if (typeof metadata.description !== 'string') {
|
|
220
|
-
errors.push({
|
|
221
|
-
field: 'description',
|
|
222
|
-
message: 'Field "description" must be a string',
|
|
223
|
-
severity: 'error',
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
else if (metadata.description.length > FIELD_LIMITS.description) {
|
|
227
|
-
errors.push({
|
|
228
|
-
field: 'description',
|
|
229
|
-
message: `Field "description" exceeds maximum length of ${FIELD_LIMITS.description} characters`,
|
|
230
|
-
severity: 'error',
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
// Author validation
|
|
234
|
-
if (metadata.author !== undefined) {
|
|
235
|
-
if (typeof metadata.author !== 'string') {
|
|
236
|
-
errors.push({
|
|
237
|
-
field: 'author',
|
|
238
|
-
message: 'Field "author" must be a string',
|
|
239
|
-
severity: 'error',
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
else if (metadata.author.length > FIELD_LIMITS.author) {
|
|
243
|
-
errors.push({
|
|
244
|
-
field: 'author',
|
|
245
|
-
message: `Field "author" exceeds maximum length of ${FIELD_LIMITS.author} characters`,
|
|
246
|
-
severity: 'error',
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
// Version validation
|
|
251
|
-
if (metadata.version !== undefined) {
|
|
252
|
-
if (typeof metadata.version !== 'string') {
|
|
253
|
-
errors.push({
|
|
254
|
-
field: 'version',
|
|
255
|
-
message: 'Field "version" must be a string',
|
|
256
|
-
severity: 'error',
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
else if (metadata.version.length > FIELD_LIMITS.version) {
|
|
260
|
-
errors.push({
|
|
261
|
-
field: 'version',
|
|
262
|
-
message: `Field "version" exceeds maximum length of ${FIELD_LIMITS.version} characters`,
|
|
263
|
-
severity: 'error',
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
else if (strict) {
|
|
268
|
-
errors.push({
|
|
269
|
-
field: 'version',
|
|
270
|
-
message: 'Field "version" is recommended',
|
|
271
|
-
severity: 'warning',
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
// Tags validation
|
|
275
|
-
if (metadata.tags !== undefined) {
|
|
276
|
-
if (!Array.isArray(metadata.tags)) {
|
|
277
|
-
errors.push({
|
|
278
|
-
field: 'tags',
|
|
279
|
-
message: 'Field "tags" must be an array',
|
|
280
|
-
severity: 'error',
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
if (metadata.tags.length > FIELD_LIMITS.maxTags) {
|
|
285
|
-
errors.push({
|
|
286
|
-
field: 'tags',
|
|
287
|
-
message: `Field "tags" exceeds maximum count of ${FIELD_LIMITS.maxTags}`,
|
|
288
|
-
severity: 'error',
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
for (let i = 0; i < metadata.tags.length; i++) {
|
|
292
|
-
const tag = metadata.tags[i];
|
|
293
|
-
if (typeof tag !== 'string') {
|
|
294
|
-
errors.push({
|
|
295
|
-
field: `tags[${i}]`,
|
|
296
|
-
message: 'Tag must be a string',
|
|
297
|
-
severity: 'error',
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
else if (tag.length > FIELD_LIMITS.tagLength) {
|
|
301
|
-
errors.push({
|
|
302
|
-
field: `tags[${i}]`,
|
|
303
|
-
message: `Tag exceeds maximum length of ${FIELD_LIMITS.tagLength} characters`,
|
|
304
|
-
severity: 'error',
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
else if (strict) {
|
|
311
|
-
errors.push({
|
|
312
|
-
field: 'tags',
|
|
313
|
-
message: 'Field "tags" is recommended for discoverability',
|
|
314
|
-
severity: 'warning',
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
// Security: Check repository URL for SSRF
|
|
318
|
-
if (metadata.repository !== undefined) {
|
|
319
|
-
if (typeof metadata.repository !== 'string') {
|
|
320
|
-
errors.push({
|
|
321
|
-
field: 'repository',
|
|
322
|
-
message: 'Field "repository" must be a string',
|
|
323
|
-
severity: 'error',
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
else if (hasSsrfPattern(metadata.repository)) {
|
|
327
|
-
errors.push({
|
|
328
|
-
field: 'repository',
|
|
329
|
-
message: 'Field "repository" contains potentially dangerous URL pattern',
|
|
330
|
-
severity: 'error',
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
// Security: Check homepage URL for SSRF
|
|
335
|
-
if (metadata.homepage !== undefined) {
|
|
336
|
-
if (typeof metadata.homepage !== 'string') {
|
|
337
|
-
errors.push({
|
|
338
|
-
field: 'homepage',
|
|
339
|
-
message: 'Field "homepage" must be a string',
|
|
340
|
-
severity: 'error',
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
else if (hasSsrfPattern(metadata.homepage)) {
|
|
344
|
-
errors.push({
|
|
345
|
-
field: 'homepage',
|
|
346
|
-
message: 'Field "homepage" contains potentially dangerous URL pattern',
|
|
347
|
-
severity: 'error',
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// Security: Check for path traversal in any string fields
|
|
352
|
-
for (const [key, value] of Object.entries(metadata)) {
|
|
353
|
-
if (typeof value === 'string' && hasPathTraversal(value)) {
|
|
354
|
-
errors.push({
|
|
355
|
-
field: key,
|
|
356
|
-
message: `Field "${key}" contains path traversal pattern`,
|
|
357
|
-
severity: 'error',
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
return errors;
|
|
362
|
-
}
|
|
28
|
+
import { validateInputSchema } from './validate.types.js';
|
|
29
|
+
// Import helpers
|
|
30
|
+
import { parseYamlFrontmatter, hasPathTraversal, validateMetadata } from './validate.helpers.js';
|
|
31
|
+
export { validateInputSchema, validateToolSchema } from './validate.types.js';
|
|
363
32
|
/**
|
|
364
33
|
* Execute skill validation.
|
|
365
34
|
*
|
|
@@ -401,7 +70,6 @@ export async function executeValidate(input, _context) {
|
|
|
401
70
|
}
|
|
402
71
|
}
|
|
403
72
|
catch {
|
|
404
|
-
// Path doesn't exist or is inaccessible
|
|
405
73
|
throw new SkillsmithError(ErrorCodes.SKILL_NOT_FOUND, `Path not found: ${skill_path}`, {
|
|
406
74
|
details: { path: skill_path },
|
|
407
75
|
});
|
|
@@ -427,7 +95,6 @@ export async function executeValidate(input, _context) {
|
|
|
427
95
|
});
|
|
428
96
|
}
|
|
429
97
|
else {
|
|
430
|
-
// Validate metadata
|
|
431
98
|
errors.push(...validateMetadata(metadata, strict));
|
|
432
99
|
}
|
|
433
100
|
// Determine validity
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/tools/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Tool Types and Schemas
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/validate.types
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Zod schema for validate tool input
|
|
8
|
+
*/
|
|
9
|
+
export declare const validateInputSchema: z.ZodObject<{
|
|
10
|
+
/** Path to SKILL.md file or skill directory */
|
|
11
|
+
skill_path: z.ZodString;
|
|
12
|
+
/** Enable strict validation (default false) */
|
|
13
|
+
strict: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
skill_path: string;
|
|
16
|
+
strict: boolean;
|
|
17
|
+
}, {
|
|
18
|
+
skill_path: string;
|
|
19
|
+
strict?: boolean | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
/**
|
|
22
|
+
* Input type (before parsing, allows optional fields)
|
|
23
|
+
*/
|
|
24
|
+
export type ValidateInput = z.input<typeof validateInputSchema>;
|
|
25
|
+
/**
|
|
26
|
+
* Validation error with severity
|
|
27
|
+
*/
|
|
28
|
+
export interface ValidationError {
|
|
29
|
+
/** Field that has the error */
|
|
30
|
+
field: string;
|
|
31
|
+
/** Error message */
|
|
32
|
+
message: string;
|
|
33
|
+
/** Severity level */
|
|
34
|
+
severity: 'error' | 'warning';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validation response
|
|
38
|
+
*/
|
|
39
|
+
export interface ValidateResponse {
|
|
40
|
+
/** Whether the skill is valid */
|
|
41
|
+
valid: boolean;
|
|
42
|
+
/** List of validation errors/warnings */
|
|
43
|
+
errors: ValidationError[];
|
|
44
|
+
/** Parsed metadata if valid */
|
|
45
|
+
metadata: Record<string, unknown> | null;
|
|
46
|
+
/** File path validated */
|
|
47
|
+
path: string;
|
|
48
|
+
/** Performance timing */
|
|
49
|
+
timing: {
|
|
50
|
+
totalMs: number;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* MCP tool schema definition for skill_validate
|
|
55
|
+
*/
|
|
56
|
+
export declare const validateToolSchema: {
|
|
57
|
+
name: string;
|
|
58
|
+
description: string;
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object";
|
|
61
|
+
properties: {
|
|
62
|
+
skill_path: {
|
|
63
|
+
type: string;
|
|
64
|
+
description: string;
|
|
65
|
+
};
|
|
66
|
+
strict: {
|
|
67
|
+
type: string;
|
|
68
|
+
description: string;
|
|
69
|
+
default: boolean;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
required: string[];
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Maximum field lengths for validation
|
|
77
|
+
*/
|
|
78
|
+
export declare const FIELD_LIMITS: {
|
|
79
|
+
name: number;
|
|
80
|
+
description: number;
|
|
81
|
+
author: number;
|
|
82
|
+
version: number;
|
|
83
|
+
category: number;
|
|
84
|
+
license: number;
|
|
85
|
+
tagLength: number;
|
|
86
|
+
maxTags: number;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Dangerous URL patterns for SSRF prevention
|
|
90
|
+
*/
|
|
91
|
+
export declare const SSRF_PATTERNS: RegExp[];
|
|
92
|
+
/**
|
|
93
|
+
* Path traversal patterns
|
|
94
|
+
*/
|
|
95
|
+
export declare const PATH_TRAVERSAL_PATTERNS: RegExp[];
|
|
96
|
+
//# sourceMappingURL=validate.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.types.d.ts","sourceRoot":"","sources":["../../../src/tools/validate.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B,+CAA+C;;IAE/C,+CAA+C;;;;;;;;EAE/C,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,qBAAqB;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,yCAAyC;IACzC,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACxC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;CAoB9B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;CASxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,UAazB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,UAAoD,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Tool Types and Schemas
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/validate.types
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Zod schema for validate tool input
|
|
8
|
+
*/
|
|
9
|
+
export const validateInputSchema = z.object({
|
|
10
|
+
/** Path to SKILL.md file or skill directory */
|
|
11
|
+
skill_path: z.string().min(1, 'skill_path is required'),
|
|
12
|
+
/** Enable strict validation (default false) */
|
|
13
|
+
strict: z.boolean().default(false),
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* MCP tool schema definition for skill_validate
|
|
17
|
+
*/
|
|
18
|
+
export const validateToolSchema = {
|
|
19
|
+
name: 'skill_validate',
|
|
20
|
+
description: 'Validate a SKILL.md file or skill directory against Skillsmith specification. Checks structure, required fields, and security patterns.',
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
skill_path: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Path to SKILL.md file or skill directory containing SKILL.md',
|
|
27
|
+
},
|
|
28
|
+
strict: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: 'Enable strict validation mode (default false). Strict mode treats warnings as errors.',
|
|
31
|
+
default: false,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ['skill_path'],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Maximum field lengths for validation
|
|
39
|
+
*/
|
|
40
|
+
export const FIELD_LIMITS = {
|
|
41
|
+
name: 64,
|
|
42
|
+
description: 1024,
|
|
43
|
+
author: 128,
|
|
44
|
+
version: 32,
|
|
45
|
+
category: 64,
|
|
46
|
+
license: 64,
|
|
47
|
+
tagLength: 32,
|
|
48
|
+
maxTags: 20,
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Dangerous URL patterns for SSRF prevention
|
|
52
|
+
*/
|
|
53
|
+
export const SSRF_PATTERNS = [
|
|
54
|
+
/^file:\/\//i,
|
|
55
|
+
/^gopher:\/\//i,
|
|
56
|
+
/^dict:\/\//i,
|
|
57
|
+
/^ldap:\/\//i,
|
|
58
|
+
/localhost/i,
|
|
59
|
+
/127\.0\.0\.\d+/,
|
|
60
|
+
/0\.0\.0\.0/,
|
|
61
|
+
/\[::1\]/,
|
|
62
|
+
/10\.\d+\.\d+\.\d+/,
|
|
63
|
+
/172\.(1[6-9]|2\d|3[01])\.\d+\.\d+/,
|
|
64
|
+
/192\.168\.\d+\.\d+/,
|
|
65
|
+
/169\.254\.\d+\.\d+/, // SMI-1723: Cloud metadata service (AWS, Azure, GCP)
|
|
66
|
+
];
|
|
67
|
+
/**
|
|
68
|
+
* Path traversal patterns
|
|
69
|
+
*/
|
|
70
|
+
export const PATH_TRAVERSAL_PATTERNS = [/\.\./, /\.\.%2[fF]/, /%2[eE]%2[eE]/, /\\\.\\./];
|
|
71
|
+
//# sourceMappingURL=validate.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.types.js","sourceRoot":"","sources":["../../../src/tools/validate.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,+CAA+C;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;IACvD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnC,CAAC,CAAA;AAqCF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,yIAAyI;IAC3I,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8DAA8D;aAC5E;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,uFAAuF;gBACzF,OAAO,EAAE,KAAK;aACf;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;CACF,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;CACZ,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,aAAa;IACb,eAAe;IACf,aAAa;IACb,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,mBAAmB;IACnB,mCAAmC;IACnC,oBAAoB;IACpB,oBAAoB,EAAE,qDAAqD;CAC5E,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAAA"}
|
|
@@ -5,4 +5,5 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { createWebhookServer, startWebhookServer, stopWebhookServer, type WebhookServerOptions, type ServerStartOptions, type WebhookServer, } from './webhook-endpoint.js';
|
|
7
7
|
export { WebhookHandler, WebhookQueue, isSkillFile, extractSkillChanges, parseWebhookPayload, type WebhookEventType, type SkillFileChange, type WebhookHandleResult, type WebhookQueueItem, type QueueStats, } from '@skillsmith/core';
|
|
8
|
+
export { createStripeWebhookServer, startStripeWebhookServer, type StripeWebhookServerConfig, type StripeWebhookServerOptions, type StripeWebhookServer, } from './stripe-webhook-endpoint.js';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,GACzB,MAAM,8BAA8B,CAAA"}
|
|
@@ -6,4 +6,6 @@
|
|
|
6
6
|
export { createWebhookServer, startWebhookServer, stopWebhookServer, } from './webhook-endpoint.js';
|
|
7
7
|
// Re-export core webhook types for convenience
|
|
8
8
|
export { WebhookHandler, WebhookQueue, isSkillFile, extractSkillChanges, parseWebhookPayload, } from '@skillsmith/core';
|
|
9
|
+
// SMI-1070: Stripe webhook endpoint
|
|
10
|
+
export { createStripeWebhookServer, startStripeWebhookServer, } from './stripe-webhook-endpoint.js';
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAIlB,MAAM,uBAAuB,CAAA;AAE9B,+CAA+C;AAC/C,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,mBAAmB,GAMpB,MAAM,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAIlB,MAAM,uBAAuB,CAAA;AAE9B,+CAA+C;AAC/C,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,mBAAmB,GAMpB,MAAM,kBAAkB,CAAA;AAEzB,oCAAoC;AACpC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAIzB,MAAM,8BAA8B,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1070: Stripe Webhook Endpoint
|
|
3
|
+
*
|
|
4
|
+
* HTTP endpoint for receiving Stripe webhooks.
|
|
5
|
+
* Integrates with the existing webhook server infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Signature verification
|
|
9
|
+
* - Rate limiting (STRIPE_WEBHOOK preset)
|
|
10
|
+
* - Idempotent event processing
|
|
11
|
+
* - Health check endpoint
|
|
12
|
+
*/
|
|
13
|
+
import { Server } from 'http';
|
|
14
|
+
import type { RateLimiterState } from './webhook-endpoint.js';
|
|
15
|
+
import type { StripeWebhookHandler } from '@skillsmith/core/billing';
|
|
16
|
+
export interface StripeWebhookServerConfig {
|
|
17
|
+
/**
|
|
18
|
+
* Stripe webhook signing secret
|
|
19
|
+
*/
|
|
20
|
+
webhookSecret: string;
|
|
21
|
+
/**
|
|
22
|
+
* Whether to trust proxy headers
|
|
23
|
+
*/
|
|
24
|
+
trustProxy?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Trusted proxy IPs
|
|
27
|
+
*/
|
|
28
|
+
trustedProxies?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Maximum request body size (default: 64KB)
|
|
31
|
+
*/
|
|
32
|
+
maxBodySize?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Rate limit: max requests per minute (default: 100)
|
|
35
|
+
*/
|
|
36
|
+
rateLimit?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface StripeWebhookServerOptions extends StripeWebhookServerConfig {
|
|
39
|
+
/**
|
|
40
|
+
* Webhook handler instance
|
|
41
|
+
*/
|
|
42
|
+
webhookHandler: StripeWebhookHandler;
|
|
43
|
+
/**
|
|
44
|
+
* Logging callback
|
|
45
|
+
*/
|
|
46
|
+
onLog?: (level: 'info' | 'warn' | 'error', message: string, data?: unknown) => void;
|
|
47
|
+
}
|
|
48
|
+
export interface StripeWebhookServer {
|
|
49
|
+
server: Server;
|
|
50
|
+
rateLimiter: RateLimiterState;
|
|
51
|
+
stop: () => Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a Stripe webhook server
|
|
55
|
+
*/
|
|
56
|
+
export declare function createStripeWebhookServer(options: StripeWebhookServerOptions): StripeWebhookServer;
|
|
57
|
+
/**
|
|
58
|
+
* Start the Stripe webhook server
|
|
59
|
+
*/
|
|
60
|
+
export declare function startStripeWebhookServer(webhookServer: StripeWebhookServer, options?: {
|
|
61
|
+
port?: number;
|
|
62
|
+
host?: string;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Standalone entry point for Stripe webhook server
|
|
66
|
+
*/
|
|
67
|
+
export declare function main(): Promise<void>;
|
|
68
|
+
//# sourceMappingURL=stripe-webhook-endpoint.d.ts.map
|