food-recipe-mcp
# Food Recipe MCP
<!-- mcp-name: io.github.AIDataNordic/food-recipe-mcp -->
Semantic search over 50,000+ food recipes — built for AI agents and LLMs. Two-stage hybrid retrieval (dense + sparse BM25, fused via RRF) with cross-encoder reranking. Supports natural language queries in Norwegian and English.
**Live endpoint:** `https://recipes.aidatanorge.no/mcp`
**Transport:** `streamable-http`
**Demo:** [https://recipes.aidatanorge.no/](https://recipes.aidatanorge.no/)
---
## Connect
Add to your MCP client config:
```json
{
"mcpServers": {
"food-recipe": {
"type": "streamable-http",
"url": "https://recipes.aidatanorge.no/mcp"
}
}
}
```
Or with Claude Code:
```bash
claude mcp add --transport http food-recipe https://recipes.aidatanorge.no/mcp
```
---
## Quick Test
**Try the live demo in your browser:**
[https://recipes.aidatanorge.no/](https://recipes.aidatanorge.no/)
No installation or configuration needed.
---
## MCP Tools
### `search_recipes`
Semantic search over 50,000+ recipes from Food.com with hybrid retrieval and reranking.
```python
search_recipes(
query="quick Italian pasta for weeknight dinner",
diet="vegetarian", # vegetarian | vegan | gluten-free | dairy-free | low-carb | keto | paleo
max_minutes=30, # maximum total cooking time in minutes
difficulty="easy", # easy | medium | hard
limit=5 # default 5, max 20
)
# Returns: rerank_score, rrf_score, title, description, total_time, difficulty,
# diet, main_ingredient, servings, ingredients, instructions, nutrition,
# rating, rating_count, source, recipe_id
```
**Query examples:**
- `"Swedish meatballs with gravy"`
- `"healthy high-protein chicken bowl"`
- `"easy chocolate cake for beginners"`
- `"traditional Norwegian kjøttkaker"`
- `"hurtig pasta med kylling"`
**Search pipeline:** Dense embedding (`intfloat/e5-large-v2`, 1024d) + sparse BM25, fused via Reciprocal Rank Fusion (RRF), reranked by `mmarco-mMiniLMv2-L12-H384-v1`.
### `ping`
```python
ping(name="world")
# Returns: "Hello world! Recipe MCP server is running."
```
---
## Data
- **Source:** Food.com (~50,000 recipes)
- **Coverage:** Wide range of cuisines, meal types, and cooking styles
- **Nutritional data:** calories, fat, protein, carbohydrates, sodium, fiber, sugar per serving
- **Ratings:** user rating + rating count per recipe
- **Languages:** English and Norwegian supported natively in queries
---
## Architecture
```
Food.com recipes → Python ingest → Qdrant (recipe_data_v2 collection)
↓
Hybrid search (dense e5-large-v2 + sparse BM25)
↓
RRF fusion + cross-encoder reranking
↓
FastMCP 3.2 → MCP clients / AI agents
```
---
## Technical Stack
- **Embeddings:** `intfloat/e5-large-v2` (1024d dense) + `Qdrant/bm25` (sparse)
- **Reranker:** `cross-encoder/mmarco-mMiniLMv2-L12-H384-v1`
- **Vector DB:** Qdrant (self-hosted)
- **Server:** FastMCP 3.2 over HTTP
- **Infrastructure:** Ubuntu Server 24 LTS, Cloudflare Tunnel
---
## License
MIT
TDQS
Scored across 2 tools
The two tools have completely distinct purposes: ping is a connectivity test with no domain functionality, while search_recipes is the core recipe search operation. There is no overlap or ambiguity between them.
Both tools use snake_case naming, which is consistent. However, ping uses a generic network term while search_recipes follows a verb_noun pattern, creating a minor deviation in naming style.
With only 2 tools, this server feels severely under-equipped for a recipe domain. A recipe server should typically include tools for retrieving recipe details, filtering by criteria, saving favorites, or managing collections, not just search and ping.
The server lacks basic CRUD operations for recipes. While search_recipes is well-described, there are no tools to get full recipe details, create/modify recipes, or manage user interactions. This creates significant gaps for agent workflows.