Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add chrischall/myhotlunchbox-mcp --skill myhotlunchboxgit clone --depth 1 https://github.com/chrischall/myhotlunchbox-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/chrischall/myhotlunchbox-mcp/myhotlunchbox)<a href="https://agentmods.dev/skills/chrischall/myhotlunchbox-mcp/myhotlunchbox"><img src="https://agentmods.dev/badge/skills/chrischall/myhotlunchbox-mcp/myhotlunchbox/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/chrischall/myhotlunchbox-mcp/myhotlunchbox"><img src="https://agentmods.dev/badge/skills/chrischall/myhotlunchbox-mcp/myhotlunchbox.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00074 | $0.01287 |
| Opus 5 | $0.00037 | $0.00643 |
| Sonnet 5 | $0.00015 | $0.00257 |
| Haiku 4.5 | $0.00007 | $0.00129 |
Grade A, and why
myhotlunchbox scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 12d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
description: Read and manage a My Hot Lunchbox school-lunch account from a shell with curl — sign in, list students, read the lunch calendar and cart, check orders, deliveries and payments. Use when you want My Hot Lunch How it starts
The opening of the file, as written. The whole thing — 113 lines — stays where its author put it; the contents beside it link to each section on GitHub.
My Hot Lunchbox from the shell
ordernow.myhotlunchbox.com exposes a plain JSON API behind an OAuth2 password
grant. It is reachable server-side — no browser, no extension, no bridge. Two
curl calls get you data: one to sign in, one per read.
Sign in once per shell
Credentials come from the environment; never paste them into a command line (that puts them in shell history).
export MHLB_USER='[email protected]'
export MHLB_PASS='…' # e.g. read -rs MHLB_PASS
export MHLB=https://ordernow.myhotlunchbox.com
mhlb_login() {
local resp
resp=$(curl -sS -X POST "$MHLB/api/auth/login" \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Accept: application/json' \
--data-urlencode 'grant_type=password' \
--data-urlencode "username=$MHLB_USER" \
--data-urlencode "password=$MHLB_PASS" \
--data-urlencode 'scope=openid offline_access email profile roles') || return 1
MHLB_TOKEN=$(printf '%s' "$resp" | jq -r '.access_token // empty')
if [ -z "$MHLB_TOKEN" ]; then
printf '%s' "$resp" | jq -r '.error_description // .error // "login failed"' >&2
return 1
fi
export MHLB_TOKEN
}
# Authenticated GET. usage: mhlb_get /parent/childrenInfo [curl args…]
mhlb_get() {
local endpoint=$1; shift # NOT `path`: zsh ties $path to $PATH
curl -sS "$MHLB/api$endpoint" -H "Authorization: Bearer $MHLB_TOKEN" -H 'Accept: application/json' "$@"
}
mhlb_login && mhlb_get /auth/userinfo | jq '{name, email, students_count, pending_orders_count, parent_credit_value}'
A failed sign-in must not be retried. The server is OpenIddict and counts
failed attempts; repeated failures can escalate to a CAPTCHA and remove
server-side sign-in for that account entirely. If invalid_grant comes back,
stop and check the credentials.
The token lasts about an hour. Re-run mhlb_login when a call starts returning
401.
The three reads that answer most questions
# Who the students are — the id feeds everything else
mhlb_get /parent/childrenInfo | jq '.[] | {id, firstName, schoolName, gradeTeacher, isInactive}'
# The lunch calendar for a date range (POST, despite being a read).
# The fields are `start`/`end`. Using `startDate`/`endDate` returns 200 with an
# EMPTY events array — a silent wrong answer, not an error.
curl -sS -X POST "$MHLB/api/calendar/studentSchoolData" \
-H "Authorization: Bearer $MHLB_TOKEN" -H 'Content-Type: application/json' \
-d '{"start":"2026-09-01","end":"2026-09-30"}' | jq '.events[] | {studentId, id, start, className}'
# What is in the cart but not yet paid for
mhlb_get '/event/shoppingCart' | jq .
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 12d ago First seen · 113 lines · 74 tokens per session scan A ab2ad89b7a7d
myhotlunchbox is a skill published in the GitHub repository chrischall/myhotlunchbox-mcp (0 stars, last pushed 2d ago), licensed MIT. It adds 74 tokens to every session and 1,287 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
snack-batching
Weekly snack-request batching for {{officechannel}}. Collects Slack shortcut submissions since the last order, consolidates duplicates and standing staples, builds a cart against {{preferredvendor}} within {{weeklybudget}}, and posts it for the office manager to approve before anything is placed.
parcel-tracking
Track parcels and check delivery status for Australian and international couriers. Searches Gmail for dispatch/shipping emails and provides tracking links for all major Australian couriers including AusPost, StarTrack, Aramex, CouriersPlease, Sendle, Toll, Team Global Express, DHL, FedEx, TNT, Hunter Express, Border…
run-campaign
Builds a 7-day SMB campaign kit: one offer with value, deadline, and an honest reason-why; channels picked from what the owner already has (email list, socials, storefront, partners); a day-by-day calendar; every asset drafted (three emails, three social posts, flyer copy); a simple spend/leads/sales tracking sheet…
post-merge-cleanup
Finish an already-merged branch. Proves the branch is contained in the fetched default, classifies leftover artifacts as unique / redundant / superseded, returns to a clean --ff-only default checkout, and deletes the merged local branch — every discard confirmed per item. Routed to by {{CMD:cleanup}}.
bundle-integration-steer
Integrate scenarios/{{TARGET}}/ into the Vrooli Business Suite bundle so that it participates in subscription gating, credit-based metering, and authenticated downloads managed by the Landing Page Business Suite (LPBS) scenario.
workflow-assistant
A workflow skill for handling multi-step tasks that connect different business areas and may require combined analysis. Its documented workflows include reviewing orders, creating orders, shipping, confirming receipt, and exporting data.