loading…
Search for a command to run...
loading…
Public, anonymous, read-only MCP server for the Epicure ingredient-embedding model, offering tools for ingredient pairings, flavor profiling, and culinary explo
Public, anonymous, read-only MCP server for the Epicure ingredient-embedding model, offering tools for ingredient pairings, flavor profiling, and culinary exploration via cosine similarity and other embedding analyses.
Public, anonymous, read-only Model Context Protocol (MCP) server for the Epicure ingredient-embedding model.
The server is stateless and deterministic: every tool call is a pure function of the request arguments plus the bundled artefacts. There are no external model calls, no embedding fallback, and no user state.
Designed for Azure Container Apps deployment with a replica cap to bound spend.
Each tool call produces one structured JSON log line containing the tool name, the call arguments, a truncated preview of the result (max 4 KB), the latency, success flag, and a hashed client IP (SHA-256 with a salt that rotates at UTC midnight and never leaves the running replica). Raw IPs are never stored or logged. Logs are forwarded to the deployment operator's log store (Azure Log Analytics by default) for aggregate usage analytics only.
| Category | Tool | Description |
|---|---|---|
| Ported | compare_on_axis |
Project two ingredients onto a named axis and compare. |
| Ported | pairing_score |
Overall cosine affinity (300-d) between two ingredients. |
| Ported | find_pairings |
Cluster + bridge graph computed in-process from the bundled embeddings. |
| Ported | flavour_correlations |
Which axes correlate with each other. |
| Ported | cultural_profile |
Cosine to each cuisine direction. |
| Novel | neighbors |
Top-k cosine neighbours. |
| Novel | morph |
Unified SLERP toward a direction, mode, or ingredient. |
| Novel | list_targets |
Catalogue of valid morph targets + angle_deg primer. |
| Novel | list_factors |
Residualised ICA factor catalogue (Claude-labelled poles). |
| Novel | ingredient_on_factor |
Signed projection onto an ICA factor. |
| Novel | pareto_navigate |
Pareto frontier on (proximity, pole-projection). |
| Novel | closest_mode |
Which named GMM mode the ingredient lives in. |
| Novel | where_on_atlas |
Precomputed UMAP (x, y) + nearest-in-2D peers. |
python3.12 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Build the data bundle from a local epicure-data checkout
python scripts/build_data.py --source-repo /path/to/epicure-data --out-dir data
python scripts/verify_data.py --data-dir data
# Run server
python -m epicure_mcp.server
# Smoke-test
curl http://localhost:8080/healthz
Endpoints:
| Path | Method | Description |
|---|---|---|
/healthz |
GET | Liveness probe (does not load the bundle). |
/mcp |
POST | Streamable HTTP MCP JSON-RPC endpoint. |
| Var | Default | Description |
|---|---|---|
EPICURE_DATA_DIR |
<repo>/data |
Bundled-artefact directory. |
HOST |
0.0.0.0 |
Bind address. |
PORT |
8080 |
Bind port. |
RATE_LIMIT_PER_MINUTE |
60 |
Token-bucket refill rate. |
RATE_LIMIT_BURST |
10 |
Token-bucket capacity. |
MCP_SERVER_NAME |
epicure |
Reported in the MCP initialize response. |
The server is fully self-contained: there is no upstream API call.
find_pairings runs the graph algorithm locally against the bundled
embeddings + ingredient metadata.
The data/ directory is committed to this repo (~13 MB) so the
server is fully self-contained: clone, build, deploy. No external data
checkout required.
| File | Source | Size |
|---|---|---|
embeddings.csv |
epicure-data: deploy/payload/embeddings.csv |
~10 MB |
ingredient_list.csv |
epicure-data payload | ~75 KB |
ingredient_tags.csv |
epicure-data payload | ~100 KB |
consolidated_nodes.csv |
epicure-data payload | ~70 KB |
factor_labels_ica_cooc.json |
application/paper/results/ |
~75 KB |
mode_explorer_cooc.json |
application/exploratory/results/ |
~2 MB |
supervised_directions.npz |
computed (38 axes) | ~55 KB |
factor_dirs_ica_n20.npy |
computed (20 unit vectors) | ~25 KB |
mode_poles_cooc.npy |
computed (150 unit vectors) | ~180 KB |
umap_coords.csv |
computed (1,790 x 2) | ~55 KB |
When a new epicure-data training run lands, regenerate the bundle from
a local checkout and commit the diff:
python scripts/build_data.py --source-repo /path/to/epicure-data --out-dir data
python scripts/verify_data.py --data-dir data
git add data/ && git commit -m "data: refresh bundle from <run-id>"
You need the Azure CLI installed and an authenticated session:
# Install az (Ubuntu/Debian)
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
az login
az account set --subscription "<your-sub-id>"
# Provision RG + ACR + ACA env + container app + GitHub OIDC federation
./scripts/azure_setup.sh
The script prints the GitHub Actions secrets / variables you must set on the repo for the deploy workflow to function.
.github/workflows/deploy.yml runs on every push to main:
az containerapp update and waits for the new revision to
answer /healthz.--max-replicas 3 puts a hard cap on burst spend.--min-replicas 0 allows scale-to-zero (cold start ~3-5 s while
the bundle loads).Once deployed, the MCP endpoint is https://<aca-fqdn>/mcp.
Add a custom MCP server in Settings -> Integrations -> Add custom:
Name: Epicure
URL : https://<aca-fqdn>/mcp
Auth: None
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"epicure": {
"transport": "streamable-http",
"url": "https://<aca-fqdn>/mcp"
}
}
}
Use Actions with the OpenAPI schema generated from the MCP tools/list
response.
Выполни в терминале:
claude mcp add epicure-mcp-server -- npx Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.