You help parents keep school lunch accounts funded so kids never go hungry due to a low balance.
Step 1: Get configuration
Look for lunch account config in CLAUDE.md or ask:
- Platform: MySchoolBucks | SchoolPay | Other
- Child name(s): who to check
- Low-balance threshold: default $15
- Top-up amount: default $50
- Auto top-up: just check and report, or actually add funds if low?
Important: Never add funds without confirming with the user, unless
auto_topup: trueis explicitly set in CLAUDE.md.
Step 2: Check balance
MySchoolBucks (most common)
MySchoolBucks exposes balance data on the account page. Use browser automation to check:
// Uses existing Chrome session (Tier 1) — you're already logged in
const { chromium } = require('playwright');
const browser = await chromium.connectOverCDP('http://localhost:9222');
const context = browser.contexts()[0];
const page = await context.newPage();
await page.goto('https://www.myschoolbucks.com/ver2/getmybalance/display');
await page.waitForSelector('.account-balance', { timeout: 10000 });
const balances = await page.$$eval('.student-balance-row', rows =>
rows.map(row => ({
name: row.querySelector('.student-name')?.textContent?.trim(),
balance: parseFloat(row.querySelector('.balance-amount')?.textContent?.replace(/[^0-9.]/g, '') || '0')
}))
);
console.log(JSON.stringify(balances));
await browser.close();
Alternative — MySchoolBucks auto-replenishment (recommended): Set up auto-replenishment directly in the MySchoolBucks web UI:
- Log in → Account Settings → Auto Replenish
- Set threshold: $10, add: $50
- This is more reliable than scripted top-ups for most families
SchoolPay
SchoolPay has no API. Browser automation required:
// Connect to existing Chrome session
await page.goto('https://www.schoolpay.com/parent/account/balance');
// Extract balance from .account-balance or similar selector
Generic portals
For district-specific lunch portals, use /browser-automate with Tier 1 (existing Chrome session) to navigate to the balance page and extract the number.
Step 3: Report and optionally top up
## Lunch Account Balances
**Checked**: [timestamp]
| Child | Balance | Status | Days Remaining* |
|-------|---------|--------|----------------|
| [Child1] | $23.50 | ✓ OK | ~12 days |
| [Child2] | $8.50 | ⚠️ LOW | ~4 days |
*Estimated at ~$2/day average
## Action Needed
- [Child2]'s balance is below the $15 threshold.
Add $50 to bring balance to ~$58.50?
[Yes, top up now] — or run /top-up-lunch Child2 --confirm
Step 4: Update family-state.json
{
"children": {
"[child_name]": {
"lunch_balance": 8.50,
"lunch_last_checked": "2026-03-31T07:00:00Z",
"lunch_platform": "myschoolbucks"
}
}
}
Step 5: Send alert if low
curl -s \
-H "Title: Lunch Balance Alert" \
-H "Priority: default" \
-d "[Child2]'s lunch balance is low: \$8.50 (~4 days left). Top up at myschoolbucks.com" \
https://ntfy.sh/YOUR_TOPIC
Scheduling
Add to your daily morning check via /mac-cron-job create:
# Every weekday at 7 AM
0 7 * * 1-5 /usr/local/bin/claude -p "/top-up-lunch all" >> ~/Library/Logs/family-automation/lunch.log 2>&1
Safety note
Topping up a lunch account makes a real financial transaction. This skill will always confirm with the user before adding funds unless auto_topup: true is explicitly set in CLAUDE.md. When in doubt, report the balance and let the parent decide.