Skip to main content
Glama

Merge shopping list

merge_shopping_list
Read-onlyIdempotent

Combine several shopping or ingredient lists into one, summing the same item across lists (volumes and weights converted to a friendly unit) and noting which list each came from. Use when shopping for several recipes or meals at once. Do NOT use to resize one recipe (use scale_recipe) or price it (use cost_per_serving).

Input Schema

NameRequiredDescriptionDefault
listsYesShopping lists to merge (at least one item overall), e.g. [{"name":"Pancakes","items":[{"item":"milk","quantity":1,"unit":"cup"}]}]

Output Schema

NameRequiredDescriptionDefault
noteYesSummary of the merge and its limits
mergedYesOne line per item and unit kind, with summed quantities
skipped_no_quantityYesItems given without a quantity, kept as notes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedInput schema / properties / lists / description
      Previous value: -"Shopping lists to merge"New value: +"Shopping lists to merge (at least one item overall), e.g. [{\"name\":\"Pancakes\",\"items\":[{\"item\":\"milk\",\"quantity\":1,\"unit\":\"cup\"}]}]"
    • changedInput schema / properties / lists / items / properties / items / items / properties / item / description
      Previous value: -"Item to buy"New value: +"Item to buy, e.g. 'eggs'"
    • changedInput schema / properties / lists / items / properties / items / items / properties / quantity / description
      Previous value: -"Amount; omit it for non-numeric items"New value: +"Amount, non-negative; omit for non-numeric items (listed in skipped_no_quantity)"
    • addedInput schema / properties / lists / items / properties / items / items / properties / quantity / minimum
      Added value: +0
    • changedInput schema / properties / lists / items / properties / items / items / properties / unit / description
      Previous value: -"Unit such as cup, tbsp or g"New value: +"Unit such as cup, tbsp, g, kg, or a free label like 'can'; omit for plain counts"
    • changedInput schema / properties / lists / items / properties / name / description
      Previous value: -"e.g. 'Saturday dinner'"New value: +"List label shown in from_lists, e.g. 'Saturday dinner'; default 'list N'"
    • addedInput schema / properties / lists / minItems
      Added value: +1
    • addedOutput schema / properties / merged
      Added value: +{
      +  "description": "One line per item and unit kind, with summed quantities",
      +  "items": {
      +    "properties": {
      +      "display": {
      +        "description": "Readable amount with unit",
      +        "type": "string"
      +      },
      +      "from_lists": {
      +        "description": "Names of the lists this item came from",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "item": {
      +        "description": "Item name (first spelling seen)",
      +        "type": "string"
      +      },
      +      "quantity": {
      +        "description": "Summed quantity (2 decimals)",
      +        "type": "number"
      +      },
      +      "unit": {
      +        "description": "Display unit, e.g. 'cup', 'g', 'each' or a free label",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "item",
      +      "quantity",
      +      "unit",
      +      "display",
      +      "from_lists"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • removedOutput schema / properties / mergedList
      Removed value: -{
      -  "description": "The consolidated shopping list",
      -  "properties": {
      -    "items": {
      -      "description": "List of items with quantities and units",
      -      "items": {
      -        "properties": {
      -          "item": {
      -            "description": "Item to buy",
      -            "type": "string"
      -          },
      -          "quantity": {
      -            "description": "Total amount of the item",
      -            "type": "number"
      -          },
      -          "unit": {
      -            "description": "Friendliest kitchen unit for the item",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "item",
      -          "quantity",
      -          "unit"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "name": {
      -      "description": "Name of the merged list, e.g. 'Weekly Groceries'",
      -      "type": "string"
      -    },
      -    "notes": {
      -      "description": "List of items without quantities",
      -      "items": {
      -        "description": "Item to buy",
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  },
      -  "required": [
      -    "items",
      -    "notes"
      -  ],
      -  "type": "object"
      -}
    • addedOutput schema / properties / note
      Added value: +{
      +  "description": "Summary of the merge and its limits",
      +  "type": "string"
      +}
    • addedOutput schema / properties / skipped_no_quantity
      Added value: +{
      +  "description": "Items given without a quantity, kept as notes",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "mergedList"
      -]New value: +[
      +  "merged",
      +  "skipped_no_quantity",
      +  "note"
      +]
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "mergedList": {
      +      "description": "The consolidated shopping list",
      +      "properties": {
      +        "items": {
      +          "description": "List of items with quantities and units",
      +          "items": {
      +            "properties": {
      +              "item": {
      +                "description": "Item to buy",
      +                "type": "string"
      +              },
      +              "quantity": {
      +                "description": "Total amount of the item",
      +                "type": "number"
      +              },
      +              "unit": {
      +                "description": "Friendliest kitchen unit for the item",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "item",
      +              "quantity",
      +              "unit"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "name": {
      +          "description": "Name of the merged list, e.g. 'Weekly Groceries'",
      +          "type": "string"
      +        },
      +        "notes": {
      +          "description": "List of items without quantities",
      +          "items": {
      +            "description": "Item to buy",
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "items",
      +        "notes"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "mergedList"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description still adds real behavioral detail beyond the annotations: aggregation of identical items, unit conversion to a 'friendly unit', and provenance attribution. It stops short of describing edge-case handling or output shape, but that is largely schema territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The core behavior and its limitations are front-loaded, and the negative guidance is packed into a single trailing clause rather than restated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it covers purpose, aggregation rules, and sibling routing. For a single-parameter, read-only merge tool, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is only one top-level parameter, so the schema already carries parameter meaning (list names, item/unit/quantity semantics, skipped_no_quantity behavior). The description adds no syntax or format detail beyond the schema, which is the expected baseline of 3 when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ('Combine several shopping or ingredient lists into one') and immediately scopes the semantics: same items are summed, volumes/weights converted, and origin list noted. It explicitly distinguishes itself from scale_recipe and cost_per_serving, so an agent can select it without inspecting siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the triggering context ('Use when shopping for several recipes or meals at once') and gives explicit exclusions with the correct alternatives for each ('Do NOT use to resize one recipe (use scale_recipe) or price it (use cost_per_serving)'). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources