An MCP server for Cookidoo, built with NestJS. It exposes a Cookidoo account (recipes, shopping list, meal planner, collections, and more) to AI tools such as Claude, Cursor, and other MCP clients.
Cookidoo credentials are configured on the server via environment variables. MCP clients only need the HTTP endpoint — they do not store your Cookidoo password.
Published images are available on:
sisqueslabs/cookidoo-mcpghcr.io/sisques-labs/cookidoo-mcp| Tag | Description |
|---|---|
latest | Most recent stable release, promoted to prod from main |
X.Y.Z | Specific semver release (e.g. 0.3.1) |
sha-<shortsha> | Continuous build for a single commit on main |
edge | Most recent continuous build on main (not yet promoted to a stable release) |
docker pull sisqueslabs/cookidoo-mcp:latest
Replace the placeholders with your Cookidoo account credentials:
docker run --rm -p 3000:3000 \
-e [email protected] \
-e COOKIDOO_PASSWORD=your-password \
sisqueslabs/cookidoo-mcp:latest
The MCP endpoint is then available at:
http://localhost:3000/api/mcp
Verify the container is running:
curl http://localhost:3000/api/health
Expected response:
{"status":"ok","timestamp":"..."}
| Variable | Description |
|---|---|
COOKIDOO_EMAIL | Cookidoo account email |
COOKIDOO_PASSWORD | Cookidoo account password |
| Variable | Default | Description |
|---|---|---|
PORT | 3000 | HTTP port the server listens on |
COOKIDOO_COUNTRY_CODE | es | Localization country code |
COOKIDOO_LANGUAGE | es-ES | Localization language |
COOKIDOO_URL | https://cookidoo.es/foundation/es-ES | Localization base URL |
COOKIDOO_COOKIE_FILE | — | Path inside the container to persist the session across restarts |
COOKIDOO_DEBUG | false | Set to true to log the full OAuth2 login flow when debugging authentication |
OTEL_EXPORTER_OTLP_ENDPOINT | — | OpenTelemetry traces + metrics + logs disabled when unset |
OTEL_SERVICE_NAME | cookidoo-mcp | Service name reported on exported traces/metrics/logs |
OTEL_TRACES_SAMPLE_RATIO | 1.0 | Trace sampling ratio (0–1) |
OTEL_METRIC_EXPORT_INTERVAL_MILLIS | 15000 | Metric export interval in milliseconds |
LOG_LEVEL | info | Minimum Winston log level (error/warn/info/http/verbose/debug) |
Traces, metrics, and logs are pushed via OTLP to a collector when
OTEL_EXPORTER_OTLP_ENDPOINT is set — there is no in-process /metrics
endpoint to scrape. Structured logs always go to stdout as colorized JSON
regardless (via Winston), OTLP forwarding is additive.
Override all three localization variables together to target another market. Examples:
| Market | COOKIDOO_COUNTRY_CODE | COOKIDOO_LANGUAGE | COOKIDOO_URL |
|---|---|---|---|
| Spain | es | es-ES | https://cookidoo.es/foundation/es-ES |
| Switzerland | ch | de-CH | https://cookidoo.ch/foundation/de-CH |
| United Kingdom | gb | en-GB | https://cookidoo.co.uk/foundation/en-GB |
If you change PORT, map the same port on the host (e.g. -p 3010:3010 when PORT=3010).
Create a .env file (do not commit it):
[email protected]
COOKIDOO_PASSWORD=your-password
PORT=3000
Run the container:
docker run --rm -p 3000:3000 --env-file .env sisqueslabs/cookidoo-mcp:latest
By default the Cookidoo session lives only in memory. Every container restart triggers a fresh login.
To reuse the session across restarts, set COOKIDOO_COOKIE_FILE to a writable path and mount a volume:
docker run --rm -p 3000:3000 \
-e [email protected] \
-e COOKIDOO_PASSWORD=your-password \
-e COOKIDOO_COOKIE_FILE=/data/.cookidoo-session.json \
-v cookidoo-session:/data \
sisqueslabs/cookidoo-mcp:latest
The session file contains cookies — treat it like a credential. Restrict volume permissions and never share it.
Minimal compose.yml:
services:
cookidoo-mcp:
image: sisqueslabs/cookidoo-mcp:latest
ports:
- "3000:3000"
environment:
COOKIDOO_EMAIL: [email protected]
COOKIDOO_PASSWORD: your-password
COOKIDOO_COOKIE_FILE: /data/.cookidoo-session.json
volumes:
- cookidoo-session:/data
restart: unless-stopped
volumes:
cookidoo-session:
Start it:
docker compose up -d
The server must be running before a client connects. Point your MCP client at the Streamable HTTP endpoint:
http://<host>:<port>/api/mcp
Replace <host> with localhost when the client runs on the same machine, or the container/host IP otherwise.
Create or edit .cursor/mcp.json:
{
"mcpServers": {
"cookidoo": {
"url": "http://localhost:3000/api/mcp"
}
}
}
If you changed PORT, update the URL accordingly. Restart Cursor so it picks up the server (Settings → Tools & MCP should list cookidoo).
Do not put Cookidoo credentials in mcp.json — authentication is handled by this container via COOKIDOO_EMAIL and COOKIDOO_PASSWORD.
Once connected, the server exposes tools to manage your Cookidoo account, including:
See the project README for the full tool list.
A liveness probe is exposed at GET /api/health. It is unauthenticated and does not call Cookidoo, so it is safe for orchestrators and uptime monitors.
Example Docker Compose health check:
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
Adjust the port if you override PORT.
Container exits immediately
COOKIDOO_EMAIL and COOKIDOO_PASSWORD are set and valid.docker logs <container-id>.Authentication failures
COOKIDOO_DEBUG=true and review the OAuth2 login trace in the logs.Client cannot connect
-p 3000:3000).POST /api/mcp; GET and DELETE on that path return 405.Content type
Image
Digest
sha256:03e5d60ed…
Size
95.4 MB
Last updated
about 1 month ago
docker pull sisqueslabs/cookidoo-mcp