Your AI can use it.
Connect Claude, ChatGPT, or any MCP client. It plans the week with the same per-person checks as your kitchen.
- Claude
- ChatGPT
- Any MCP client
https://ovenlovin-demo.vercel.app/mcp
Plan dinners for this week. Grandpa C is visiting Thursday.
- Mon
- Baked ziti
- Tue
- Sheet pan gnocchi
- Wed
- Stuffed peppers
- Thu
- Lemon chicken
- Fri
- Tacos
Three steps: get an API key, paste a snippet into your AI, then ask it to plan the week.
Send your key as Authorization: ApiKey YOUR_KEY. Bearer works in place of ApiKey. Allergen findings name the person and the ingredient. Not medical advice. Always read the label.
New here? Start here. Just looking? The public demo at https://ovenlovin-demo.vercel.app issues a 24h sandbox key at /api/demo/enter?format=json.
Get an API key
Sign in to create an API key. Your keys also live in Settings, under API keys. Until then the snippets use YOUR_OVENLOVIN_API_KEY.
Pick your AI
Paste this into Grok Bot MCP settings. It already has your kitchen’s URL.
- Sign in here and generate an API key (or create one under Settings).
- In Grok, add an MCP server and paste the JSON below.
- Ask: "Search my OvenLovin recipes for chicken."
{
"mcpServers": {
"ovenlovin": {
"transport": "http",
"url": "https://ovenlovin-demo.vercel.app/mcp",
"headers": {
"Authorization": "ApiKey YOUR_OVENLOVIN_API_KEY"
}
}
}
}Claude Code
Remote HTTP is the supported path. After you have a key:
claude mcp add --transport http ovenlovin https://ovenlovin-demo.vercel.app/mcp \ --header "Authorization: ApiKey YOUR_OVENLOVIN_API_KEY"
Migrate from ReciMe
Bring every ReciMe folder into your kitchen. Copy the prompt, hand it to an agent with a browser, and it will create matching cookbooks and import each recipe.
For an agent with a browser plus this kitchen's MCP or API key. It signs into ReciMe, walks every folder, and imports matching cookbooks and recipes here - images, servings, times, and source URLs included.
- Generate an API key above, or leave the placeholder and paste a key later.
- Copy the prompt. Your kitchen's address is already filled in (https://ovenlovin-demo.vercel.app).
- Give the agent browser access and this kitchen's MCP connection or API key.
- Cookbooks, images, and times all come across. If an endpoint 404s, the prompt tells the agent to retry once, then continue and mark those items incomplete.
Migrate this household's ReciMe library into OvenLovin.
You have a browser and this OvenLovin kitchen:
- Instance: https://ovenlovin-demo.vercel.app
- MCP: https://ovenlovin-demo.vercel.app/mcp
- REST: https://ovenlovin-demo.vercel.app/api/v1
- OpenAPI: https://ovenlovin-demo.vercel.app/api/v1/openapi.json
- Authorization header: ApiKey YOUR_OVENLOVIN_API_KEY
- ReciMe: https://recime.app
## Sign in and enumerate ReciMe
1. Open https://recime.app in the browser. If a sign-in wall appears, sign in as the household owner and wait until the library loads.
2. Enumerate every folder/cookbook (and any Unfiled / unsorted area). Record the folder name and a stable ReciMe URL when one exists.
3. Inside each folder, list every recipe. Do not skip hidden, favorited-only, or paginated items - scroll or page until the folder is exhausted.
4. For each recipe, open it and capture:
- title
- image URL(s), including the hero photo
- servings
- prep time, cook time, and total time if shown
- ingredients (keep the original line wording)
- steps / instructions
- source URL: the ReciMe recipe permalink, plus any original recipe URL ReciMe shows
5. If a recipe page fails to load, record the error and continue. Never silently drop a recipe.
## Create matching cookbooks in OvenLovin
ReciMe folders map to OvenLovin cookbooks (many-to-many collections). A recipe may belong to more than one cookbook.
Probe this kitchen before writing:
- REST: GET https://ovenlovin-demo.vercel.app/api/v1/cookbooks
- MCP: list_cookbooks
If those exist, create one cookbook per ReciMe folder (skip Unfiled):
- REST: POST https://ovenlovin-demo.vercel.app/api/v1/cookbooks body: { "name": "<folder name>", "description": "Migrated from ReciMe" }
- MCP: manage_cookbook action=create, name, description
Keep a map of ReciMe folder → cookbook id.
This kitchen supports cookbooks, image upload, and recipe times: GET/POST https://ovenlovin-demo.vercel.app/api/v1/cookbooks, POST https://ovenlovin-demo.vercel.app/api/v1/cookbooks/:id/recipes, POST https://ovenlovin-demo.vercel.app/api/v1/uploads/images, MCP list_cookbooks / get_cookbook / manage_cookbook, and import_recipe cookbookId. If any of those 404, retry once, then import recipes anyway and list "cookbook membership skipped" in the summary. Do not invent endpoints.
## Import each recipe
De-duplicate by source URL before creating. List existing recipes (GET https://ovenlovin-demo.vercel.app/api/v1/recipes?limit=50 and page cursors; MCP search_recipes) and skip when source.url or source.canonicalUrl already matches the ReciMe permalink or the original source URL.
Prefer MCP import_recipe when the ReciMe (or original) URL is publicly fetchable:
- import_recipe source="url", content="<url>", cookbookId="<id>"
If the URL is behind ReciMe login, or import_recipe only returns a title without ingredients/steps, create the recipe from the captured fields:
POST https://ovenlovin-demo.vercel.app/api/v1/recipes
{
"title": "...",
"slug": "<slugified title>",
"servings": 4,
"prepTimeMinutes": 15,
"cookTimeMinutes": 30,
"totalTimeMinutes": 45,
"images": ["https://..."],
"status": "published",
"visibility": "private",
"ingredients": [{ "rawText": "2 cups flour", "order": 0 }],
"steps": [{ "text": "Mix dry ingredients.", "order": 0 }],
"source": {
"type": "app_export",
"url": "https://recime.app/...",
"canonicalUrl": "https://original-source.example/...",
"importerName": "recime-migrate",
"importerVersion": "1"
}
}
Field names on this kitchen:
- images[] - remote photo URLs. Upload first via POST https://ovenlovin-demo.vercel.app/api/v1/uploads/images (JSON { "url": "..." } or multipart file) and store the returned Blob URL so the kitchen can show the photo. If Blob is not configured, keep the remote URL on images[].
- servings - integer.
- prepTimeMinutes, cookTimeMinutes, totalTimeMinutes - integers. Parse "1 hr 15 min" → 75.
- ingredients[].rawText, steps[].text / order.
- source.url / source.canonicalUrl - required for de-dupe. Prefer the ReciMe permalink on url and the original site on canonicalUrl when both exist.
If POST /api/v1/recipes rejects ingredients, steps, or source, create the recipe with title/images/servings/times, then PATCH https://ovenlovin-demo.vercel.app/api/v1/recipes/:id with the remaining fields. If PATCH also lacks those keys, keep the captured payload and report status: incomplete for that recipe - never claim it imported cleanly.
Add the recipe to the matching cookbook(s):
- REST: POST https://ovenlovin-demo.vercel.app/api/v1/cookbooks/:id/recipes body: { "recipeId": "..." }
- MCP: manage_cookbook action=add_recipe, id, recipeId
## Report
After every folder, print progress. At the end return a summary:
- cookbooks created (name → id)
- recipes imported (title, OvenLovin id, ReciMe URL)
- skipped as duplicates (title, matched source URL)
- failures (title, reason)
- incomplete (missing cookbooks, images, times, ingredients, or steps - name the field)
Do not use real family names in the report. Do not stop the whole run because one recipe failed.Safety
Call check_meal_plan before save_meal_plan. If checking cannot finish, the result is status: incomplete. Never treat that as “no issues”.