Mensa MCP Server
An MCP (Model Context Protocol) server for accessing meal plans from Studierendenwerk Vorderpfalz (stw-vp.de).
Features
- Get meals plans for specific weeks or dates
- Fetch meal plans for all canteens from Studierendenwerk Vorderpfalz
- Structured JSON output with meal details (vegan, vegetarian, main dish flags)
Available Canteens
| ID | Name |
|---|---|
| 310 | Landau |
| 311 | Landau Bürgerstr. |
| 320 | Germersheim |
| 330 | Worms |
| 340 | Ludwigshafen |
Installation
uv sync
Transports
The server supports two transport protocols:
- stdio (default) — launched as a child process by the MCP client. Best for IDE/editor integration.
- streamable-http — runs as a long-running HTTP server. Best for remote access or multi-client deployments.
Stdio (default)
Add to your MCP client e.g., opencode.json:
{
"mcpServers": {
"mensa": {
"type": "local",
"command": ["uv", "run", "mensa-mcp", "--canteen", "330"],
"cwd": "/Users/boza/git/hswo/zd/mensa-stw-vp"
}
}
}
Streamable HTTP
uv run mensa-mcp --transport streamable-http --port 8000
The MCP endpoint is POST /mcp with Content-Type: application/json and Accept: application/json, text/event-stream. GET / returns a small health check.
The --canteen argument sets the default canteen ID. Omit it if you prefer to always specify canteen_id explicitly.
Available Tools
list_canteens
List all available canteens with their IDs and names.
Parameters: none.
Example:
list_canteens()
get_weekly_meals
Fetch the weekly meal plan for a canteen.
Parameters:
- canteen_id (int, optional): ID of the canteen (310, 311, 320, 330, 340). Uses default from command line if not specified.
- week_number (int, optional): ISO week number (1-53). Defaults to current week.
Example:
- get_weekly_meals() # Uses default canteen, current week
- get_weekly_meals(canteen_id=330) # Current week, Worms
- get_weekly_meals(canteen_id=330, week_number=25) # Specific week
get_daily_meals
Get meals for a specific date.
Parameters:
- date (string, optional): Date in ISO format YYYY-MM-DD (e.g., "2026-06-11"). If omitted, uses today.
- canteen_id (int, optional): Canteen ID. Uses default from command line if not specified.
Example:
- get_daily_meals() # Today's meals, default canteen
- get_daily_meals(date="2026-06-11") # Specific date, default canteen
- get_daily_meals(canteen_id=340) # Today, Ludwigshafen
- get_daily_meals(date="2026-06-11", canteen_id=340) # Both specified
Development
# Install dependencies (including dev/test extras)
uv sync --extra dev
# Run tests
uv run pytest tests/ -v
# Run server in stdio mode (for MCP integration)
uv run mensa-mcp --canteen 330
# Run server with HTTP transport
uv run mensa-mcp --transport streamable-http --port 8000
Validation
canteen_idmust be one of the known IDs (310, 311, 320, 330, 340).week_numbermust be an ISO week number between 1 and 53. Out-of-range values are rejected with a clear error at both the server and scraper layers.datemust be inYYYY-MM-DDformat.- Dates outside the currently-served week return an empty meal list with a
noteexplaining the date is out of range.
2026 Hochschule Worms, Zentrum für Digitalisierung.
Release files for mensa-stw-vp-mcp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mensa_stw_vp_mcp-0.2.0.tar.gz | 100.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mensa_stw_vp_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 110.9 kB
Release files / mensa_stw_vp_mcp-0.2.0.tar.gz
| Download URL | mensa_stw_vp_mcp-0.2.0.tar.gz |
|---|---|
| Size | 100.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
89ccc8710a397d28a63793ab8bd8c970b55df49bb473d8f84002eaa05eb74130
|
|
BLAKE2b-256 checksum How to use checksums |
cc70fca4700c76899479387983926030ae8b2e232eeacc6b3874b7015683d569
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / mensa_stw_vp_mcp-0.2.0-py3-none-any.whl
| Download URL | mensa_stw_vp_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2693d79c9a9c54aeaf19264a63a998a3dbb6ac193c65fdda7068d682fcbf598a
|
|
BLAKE2b-256 checksum How to use checksums |
5d0afde56dc1b9e05cf27fc6f5f6a5c8ac51aba21711a06d18a34fee0140d9a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|