@outfitter/mcp 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +179 -5
- package/dist/actions.d.ts +4 -0
- package/dist/actions.js +11 -0
- package/dist/core-tools.d.ts +4 -0
- package/dist/core-tools.js +13 -0
- package/dist/index.d.ts +140 -28
- package/dist/index.js +158 -51
- package/dist/logging.d.ts +2 -0
- package/dist/logging.js +9 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.js +7 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +18 -0
- package/dist/shared/@outfitter/mcp-2vqyt1fj.d.ts +104 -0
- package/dist/shared/@outfitter/mcp-9m5hs2z0.js +49 -0
- package/dist/shared/@outfitter/mcp-9whem1wr.js +28 -0
- package/dist/shared/@outfitter/mcp-a0cgfsnw.d.ts +8 -0
- package/dist/shared/@outfitter/mcp-cqpyer9m.d.ts +27 -0
- package/dist/shared/@outfitter/mcp-dwd800vf.d.ts +96 -0
- package/dist/shared/@outfitter/mcp-f91wbr49.js +341 -0
- package/dist/shared/@outfitter/mcp-fjtxsa0x.js +36 -0
- package/dist/shared/@outfitter/mcp-h2twz77x.d.ts +699 -0
- package/dist/shared/@outfitter/mcp-jk0ka9hw.d.ts +30 -0
- package/dist/shared/@outfitter/mcp-k8r6kefr.js +538 -0
- package/dist/shared/@outfitter/mcp-mzky3ck8.js +165 -0
- package/dist/shared/@outfitter/mcp-s80bqcsb.d.ts +60 -0
- package/dist/shared/@outfitter/mcp-zv3ej45k.js +143 -0
- package/dist/transport.d.ts +4 -0
- package/dist/transport.js +13 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.js +13 -0
- package/package.json +43 -7
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/mcp/src/schema.ts
|
|
3
|
+
function zodToJsonSchema(schema) {
|
|
4
|
+
return convertZodType(schema);
|
|
5
|
+
}
|
|
6
|
+
function getDef(schemaOrDef) {
|
|
7
|
+
if (!schemaOrDef) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (schemaOrDef._def) {
|
|
11
|
+
return schemaOrDef._def;
|
|
12
|
+
}
|
|
13
|
+
if (schemaOrDef.def) {
|
|
14
|
+
return schemaOrDef.def;
|
|
15
|
+
}
|
|
16
|
+
return schemaOrDef;
|
|
17
|
+
}
|
|
18
|
+
function getDescription(schema, def) {
|
|
19
|
+
if (typeof schema?.description === "string") {
|
|
20
|
+
return schema.description;
|
|
21
|
+
}
|
|
22
|
+
if (typeof def?.description === "string") {
|
|
23
|
+
return def.description;
|
|
24
|
+
}
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
function convertZodType(schema) {
|
|
28
|
+
const def = getDef(schema);
|
|
29
|
+
if (!def) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
const typeName = def.typeName ?? def.type;
|
|
33
|
+
let jsonSchema;
|
|
34
|
+
switch (typeName) {
|
|
35
|
+
case "ZodString":
|
|
36
|
+
case "string":
|
|
37
|
+
jsonSchema = convertString(def);
|
|
38
|
+
break;
|
|
39
|
+
case "ZodNumber":
|
|
40
|
+
case "number":
|
|
41
|
+
jsonSchema = convertNumber(def);
|
|
42
|
+
break;
|
|
43
|
+
case "ZodBoolean":
|
|
44
|
+
case "boolean":
|
|
45
|
+
jsonSchema = { type: "boolean" };
|
|
46
|
+
break;
|
|
47
|
+
case "ZodNull":
|
|
48
|
+
case "null":
|
|
49
|
+
jsonSchema = { type: "null" };
|
|
50
|
+
break;
|
|
51
|
+
case "ZodUndefined":
|
|
52
|
+
case "undefined":
|
|
53
|
+
jsonSchema = {};
|
|
54
|
+
break;
|
|
55
|
+
case "ZodArray":
|
|
56
|
+
case "array":
|
|
57
|
+
jsonSchema = convertArray(def);
|
|
58
|
+
break;
|
|
59
|
+
case "ZodObject":
|
|
60
|
+
case "object":
|
|
61
|
+
jsonSchema = convertObject(def);
|
|
62
|
+
break;
|
|
63
|
+
case "ZodOptional":
|
|
64
|
+
case "optional":
|
|
65
|
+
jsonSchema = convertZodType(def.innerType);
|
|
66
|
+
break;
|
|
67
|
+
case "ZodNullable":
|
|
68
|
+
case "nullable":
|
|
69
|
+
jsonSchema = {
|
|
70
|
+
anyOf: [convertZodType(def.innerType), { type: "null" }]
|
|
71
|
+
};
|
|
72
|
+
break;
|
|
73
|
+
case "ZodDefault":
|
|
74
|
+
case "default": {
|
|
75
|
+
const defaultValue = typeof def.defaultValue === "function" ? def.defaultValue() : def.defaultValue;
|
|
76
|
+
jsonSchema = {
|
|
77
|
+
...convertZodType(def.innerType),
|
|
78
|
+
default: defaultValue
|
|
79
|
+
};
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case "ZodEnum":
|
|
83
|
+
case "enum": {
|
|
84
|
+
const values = def.values ?? Object.values(def.entries ?? {});
|
|
85
|
+
jsonSchema = {
|
|
86
|
+
type: "string",
|
|
87
|
+
enum: values
|
|
88
|
+
};
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "ZodNativeEnum":
|
|
92
|
+
jsonSchema = {
|
|
93
|
+
enum: Object.values(def.values ?? def.entries ?? {})
|
|
94
|
+
};
|
|
95
|
+
break;
|
|
96
|
+
case "ZodLiteral":
|
|
97
|
+
case "literal": {
|
|
98
|
+
const literalValues = Array.isArray(def.values) ? def.values : [def.value].filter((value) => value !== undefined);
|
|
99
|
+
if (literalValues.length > 1) {
|
|
100
|
+
jsonSchema = {
|
|
101
|
+
enum: literalValues
|
|
102
|
+
};
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
jsonSchema = literalValues.length ? {
|
|
106
|
+
const: literalValues[0]
|
|
107
|
+
} : {};
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case "ZodUnion":
|
|
111
|
+
case "union":
|
|
112
|
+
jsonSchema = {
|
|
113
|
+
anyOf: def.options.map(convertZodType)
|
|
114
|
+
};
|
|
115
|
+
break;
|
|
116
|
+
case "ZodIntersection":
|
|
117
|
+
case "intersection":
|
|
118
|
+
jsonSchema = {
|
|
119
|
+
allOf: [convertZodType(def.left), convertZodType(def.right)]
|
|
120
|
+
};
|
|
121
|
+
break;
|
|
122
|
+
case "ZodRecord":
|
|
123
|
+
case "record":
|
|
124
|
+
jsonSchema = {
|
|
125
|
+
type: "object",
|
|
126
|
+
additionalProperties: def.valueType ? convertZodType(def.valueType) : {}
|
|
127
|
+
};
|
|
128
|
+
break;
|
|
129
|
+
case "ZodTuple":
|
|
130
|
+
case "tuple":
|
|
131
|
+
jsonSchema = {
|
|
132
|
+
type: "array",
|
|
133
|
+
items: def.items.map(convertZodType)
|
|
134
|
+
};
|
|
135
|
+
break;
|
|
136
|
+
case "ZodAny":
|
|
137
|
+
case "any":
|
|
138
|
+
jsonSchema = {};
|
|
139
|
+
break;
|
|
140
|
+
case "ZodUnknown":
|
|
141
|
+
case "unknown":
|
|
142
|
+
jsonSchema = {};
|
|
143
|
+
break;
|
|
144
|
+
case "ZodVoid":
|
|
145
|
+
case "void":
|
|
146
|
+
jsonSchema = {};
|
|
147
|
+
break;
|
|
148
|
+
case "ZodNever":
|
|
149
|
+
case "never":
|
|
150
|
+
jsonSchema = { not: {} };
|
|
151
|
+
break;
|
|
152
|
+
case "ZodEffects":
|
|
153
|
+
jsonSchema = convertZodType(def.schema);
|
|
154
|
+
break;
|
|
155
|
+
case "ZodPipeline":
|
|
156
|
+
case "pipe": {
|
|
157
|
+
const outputDef = getDef(def.out);
|
|
158
|
+
const outputType = outputDef?.typeName ?? outputDef?.type;
|
|
159
|
+
jsonSchema = outputType === "transform" ? convertZodType(def.in) : convertZodType(def.out);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case "ZodLazy":
|
|
163
|
+
case "lazy":
|
|
164
|
+
jsonSchema = {};
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
jsonSchema = {};
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
const description = getDescription(schema, def);
|
|
171
|
+
if (description && !jsonSchema.description) {
|
|
172
|
+
jsonSchema.description = description;
|
|
173
|
+
}
|
|
174
|
+
return jsonSchema;
|
|
175
|
+
}
|
|
176
|
+
function convertString(def) {
|
|
177
|
+
const schema = { type: "string" };
|
|
178
|
+
if (def.checks) {
|
|
179
|
+
for (const check of def.checks) {
|
|
180
|
+
const normalizedCheck = check?._zod?.def ?? check?.def ?? check;
|
|
181
|
+
if (normalizedCheck?.kind) {
|
|
182
|
+
switch (normalizedCheck.kind) {
|
|
183
|
+
case "min":
|
|
184
|
+
schema.minLength = normalizedCheck.value;
|
|
185
|
+
break;
|
|
186
|
+
case "max":
|
|
187
|
+
schema.maxLength = normalizedCheck.value;
|
|
188
|
+
break;
|
|
189
|
+
case "length":
|
|
190
|
+
schema.minLength = normalizedCheck.value;
|
|
191
|
+
schema.maxLength = normalizedCheck.value;
|
|
192
|
+
break;
|
|
193
|
+
case "email":
|
|
194
|
+
schema.pattern = "^[^@]+@[^@]+\\.[^@]+$";
|
|
195
|
+
break;
|
|
196
|
+
case "url":
|
|
197
|
+
schema.pattern = "^https?://";
|
|
198
|
+
break;
|
|
199
|
+
case "uuid":
|
|
200
|
+
schema.pattern = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
|
|
201
|
+
break;
|
|
202
|
+
case "regex":
|
|
203
|
+
schema.pattern = normalizedCheck.regex?.source ?? normalizedCheck.pattern?.source ?? (typeof normalizedCheck.pattern === "string" ? normalizedCheck.pattern : undefined);
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (!normalizedCheck?.check) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
switch (normalizedCheck.check) {
|
|
214
|
+
case "min_length":
|
|
215
|
+
schema.minLength = normalizedCheck.minimum;
|
|
216
|
+
break;
|
|
217
|
+
case "max_length":
|
|
218
|
+
schema.maxLength = normalizedCheck.maximum;
|
|
219
|
+
break;
|
|
220
|
+
case "string_format":
|
|
221
|
+
if (normalizedCheck.pattern) {
|
|
222
|
+
schema.pattern = typeof normalizedCheck.pattern === "string" ? normalizedCheck.pattern : normalizedCheck.pattern.source;
|
|
223
|
+
}
|
|
224
|
+
if (normalizedCheck.format && normalizedCheck.format !== "regex") {
|
|
225
|
+
schema.format = normalizedCheck.format;
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
default:
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return schema;
|
|
234
|
+
}
|
|
235
|
+
function convertNumber(def) {
|
|
236
|
+
const schema = { type: "number" };
|
|
237
|
+
if (def.checks) {
|
|
238
|
+
for (const check of def.checks) {
|
|
239
|
+
const normalizedCheck = check?._zod?.def ?? check?.def ?? check;
|
|
240
|
+
if (normalizedCheck?.kind) {
|
|
241
|
+
switch (normalizedCheck.kind) {
|
|
242
|
+
case "min":
|
|
243
|
+
schema.minimum = normalizedCheck.value;
|
|
244
|
+
break;
|
|
245
|
+
case "max":
|
|
246
|
+
schema.maximum = normalizedCheck.value;
|
|
247
|
+
break;
|
|
248
|
+
case "int":
|
|
249
|
+
schema.type = "integer";
|
|
250
|
+
break;
|
|
251
|
+
default:
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (!normalizedCheck?.check) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
switch (normalizedCheck.check) {
|
|
260
|
+
case "greater_than":
|
|
261
|
+
if (normalizedCheck.inclusive) {
|
|
262
|
+
schema.minimum = normalizedCheck.value;
|
|
263
|
+
} else {
|
|
264
|
+
schema.exclusiveMinimum = normalizedCheck.value;
|
|
265
|
+
}
|
|
266
|
+
break;
|
|
267
|
+
case "less_than":
|
|
268
|
+
if (normalizedCheck.inclusive) {
|
|
269
|
+
schema.maximum = normalizedCheck.value;
|
|
270
|
+
} else {
|
|
271
|
+
schema.exclusiveMaximum = normalizedCheck.value;
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
case "number_format":
|
|
275
|
+
if (normalizedCheck.format === "int" || normalizedCheck.format === "safeint") {
|
|
276
|
+
schema.type = "integer";
|
|
277
|
+
}
|
|
278
|
+
break;
|
|
279
|
+
default:
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return schema;
|
|
285
|
+
}
|
|
286
|
+
function convertArray(def) {
|
|
287
|
+
const element = def.element ?? def.type;
|
|
288
|
+
const schema = {
|
|
289
|
+
type: "array",
|
|
290
|
+
items: element ? convertZodType(element) : {}
|
|
291
|
+
};
|
|
292
|
+
return schema;
|
|
293
|
+
}
|
|
294
|
+
function isFieldOptional(fieldDef) {
|
|
295
|
+
if (!(fieldDef?.typeName || fieldDef?.type)) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
const typeName = fieldDef.typeName ?? fieldDef.type;
|
|
299
|
+
if (typeName === "ZodOptional" || typeName === "ZodDefault" || typeName === "optional" || typeName === "default") {
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
if (typeName === "ZodEffects") {
|
|
303
|
+
return isFieldOptional(getDef(fieldDef.schema));
|
|
304
|
+
}
|
|
305
|
+
if (typeName === "ZodPipeline" || typeName === "pipe") {
|
|
306
|
+
const inputOptional = isFieldOptional(getDef(fieldDef.in));
|
|
307
|
+
const outputDef = getDef(fieldDef.out);
|
|
308
|
+
const outputType = outputDef?.typeName ?? outputDef?.type;
|
|
309
|
+
if (outputType === "transform") {
|
|
310
|
+
return inputOptional;
|
|
311
|
+
}
|
|
312
|
+
const outputOptional = isFieldOptional(outputDef);
|
|
313
|
+
return inputOptional && outputOptional;
|
|
314
|
+
}
|
|
315
|
+
if (typeName === "ZodNullable" || typeName === "nullable") {
|
|
316
|
+
return isFieldOptional(getDef(fieldDef.innerType));
|
|
317
|
+
}
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
function convertObject(def) {
|
|
321
|
+
const properties = {};
|
|
322
|
+
const required = [];
|
|
323
|
+
const shape = typeof def.shape === "function" ? def.shape() : def.shape;
|
|
324
|
+
for (const [key, value] of Object.entries(shape ?? {})) {
|
|
325
|
+
properties[key] = convertZodType(value);
|
|
326
|
+
const fieldDef = getDef(value);
|
|
327
|
+
if (!isFieldOptional(fieldDef)) {
|
|
328
|
+
required.push(key);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const schema = {
|
|
332
|
+
type: "object",
|
|
333
|
+
properties
|
|
334
|
+
};
|
|
335
|
+
if (required.length > 0) {
|
|
336
|
+
schema.required = required;
|
|
337
|
+
}
|
|
338
|
+
return schema;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export { zodToJsonSchema };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/mcp/src/logging.ts
|
|
3
|
+
var MCP_LEVEL_ORDER = [
|
|
4
|
+
"debug",
|
|
5
|
+
"info",
|
|
6
|
+
"notice",
|
|
7
|
+
"warning",
|
|
8
|
+
"error",
|
|
9
|
+
"critical",
|
|
10
|
+
"alert",
|
|
11
|
+
"emergency"
|
|
12
|
+
];
|
|
13
|
+
function mapLogLevelToMcp(level) {
|
|
14
|
+
switch (level) {
|
|
15
|
+
case "trace":
|
|
16
|
+
case "debug":
|
|
17
|
+
return "debug";
|
|
18
|
+
case "info":
|
|
19
|
+
return "info";
|
|
20
|
+
case "warn":
|
|
21
|
+
return "warning";
|
|
22
|
+
case "error":
|
|
23
|
+
return "error";
|
|
24
|
+
case "fatal":
|
|
25
|
+
return "emergency";
|
|
26
|
+
default: {
|
|
27
|
+
const _exhaustiveCheck = level;
|
|
28
|
+
return _exhaustiveCheck;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function shouldEmitLog(messageLevel, threshold) {
|
|
33
|
+
return MCP_LEVEL_ORDER.indexOf(messageLevel) >= MCP_LEVEL_ORDER.indexOf(threshold);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { mapLogLevelToMcp, shouldEmitLog };
|