FastAPI-based recipe ingestion service that scrapes recipes from websites and parses recipes from videos (TikTok, Instagram, YouTube). Automatically detects source type and routes to appropriate parser. Integrates with eKitchen backend for recipe creation, OpenAI for video/image parsing, Spoonacular for ingredient enrichment, and Whisper for video transcription.
This MCP server exhibits severe definition quality issues across multiple dimensions. Of 17 tools, 10 are duplicates (health_check, get_server_config, test_connectivity appear 2-3 times each), indicating either incomplete refactoring or tool registration errors. Unique functional tools (ingest_recipe, scrape_single_recipe, search_ingredient, get_ingredient) have reasonable descriptions, but parameter handling is inconsistent. The ingest_recipe tool description is verbose (>1000 chars) and mixes implementation details (ffmpeg, yt-dlp) with functional intent. Parameters like ekitchen_email and ekitchen_password are exposed as tool parameters, a critical security violation. Error handling is mentioned in source but not visible in tool definitions. Average description length for unique tools is ~300 chars (above the 194-char baseline), suggesting over-verbosity rather than clarity.
Detailed health check with dependencies.
Check analytics system health. Returns: - Number of records stored - Oldest and newest record timestamps - Storage status
Get cost analytics for video ingestion. Returns: - Total costs by time period - Breakdown by extraction method - Platform-specific costs - Average cost per video - Cost trends Example: GET /api/v1/analytics/costs?start_date=2025-01-01&platform=tiktok
Get a quick cost summary for the current day, week, and month. Returns: - Today's total cost - This week's total cost - This month's total cost - Average cost per video
Get detailed ingredient information including nutrition facts Provides comprehensive ingredient information for Claude to use in conversations. Args: ingredient_id: Spoonacular ingredient ID from search results amount: Amount for nutrition calculation (default: 100) unit: Unit for amount calculation (default: "grams") Returns: Detailed ingredient data with nutrition facts per specified amount
Duplicate tool definitions: health_check, get_server_config, test_connectivity appear 2-3 times with varying descriptions. This indicates incomplete refactoring or tool registration errors and will confuse LLM tool selection.
Credentials exposed as tool parameters: scrape_single_recipe accepts ekitchen_email, ekitchen_password, and spoonacular_api_key as parameters. These will be logged in agent traces and prompt history. Must use server-side secret injection via environment variables.
Missing input schemas for 5 tools: healthz, ready, detailed_health_check, get_cost_summary, get_analytics_health have no visible input parameter definitions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Get current server configuration settings Provides visibility into server settings for debugging and optimization purposes.
Get current server configuration settings Provides visibility into server settings for debugging and optimization purposes.
Check MCP server health and status Returns comprehensive health information including uptime, request statistics, and system status.
Check MCP server health and status Returns comprehensive health information including uptime, request statistics, and system status.
Basic health check.
Kubernetes-style liveness probe (always returns 200).
Ingest a recipe from any URL - automatically routes to appropriate parser. Unified recipe ingestion endpoint that automatically detects URL type and routes accordingly. **Supported Sources:** - **Websites** (200+ recipe sites): AllRecipes, FoodNetwork, BonAppetit, etc. - **TikTok**: tiktok.com/@user/video/..., vm.tiktok.com/... - **Instagram**: instagram.com/reel/..., instagram.com/reels/... - **YouTube Shorts**: youtube.com/shorts/... **Pipeline for Websites:** 1. Scrape recipe using recipe-scrapers 2. AI ingredient parsing + Spoonacular enrichment 3. Create recipe in eKitchen **Pipeline for Videos:** 1. Download audio with yt-dlp (audio-only, fast) 2. Transcribe with Whisper API 3. Extract recipe with GPT-4 4. AI ingredient parsing + Spoonacular enrichment 5. Create recipe in eKitchen
Kubernetes-style readiness probe (requires auth to be valid).
Scrape a single recipe from URL with optional ingredient processing Args: url: Recipe URL to scrape process_ingredients: If True, also process ingredients with eKitchen database integration ekitchen_email: eKitchen admin email for authentication (required if process_ingredients=True) ekitchen_password: eKitchen admin password for authentication (required if process_ingredients=True) spoonacular_api_key: Spoonacular API key for ingredient enrichment (optional) Returns: Recipe data with scraping metadata, and optionally processed ingredients with ID mapping
Search for ingredients by name using Spoonacular API Enables Claude to find ingredients for further processing. Args: name: Ingredient name to search for (e.g., "butter", "chicken breast") limit: Maximum number of results to return (default: 10, max: 100) Returns: Structured ingredient search results with IDs and names
Test server connectivity and basic functionality Placeholder tool for testing MCP communication with Claude Desktop. Will be extended with actual scraping capabilities in Issue #6.
Test server connectivity and basic functionality Tests connection to Spoonacular API and validates configuration.
Sparse descriptions on health check variants: health_check (duplicate #3) has only 12 characters ('Basic health check.'), violating the minimum 20-character rule and providing no context for LLM tool selection.
Over-verbose descriptions: ingest_recipe description exceeds 1000 characters and mixes implementation details (yt-dlp, ffmpeg, Whisper API, GPT-4, DALL-E) with functional intent. Should be 50-200 characters focusing on user intent, with implementation abstracted.
Parameter descriptions embed example values without enum constraints: scrape_single_recipe description says '(e.g., "butter", "chicken breast")' but does not enforce these as valid options. Should use formal enums for constrained inputs.
Ambiguous Kubernetes probe naming: healthz, ready, detailed_health_check use internal probe conventions (Kubernetes liveness/readiness) as external tool names. LLMs will conflate these with application health semantics. Rename to health_check_liveness, health_check_readiness, or consolidate into single health_check with a mode parameter.
Missing response schema documentation: Tool definitions provide input schemas for most tools, but output schemas are not visible. LLMs cannot plan downstream calls without knowing what fields (e.g., recipe_id, ingredient_ids) the response contains.