The only Best Food Trucks client that can tell you where a truck goes, not just what's parked outside today.
Best Food Trucks has no public API, no SDK, and no way to ask 'where else does this truck park' or 'summarize this week for my team.' This CLI talks directly to the same GraphQL backend the website and mobile apps use, then adds schedule digests, cuisine search, truck-centric reverse lookup, and cross-lot views the live site was never built to answer.
Learn more at Best Food Trucks.
Created by @enlewof (Allen Lew).
Quick Start
# Confirms the CLI can reach the API. No login or API key needed — the read surface is fully anonymous.
bestfoodtrucks-pp-cli doctor --dry-run
# See the full upcoming schedule for a specific lot by its URL slug.
bestfoodtrucks-pp-cli lot schedule playa-district
# Get the same schedule as ready-to-paste announcement text.
bestfoodtrucks-pp-cli lot digest playa-district
# Look up a specific scheduled truck visit's full menu, prices, and hours.
bestfoodtrucks-pp-cli shift get 179609
# Reverse-lookup: see every lot a specific truck visits, a view the website itself never shows.
bestfoodtrucks-pp-cli truck schedule 11869
Unique Features
These capabilities aren't available in any other tool for this API.
Cross-schedule synthesis
-
lot digest — Turns a lot's upcoming schedule into ready-to-paste announcement text instead of raw structured data.
Reach for this when the task is 'summarize this week's schedule for humans,' not 'give me structured data.'
bestfoodtrucks-pp-cli lot digest playa-district
-
trucks find — Finds every upcoming shift at a lot matching a cuisine, without opening each shift page one at a time.
Use this when a user names a cuisine and a lot rather than a specific date — it walks the whole visible schedule window for you.
bestfoodtrucks-pp-cli trucks find --cuisine Thai --lot playa-district --json
-
lots digest — Combines multiple lots' schedules into one view in a single command instead of visiting each lot's page separately.
Use this when a user tracks more than one regular lot (e.g., office campus plus a nearby favorite) and wants one combined answer.
bestfoodtrucks-pp-cli lots digest --lots playa-district,at-t-los-angeles --json
Truck-centric views the website never built
-
truck schedule — Shows every lot a specific truck visits, past and future — a view the Best Food Trucks website itself never built.
Use this to answer 'when does my favorite truck come back' or 'what other lots does this truck serve' — impossible from the live site's own navigation.
bestfoodtrucks-pp-cli truck schedule 11869 --json --select locations.records.startTime,locations.records.lot.name
-
market hotlist — Ranks trucks operating in a city by review signal, a cross-truck aggregate the site never computes.
Use this for 'what's the best-rated truck in this city' rather than checking trucks one at a time.
bestfoodtrucks-pp-cli market hotlist los-angeles --limit 10
Recipes
What's at my office today
bestfoodtrucks-pp-cli lot schedule playa-district --json --select locationSchedule.dateAlias,locationSchedule.locations.truck.name
Pulls just today/tomorrow's truck name from the full schedule payload, instead of parsing the whole nested response by hand.
Paste this week's schedule into Slack
bestfoodtrucks-pp-cli lot digest playa-district
Produces the announcement text directly — no manual copy-paste from the website required.
Find every Thai truck coming to my lot
bestfoodtrucks-pp-cli trucks find --cuisine Thai --lot playa-district --json
Walks the visible schedule window and filters by cuisine tag, something no single API call does server-side.
Track a favorite truck across every lot it visits
bestfoodtrucks-pp-cli truck schedule 11869 --agent --select locations.records.startTime,locations.records.lot.name
Reverse lookup with --select narrows a potentially large history-plus-future list down to just the two fields an agent needs to answer 'when and where.'
Combine two lots you care about into one view
bestfoodtrucks-pp-cli lots digest --lots playa-district,at-t-los-angeles
One command instead of visiting two separate lot pages and manually merging the results.
Usage
Run bestfoodtrucks-pp-cli --help for the full command reference and flag list.
Paths & environment variables
This CLI separates local files into four path kinds:
| Kind | Contents |
|---|
config | User-editable settings such as config.toml and saved profiles |
data | Durable local data: data.db and the local learning store. This CLI needs no Best Food Trucks credentials — its read surface is fully anonymous — so no credentials.toml or auth sidecar files are written here |
state | Runtime state such as persisted queries, jobs, and teach.log |
cache | Regenerable HTTP/cache files |
Each kind resolves independently. The ladder is:
- Per-kind env var:
BESTFOODTRUCKS_CONFIG_DIR, BESTFOODTRUCKS_DATA_DIR, BESTFOODTRUCKS_STATE_DIR, or BESTFOODTRUCKS_CACHE_DIR
--home <dir> for this invocation
BESTFOODTRUCKS_HOME for a flat relocated root
- XDG env vars:
XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_STATE_HOME, XDG_CACHE_HOME
- Platform defaults matching existing installs
For containers and agent sandboxes, prefer a single relocated root:
export BESTFOODTRUCKS_HOME=/srv/bestfoodtrucks
bestfoodtrucks-pp-cli doctor
Under BESTFOODTRUCKS_HOME=/srv/bestfoodtrucks, the four dirs resolve to /srv/bestfoodtrucks/config, /srv/bestfoodtrucks/data, /srv/bestfoodtrucks/state, and /srv/bestfoodtrucks/cache.
MCP servers do not receive CLI flags from the host. Put relocation in the host env block:
{
"mcpServers": {
"bestfoodtrucks": {
"command": "bestfoodtrucks-pp-mcp",
"env": {
"BESTFOODTRUCKS_HOME": "/srv/bestfoodtrucks"
}
}
}
}
Precedence matters in fleets: an ambient per-kind variable such as BESTFOODTRUCKS_DATA_DIR overrides an explicit --home for that kind. Use BESTFOODTRUCKS_HOME or the per-kind variables for durable fleet relocation; treat --home as the weaker per-invocation lever.
Relocation is one-way. Unsetting BESTFOODTRUCKS_HOME does not move files back to platform defaults, and doctor cannot find credentials left under a former root. Move the files manually before unsetting relocation variables.
Existing installs keep working because the platform-default rung matches the legacy layout. This CLI stores no Best Food Trucks API credentials — the read surface is fully anonymous. Run bestfoodtrucks-pp-cli doctor --fail-on warn to check path and connectivity warnings in automation.
Commands
graphql
Raw GraphQL passthrough against the Best Food Trucks API. This is a generic escape-hatch endpoint; Phase 3 hand-writes typed, well-named commands (lot get/schedule/digest, shift get, truck schedule, market list/hotlist, trucks find, lots digest) on top of a hand-authored GraphQL client rather than relying on this endpoint's auto-emitted command surface. The CLI always sends full query text (no extensions.persistedQuery hash) to avoid depending on the server's Apollo Automatic Persisted Query cache.
bestfoodtrucks-pp-cli graphql - Execute a raw, read-only GraphQL query against the Best Food Trucks API (advanced escape hatch; mutations such as ordering, subscribing, or checkout are out of scope for this CLI and require a customer login this build does not implement)
Self-learning loop
This CLI caches per-question discovery so repeat queries skip the walk and structurally similar queries get answered via entity substitution. The loop also self-captures: every invocation is journaled locally, and failed-flag corrections plus fresh teaches surface as candidates on the next recall for confirm/reject judgment. Agents call recall before discovery and fire teach & after answering. See the ## Automatic learning section in SKILL.md for the full protocol.
bestfoodtrucks-pp-cli recall <query> - Look up cached resources for a query before running discovery
bestfoodtrucks-pp-cli teach - Record a query -> resource mapping (silent on success, safe to background with &)
bestfoodtrucks-pp-cli learnings list - Inspect taught rows
bestfoodtrucks-pp-cli learnings forget <query> - Undo a teach
bestfoodtrucks-pp-cli learnings candidates - List auto-captured candidates awaiting confirm/reject
bestfoodtrucks-pp-cli learnings stats - Local loop metrics: recall hit rate, teach-to-reuse, playbook resolution, candidate counts
bestfoodtrucks-pp-cli teach-pattern - Install a query/resource template up front
bestfoodtrucks-pp-cli teach-lookup - Add an entity mapping (e.g. country code, team alias) for pattern substitution
Pass --no-learn or set BESTFOODTRUCKS_NO_LEARN=true to disable the loop for deterministic flows.
The local store's schema version stamp is one-way: once this version of bestfoodtrucks-pp-cli opens the database, older binaries refuse it with a version error — upgrade the binary rather than downgrading.
Output Formats
# Human-readable table (default in terminal, JSON when piped)
bestfoodtrucks-pp-cli graphql --query example-value
# JSON for scripting and agents
bestfoodtrucks-pp-cli graphql --query example-value --json
# Filter to specific fields by name (example uses a real curated command + real field path)
bestfoodtrucks-pp-cli lot schedule playa-district --json --select locationSchedule.dateAlias,locationSchedule.locations.truck.name
# Dry run — show the request without sending
bestfoodtrucks-pp-cli graphql --query example-value --dry-run
# Agent mode — JSON + compact + no prompts in one flag
bestfoodtrucks-pp-cli graphql --query example-value --agent
Agent Usage
This CLI is designed for AI agent consumption:
- Non-interactive - never prompts, every input is a flag
- Pipeable -
--json output to stdout, errors to stderr
- Filterable -
--select <field>[,<field>...] returns only fields you need
- Previewable -
--dry-run shows the request without sending
- Read-only by every curated command - every command in "Unique Features" and every absorbed lot/shift/truck/market command above is a read-only lookup. The generic framework
import/graphql commands can technically issue writes if deliberately misused with a mutation query, but no shipped feature does so, and the Best Food Trucks API requires a customer login this build does not implement for any real write (subscribe, order-ahead, checkout)
- Agent-safe by default - no colors or formatting unless
--human-friendly is set
Exit codes: 0 success, 2 usage error, 3 not found, 5 API error, 7 rate limited, 10 config error.
Health Check
bestfoodtrucks-pp-cli doctor
Verifies configuration and connectivity to the API.
Configuration
Run bestfoodtrucks-pp-cli doctor to see the resolved config, data, state, and cache directories. The platform-default config path is ``; --home, BESTFOODTRUCKS_HOME, and per-kind env vars can relocate it.
Static request headers can be configured under headers; per-command header overrides take precedence.
Troubleshooting
Not found errors (exit code 3)
- Check the resource ID is correct
- Run the
list command to see available items
API-specific
- lot get returns 'not found' for a slug you copied from a URL — Use market list to find the correct seoName slug — some lots have display names that differ from their URL slug.
- shift get returns an empty menu — The shift may not have started publishing its menu yet (workStatusHuman: 'Not Started'); menus typically populate closer to the shift's start time.
- market hotlist returns no ranking — The market has zero trucks on record, or every truck lookup in the fan-out failed — check the fetch_failures field in --json output for per-truck error detail.
Discovery Signals
This CLI was generated with browser-captured traffic analysis.
- Target observed: https://www.bestfoodtrucks.com/lots/playa-district
- Capture coverage: 25 API entries from 196 total network entries
- Reachability: browser_http (78% confidence)
- Protocols: graphql (92% confidence), graphql_persisted_query (90% confidence), rest_json (75% confidence)
- Protection signals: cloudflare (90% confidence)
- Generation hints: browser_http_transport, graphql_persisted_query, requires_protected_client, weak_schema_confidence
- Candidate command ideas: create_graphql — Derived from observed POST /graphql traffic.; create_track_referrer.json — Derived from observed POST /track-referrer.json traffic.; create_track_request — Derived from observed POST /api/v1/intent_pixel/track_request traffic.; head_schedule.json — Derived from observed HEAD /_next/data/-dh7Qe2PYMUxWzoOQbyo3/lots/playa-district/schedule.json traffic.; list_179609_playa_district_on_2026_08_26.json — Derived from observed GET /_next/data/-dh7Qe2PYMUxWzoOQbyo3/shifts/179609-playa-district-on-2026-08-26.json traffic.; list_attribution_trigger — Derived from observed GET /attribution_trigger traffic.; list_can_track_visitor — Derived from observed GET /api/v1/intent_pixel/can_track_visitor traffic.; list_j — Derived from observed GET /j traffic.
Warnings from discovery:
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
- empty_payload: API-looking request returned an empty or null payload; schema confidence is weak.
Generated by CLI Printing Press