mealie-mcp 0.1.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/dist/schema.js ADDED
@@ -0,0 +1,84 @@
1
+ const COMPONENT_REF = /^#\/components\/schemas\/(.+)$/;
2
+ /** Deep clone a JSON-compatible value. */
3
+ function clone(value) {
4
+ return value === undefined ? value : JSON.parse(JSON.stringify(value));
5
+ }
6
+ /**
7
+ * Walk a schema node and collect every `#/components/schemas/<name>` it
8
+ * references, transitively, by following into the referenced components.
9
+ */
10
+ function collectRefs(node, components, seen) {
11
+ if (Array.isArray(node)) {
12
+ for (const item of node)
13
+ collectRefs(item, components, seen);
14
+ return;
15
+ }
16
+ if (!node || typeof node !== "object")
17
+ return;
18
+ for (const [key, value] of Object.entries(node)) {
19
+ if (key === "$ref" && typeof value === "string") {
20
+ const match = COMPONENT_REF.exec(value);
21
+ if (match) {
22
+ const name = match[1];
23
+ if (!seen.has(name)) {
24
+ seen.add(name);
25
+ if (components[name])
26
+ collectRefs(components[name], components, seen);
27
+ }
28
+ }
29
+ continue;
30
+ }
31
+ collectRefs(value, components, seen);
32
+ }
33
+ }
34
+ /** Rewrite `#/components/schemas/X` refs to local `#/$defs/X` refs (in place). */
35
+ function rewriteRefs(node) {
36
+ if (Array.isArray(node)) {
37
+ for (const item of node)
38
+ rewriteRefs(item);
39
+ return;
40
+ }
41
+ if (!node || typeof node !== "object")
42
+ return;
43
+ const obj = node;
44
+ if (typeof obj.$ref === "string") {
45
+ const match = COMPONENT_REF.exec(obj.$ref);
46
+ if (match)
47
+ obj.$ref = `#/$defs/${match[1]}`;
48
+ }
49
+ for (const value of Object.values(obj))
50
+ rewriteRefs(value);
51
+ }
52
+ /**
53
+ * Given a set of root schemas, build the `$defs` map containing the transitive
54
+ * closure of component schemas they reference, with all refs rewritten to
55
+ * `#/$defs/...`. Returns `undefined` when nothing is referenced.
56
+ */
57
+ export function buildDefs(roots, components) {
58
+ const seen = new Set();
59
+ for (const root of roots) {
60
+ if (root)
61
+ collectRefs(root, components, seen);
62
+ }
63
+ if (seen.size === 0)
64
+ return undefined;
65
+ const defs = {};
66
+ for (const name of seen) {
67
+ const schema = components[name];
68
+ if (!schema)
69
+ continue;
70
+ const copy = clone(schema);
71
+ rewriteRefs(copy);
72
+ defs[name] = copy;
73
+ }
74
+ return defs;
75
+ }
76
+ /** Clone a schema and rewrite its component refs to local `$defs` refs. */
77
+ export function localize(schema) {
78
+ if (!schema)
79
+ return undefined;
80
+ const copy = clone(schema);
81
+ rewriteRefs(copy);
82
+ return copy;
83
+ }
84
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/server.js ADDED
@@ -0,0 +1,39 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
3
+ import { executeTool } from "./http-client.js";
4
+ export const SERVER_NAME = "mealie-mcp";
5
+ export const SERVER_VERSION = "0.1.0";
6
+ export function createServer(config, tools) {
7
+ const byName = new Map(tools.map((t) => [t.name, t]));
8
+ const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
9
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
10
+ tools: tools.map((t) => ({
11
+ name: t.name,
12
+ description: t.description,
13
+ inputSchema: t.inputSchema,
14
+ })),
15
+ }));
16
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
17
+ const { name, arguments: args } = request.params;
18
+ const tool = byName.get(name);
19
+ if (!tool) {
20
+ return {
21
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
22
+ isError: true,
23
+ };
24
+ }
25
+ try {
26
+ const result = await executeTool(config, tool, (args ?? {}));
27
+ return result;
28
+ }
29
+ catch (err) {
30
+ const reason = err instanceof Error ? err.message : String(err);
31
+ return {
32
+ content: [{ type: "text", text: `Error executing ${name}: ${reason}` }],
33
+ isError: true,
34
+ };
35
+ }
36
+ });
37
+ return server;
38
+ }
39
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAmB;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAuD;SACvE,CAAC,CAAC;KACJ,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAA2B,EAAE;QACzF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;gBAC1D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC;YACxF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;gBACvE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/tools.js ADDED
@@ -0,0 +1,221 @@
1
+ import { buildDefs, localize } from "./schema.js";
2
+ import { HTTP_METHODS, } from "./openapi-types.js";
3
+ function slug(value) {
4
+ return value
5
+ .toLowerCase()
6
+ .replace(/[^a-z0-9]+/g, "_")
7
+ .replace(/^_+|_+$/g, "");
8
+ }
9
+ /** Strip the FastAPI-generated `<path>_<method>` suffix off an operationId. */
10
+ function operationName(operationId, path, method) {
11
+ if (!operationId)
12
+ return `${method}_${slug(path)}`;
13
+ const suffix = `${path.replace(/\W/g, "_")}_${method}`;
14
+ return operationId.endsWith(suffix) ? operationId.slice(0, -suffix.length) : operationId;
15
+ }
16
+ /** Collapse immediately repeated tokens, e.g. `recipe_recipe_get` -> `recipe_get`. */
17
+ function dedupeTokens(name) {
18
+ return name
19
+ .split("_")
20
+ .filter((tok, i, arr) => tok.length > 0 && tok !== arr[i - 1])
21
+ .join("_");
22
+ }
23
+ function buildName(op, path, method) {
24
+ const category = slug(op.tags?.[0] ?? "misc");
25
+ const fn = operationName(op.operationId, path, method);
26
+ let name = dedupeTokens(`${category}_${fn}`.replace(/_+/g, "_"));
27
+ if (name.length > 64)
28
+ name = name.slice(0, 64).replace(/_+$/, "");
29
+ return { name, category };
30
+ }
31
+ function buildDescription(op, path, method) {
32
+ const parts = [];
33
+ if (op.summary)
34
+ parts.push(op.summary);
35
+ parts.push(`[${method.toUpperCase()} ${path}]`);
36
+ if (op.description && op.description.trim() && op.description.trim() !== op.summary) {
37
+ parts.push(op.description.trim());
38
+ }
39
+ if (op.deprecated)
40
+ parts.unshift("(DEPRECATED)");
41
+ let text = parts.join("\n");
42
+ if (text.length > 2000)
43
+ text = `${text.slice(0, 1997)}...`;
44
+ return text;
45
+ }
46
+ /** Does a parameter schema permit an array value (so we repeat the query key)? */
47
+ function schemaAllowsArray(schema) {
48
+ if (!schema)
49
+ return false;
50
+ if (schema.type === "array")
51
+ return true;
52
+ for (const key of ["anyOf", "oneOf", "allOf"]) {
53
+ const branch = schema[key];
54
+ if (Array.isArray(branch) && branch.some((s) => schemaAllowsArray(s)))
55
+ return true;
56
+ }
57
+ return false;
58
+ }
59
+ /** Resolve a possibly-$ref'd schema to its target object (one hop) for inspection. */
60
+ function resolveSchema(schema, components) {
61
+ if (!schema)
62
+ return undefined;
63
+ const ref = schema.$ref;
64
+ if (typeof ref === "string") {
65
+ const match = /^#\/components\/schemas\/(.+)$/.exec(ref);
66
+ if (match && components[match[1]])
67
+ return components[match[1]];
68
+ }
69
+ return schema;
70
+ }
71
+ /** Find multipart properties whose schema is binary (a file), incl. arrays of files. */
72
+ function findFileFields(schema, components) {
73
+ const resolved = resolveSchema(schema, components);
74
+ const props = resolved?.properties;
75
+ if (!props)
76
+ return [];
77
+ const isBinary = (s) => {
78
+ if (!s || typeof s !== "object")
79
+ return false;
80
+ // Mealie marks file fields with `contentMediaType` (e.g. application/octet-stream);
81
+ // OpenAPI 3.1 also allows `format: binary`. Files may be a single value or an array.
82
+ if (s.format === "binary")
83
+ return true;
84
+ if (typeof s.contentMediaType === "string")
85
+ return true;
86
+ if (isBinary(s.items))
87
+ return true;
88
+ for (const key of ["anyOf", "oneOf", "allOf"]) {
89
+ const branch = s[key];
90
+ if (Array.isArray(branch) && branch.some((b) => isBinary(b)))
91
+ return true;
92
+ }
93
+ return false;
94
+ };
95
+ return Object.entries(props)
96
+ .filter(([, s]) => isBinary(s))
97
+ .map(([k]) => k);
98
+ }
99
+ function pickBody(op, components) {
100
+ const content = op.requestBody?.content;
101
+ if (!content)
102
+ return undefined;
103
+ const required = Boolean(op.requestBody?.required);
104
+ if (content["application/json"]) {
105
+ return { kind: "json", schema: content["application/json"].schema, required, fileFields: [] };
106
+ }
107
+ if (content["multipart/form-data"]) {
108
+ const schema = content["multipart/form-data"].schema;
109
+ return { kind: "multipart", schema, required, fileFields: findFileFields(schema, components) };
110
+ }
111
+ if (content["application/x-www-form-urlencoded"]) {
112
+ return { kind: "urlencoded", schema: content["application/x-www-form-urlencoded"].schema, required, fileFields: [] };
113
+ }
114
+ // Unknown body type: treat the first available content as JSON-ish passthrough.
115
+ const first = Object.values(content)[0];
116
+ return first ? { kind: "json", schema: first.schema, required, fileFields: [] } : undefined;
117
+ }
118
+ function buildInputSchema(op, params, body, components) {
119
+ const properties = {};
120
+ const required = [];
121
+ const pathParams = [];
122
+ const queryParams = [];
123
+ const rootSchemas = [];
124
+ for (const param of params) {
125
+ if (param.in !== "path" && param.in !== "query")
126
+ continue; // headers/cookies handled globally
127
+ const localized = localize(param.schema) ?? {};
128
+ if (param.description && !localized.description)
129
+ localized.description = param.description;
130
+ properties[param.name] = localized;
131
+ rootSchemas.push(param.schema);
132
+ if (param.in === "path") {
133
+ pathParams.push(param.name);
134
+ required.push(param.name);
135
+ }
136
+ else {
137
+ queryParams.push({ name: param.name, isArray: schemaAllowsArray(param.schema) });
138
+ if (param.required)
139
+ required.push(param.name);
140
+ }
141
+ }
142
+ if (body?.schema) {
143
+ const bodySchema = localize(body.schema) ?? {};
144
+ if (op.requestBody?.description && !bodySchema.description) {
145
+ bodySchema.description = op.requestBody.description;
146
+ }
147
+ if (body.kind === "multipart" && body.fileFields.length > 0) {
148
+ const note = `File fields (${body.fileFields.join(", ")}) must be absolute paths to local files to upload.`;
149
+ bodySchema.description = bodySchema.description ? `${bodySchema.description} ${note}` : note;
150
+ }
151
+ properties.body = bodySchema;
152
+ rootSchemas.push(body.schema);
153
+ if (body.required)
154
+ required.push("body");
155
+ }
156
+ const inputSchema = { type: "object", properties };
157
+ if (required.length > 0)
158
+ inputSchema.required = required;
159
+ inputSchema.additionalProperties = false;
160
+ const defs = buildDefs(rootSchemas, components);
161
+ if (defs)
162
+ inputSchema.$defs = defs;
163
+ return { inputSchema, pathParams, queryParams };
164
+ }
165
+ /** Generate one MealieTool per operation in the OpenAPI document. */
166
+ export function generateTools(doc) {
167
+ const components = doc.components?.schemas ?? {};
168
+ const tools = [];
169
+ const usedNames = new Set();
170
+ for (const [path, item] of Object.entries(doc.paths)) {
171
+ const sharedParams = item.parameters ?? [];
172
+ for (const method of HTTP_METHODS) {
173
+ const op = item[method];
174
+ if (!op)
175
+ continue;
176
+ const params = [...sharedParams, ...(op.parameters ?? [])];
177
+ const body = pickBody(op, components);
178
+ const { name: rawName, category } = buildName(op, path, method);
179
+ let name = rawName;
180
+ for (let i = 2; usedNames.has(name); i++) {
181
+ name = `${rawName.slice(0, 61)}_${i}`;
182
+ }
183
+ usedNames.add(name);
184
+ const { inputSchema, pathParams, queryParams } = buildInputSchema(op, params, body, components);
185
+ tools.push({
186
+ name,
187
+ description: buildDescription(op, path, method),
188
+ inputSchema,
189
+ category,
190
+ method,
191
+ path,
192
+ pathParams,
193
+ queryParams,
194
+ body: body ? { kind: body.kind, required: body.required, fileFields: body.fileFields } : undefined,
195
+ deprecated: Boolean(op.deprecated),
196
+ });
197
+ }
198
+ }
199
+ return tools;
200
+ }
201
+ function matches(tool, entry) {
202
+ const e = entry.toLowerCase();
203
+ return (tool.name === e ||
204
+ tool.name.startsWith(`${e}_`) ||
205
+ tool.category === e ||
206
+ tool.category.startsWith(`${e}_`));
207
+ }
208
+ /** Apply read-only / include / exclude filters from config. */
209
+ export function filterTools(tools, config) {
210
+ let result = tools;
211
+ if (config.readOnly)
212
+ result = result.filter((t) => t.method === "get");
213
+ if (config.include.length > 0) {
214
+ result = result.filter((t) => config.include.some((e) => matches(t, e)));
215
+ }
216
+ if (config.exclude.length > 0) {
217
+ result = result.filter((t) => !config.exclude.some((e) => matches(t, e)));
218
+ }
219
+ return result;
220
+ }
221
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}