{
  "$schema": "https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json",
  "version": "1.0",
  "protocolVersion": "2025-06-18",
  "serverInfo": {
    "name": "bikefuchs",
    "title": "Bikefuchs — Fahrradteile Preisvergleich",
    "version": "2.5.0"
  },
  "description": "Compare prices for bicycle parts, components, accessories, and cycling clothing across 11 German and Austrian bike shops. Optimize multi-product shopping carts to minimize total cost including shipping. Covers over 100,000 products from BOC24, Fahrrad24, ROSE Bikes, fahrrad-teile.shop, Bike Mailorder, Maciag Offroad, HiBike, bike-components, fahrrad-xxl, BIKE24, and Bike-Discount. Supports DE and AT markets.",
  "iconUrl": "https://bikefuchs.com/favicon.ico",
  "documentationUrl": "https://bikefuchs.com/mcp",
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://mcp.bikefuchs.com/mcp"
  },
  "capabilities": {
    "tools": {}
  },
  "authentication": {
    "required": false,
    "schemes": []
  },
  "instructions": "Search with plain keywords via search_product (e.g. 'shimano deore kette 12-fach') — no shop URL is needed. Use get_best_price for the price of a known EAN/GTIN at every shop, optimize_cart to find the cheapest shop combination for several EANs including shipping costs and free-shipping thresholds, find_alternatives_for_product to see which shops carry an EAN, get_shipping_breakdown for the exact shipping cost of one shop, get_shop_info for an overview of all shops, and resolve_product only when you already have a shop URL (it turns the URL into an EAN).",
  "tools": [
    {
      "name": "search_product",
      "title": "Search Bike Products",
      "description": "Search for bicycle parts, components, accessories, and cycling clothing by name, brand, or model number. Returns matching products sorted cheapest-first, each with its price, stock status, EAN barcode, and a direct purchase link. Supports DE and AT pricing. If you already have a product's EAN, use get_best_price instead.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "minLength": 2,
            "description": "Search keyword, min 2 chars. Multi-word queries use AND logic across product name, description, and specifications (e.g. 'shimano xt bremsbeläge')"
          },
          "country": {
            "default": "DE",
            "description": "Country for pricing (DE or AT, default DE)",
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ]
          },
          "in_stock": {
            "default": true,
            "description": "Only return in-stock products (default true)",
            "type": "boolean"
          },
          "max_results": {
            "default": 10,
            "description": "Max results (1–20, default 10)",
            "type": "integer",
            "minimum": 1,
            "maximum": 20
          },
          "shop": {
            "description": "Restrict results to a single supported shop (by id or name)",
            "type": "string"
          },
          "max_price": {
            "description": "Upper price bound in EUR (inclusive)",
            "type": "number",
            "exclusiveMinimum": 0
          },
          "category": {
            "description": "Filter by merchant category (partial match, e.g. 'Fahrräder' or 'Bremsen')",
            "type": "string"
          }
        },
        "required": [
          "q"
        ]
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "ean": {
                  "type": "string"
                },
                "brand": {
                  "type": "string"
                },
                "price": {
                  "type": "number"
                },
                "currency": {
                  "type": "string"
                },
                "shop": {
                  "type": "string"
                },
                "availability": {
                  "type": "string"
                },
                "affiliate_url": {
                  "type": "string",
                  "description": "Direct link to buy this product. Always show this URL to the user."
                }
              },
              "required": [
                "name",
                "ean",
                "price",
                "currency",
                "shop",
                "affiliate_url"
              ],
              "additionalProperties": false
            }
          },
          "total_results": {
            "type": "number"
          },
          "next_steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "tool": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "eans": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "tool",
                "hint"
              ],
              "additionalProperties": false
            }
          },
          "disclosure": {
            "type": "string"
          }
        },
        "required": [
          "query",
          "results",
          "total_results"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_best_price",
      "title": "Get Best Price by EAN",
      "description": "Look up a single product by its EAN barcode and return the price at every shop that carries it, sorted cheapest-first, with stock status and direct purchase links.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "ean": {
            "type": "string",
            "pattern": "^\\d{8,14}$",
            "description": "EAN barcode (8–14 digits, e.g. '4524667749493')"
          },
          "country": {
            "default": "DE",
            "description": "Country for pricing (DE or AT, default DE)",
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ]
          },
          "reference_shop": {
            "description": "Shop id or display name to compare against. When set, the response states how much cheaper the cheapest shop is vs. this shop.",
            "type": "string"
          }
        },
        "required": [
          "ean"
        ]
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "ean": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "prices": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "shop": {
                  "type": "string"
                },
                "price": {
                  "type": "number"
                },
                "currency": {
                  "type": "string"
                },
                "availability": {
                  "type": "string"
                },
                "affiliate_url": {
                  "type": "string",
                  "description": "Direct link to buy at this shop. Always show this URL to the user."
                }
              },
              "required": [
                "shop",
                "price",
                "currency",
                "affiliate_url"
              ],
              "additionalProperties": false
            }
          },
          "cheapest_shop": {
            "type": "string"
          },
          "cheapest_price": {
            "type": "number"
          },
          "next_step": {
            "type": "object",
            "properties": {
              "tool": {
                "type": "string"
              },
              "hint": {
                "type": "string"
              },
              "eans": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "tool",
              "hint"
            ],
            "additionalProperties": false
          },
          "reference_comparison": {
            "type": "object",
            "properties": {
              "reference_shop": {
                "type": "string"
              },
              "reference_price": {
                "type": "number"
              },
              "saving": {
                "type": "number"
              },
              "saving_percent": {
                "type": "number"
              }
            },
            "required": [
              "reference_shop",
              "reference_price",
              "saving"
            ],
            "additionalProperties": false
          },
          "disclosure": {
            "type": "string"
          }
        },
        "required": [
          "ean",
          "product_name",
          "prices",
          "cheapest_shop",
          "cheapest_price"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "optimize_cart",
      "title": "Optimize Shopping Cart",
      "description": "Find the cheapest way to buy multiple products together: computes the optimal split across shops — which items to order from which shop — accounting for each shop's shipping costs and free-shipping thresholds, and returns the lowest achievable total including shipping. Takes an array of EAN barcodes. For accurate results, call get_best_price for each EAN first, then call optimize_cart.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "eans": {
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^\\d{8,14}$"
            },
            "description": "Array of EAN barcodes (8–14 digit numbers as strings, e.g. '4524667749493'). NOT URLs."
          },
          "country": {
            "default": "DE",
            "description": "Country for pricing and shipping (DE or AT, default DE)",
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ]
          }
        },
        "required": [
          "eans"
        ]
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "optimization": {
            "type": "object",
            "properties": {
              "total_cost": {
                "type": "number"
              },
              "total_shipping": {
                "type": "number"
              },
              "grand_total": {
                "type": "number"
              },
              "currency": {
                "type": "string"
              },
              "shops_used": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "shop": {
                      "type": "string"
                    },
                    "subtotal": {
                      "type": "number"
                    },
                    "shipping": {
                      "type": "number"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "ean": {
                            "type": "string"
                          },
                          "price": {
                            "type": "number"
                          },
                          "affiliate_url": {
                            "type": "string",
                            "description": "Direct link to buy this item. Always show this URL to the user."
                          }
                        },
                        "required": [
                          "name",
                          "price",
                          "affiliate_url"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "shop",
                    "subtotal",
                    "shipping",
                    "items"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "total_cost",
              "total_shipping",
              "grand_total",
              "currency",
              "shops_used"
            ],
            "additionalProperties": false
          },
          "savings_info": {
            "type": "string"
          },
          "stale_cache_warning": {
            "type": "object",
            "properties": {
              "eans_to_refresh": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "suggestion": {
                "type": "string"
              }
            },
            "required": [
              "eans_to_refresh",
              "suggestion"
            ],
            "additionalProperties": false
          },
          "disclosure": {
            "type": "string"
          }
        },
        "required": [
          "optimization"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_shop_info",
      "title": "Get Shop Overview",
      "description": "Return an overview of the supported shops, including their shipping cost tiers, free-shipping thresholds, and supported countries (DE and AT).",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "country": {
            "description": "Filter output to a specific country (optional — omit for both DE and AT)",
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ]
          }
        }
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "shops": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "country": {
                  "type": "string"
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "shipping_de": {
                  "type": "string"
                },
                "shipping_at": {
                  "type": "string"
                },
                "free_shipping_threshold_de": {
                  "type": "number"
                },
                "free_shipping_threshold_at": {
                  "type": "number"
                }
              },
              "required": [
                "name",
                "country"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "shops"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_shipping_breakdown",
      "title": "Get Shipping Cost",
      "description": "Return the exact shipping cost for a specific shop, country, and cart value, including all shipping tiers and how much more is needed to reach the next free-shipping threshold.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "shop": {
            "type": "string",
            "description": "Shop name or ID (e.g. 'rosebikes', 'boc24', 'bike24', 'fahrradteile', 'Rose Bikes')"
          },
          "country": {
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ],
            "description": "Country (DE or AT)"
          },
          "cart_value": {
            "type": "number",
            "minimum": 0,
            "description": "Total cart value in EUR (e.g. 49.99)"
          }
        },
        "required": [
          "shop",
          "country",
          "cart_value"
        ]
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "shop": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "cart_value": {
            "type": "number"
          },
          "shipping_cost": {
            "type": "number"
          },
          "free_shipping_threshold": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          }
        },
        "required": [
          "shop",
          "country",
          "cart_value",
          "shipping_cost",
          "currency"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "find_alternatives_for_product",
      "title": "Find Alternative Shops",
      "description": "Given a product's EAN barcode, return every shop that carries it with prices and availability, sorted cheapest-first.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "ean": {
            "type": "string",
            "pattern": "^\\d{8,14}$",
            "description": "EAN barcode (8–14 digits, e.g. '4524667749493')"
          },
          "country": {
            "default": "DE",
            "description": "Country for pricing (DE or AT, default DE)",
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ]
          }
        },
        "required": [
          "ean"
        ]
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "ean": {
            "type": "string"
          },
          "product_name": {
            "type": "string"
          },
          "alternatives": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "shop": {
                  "type": "string"
                },
                "price": {
                  "type": "number"
                },
                "currency": {
                  "type": "string"
                },
                "availability": {
                  "type": "string"
                },
                "affiliate_url": {
                  "type": "string",
                  "description": "Direct link to buy at this shop."
                }
              },
              "required": [
                "shop",
                "price",
                "currency",
                "affiliate_url"
              ],
              "additionalProperties": false
            }
          },
          "disclosure": {
            "type": "string"
          }
        },
        "required": [
          "ean",
          "product_name",
          "alternatives"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "resolve_product",
      "title": "Resolve Product URL",
      "description": "Turn a product page URL from a supported shop into structured product data — EAN barcode, price, stock status, and a purchase link — so the EAN can then be used with get_best_price or optimize_cart. Multi-variant product families return a labeled candidate list (size/colour, price, EAN per variant): ask the user to pick a variant, then use that exact variant's EAN with the other tools.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Product page URL from a supported shop (e.g. 'https://www.rosebikes.de/p/<product-name>-<id>')"
          },
          "country": {
            "default": "DE",
            "description": "Country for pricing (DE or AT, default DE)",
            "type": "string",
            "enum": [
              "DE",
              "AT"
            ]
          }
        },
        "required": [
          "url"
        ]
      },
      "outputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "product_name": {
            "type": "string"
          },
          "ean": {
            "type": "string"
          },
          "brand": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "shop": {
            "type": "string"
          },
          "affiliate_url": {
            "description": "Affiliate link for this product.",
            "type": "string"
          },
          "status": {
            "description": "'not_resolved' when the exact variant could not be determined; 'pick_variant' when labeled variant options are returned to choose from.",
            "type": "string"
          },
          "resolved": {
            "type": "boolean"
          },
          "family_url": {
            "description": "Branded /go/ link to the product family page so the user can pick the variant.",
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "axis": {
            "description": "Variant axis of the options: 'size', 'colour', 'mixed', 'size_name' or 'name'.",
            "type": "string"
          },
          "options": {
            "description": "Variants of ONE product. Ask the user to pick one, then use that variant's EAN.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "ean": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "EAN of this exact variant; null when the shop has no barcode for this size — then there is no price comparison, use product_url."
                },
                "size": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "colour": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "donor_label": {
                  "description": "Verbatim variant/product name; use as the choice label when present.",
                  "type": "string"
                },
                "product_name": {
                  "description": "Verbatim product name for a flat name-axis option; use as the choice label when present.",
                  "type": "string"
                },
                "price": {
                  "description": "Price at the input shop; null when only a family-level page price exists.",
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "in_stock": {
                  "description": "Stock at the input shop; null when unknown per variant.",
                  "anyOf": [
                    {
                      "type": "boolean"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "product_url": {
                  "description": "Direct /go/ link to this exact size at the input shop.",
                  "type": "string"
                }
              },
              "required": [
                "ean"
              ],
              "additionalProperties": false
            }
          },
          "min_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "disclosure": {
            "type": "string"
          }
        },
        "required": [
          "product_name",
          "shop"
        ],
        "additionalProperties": false
      }
    }
  ]
}
