Generate a recipe from ingredients on hand, with optional dietary restrictions. Free.
One address for any MCP client. No sign-in needed on this server.
1 other
Grouped by tool name. At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
AI-powered recipe generator that transforms ingredients into delicious recipes using Google Gemini AI. Deployed on Google Cloud Run at chomptron.com.
Enter ingredients you have in your kitchen, and Chomptron generates creative, practical recipes complete with measurements, instructions, cooking time, and serving sizes.
npm install
export GEMINI_API_KEY="your-api-key-here"
export GEMINI_MODEL="gemini-3.1-flash-lite" # Optional, defaults to gemini-3.1-flash-lite
npm start
Visit http://localhost:8080
Get API key: https://makersuite.google.com/app/apikey
GEMINI_API_KEY (required) - Your Google Gemini API keyGEMINI_MODEL (optional) - Model to use, defaults to gemini-3.1-flash-litePORT (optional) - Server port, defaults to 8080The Gemini model can be configured via the GEMINI_MODEL environment variable:
Recommended Models (as of December 2025):
gemini-3.1-flash-lite (default) - Best free tier limits: 15 RPM, 1,000 RPDgemini-2.5-flash - 10 RPM, 250 RPDgemini-2.0-flash - 10 RPM, 200 RPD (⚠️ unstable quota, often shows limit: 0)gemini-1.5-flash - Legacy model, may have better limits than 2.0December 2025 Quota Shift:
Google overhauled free tier quotas in December 2025:
gemini-2.0-flash was removed from fully unauthenticated free tierlimit: 0 errors for newer models without billing enabledFixing "Limit: 0" Errors:
If you're seeing quota errors with limit: 0:
gemini-2.5-flash-lite - Best free tier model currently available/api/usage endpoint or https://ai.dev/usageFree Tier Limits (as of Dec 2025):
| Model | Requests/Minute | Requests/Day | Best For |
|---|---|---|---|
| gemini-2.5-flash-lite | 15 | 1,000 | High-volume apps |
| gemini-2.5-flash | 10 | 250 | General use |
| gemini-2.0-flash | 10 | 200 | Legacy (unstable) |
| gemini-2.5-pro | 2 | 50 | Complex reasoning |
npm test
Tests validate:
styles.css and app.js linking/health, /ready) and recipe generationGET /health - Liveness check, returns service status
GET /ready - Readiness check, verifies AI configuration and shows current model
GET /api/usage - Usage statistics (total requests, quota errors, model info)
POST /api/generate-recipe - Main recipe generation endpoint
{
"ingredients": "chicken, tomatoes, garlic",
"dietaryPreferences": {
"vegan": false,
"vegetarian": false,
"glutenFree": false,
"dairyFree": false,
"nutFree": false,
"shellfishFree": false,
"eggFree": false,
"soyFree": false
}
}
{
"success": true,
"recipe": "**Recipe Name:** ...",
"cached": false
}
POST /mcp — MCP Streamable HTTP. Tool generate_recipe (ingredients + optional dietary flags). Unauthenticated. Daily cap MCP_DAILY_RECIPE_LIMIT (default 20), persisted to MCP_BUDGET_FILE so a process restart on the same instance does not reset it.
Chomptron is built as a serverless application on Google Cloud Run for cost efficiency and automatic scaling.
Tech Stack:
Why Serverless?
Performance Optimizations:
Health checks:
curl https://chomptron.com/health
curl https://chomptron.com/ready
curl https://chomptron.com/api/usage # View usage statistics
View logs:
# Recent logs
gcloud run logs read chomptron --region us-central1 --limit 50
# Live stream
gcloud run logs tail chomptron --region us-central1
Console dashboards:
Recipes are stored in browser localStorage with the following structure:
{
"id": "timestamp",
"ingredients": "chicken, tomatoes, garlic",
"recipe": "Full recipe text...",
"recipeName": "Extracted recipe name",
"timestamp": "2025-01-01T00:00:00.000Z",
"favorite": false,
"rating": 0,
"notes": "",
"servingSize": 4,
"dietaryPreferences": {
"vegan": false,
"vegetarian": false,
"glutenFree": false,
"dairyFree": false,
"nutFree": false,
"shellfishFree": false,
"eggFree": false,
"soyFree": false
}
}
The application uses in-memory caching on the server side:
Optimized for search engines and social sharing with meta tags, Open Graph, Twitter Cards, structured data (JSON-LD), sitemap, robots.txt, and PWA support.
This repo includes a Buildkite pipeline at .buildkite/pipeline.yml that runs on a self-hosted GCP agent provisioned by buildkite-gcp-agent.
Push / PR
└── Three steps dispatched in parallel:
├── :prettier: Format check (npm run format -- --check)
├── :eslint: Lint (npm run lint)
└── :nodejs: Tests (npm test)
└── Annotate — consolidated pass/fail surfaced in the Buildkite UI
The key difference from the GitHub Actions workflow, which runs format → lint → test sequentially in a single job: these three steps have no dependencies on each other and run simultaneously. On a pool of agents this distributes the work; even on a single agent the explicit dependency graph documents intent and makes the pipeline trivially scalable.
The deploy stage is intentionally omitted — Cloud Run deployments are handled by the existing GHA workflow which holds the production GCP credentials. CI (fast feedback) and CD (production access) are kept in separate systems as a security boundary.
Connect the repo via Buildkite → New Pipeline → point at github.com/swantron/chomptron. Buildkite reads .buildkite/pipeline.yml automatically on each push.
All steps run on the gcp queue:
agents:
queue: gcp
This is a personal project, but suggestions and improvements are welcome!
MIT