loewen-menu-mcp
loewen-menu-mcp
MCP (Model Context Protocol) server for the Löwen Menü IBS5 school-lunch ordering system. Lets an LLM browse weekly menus, manage a shopping cart, and place meal orders via the IBS5 web portal at ibs.loewen-menue.de.
Features
Browse weekly meal plans by calendar week
View order history
Add/remove meals from the shopping cart
Confirm orders
Multi-profile support (order for multiple children from one server)
Related MCP server: foodvisor-mcp
Requirements
Python 3.10+
uv package manager
A Löwen Menü IBS5 account
Setup
# Clone and install
git clone https://github.com/yourusername/loewen-menu-mcp.git
cd loewen-menu-mcp
uv syncConfiguration
Credentials are passed via the PROFILES environment variable:
PROFILES=child1:CUSTOMER_ID:PASSWORDFor multiple children:
PROFILES=child1:S000001:1234,child2:S000002:5678If only one profile is configured, it is used as the default and the profile parameter can be omitted from all tool calls.
Usage with Claude Desktop
Add to your Claude Desktop MCP config (~/.claude/settings.json or a project-level MCP file):
{
"mcpServers": {
"loewen-menu": {
"command": "/bin/bash",
"args": ["-c", "cd /path/to/loewen-menu-mcp && uv run server.py"],
"env": {
"PROFILES": "child1:S000001:1234,child2:S000002:5678"
}
}
}
}MCP Tools
Tool | Description |
| List configured profiles (children) |
| Browse meals for a given calendar week |
| View past orders (filterable by days back and search text) |
| Check shopping cart contents and balance |
| Add a meal to the cart (does not finalize the order) |
| Finalize and submit all items in the cart |
| Remove a meal from the cart |
Ordering flow
get_weekly_menu— see what's availableadd_to_cart— add meals (repeat for each day/meal)get_cart_status— verify the cartconfirm_order— submit the order
How it works
The server authenticates to IBS5 using a Base64-encoded Bearer token built from the customer ID and password. Credentials are configured server-side via environment variables and never pass through the LLM.
Weekly menus and order history are scraped from server-rendered HTML pages. Cart operations and order confirmation use JSON API endpoints.
License
MIT
Available Tools
7 toolsadd_to_cartA
Add a meal to the shopping cart. Does NOT place the order yet.
You MUST call confirm_order afterwards to finalize the order.
Note: Orders must be placed at least 1 day before the delivery date.
Args:
serve_date: Delivery date in YYYY-MM-DD format (e.g. "2026-02-25")
menu_line_id: Menu line ID (8=GS1, 9=GS2, 10=GS3 — shown in get_weekly_menu output)
profile: Profile name (e.g. "child1"). Optional if only one profile is configured.
quantity: Number of portions (default 1, usually max 2)
menu_group_id: Menu group ID (default "2", shown in get_weekly_menu output)
Returns:
Cart status. Remember to call confirm_order to finalize.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | ||
| quantity | No | ||
| serve_date | Yes | ||
| menu_line_id | Yes | ||
| menu_group_id | No | 2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden, and it does well by stating that the order is not finalized, that confirmation is required later, and that there is a delivery lead-time constraint. It also conveys practical limits like quantity usually maxing at 2, which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured with a purpose statement, caveats, an Args list, and a Returns note. It is slightly repetitive about calling confirm_order, but the organization is clean and information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and 5 parameters, the description is remarkably complete: it covers required parameters, defaults, valid formats, workflow follow-up, and delivery constraints. The presence of an output schema reduces the need to detail return values further, and 'Returns: Cart status' is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning. It explains all five parameters: serve_date format, menu_line_id meaning with examples, profile optionality, quantity default/max, and menu_group_id default. This fully compensates for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description has a specific verb ('Add') and resource ('meal to the shopping cart'), and explicitly says it does NOT place the order, which distinguishes it from confirm_order. This makes the tool's role immediately clear in the context of the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states that confirm_order must be called afterwards and that orders must be placed at least 1 day before delivery. It does not explicitly discuss alternatives like remove_meal or get_cart_status, but the workflow guidance is strong enough for an agent to know when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_orderA
Confirm and finalize all items currently in the shopping cart.
This submits the order. Items must first be added with add_to_cart.
Call get_cart_status first to verify what will be ordered.
Args:
profile: Profile name (e.g. "child1"). Optional if only one profile is configured.
Returns:
Confirmation message from the server.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It does state 'This submits the order,' implying a finalizing, likely irreversible action, and it notes prerequisites. However, it does not disclose side effects such as whether the cart is cleared, whether the order can be changed after submission, or what happens if the cart is empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main description is two clear sentences followed by concise Args and Returns sections. The Returns line is somewhat redundant given an output schema exists, but the overall length is appropriate and information is front-loaded. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and this is a simple one-parameter tool, the description covers the essential prerequisites, the workflow order, and parameter meaning. It could be more explicit about the consequences of submitting (e.g., irreversibility, cart clearing), but it is largely sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. The Args section explains the sole parameter: 'profile: Profile name (e.g. "child1"). Optional if only one profile is configured.' This provides type, an example, and conditionality that the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Confirm and finalize all items currently in the shopping cart' and 'This submits the order.' This is a specific verb (confirm/finalize) and resource (the shopping cart/order). It is easily distinguished from siblings like add_to_cart, get_cart_status, and remove_meal, as it is the final submission step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides workflow context: 'Items must first be added with add_to_cart. Call get_cart_status first to verify what will be ordered.' This tells the agent when to use this tool relative to sibling alternatives and mentions a prerequisite check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cart_statusA
Check the current shopping cart status and balance.
Args:
profile: Profile name (e.g. "child1"). Optional if only one profile is configured.
Returns:
Cart item count, total price, and credit balance.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior itself. It does so by explicitly listing the returns (item count, total price, credit balance) and by noting the profile parameter is optional when only one profile is configured. The word 'check' implies a read-only operation, which is appropriate for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line purpose, then Args, then Returns. No redundant text or filler. The most important information is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema, the description covers purpose, parameters, and return content. The only minor gap is behavior when multiple profiles exist and no profile is supplied, but this is an edge case and the tool remains simple enough that the description is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only provides a string type and default for 'profile', with no description. The description compensates by explaining that profile is a profile name, giving an example ('child1'), and clarifying the optionality condition. This adds meaningful semantic context beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Check the current shopping cart status and balance,' a specific verb and resource that clearly identifies the tool's purpose. It is naturally distinguished from siblings like add_to_cart, remove_meal, and confirm_order, which are mutations, and get_order_history, which is historical rather than current.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrasing 'Check the current...' provides clear context for when to use this tool: whenever current cart status or balance is needed. It does not explicitly name alternatives or exclusions, but the purpose itself is unambiguous, giving a clear usage context without needing further routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_historyA
Get past order history.
Args:
profile: Profile name (e.g. "child1"). Optional if only one profile is configured.
days_back: How many days back to look (default 60)
search: Optional search text to filter orders
Returns:
List of past orders with dates, descriptions, and quantities.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| profile | No | ||
| days_back | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses defaults, the optional-profile rule, and the return shape, but it does not explicitly state that the operation is read-only and has no side effects. The verb 'Get' plus 'Returns' makes this largely inferable, but not fully explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is efficient: a one-sentence purpose, then Args and Returns sections. Every line contributes parameter or return semantics, with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only three optional scalar parameters and an output schema already present, the description covers all invocation-relevant details: parameter meaning, defaults, the optional-profile condition, and the returned fields. An agent has enough to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning. It fully compensates by defining profile, days_back, and search, including the important conditional behavior for profile and the default for days_back.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'Get past order history' uses a specific verb and resource, and clearly positions this tool as the historical-order lookup among siblings like get_cart_status, confirm_order, and add_to_cart. It is immediately distinguishable without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the tool's context clear—past orders rather than current cart or menu—but it does not explicitly state when to prefer this tool over alternatives or when not to use it. The usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_profilesA
List all configured profiles (children).
Returns:
Names of available profiles that can be used with other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose the return value ('Names of available profiles') and that it lists all configured profiles, implying a read-only operation. However, it does not explicitly state that it has no side effects, nor does it mention error or permission behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with the primary action first and the return value clearly stated. There is no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter list tool with an output schema and distinct sibling tools, the description covers purpose and return value adequately. The term 'children' is slightly ambiguous but not blocking, and the presence of an output schema reduces the need to describe return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so there is no parameter information for the description to add. The zero-parameter case earns the baseline score of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List'), a clear resource ('configured profiles'), and explains that they are 'children' and usable with other tools. This distinguishes it from sibling tools that operate on weekly menus, orders, or cart items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used to discover available profile names before using other tools, but it does not explicitly state when to use it, when not to use it, or provide alternatives. The usage context is present but left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_mealB
Remove a meal from the shopping cart (set quantity to 0).
Args:
serve_date: Delivery date in YYYY-MM-DD format
menu_line_id: Menu line ID (8=GS1, 9=GS2, 10=GS3)
profile: Profile name (e.g. "child1"). Optional if only one profile is configured.
menu_group_id: Menu group ID (default "2")
Returns:
Confirmation that the meal was removed from cart.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | ||
| serve_date | Yes | ||
| menu_line_id | Yes | ||
| menu_group_id | No | 2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the key behavior (quantity set to 0 rather than deletion) and notes that profile is optional if only one profile is configured, which is useful. However, it does not mention edge cases such as what happens when the meal is not in the cart or whether removal is reversible via re-adding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with an Args/Returns layout. It front-loads the core behavior and then lists parameters concisely. Slight overhead from the Returns section, which only says a confirmation is returned, but acceptable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, the description covers the main safety-relevant behaviors and parameter meanings. It lacks details about what the confirmation contains, error cases, and whether removal affects an active order or only unconfirmed carts, but the core usage is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains serve_date format, menu_line_id meaning (8=GS1, 9=GS2, 10=GS3), profile optionality, and menu_group_id default, which adds significant value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Remove a meal from the shopping cart') and the mechanism ('set quantity to 0'), which distinguishes it from sibling tools like add_to_cart and confirm_order. It lacks a title but the description itself is specific enough to identify the resource and operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like add_to_cart or get_cart_status. The description implies it's for removing meals, but does not mention prerequisites, idempotency, or when removal is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
add_to_cart - First observed
confirm_order - First observed
get_cart_status - First observed
get_order_history - First observed
get_weekly_menu - First observed
list_profiles - First observed
remove_meal
TDQS
Scored across 7 tools
Each tool addresses a distinct part of the workflow: profiles, menu browsing, cart management, ordering, and history. There is no meaningful overlap between tools, and an agent can confidently select the correct one from its name and description alone.
Tool names are predominantly verb_noun in snake_case, such as list_profiles, get_weekly_menu, and confirm_order. Minor inconsistency exists between add_to_cart and remove_meal, but the overall pattern is clear and predictable.
Seven tools is well-scoped for a school-menu ordering server. Each tool covers a necessary step in the workflow without redundancy or unnecessary bloat.
The tool surface covers the full ordering lifecycle: browse the menu, add items, remove items, inspect the cart, confirm the order, and review past orders. No obvious gaps exist for the stated purpose.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to order food from TGO Yemek by browsing restaurants, managing carts, and completing checkouts. It allows users to handle address selection and order tracking directly through natural language interactions.29 npm13MIT
- AlicenseNot gradedqualityDmaintenanceMCP server integrating Foodvisor nutrition API for food search, meal logging, daily summaries, and progress tracking via LLM agents like Claude.MIT
- AlicenseNot gradedqualityFmaintenanceMCP server for MealMastery AI meal planning that enables users to manage meal plans, recipes, and grocery lists through natural language conversation with AI agents like Claude.51 npmMIT
- FlicenseNot gradedqualityDmaintenanceMCP server for grocery-related web automation using Playwright, enabling AI assistants to interact with grocery websites.-