fitatu-wrapper
# Fitatu Wrapper
CLI and MCP wrapper for Fitatu.
## Scope
This repository currently targets v1 of a product-only wrapper.
Included:
- programmatic login
- session refresh
- product search
- product details
- day read
- daily nutrition summary
- add product
- delete entry
Not included in v1:
- recipes
- water
- Own / Favorites / Fridge
- editing existing entries
## Install
```bash
python3 -m pip install -e .
cp .env.example .env
```
## Run
```bash
fitatu --help
```
Start the MCP server over stdio with:
```bash
fitatu-mcp
```
The CLI entrypoint is `fitatu`.
Implemented commands:
- `fitatu login --email ... --password ...`
- `fitatu whoami`
- `fitatu logout`
- `fitatu search-food --date YYYY-MM-DD --meal breakfast --query banana`
- `fitatu get-product --product-id 105392008`
- `fitatu read-day --date YYYY-MM-DD`
- `fitatu read-day-summary --date YYYY-MM-DD`
- `fitatu read-days --from-date YYYY-MM-DD --to-date YYYY-MM-DD`
- `fitatu read-day-summaries --from-date YYYY-MM-DD --to-date YYYY-MM-DD`
- `fitatu add-product --date YYYY-MM-DD --meal breakfast --product-id ... --measure-id ... --quantity ...`
- `fitatu delete-entry --date YYYY-MM-DD --entry-id ...`
All CLI output is JSON.
Read-oriented commands also support `--out PATH` for writing snapshots directly to disk.
The MCP entrypoint is `fitatu-mcp`.
Implemented tools:
- `fitatu_login`
- `fitatu_whoami`
- `fitatu_logout`
- `fitatu_search_food`
- `fitatu_get_product`
- `fitatu_read_day`
- `fitatu_read_day_summary`
- `fitatu_add_product`
- `fitatu_delete_entry`
The server uses `FastMCP` over stdio.
## Automation Examples
Range exports for a dashboard:
```bash
fitatu read-days --from-date 2026-03-01 --to-date 2026-03-07 --out data/fitatu-days.json
fitatu read-day-summaries --from-date 2026-03-01 --to-date 2026-03-31 --out data/fitatu-summaries.json
```
Example cronjobs:
```cron
# macOS / BSD `date`
5 6 * * * cd /absolute/path/to/fitatu-wrapper && /absolute/path/to/.venv/bin/fitatu read-day --date $(date +\%F) --out data/today.json
10 6 * * * cd /absolute/path/to/fitatu-wrapper && /absolute/path/to/.venv/bin/fitatu read-day-summaries --from-date $(date -v-6d +\%F) --to-date $(date +\%F) --out data/weekly-summaries.json
```
Linux / GNU `date` variant:
```cron
10 6 * * * cd /absolute/path/to/fitatu-wrapper && /absolute/path/to/.venv/bin/fitatu read-day-summaries --from-date $(date -d '6 days ago' +\%F) --to-date $(date +\%F) --out data/weekly-summaries.json
```
For dashboard ingestion, prefer the CLI over MCP and persist JSON snapshots locally.
## Configuration
Copy [.env.example](.env.example) to `.env` for local development.
The runtime loads `.env` automatically.
Important rules:
- never commit a real `.env`
- never put real credentials or tokens into `.env.example`
- treat `.env.example` as documentation, not as a secrets file
Supported environment variables:
- `FITATU_API_BASE_URL`
- `FITATU_SESSION_PATH`
- `FITATU_USERNAME`
- `FITATU_PASSWORD`
- `FITATU_API_KEY`
- `FITATU_API_SECRET`
- `FITATU_LOGIN_API_CLUSTER`
- `FITATU_APP_LOCATION_COUNTRY`
- `FITATU_APP_UUID`
- `FITATU_APP_VERSION`
- `FITATU_APP_LOCALE`
- `FITATU_APP_SEARCHLOCALE`
- `FITATU_APP_STORAGELOCALE`
- `FITATU_APP_TIMEZONE`
- `FITATU_APP_OS`
### Zero-Bootstrap Login
The default path is now browserless and zero-bootstrap:
- `fitatu login --email ... --password ...` can work with only credentials
- the client fetches the public Fitatu login page and web bundle
- it extracts the public web-app config needed for the first login request
- after login, the session file stores the user tokens and user-scoped headers for normal reuse
This means:
- browser automation is not required for normal CLI or MCP use
- manual `FITATU_API_*` / `FITATU_APP_*` values are not required for first login
- those header env vars are now advanced debug or override inputs, not mandatory setup
The repository does not include real values for any of these fields.
Populate them from your own local setup only.
## Live Smoke
The repo includes opt-in live smoke tests for zero-bootstrap browserless operation.
By default they are skipped. To run them:
```bash
FITATU_RUN_LIVE=1 python3 -m pytest -m live tests/test_live_smoke.py
```
Required live-smoke inputs:
- `FITATU_USERNAME`
- `FITATU_PASSWORD`
- `FITATU_LIVE_DATE`
- optionally `FITATU_LIVE_MEAL` and `FITATU_LIVE_QUERY`
Optional write smoke inputs:
- `FITATU_LIVE_PRODUCT_ID`
- `FITATU_LIVE_MEASURE_ID`
- `FITATU_LIVE_QUANTITY`
The live smoke tests unset all manual `FITATU_API_*` and `FITATU_APP_*` env vars before building the client config. They then perform programmatic login and run the v1 read and write flows. That proves the browserless path works without manual bootstrap configuration.
## Development
The project uses:
- Python 3.12+
- `typer` for the CLI
- `pydantic` for public models
- `mcp` for the MCP server
- `pytest` for tests
- `ruff` for linting
Checks:
```bash
ruff check .
python3 -m pytest
```
If you are changing CLI or MCP behavior, update this README in the same change.
TDQS
Scored across 9 tools
Each tool targets a distinct function: authentication (login/whoami/logout), food lookup (search_food/get_product), and daily log management (read_day/read_day_summary/add_product/delete_entry). The two read tools differentiate by level of detail, and add/delete are clearly opposed.
All tools follow a consistent 'fitatu_verb_noun' pattern with snake_case throughout. 'whoami' is a minor deviation but is a standard command name that fits the style.
9 tools is well within the ideal 3-15 range. Each tool addresses a core aspect of the Fitatu workflow without redundancy.
The surface covers authentication, food database search, and daily entry management comprehensively. Missing an explicit update operation for entries is a minor gap, but add/delete and multiple read modes handle most practical use cases.