recipe-tools
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@recipe-tools Extract recipe from scanned PDF and convert to structured HTML"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
recipe-tools
MCP-Server zur Rezept-Extraktion aus PDFs oder JPG-Dateien. Stellt Prompts und Tools bereit, mit denen ein LLM-Client (Claude Desktop, Cursor, etc.) gescannte Rezepte interaktiv in strukturierte HTML-Dateien umwandeln kann.
Funktionsweise
Der FastMCP-Server in server.py registriert alle Endpunkte zentral:
Prompt
generate_recipe-- Rezept-Workflow fuer MCP-Clients mit Prompt-UnterstuetzungTool
get_recipe_prompt-- Rezept-Workflow fuer Clients die nur Tools unterstuetzenTool
select_image_regions_tool-- Web-GUI zur Bildausschnitt-Selektion mit OCR (oeffnet Browser automatisch, kehrt sofort zurueck)Tool
get_selection_result_tool-- Holt das Ergebnis der Bildausschnitt-Selektion ab, sobald der Nutzer im Browser fertig istTool
get_working_directory_tool-- Zeigt das Arbeitsverzeichnis anTool
build_recipe_html_tool-- Erzeugt HTML aus strukturierten Rezeptdaten und aktualisiert den Index (erzeugtindex.htmlautomatisch aus Template, falls nicht vorhanden)Tool
get_server_version-- Gibt die aktuelle Versionsnummer des Servers zurueck
Related MCP server: mcp_server_image_selector
Projektstruktur
recipe-tools/
├── pyproject.toml
├── README.md
├── CLAUDE.md
├── .flake8
├── src/
│ └── recipe_processor/
│ ├── __init__.py
│ ├── server.py # Zentraler MCP-Server (FastMCP)
│ ├── assets/
│ │ ├── Template.html # HTML-Template fuer einzelne Rezepte
│ │ └── index_template.html # HTML-Template fuer die Rezeptuebersicht
│ ├── core/
│ │ ├── __init__.py
│ │ ├── utils.py # Gemeinsame Utils (Pfade, Verzeichnisse)
│ │ └── recipes_index.py # Rezept-Index-Verwaltung (HTML-Manipulation)
│ └── tools/
│ ├── __init__.py
│ ├── prompt.py # RECIPE_PROMPT Konstante
│ ├── html_builder.py # HTML-Erzeugung aus Rezeptdaten
│ └── image_selector/
│ ├── __init__.py
│ ├── tools.py # Tool-Funktionen (select, list, get_dir)
│ ├── web_gui.py # Browser-GUI (FastAPI + HTML Canvas)
│ ├── gui.py # Tkinter-GUI (inaktiv, Backup)
│ ├── export.py # Region-Export + OCR
│ ├── pdf_utils.py # PDF-Bildextraktion (PyMuPDF)
│ └── utils.py # transform_coords (image_selector-spezifisch)
└── tests/
├── __init__.py
├── test_prompt.py
├── test_server.py
├── test_html_builder.py
├── test_image_selector_tools.py
├── test_web_gui.py
└── test_recipes_index.pyInstallation
uv installieren (einmalig)
# Option 1: winget
winget install astral-sh.uv
# Option 2: pip
pip install uvDanach Terminal neu starten, damit uv im PATH ist.
Umgebungsvariable setzen (einmalig, damit uv venv/ statt .venv/ verwendet)
[System.Environment]::SetEnvironmentVariable("UV_PROJECT_ENVIRONMENT", "venv", "User")Danach Terminal neu starten.
Projekt einrichten
uv sync --extra dev
git config core.hooksPath .githooksuv legt venv/ an, installiert alle Abhaengigkeiten und sperrt die genauen
Versionen in uv.lock. Der zweite Befehl aktiviert den pre-push Hook (laeuft
einmalig nach dem Klonen).
Voraussetzung
Tesseract OCR muss installiert und im PATH sein.
MCP-Server konfigurieren
Beispielkonfiguration fuer Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"recipe-server": {
"command": "path/to/venv/Scripts/recipe-server",
"env": {
"IMAGE_SELECTOR_WORKING_DIR": "C:/Rezepte",
"IMAGE_SUBDIRECTORY": "Eingang"
}
}
}
}Server manuell starten
uv run recipe-serverOder als Modul:
uv run python -m recipe_processor.serverTests und Linting
uv run pytest
uv run flake8 src/ tests/
uv run black src/ tests/Der pre-push Hook (.githooks/pre-push) fuehrt diese drei Schritte automatisch
vor jedem git push aus: black formatiert den Code, flake8 prueft auf Fehler,
pytest fuehrt die Tests aus. Hat black Aenderungen vorgenommen, wird der Push
abgebrochen -- die Formatierungen muessen dann noch committet werden.
CI/CD
Die GitHub Actions Workflows (.github/workflows/) verwenden ebenfalls uv:
CI (
ci.yml): laeuft bei jedem Push und PR -- Linting, Formatierung, TestsRelease (
release.yml): erstellt bei Pushes aufmainautomatisch ein neues Release perpython-semantic-release, wenn konventionelle Commits vorhanden sind (feat:,fix:, etc.). Nach einem Release wirduv.lockautomatisch aktualisiert und mit[skip ci]committed.
uv.lock ist Teil des Repositories und sichert reproduzierbare Installs. Nach
einem git pull genuegt uv sync --extra dev, um die Umgebung zu aktualisieren.
Standalone-Modi (ohne MCP-Server)
Image Selector (Web-GUI)
uv run python -m recipe_processor.tools.image_selector.tools --standaloneOeffnet die Browser-GUI automatisch. Laedt die .env-Datei automatisch (via python-dotenv).
Ohne Argumente werden Bilder aus IMAGE_SUBDIRECTORY geladen.
Optional kann ein Bildpfad direkt uebergeben werden:
uv run python -m recipe_processor.tools.image_selector.tools --standalone pfad/zum/bild.jpgHTML Builder
uv run python -m recipe_processor.tools.html_builder rezept.jsonErzeugt eine HTML-Datei aus einer JSON-Datei mit Rezeptdaten. Die JSON-Datei
enthaelt die gleichen Felder wie die build_recipe_html-Funktion (recipe_name,
ingredients, instructions, etc.). Laedt die .env-Datei automatisch.
Umgebungsvariablen (.env)
Variable | Beschreibung | Default |
| Arbeitsverzeichnis |
|
| Unterverzeichnis fuer Bilder (relativ zum Working Dir) |
|
Templates
Im Verzeichnis src/recipe_processor/assets/ liegen zwei HTML-Templates:
Template.html -- Vorlage fuer einzelne Rezept-HTML-Dateien. Platzhalter werden beim Erzeugen ersetzt:
Platzhalter
Inhalt
<RECIPE_NAME>,<TITLE>Rezeptname
<SUBTITLE>Kurzbeschreibung
<IMAGE_PATH>Relativer Bildpfad
<PREP_TIME>,<COOK_TIME>,<WAIT_TIME>,<TOTAL_TIME>Zeitangaben (Text)
<PREP_TIME_ISO>,<COOK_TIME_ISO>,<WAIT_TIME_ISO>,<TOTAL_TIME_ISO>Zeitangaben (ISO 8601)
<PORTIONS>Portionsangabe
<COOKWARE>Benoetigte Kuechengeraete (kommagetrennt)
<INGREDIENTS>Zutatenliste als
<ul><INSTRUCTIONS>Zubereitungsschritte als
<ol><TIPS>Tipps und Hinweise
<NUTRITION>Naehrwertangaben
<SOURCE>Quellangabe
index_template.html -- Vorlage fuer die Rezeptuebersicht (
index.html). Enthaelt den Platzhalter<CATEGORIES>, der durch die Kategorie-Sections ersetzt wird. Wird automatisch verwendet, wenn im Ausgangsverzeichnis noch keineindex.htmlexistiert.
Zutaten-Ueberschriften
Innerhalb der Zutatenliste koennen Ueberschriften mit dem Muster --- Text --- markiert werden. Diese werden automatisch in <b>Text</b> umgewandelt.
Zutaten mit gleicher Menge ("je"-Syntax)
Zutaten der Form je 1 TL Kreuzkuemmel und Chilipulver werden automatisch in
einzelne Eintraege mit gleicher Menge aufgesplittet:
je 1 TL Kreuzkümmel und Chilipulver → 1 TL Kreuzkümmel
1 TL Chilipulver
je 1 TL Salz, Pfeffer und Paprika → 1 TL Salz
1 TL Pfeffer
1 TL PaprikaBekannte Einheiten: g, kg, mg, l, ml, cl, dl, EL, TL, Stk, Pck, Pkg, Pr, Prise, Msp, Bd, Bund.
Kuechengeraete (cookware)
Das optionale Feld cookware nimmt eine Liste von Geraeten entgegen und gibt sie
kommagetrennt im HTML-Abschnitt "Kuechengeraete" aus. Fehlt das Feld oder ist es leer,
wird der Abschnitt komplett ausgeblendet.
Optionale Felder und bedingte HTML-Bloecke
Die Felder prep_time, cook_time, wait_time, cookware, tips, nutrition
und source sind optional. Ist ein Feld leer, wird der zugehoerige HTML-Block
vollstaendig weggelassen (keine leere Ueberschrift im Output).
Abhaengigkeiten
Paket | Zweck |
fastmcp | MCP-Server-Framework |
Pillow | Bildverarbeitung |
PyMuPDF | PDF-Bildextraktion |
pytesseract | OCR-Texterkennung |
beautifulsoup4 | HTML-Parsing (Rezept-Index) |
lxml | HTML-Parser-Backend fuer BeautifulSoup |
python-dotenv | .env-Datei laden (Standalone-Modus) |
fastapi | Web-Framework fuer Browser-GUI |
uvicorn | ASGI-Server fuer Browser-GUI |
Available Tools
6 toolsbuild_recipe_html_toolB
Erstellt HTML aus strukturierten Rezeptdaten.
Uebernimmt automatisch Dateinamen-Sanitisierung, ISO-Zeitformat-Berechnung, Leerzeichen Menge/Einheit, Quellen-Bereinigung, Template-Befuellung, Bild-Zuordnung, Datei-Speicherung und Index-Aktualisierung.
Inputs: recipe_name (required), tips, source, category, +9 more. Returns: result
get_recipe_promptA
Gibt den Workflow-Prompt für Rezept-Extraktion aus PDFs zurück.
Inputs: no named parameters. Returns: result
get_selection_result_toolA
Holt das Ergebnis einer mit select_image_regions_tool gestarteten Auswahl ab.
Solange die Auswahl im Browser noch nicht abgeschlossen wurde, liefert das Tool einen Hinweis zurück und kann beliebig oft erneut aufgerufen werden.
Inputs: no named parameters. Returns: result
get_server_versionA
Gibt die aktuelle Version des recipe-servers zurueck.
Inputs: no named parameters. Returns: result
get_working_directory_toolA
Zeigt das aktuelle Working Directory an.
Inputs: no named parameters. Returns: result
select_image_regions_toolA
Öffnet eine GUI zum interaktiven Auswählen von Bildausschnitten.
Unterstützt Bildformate (JPEG, PNG, etc.) und PDF-Dateien. Ohne image_path werden automatisch die ersten 4 Bilder aus dem Bildverzeichnis geladen.
Kehrt sofort zurück, sobald die GUI im Browser geöffnet wurde (blockiert nicht bis zum Abschluss der Auswahl). Das Ergebnis muss anschließend mit get_selection_result_tool abgeholt werden.
Inputs: image_path. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool has a distinct purpose: version info, working directory, prompt retrieval, image selection initiation, selection result retrieval, and HTML building. The paired select/get tools are clearly complementary with explicit descriptions. No two tools appear to do the same thing.
Most tools follow a verb_noun pattern, but the 'tool' suffix is applied inconsistently (e.g., get_server_version vs. get_working_directory_tool). The verbs are clear and predictable (get, select, build), but the naming style is slightly uneven.
With 6 tools, the set is well-scoped for a recipe-oriented MCP server. It covers both utility (version, working directory) and domain-specific operations (prompt, image selection, HTML generation) without being bloated or too sparse.
The core workflow is supported: get prompt, select image regions, fetch result, build HTML. Minor gaps exist (e.g., no explicit PDF-to-text tool, no recipe management), but the provided tools form a coherent pipeline for the intended use case.
Maintenance
Related MCP Connectors
Turn any PDF into structured JSON via AI + OCR: invoices, bank statements, contracts.
Convert PDF, Word, Excel and scanned documents to Markdown, tables and RAG chunks. OCR.
Turn PDFs, scans and photos into a queryable database. Invoices, CVs, receipts, in bulk.
Extract text, tables and metadata from every PDF linked in a dataset, CSV or Google Sheet.
Related MCP Servers
- AlicenseAqualityCmaintenanceConverts dense PDFs into soft, minimal, card-based HTML readers with preserved source text, rendered pages, and cropped tables/figures as images, all processed locally.328 PyPI2MIT
- AlicenseNot gradedqualityDmaintenanceEnables interactive selection of image regions from images and PDFs, with OCR support and automated export of selected regions as separate files.MIT
- FlicenseNot gradedqualityDmaintenanceEnables managing recipes via a web UI and MCP tools, allowing retrieval and saving of recipe data through natural language.-
- FlicenseNot gradedqualityDmaintenanceProvides secure PDF template analysis and layout extraction for AI assistants, enabling generation of styled HTML with automatic image generation.-