@bojanrajkovic/mcp-paprika 2.0.0-beta.2 → 2.0.0-beta.3
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/tools/aisles.js +1 -0
- package/dist/tools/categories.js +1 -0
- package/dist/tools/category-writes.js +3 -0
- package/dist/tools/create.js +1 -0
- package/dist/tools/delete.js +1 -0
- package/dist/tools/discover.js +1 -0
- package/dist/tools/empty-trash.js +1 -0
- package/dist/tools/grocery-clear.js +2 -0
- package/dist/tools/grocery-item-purchase.js +1 -0
- package/dist/tools/grocery-item.js +3 -0
- package/dist/tools/grocery-list.js +5 -0
- package/dist/tools/grocery-move.js +1 -0
- package/dist/tools/list.js +1 -0
- package/dist/tools/meal-add-menu.js +1 -0
- package/dist/tools/meal-history-search.js +1 -0
- package/dist/tools/meal-log-cooked.js +1 -0
- package/dist/tools/meal-plan-read.js +1 -0
- package/dist/tools/meal-reschedule.js +1 -0
- package/dist/tools/meal-types.js +1 -0
- package/dist/tools/meal-writes.js +3 -0
- package/dist/tools/menu-item-move.js +1 -0
- package/dist/tools/menu-item-write.js +3 -0
- package/dist/tools/menu-read.js +2 -0
- package/dist/tools/menu-write.js +3 -0
- package/dist/tools/pantry-batch-add.js +1 -0
- package/dist/tools/pantry-delete.js +1 -0
- package/dist/tools/pantry-get.js +1 -0
- package/dist/tools/pantry-list.js +1 -0
- package/dist/tools/pantry-stock.js +2 -0
- package/dist/tools/pantry-update.js +1 -0
- package/dist/tools/photo-generate.js +1 -0
- package/dist/tools/photo-writes.js +2 -0
- package/dist/tools/read.js +1 -0
- package/dist/tools/recipe-categorize.js +1 -0
- package/dist/tools/recipe-favorite.js +2 -0
- package/dist/tools/recipe-rating.js +1 -0
- package/dist/tools/recipe-restore.js +1 -0
- package/dist/tools/search.js +1 -0
- package/dist/tools/update.js +1 -0
- package/package.json +1 -1
package/dist/tools/aisles.js
CHANGED
|
@@ -3,6 +3,7 @@ import { textResult } from "./helpers.js";
|
|
|
3
3
|
export function registerAislesTool(server, ctx) {
|
|
4
4
|
const log = ctx.log.child({ component: "list_aisles" });
|
|
5
5
|
server.registerTool("list_aisles", {
|
|
6
|
+
title: "List grocery aisles",
|
|
6
7
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
7
8
|
description: "List all known aisles, sorted by order then name. " +
|
|
8
9
|
"Includes the aisle UID needed for pantry and grocery item writes.",
|
package/dist/tools/categories.js
CHANGED
|
@@ -3,6 +3,7 @@ import { textResult } from "./helpers.js";
|
|
|
3
3
|
export function registerCategoryTools(server, ctx) {
|
|
4
4
|
const log = ctx.log.child({ component: "list_categories" });
|
|
5
5
|
server.registerTool("list_categories", {
|
|
6
|
+
title: "List recipe categories",
|
|
6
7
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
7
8
|
description: "List all recipe categories with the number of recipes in each. Categories are sorted alphabetically.",
|
|
8
9
|
inputSchema: {},
|
|
@@ -11,6 +11,7 @@ function categorySummary(ctx, category) {
|
|
|
11
11
|
export function registerCreateCategoryTool(server, ctx) {
|
|
12
12
|
const log = ctx.log.child({ component: "create_category" });
|
|
13
13
|
server.registerTool("create_category", {
|
|
14
|
+
title: "Create a recipe category",
|
|
14
15
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
15
16
|
description: "Create a new recipe category. Optionally nest it under an existing category by passing that " +
|
|
16
17
|
"category's UID as `parentUid` to build a hierarchy (e.g. Thai → Curries). Use `list_categories` " +
|
|
@@ -46,6 +47,7 @@ export function registerCreateCategoryTool(server, ctx) {
|
|
|
46
47
|
export function registerUpdateCategoryTool(server, ctx) {
|
|
47
48
|
const log = ctx.log.child({ component: "update_category" });
|
|
48
49
|
server.registerTool("update_category", {
|
|
50
|
+
title: "Rename or re-parent a recipe category",
|
|
49
51
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
50
52
|
description: "Rename and/or re-parent an existing category. Pass `name` to rename, `parentUid` to move it under " +
|
|
51
53
|
"another category, or `null` for `parentUid` to make it top-level. Re-parenting builds the hierarchy " +
|
|
@@ -101,6 +103,7 @@ export function registerUpdateCategoryTool(server, ctx) {
|
|
|
101
103
|
export function registerDeleteCategoryTool(server, ctx) {
|
|
102
104
|
const log = ctx.log.child({ component: "delete_category" });
|
|
103
105
|
server.registerTool("delete_category", {
|
|
106
|
+
title: "Delete a recipe category",
|
|
104
107
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
105
108
|
description: "Delete a category. Refuses if the category still has child categories or is assigned to any recipe — " +
|
|
106
109
|
"reassign or delete those first (move recipes with `update_recipe`, re-parent children with " +
|
package/dist/tools/create.js
CHANGED
|
@@ -6,6 +6,7 @@ import { coldStartGuard, commitRecipe, recipeToMarkdown, resolveCategoryRefs, te
|
|
|
6
6
|
export function registerCreateTool(server, ctx) {
|
|
7
7
|
const log = ctx.log.child({ component: "create_recipe" });
|
|
8
8
|
server.registerTool("create_recipe", {
|
|
9
|
+
title: "Create a new recipe",
|
|
9
10
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
10
11
|
description: "Create a new recipe in the Paprika account. If you built this recipe from a web page, " +
|
|
11
12
|
"follow up with `upload_recipe_photo` and the page's main/hero (og:image) image URL to attach its photo.",
|
package/dist/tools/delete.js
CHANGED
|
@@ -4,6 +4,7 @@ import { coldStartGuard, commitRecipe, textResult } from "./helpers.js";
|
|
|
4
4
|
export function registerDeleteTool(server, ctx) {
|
|
5
5
|
const log = ctx.log.child({ component: "trash_recipe" });
|
|
6
6
|
server.registerTool("trash_recipe", {
|
|
7
|
+
title: "Move a recipe to the trash",
|
|
7
8
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },
|
|
8
9
|
description: "Soft-delete a recipe by UID, moving it to the Paprika trash. " +
|
|
9
10
|
"This operation is reversible — trashed recipes can be recovered in the Paprika app. " +
|
package/dist/tools/discover.js
CHANGED
|
@@ -3,6 +3,7 @@ import { coldStartGuard, recipeMetadataLines, textResult } from "./helpers.js";
|
|
|
3
3
|
export function registerDiscoverTool(server, ctx, vectorStore) {
|
|
4
4
|
const log = ctx.log.child({ component: "discover_recipes" });
|
|
5
5
|
server.registerTool("discover_recipes", {
|
|
6
|
+
title: "Discover recipes by natural-language search",
|
|
6
7
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
7
8
|
description: "Discover recipes using semantic search. Finds recipes matching a natural language description of what you're looking for.",
|
|
8
9
|
inputSchema: {
|
|
@@ -5,6 +5,7 @@ import { coldStartGuard, commitRecipeHardDelete, reconcileLocalRecipe, reconcile
|
|
|
5
5
|
export function registerEmptyTrashTool(server, ctx) {
|
|
6
6
|
const log = ctx.log.child({ component: "purge_recipe" });
|
|
7
7
|
server.registerTool("purge_recipe", {
|
|
8
|
+
title: "Permanently delete a trashed recipe",
|
|
8
9
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },
|
|
9
10
|
description: "Permanently delete a recipe that is already in the Paprika trash. " +
|
|
10
11
|
"This is IRREVERSIBLE — once emptied from the trash the recipe cannot be recovered. " +
|
|
@@ -5,6 +5,7 @@ import { textResult } from "./helpers.js";
|
|
|
5
5
|
export function registerClearPurchasedTool(server, ctx) {
|
|
6
6
|
const log = ctx.log.child({ component: "clear_purchased_grocery_items" });
|
|
7
7
|
server.registerTool("clear_purchased_grocery_items", {
|
|
8
|
+
title: "Remove purchased items from a grocery list",
|
|
8
9
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
9
10
|
description: "Clear all purchased items from a grocery list.",
|
|
10
11
|
inputSchema: {
|
|
@@ -38,6 +39,7 @@ export function registerClearPurchasedTool(server, ctx) {
|
|
|
38
39
|
export function registerClearAllTool(server, ctx) {
|
|
39
40
|
const log = ctx.log.child({ component: "clear_grocery_list" });
|
|
40
41
|
server.registerTool("clear_grocery_list", {
|
|
42
|
+
title: "Remove all items from a grocery list",
|
|
41
43
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
42
44
|
description: "Clear all items from a grocery list.",
|
|
43
45
|
inputSchema: {
|
|
@@ -11,6 +11,7 @@ export const markGroceryItemPurchasedInputSchema = z
|
|
|
11
11
|
export function registerMarkGroceryItemPurchasedTool(server, ctx) {
|
|
12
12
|
const log = ctx.log.child({ component: "mark_grocery_item_purchased" });
|
|
13
13
|
server.registerTool("mark_grocery_item_purchased", {
|
|
14
|
+
title: "Mark a grocery item purchased",
|
|
14
15
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
15
16
|
description: "Mark a grocery item as purchased (checked off) by UID.",
|
|
16
17
|
inputSchema: markGroceryItemPurchasedInputSchema,
|
|
@@ -17,6 +17,7 @@ const itemInputSchema = z.object({
|
|
|
17
17
|
export function registerAddGroceryItemsTool(server, ctx) {
|
|
18
18
|
const log = ctx.log.child({ component: "add_grocery_items" });
|
|
19
19
|
server.registerTool("add_grocery_items", {
|
|
20
|
+
title: "Add items to a grocery list",
|
|
20
21
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
21
22
|
description: "Add one or more items to a grocery list. Check read_grocery_list first to avoid duplicate ingredients — no server-side duplicate guard.",
|
|
22
23
|
inputSchema: {
|
|
@@ -151,6 +152,7 @@ export const updateGroceryItemInputSchema = z
|
|
|
151
152
|
export function registerUpdateGroceryItemTool(server, ctx) {
|
|
152
153
|
const log = ctx.log.child({ component: "update_grocery_item" });
|
|
153
154
|
server.registerTool("update_grocery_item", {
|
|
155
|
+
title: "Edit a grocery item",
|
|
154
156
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
155
157
|
description: "Update a grocery item's quantity, aisle, or notes by UID. Only provided fields are changed; " +
|
|
156
158
|
"omitted fields retain their current values. To check an item off, use mark_grocery_item_purchased.",
|
|
@@ -190,6 +192,7 @@ export function registerUpdateGroceryItemTool(server, ctx) {
|
|
|
190
192
|
export function registerDeleteGroceryItemTool(server, ctx) {
|
|
191
193
|
const log = ctx.log.child({ component: "delete_grocery_item" });
|
|
192
194
|
server.registerTool("delete_grocery_item", {
|
|
195
|
+
title: "Delete a grocery item",
|
|
193
196
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
194
197
|
description: "Delete a grocery item by UID.",
|
|
195
198
|
inputSchema: {
|
|
@@ -6,6 +6,7 @@ import { formatLookupOutcome, resolveLookup, textResult, uidOrTextLookupSchema }
|
|
|
6
6
|
export function registerListGroceryListsTool(server, ctx) {
|
|
7
7
|
const log = ctx.log.child({ component: "list_grocery_lists" });
|
|
8
8
|
server.registerTool("list_grocery_lists", {
|
|
9
|
+
title: "List your grocery lists",
|
|
9
10
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
10
11
|
description: "List all grocery lists sorted alphabetically by name, with UID and item count per list.",
|
|
11
12
|
inputSchema: {},
|
|
@@ -29,6 +30,7 @@ export function registerListGroceryListsTool(server, ctx) {
|
|
|
29
30
|
export function registerReadGroceryListTool(server, ctx) {
|
|
30
31
|
const log = ctx.log.child({ component: "read_grocery_list" });
|
|
31
32
|
server.registerTool("read_grocery_list", {
|
|
33
|
+
title: "Read a grocery list and its items",
|
|
32
34
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
33
35
|
description: "Get a grocery list by UID or name. Name lookup is tiered (exact → starts-with → contains) " +
|
|
34
36
|
"and case-insensitive, with a disambiguation list when multiple lists match the same tier. " +
|
|
@@ -60,6 +62,7 @@ export function registerReadGroceryListTool(server, ctx) {
|
|
|
60
62
|
export function registerCreateGroceryListTool(server, ctx) {
|
|
61
63
|
const log = ctx.log.child({ component: "create_grocery_list" });
|
|
62
64
|
server.registerTool("create_grocery_list", {
|
|
65
|
+
title: "Create a grocery list",
|
|
63
66
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
64
67
|
description: "Create a new grocery list with the given name. Rejects duplicate names (case-insensitive exact match); " +
|
|
65
68
|
"if a duplicate is found, the response includes the existing UID.",
|
|
@@ -102,6 +105,7 @@ export function registerCreateGroceryListTool(server, ctx) {
|
|
|
102
105
|
export function registerRenameGroceryListTool(server, ctx) {
|
|
103
106
|
const log = ctx.log.child({ component: "rename_grocery_list" });
|
|
104
107
|
server.registerTool("rename_grocery_list", {
|
|
108
|
+
title: "Rename a grocery list",
|
|
105
109
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
106
110
|
description: "Rename a grocery list. Rejects if the new name conflicts with a different existing list.",
|
|
107
111
|
inputSchema: {
|
|
@@ -144,6 +148,7 @@ export function registerRenameGroceryListTool(server, ctx) {
|
|
|
144
148
|
export function registerDeleteGroceryListTool(server, ctx) {
|
|
145
149
|
const log = ctx.log.child({ component: "delete_grocery_list" });
|
|
146
150
|
server.registerTool("delete_grocery_list", {
|
|
151
|
+
title: "Delete a grocery list",
|
|
147
152
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
148
153
|
description: "Delete a grocery list by UID.",
|
|
149
154
|
inputSchema: {
|
|
@@ -8,6 +8,7 @@ import { commitPantryItemsBatch } from "./pantry-helpers.js";
|
|
|
8
8
|
export function registerMoveToPantryTool(server, ctx) {
|
|
9
9
|
const log = ctx.log.child({ component: "move_grocery_items_to_pantry" });
|
|
10
10
|
server.registerTool("move_grocery_items_to_pantry", {
|
|
11
|
+
title: "Move grocery items to the pantry",
|
|
11
12
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },
|
|
12
13
|
description: "Move one or more grocery items to the pantry. Creates pantry items (with today's purchase date), then deletes the grocery items.",
|
|
13
14
|
inputSchema: {
|
package/dist/tools/list.js
CHANGED
|
@@ -3,6 +3,7 @@ import { coldStartGuard, textResult } from "./helpers.js";
|
|
|
3
3
|
export function registerListTool(server, ctx) {
|
|
4
4
|
const log = ctx.log.child({ component: "list_recipes" });
|
|
5
5
|
server.registerTool("list_recipes", {
|
|
6
|
+
title: "List your saved recipes",
|
|
6
7
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
7
8
|
description: "List all recipes with pagination. Returns recipe summaries sorted alphabetically. Use offset/limit to paginate through the full library. Response includes total recipe count.",
|
|
8
9
|
inputSchema: {
|
|
@@ -56,6 +56,7 @@ function renderPlannerAdds(menuName, startDay, items) {
|
|
|
56
56
|
export function registerAddMenuToPlannerTool(server, ctx) {
|
|
57
57
|
const log = ctx.log.child({ component: "schedule_menu" });
|
|
58
58
|
server.registerTool("schedule_menu", {
|
|
59
|
+
title: "Add a saved menu's recipes to the meal planner",
|
|
59
60
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
60
61
|
description: "Instantiate a saved menu's recipes as meal-planner entries. Look the menu up by UID or name " +
|
|
61
62
|
"(tiered fuzzy match), then materialize each of its items into a meal dated start_date + (day − 1) " +
|
|
@@ -30,6 +30,7 @@ export const searchMealHistoryInputSchema = z
|
|
|
30
30
|
export function registerSearchMealHistoryTool(server, ctx) {
|
|
31
31
|
const log = ctx.log.child({ component: "search_meal_history" });
|
|
32
32
|
server.registerTool("search_meal_history", {
|
|
33
|
+
title: "Search past cooked meals by recipe or category",
|
|
33
34
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
34
35
|
description: 'Search PAST meals (recall/browse), by a specific recipe, a recipe category ("class"), a meal type, ' +
|
|
35
36
|
'and/or a date window — any combination, ANDed. Answers "when did we last have tacos", "how often do ' +
|
|
@@ -21,6 +21,7 @@ export const logCookedMealInputSchema = z
|
|
|
21
21
|
export function registerLogCookedMealTool(server, ctx) {
|
|
22
22
|
const log = ctx.log.child({ component: "log_cooked_meal" });
|
|
23
23
|
server.registerTool("log_cooked_meal", {
|
|
24
|
+
title: "Log a meal you cooked",
|
|
24
25
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
25
26
|
description: "Log a meal you cooked: records the given recipe on the planner, defaulting to today and the Dinner " +
|
|
26
27
|
"meal type — a quick way to keep your cooking history current. Pass `date` to log a different day or " +
|
|
@@ -16,6 +16,7 @@ export const readMealPlanInputSchema = z
|
|
|
16
16
|
export function registerReadMealPlanTool(server, ctx) {
|
|
17
17
|
const log = ctx.log.child({ component: "read_meal_plan" });
|
|
18
18
|
server.registerTool("read_meal_plan", {
|
|
19
|
+
title: "Show upcoming planned meals",
|
|
19
20
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
20
21
|
description: "Read the upcoming meal plan: meals scheduled from today forward, grouped by day in ascending date " +
|
|
21
22
|
'order (today first). Defaults to the next 7 days; pass `days` to widen the window. For past meals or recall ("when did we last have X"), use search_meal_history.',
|
|
@@ -24,6 +24,7 @@ export const rescheduleMealInputSchema = z
|
|
|
24
24
|
export function registerRescheduleMealTool(server, ctx) {
|
|
25
25
|
const log = ctx.log.child({ component: "reschedule_meal" });
|
|
26
26
|
server.registerTool("reschedule_meal", {
|
|
27
|
+
title: "Reschedule a planned meal",
|
|
27
28
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
28
29
|
description: "Reschedule a planned meal to a different date by UID, optionally also changing its meal type. " +
|
|
29
30
|
"Moving the date re-sequences the meal to the end of the destination day's order. To change a " +
|
package/dist/tools/meal-types.js
CHANGED
|
@@ -35,6 +35,7 @@ function mealTypeLine(mt) {
|
|
|
35
35
|
export function registerMealTypesTool(server, ctx) {
|
|
36
36
|
const log = ctx.log.child({ component: "list_meal_types" });
|
|
37
37
|
server.registerTool("list_meal_types", {
|
|
38
|
+
title: "List meal types",
|
|
38
39
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
39
40
|
description: "List all meal types — the built-in Breakfast/Lunch/Dinner/Snacks plus any custom " +
|
|
40
41
|
"types — sorted by order then name. Each entry shows whether it is built-in or custom, " +
|
|
@@ -55,6 +55,7 @@ export const addMealsInputSchema = z.object({
|
|
|
55
55
|
export function registerAddMealsTool(server, ctx) {
|
|
56
56
|
const log = ctx.log.child({ component: "plan_meals" });
|
|
57
57
|
server.registerTool("plan_meals", {
|
|
58
|
+
title: "Add meals to the planner",
|
|
58
59
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
59
60
|
description: "Add one or more meals to the meal planner. Each item is EITHER recipe-linked (supply " +
|
|
60
61
|
"recipe_uid; display name auto-resolves from the recipe) OR freeform (supply name; no " +
|
|
@@ -227,6 +228,7 @@ export const updateMealInputSchema = z.object({
|
|
|
227
228
|
export function registerUpdateMealTool(server, ctx) {
|
|
228
229
|
const log = ctx.log.child({ component: "update_meal" });
|
|
229
230
|
server.registerTool("update_meal", {
|
|
231
|
+
title: "Edit a planned meal",
|
|
230
232
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
231
233
|
description: "Update an existing meal by UID. The `update` payload is a discriminated union: pick exactly one " +
|
|
232
234
|
"of {recipe_uid?, ...other} | {name, ...other} | {recipe_uid: null, name?, ...other}. Recipe link " +
|
|
@@ -370,6 +372,7 @@ const deleteMealInputSchema = z.object({
|
|
|
370
372
|
export function registerDeleteMealTool(server, ctx) {
|
|
371
373
|
const log = ctx.log.child({ component: "delete_meal" });
|
|
372
374
|
server.registerTool("delete_meal", {
|
|
375
|
+
title: "Delete a planned meal",
|
|
373
376
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
374
377
|
description: "Soft-delete a meal from the planner by UID. Idempotent: a second delete on the same UID " +
|
|
375
378
|
"returns a friendly 'already deleted' message without re-POSTing. Requires an exact UID.",
|
|
@@ -20,6 +20,7 @@ export const moveMenuItemInputSchema = z
|
|
|
20
20
|
export function registerMoveMenuItemTool(server, ctx) {
|
|
21
21
|
const log = ctx.log.child({ component: "move_menu_item" });
|
|
22
22
|
server.registerTool("move_menu_item", {
|
|
23
|
+
title: "Move a menu item to a different day",
|
|
23
24
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
24
25
|
description: "Move a menu item to a different day within its menu, by UID. A day beyond the menu's current span " +
|
|
25
26
|
"auto-extends the menu so the item stays visible, and the item is re-sequenced to the end of the " +
|
|
@@ -47,6 +47,7 @@ export const addMenuItemsInputSchema = z.object({
|
|
|
47
47
|
export function registerAddMenuItemsTool(server, ctx) {
|
|
48
48
|
const log = ctx.log.child({ component: "add_menu_items" });
|
|
49
49
|
server.registerTool("add_menu_items", {
|
|
50
|
+
title: "Add items to a menu",
|
|
50
51
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
51
52
|
description: "Add one or more menuitems to a menu (saved meal plan). Look the menu up by UID or name (tiered " +
|
|
52
53
|
"fuzzy match). Each item is EITHER recipe-linked (supply recipe_uid; display name auto-resolves " +
|
|
@@ -206,6 +207,7 @@ export const updateMenuItemInputSchema = z
|
|
|
206
207
|
export function registerUpdateMenuItemTool(server, ctx) {
|
|
207
208
|
const log = ctx.log.child({ component: "update_menu_item" });
|
|
208
209
|
server.registerTool("update_menu_item", {
|
|
210
|
+
title: "Edit a menu item",
|
|
209
211
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
210
212
|
description: "Update an existing menuitem's meal type or recipe link by UID. Provide at least one of type or " +
|
|
211
213
|
"recipe_uid; omitted fields keep their current values. Changing recipe_uid re-resolves the display " +
|
|
@@ -285,6 +287,7 @@ export const deleteMenuItemInputSchema = z.object({
|
|
|
285
287
|
export function registerDeleteMenuItemTool(server, ctx) {
|
|
286
288
|
const log = ctx.log.child({ component: "delete_menu_item" });
|
|
287
289
|
server.registerTool("delete_menu_item", {
|
|
290
|
+
title: "Delete a menu item",
|
|
288
291
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
289
292
|
description: "Soft-delete a menuitem (a planned recipe) from a menu by UID. Idempotent: a second delete on the " +
|
|
290
293
|
"same UID returns a friendly 'already deleted' message without re-POSTing. Requires an exact UID.",
|
package/dist/tools/menu-read.js
CHANGED
|
@@ -4,6 +4,7 @@ import { menuStartGuard, menuToMarkdown } from "./menu-helpers.js";
|
|
|
4
4
|
export function registerListMenusTool(server, ctx) {
|
|
5
5
|
const log = ctx.log.child({ component: "list_menus" });
|
|
6
6
|
server.registerTool("list_menus", {
|
|
7
|
+
title: "List your menus",
|
|
7
8
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
8
9
|
description: "List all menus (saved meal plans) in Paprika order, with item count and day span per menu. " +
|
|
9
10
|
"Use read_menu to see a menu's full day-by-day breakdown.",
|
|
@@ -27,6 +28,7 @@ export function registerListMenusTool(server, ctx) {
|
|
|
27
28
|
export function registerReadMenuTool(server, ctx) {
|
|
28
29
|
const log = ctx.log.child({ component: "read_menu" });
|
|
29
30
|
server.registerTool("read_menu", {
|
|
31
|
+
title: "Read a menu and its items",
|
|
30
32
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
31
33
|
description: "Get a menu by UID or name, rendered day by day with each day's planned recipes. " +
|
|
32
34
|
"Name lookup is tiered (exact → starts-with → contains) and case-insensitive, with a " +
|
package/dist/tools/menu-write.js
CHANGED
|
@@ -6,6 +6,7 @@ import { commitMenu, commitMenuItemsBatch, menuStartGuard, menuToMarkdown } from
|
|
|
6
6
|
export function registerCreateMenuTool(server, ctx) {
|
|
7
7
|
const log = ctx.log.child({ component: "create_menu" });
|
|
8
8
|
server.registerTool("create_menu", {
|
|
9
|
+
title: "Create a menu",
|
|
9
10
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
10
11
|
description: "Create a new menu (saved meal plan) with the given name. Rejects duplicate names " +
|
|
11
12
|
"(case-insensitive exact match); if a duplicate is found, the response includes the existing UID. " +
|
|
@@ -58,6 +59,7 @@ export function registerCreateMenuTool(server, ctx) {
|
|
|
58
59
|
export function registerUpdateMenuTool(server, ctx) {
|
|
59
60
|
const log = ctx.log.child({ component: "update_menu" });
|
|
60
61
|
server.registerTool("update_menu", {
|
|
62
|
+
title: "Edit a menu",
|
|
61
63
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
62
64
|
description: "Update a menu's name, day span, and/or notes. Look it up by UID or name (tiered fuzzy match, " +
|
|
63
65
|
"case-insensitive). Provide at least one of name, days, or notes. Renaming to a name already used " +
|
|
@@ -156,6 +158,7 @@ export function registerUpdateMenuTool(server, ctx) {
|
|
|
156
158
|
export function registerDeleteMenuTool(server, ctx) {
|
|
157
159
|
const log = ctx.log.child({ component: "delete_menu" });
|
|
158
160
|
server.registerTool("delete_menu", {
|
|
161
|
+
title: "Delete a menu",
|
|
159
162
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false },
|
|
160
163
|
description: "Delete a menu and all of its planned recipes (menuitems). Look it up by UID or name (tiered fuzzy " +
|
|
161
164
|
"match, case-insensitive). The menuitems are tombstoned first, then the menu itself. " +
|
|
@@ -20,6 +20,7 @@ const itemInputSchema = z.object({
|
|
|
20
20
|
export function registerAddPantryItemsTool(server, ctx) {
|
|
21
21
|
const log = ctx.log.child({ component: "add_pantry_items" });
|
|
22
22
|
server.registerTool("add_pantry_items", {
|
|
23
|
+
title: "Add items to the pantry",
|
|
23
24
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
24
25
|
description: "Add one or more items to the pantry. Skips items that duplicate an existing ingredient (case-insensitive) " +
|
|
25
26
|
"and reports them with the existing UID and a suggestion to use update_pantry_item. " +
|
|
@@ -5,6 +5,7 @@ import { commitPantryItem, pantryStartGuard } from "./pantry-helpers.js";
|
|
|
5
5
|
export function registerDeletePantryItemTool(server, ctx) {
|
|
6
6
|
const log = ctx.log.child({ component: "delete_pantry_item" });
|
|
7
7
|
server.registerTool("delete_pantry_item", {
|
|
8
|
+
title: "Delete a pantry item",
|
|
8
9
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
9
10
|
description: "Soft-delete a pantry item by UID. Idempotent: a second delete on the same UID " +
|
|
10
11
|
"returns a friendly 'already deleted' message without re-saving. Requires an exact UID.",
|
package/dist/tools/pantry-get.js
CHANGED
|
@@ -4,6 +4,7 @@ import { pantryItemToMarkdown, pantryStartGuard } from "./pantry-helpers.js";
|
|
|
4
4
|
export function registerGetPantryItemTool(server, ctx) {
|
|
5
5
|
const log = ctx.log.child({ component: "read_pantry_item" });
|
|
6
6
|
server.registerTool("read_pantry_item", {
|
|
7
|
+
title: "Read a pantry item",
|
|
7
8
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
8
9
|
description: "Get a pantry item by UID or ingredient name. Ingredient lookup is fuzzy " +
|
|
9
10
|
"(exact → starts-with → contains) and case-insensitive, with a disambiguation list " +
|
|
@@ -3,6 +3,7 @@ import { pantryStartGuard } from "./pantry-helpers.js";
|
|
|
3
3
|
export function registerListPantryTool(server, ctx) {
|
|
4
4
|
const log = ctx.log.child({ component: "list_pantry_items" });
|
|
5
5
|
server.registerTool("list_pantry_items", {
|
|
6
|
+
title: "List your pantry items",
|
|
6
7
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
7
8
|
description: "List all pantry items sorted alphabetically by ingredient name. Returns the ingredient, quantity, and aisle for each item. Use read_pantry_item with the UID for full details.",
|
|
8
9
|
inputSchema: {},
|
|
@@ -16,6 +16,7 @@ export const restockPantryItemInputSchema = z
|
|
|
16
16
|
export function registerMarkPantryItemOutOfStockTool(server, ctx) {
|
|
17
17
|
const log = ctx.log.child({ component: "mark_pantry_item_out_of_stock" });
|
|
18
18
|
server.registerTool("mark_pantry_item_out_of_stock", {
|
|
19
|
+
title: "Mark a pantry item out of stock",
|
|
19
20
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
20
21
|
description: "Mark a pantry item as out of stock by UID (e.g. you've run out of it).",
|
|
21
22
|
inputSchema: markPantryItemOutOfStockInputSchema,
|
|
@@ -44,6 +45,7 @@ export function registerMarkPantryItemOutOfStockTool(server, ctx) {
|
|
|
44
45
|
export function registerRestockPantryItemTool(server, ctx) {
|
|
45
46
|
const log = ctx.log.child({ component: "restock_pantry_item" });
|
|
46
47
|
server.registerTool("restock_pantry_item", {
|
|
48
|
+
title: "Mark a pantry item back in stock",
|
|
47
49
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
48
50
|
description: "Mark a pantry item as back in stock by UID (e.g. you've restocked it).",
|
|
49
51
|
inputSchema: restockPantryItemInputSchema,
|
|
@@ -28,6 +28,7 @@ export const updatePantryItemInputSchema = z
|
|
|
28
28
|
export function registerUpdatePantryItemTool(server, ctx) {
|
|
29
29
|
const log = ctx.log.child({ component: "update_pantry_item" });
|
|
30
30
|
server.registerTool("update_pantry_item", {
|
|
31
|
+
title: "Edit a pantry item",
|
|
31
32
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
32
33
|
description: "Update a pantry item's ingredient, quantity, aisle, or dates by UID. Only provided fields are " +
|
|
33
34
|
"changed; omitted fields retain their existing values. Setting expirationDate also updates " +
|
|
@@ -41,6 +41,7 @@ export const generatePhotoInputSchema = z.object({
|
|
|
41
41
|
export function registerGeneratePhotoTool(server, ctx, photographyClient) {
|
|
42
42
|
const log = ctx.log.child({ component: "generate_recipe_photo" });
|
|
43
43
|
server.registerTool("generate_recipe_photo", {
|
|
44
|
+
title: "Generate a recipe photo with AI",
|
|
44
45
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
45
46
|
description: "Generate a styled food photo for a recipe with an AI image model and (by default) attach it to the " +
|
|
46
47
|
"recipe. The prompt is built from the recipe's name, description, and categories — so well-described, " +
|
|
@@ -99,6 +99,7 @@ async function resolveSourceBytes(source, ctx, recipeUid) {
|
|
|
99
99
|
export function registerUploadPhotoTool(server, ctx) {
|
|
100
100
|
const log = ctx.log.child({ component: "upload_recipe_photo" });
|
|
101
101
|
server.registerTool("upload_recipe_photo", {
|
|
102
|
+
title: "Upload a photo to a recipe",
|
|
102
103
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
103
104
|
description: "Attach a photo to a recipe from exactly one `source`: a `url` (PREFERRED for web images — the server " +
|
|
104
105
|
"downloads it), a `generation_token` (to save an image you previewed with generate_recipe_photo, attach:false — " +
|
|
@@ -161,6 +162,7 @@ export function registerUploadPhotoTool(server, ctx) {
|
|
|
161
162
|
export function registerDeletePhotoTool(server, ctx) {
|
|
162
163
|
const log = ctx.log.child({ component: "delete_recipe_photo" });
|
|
163
164
|
server.registerTool("delete_recipe_photo", {
|
|
165
|
+
title: "Delete a recipe photo",
|
|
164
166
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
165
167
|
description: "Delete a photo from a recipe by UID. Idempotent: a second delete on the same UID returns a friendly " +
|
|
166
168
|
"'already deleted' message without re-POSTing. Requires an exact photo UID.",
|
package/dist/tools/read.js
CHANGED
|
@@ -3,6 +3,7 @@ import { coldStartGuard, formatLookupOutcome, recipeToMarkdown, resolveLookup, u
|
|
|
3
3
|
export function registerReadTool(server, ctx) {
|
|
4
4
|
const log = ctx.log.child({ component: "read_recipe" });
|
|
5
5
|
server.registerTool("read_recipe", {
|
|
6
|
+
title: "Read a recipe by UID or title",
|
|
6
7
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
7
8
|
description: "Read a recipe by UID or title. Title lookup is fuzzy (exact → starts-with → contains) " +
|
|
8
9
|
"and returns a disambiguation list when multiple recipes match the same tier. " +
|
|
@@ -24,6 +24,7 @@ export const categorizeRecipeInputSchema = z
|
|
|
24
24
|
export function registerCategorizeRecipeTool(server, ctx) {
|
|
25
25
|
const log = ctx.log.child({ component: "categorize_recipe" });
|
|
26
26
|
server.registerTool("categorize_recipe", {
|
|
27
|
+
title: "Add, replace, or remove a recipe's categories",
|
|
27
28
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
28
29
|
description: "Add, replace, or remove a recipe's categories by UID. Pass category names or UIDs and a mode: " +
|
|
29
30
|
"add (union with current — the default), replace (set exactly these), or remove (drop these). " +
|
|
@@ -15,6 +15,7 @@ export const unfavoriteRecipeInputSchema = z
|
|
|
15
15
|
export function registerFavoriteRecipeTool(server, ctx) {
|
|
16
16
|
const log = ctx.log.child({ component: "favorite_recipe" });
|
|
17
17
|
server.registerTool("favorite_recipe", {
|
|
18
|
+
title: "Mark a recipe as a favorite",
|
|
18
19
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
19
20
|
description: "Mark a recipe as a favorite by UID (adds it to the Favorites list).",
|
|
20
21
|
inputSchema: favoriteRecipeInputSchema,
|
|
@@ -44,6 +45,7 @@ export function registerFavoriteRecipeTool(server, ctx) {
|
|
|
44
45
|
export function registerUnfavoriteRecipeTool(server, ctx) {
|
|
45
46
|
const log = ctx.log.child({ component: "unfavorite_recipe" });
|
|
46
47
|
server.registerTool("unfavorite_recipe", {
|
|
48
|
+
title: "Remove a recipe from favorites",
|
|
47
49
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
48
50
|
description: "Remove a recipe from the Favorites list by UID.",
|
|
49
51
|
inputSchema: unfavoriteRecipeInputSchema,
|
|
@@ -11,6 +11,7 @@ export const rateRecipeInputSchema = z
|
|
|
11
11
|
export function registerRateRecipeTool(server, ctx) {
|
|
12
12
|
const log = ctx.log.child({ component: "rate_recipe" });
|
|
13
13
|
server.registerTool("rate_recipe", {
|
|
14
|
+
title: "Rate a recipe",
|
|
14
15
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
15
16
|
description: "Rate a recipe 0–5 stars by UID. Sets the recipe's star rating; pass 0 to clear it.",
|
|
16
17
|
inputSchema: rateRecipeInputSchema,
|
|
@@ -11,6 +11,7 @@ export const restoreRecipeInputSchema = z
|
|
|
11
11
|
export function registerRestoreRecipeTool(server, ctx) {
|
|
12
12
|
const log = ctx.log.child({ component: "restore_recipe" });
|
|
13
13
|
server.registerTool("restore_recipe", {
|
|
14
|
+
title: "Restore a recipe from the trash",
|
|
14
15
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
|
|
15
16
|
description: "Restore a trashed recipe by UID, moving it out of the trash back into the active library. " +
|
|
16
17
|
"The inverse of trash_recipe; use purge_recipe to permanently delete a trashed recipe instead.",
|
package/dist/tools/search.js
CHANGED
|
@@ -31,6 +31,7 @@ export const searchRecipesInputSchema = z
|
|
|
31
31
|
export function registerSearchTool(server, ctx) {
|
|
32
32
|
const log = ctx.log.child({ component: "search_recipes" });
|
|
33
33
|
server.registerTool("search_recipes", {
|
|
34
|
+
title: "Search recipes by name, ingredient, or time",
|
|
34
35
|
annotations: { readOnlyHint: true, idempotentHint: true },
|
|
35
36
|
description: "Search and filter recipes. Use any combination of: free-text query (matches name, " +
|
|
36
37
|
"ingredients, description), an ingredient list with all/any match mode, and/or max " +
|
package/dist/tools/update.js
CHANGED
|
@@ -29,6 +29,7 @@ export const updateRecipeInputSchema = z
|
|
|
29
29
|
export function registerUpdateTool(server, ctx) {
|
|
30
30
|
const log = ctx.log.child({ component: "update_recipe" });
|
|
31
31
|
server.registerTool("update_recipe", {
|
|
32
|
+
title: "Edit a recipe's details",
|
|
32
33
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
|
|
33
34
|
description: "Update a recipe's content fields by UID (name, ingredients, directions, description, notes, " +
|
|
34
35
|
"servings, prep/cook/total time, source, difficulty, nutritional info). Only provided fields " +
|