Fyndling
fyndling-mcp
Built for medieval market fans, reenactors, and living-history enthusiasts — and the AI assistants that help them plan. Fyndling MCP gives AI clients direct access to two niche European datasets:
Medieval events — query 5,800+ markets, concerts, castle experiences, living-history events, and renaissance faires across 26+ countries in Europe and North America, by location + radius + date range (updated weekly)
Permanent POIs — 1,900+ meaderies, mead producers, castles, and medieval restaurants, also searchable by geo-radius
Historical recipes — 4,650+ recipes from forty cookbooks spanning c. 1300–1581, with modern German adaptations, structured ingredient lists, original manuscript transcripts, and a controlled tag vocabulary for dish-type, diet, and social-class filtering
→ fyndling.de — the web app behind this data
Endpoint: https://fyndling.de/mcp
Transport: Streamable HTTP (MCP spec 2025-03-26)
Auth: none
Rate limit: 60 requests / minute
Quickstart
Add to your MCP client config (e.g. Claude Desktop claude_desktop_config.json):
{
"mcpServers": {
"fyndling": {
"url": "https://fyndling.de/mcp"
}
}
}Related MCP server: LiveDataLink
Tools
Events & Locations
All list tools (find_events_near, list_events, find_pois_near, search_recipes) return the same envelope: total (all matches), count, offset, sort, has_more, next_offset, plus the array (events, pois, recipes). Page with offset. Orders always tie-break on id, so pages never skip or repeat. Errors (unknown id, invalid input) are real MCP errors (isError), never normal results.
Event schema (fixed; same fields for every source): id, name, date_from, date_to (null = single day), ort, plz, country, lat, lon, geo_precision, venue, category, categories[], flags[], cancelled, source_url, fyndling_url, description (excerpt in lists), extra{} (source-specific raw fields); optional band, organizers[], duplicate_ids[]. Searches around a point add distance_km and distance_approximate.
categoryis the stored category (market,concert,burg_event,renfaire);categories[]adds flag-based memberships such asliving_history. Filters (category,types) testcategories[], so response and filter never disagree.flags[]includesliving_history,beerenweine,free_admission,sold_outand the derivedparty(dance and party nights such as "Bal Renaissance", classified asmarket).geo_precisionis derived, not verified:venue,address,plzorcity. Coordinates shared by many venues (e.g. one point per city) count ascity. Imprecise events are shown and marked (distance_approximate) but sorted as if up to 5 km (plz) or 10 km (city) farther away, so they never crowd out precise results.Placeholder texts from scraping are returned as
null.
find_events_near
Find medieval events near a geographic coordinate, sorted by effective distance, then date, then id.
Parameter | Type | Required | Description |
| number | ✓ | Latitude, -90 to 90 |
| number | ✓ | Longitude, -180 to 180 |
| number | — | Search radius in km (default 50, max 500) |
| string | — |
|
| string | — |
|
| array | — |
|
| integer | — | Page size (default 20, max 100) / skip |
| boolean | — | Default |
| boolean | — | Default |
The date filter tests overlap: a multi-day event that started before date_from and still runs is found. Recurring markets are one entry showing the next date. The response echoes effective_date_from and effective_date_to. Invalid input (lat 95, "morgen", reversed range) is a validation error.
Example — markets within 80 km of Vienna this summer:
{
"lat": 48.2082, "lon": 16.3738,
"radius_km": 80,
"date_from": "2026-06-01", "date_to": "2026-08-31",
"types": ["market"]
}list_events
List events filtered by category, country, and/or date range, ordered by start date, then id.
Parameter | Type | Required | Description |
| string | — |
|
| string | — | ISO 3166-1 alpha-2 code (e.g. |
| string | — |
|
| integer | — | Page size (default 20, max 100) / skip |
| boolean | — | As in |
get_event
Full details for one event (also accepts POI ids): complete description, organizers, other_dates (same series nearby), nearby_events and nearby_pois (up to 5 each within 25 km, upcoming only). An unknown or deleted id is an MCP error.
Parameter | Type | Required | Description |
| string | ✓ | Event ID (16-char hex, e.g. |
find_pois_near
Find permanent medieval-themed locations, sorted by effective distance, then id.
Parameter | Type | Required | Description |
| number | ✓ | Coordinates (validated like above) |
| number | — | Default 100, max 1000 |
| string | — |
|
| integer | — | Page size (default 20, max 100) / skip |
POI schema: id, name, poi_type, ort, plz, country, state, address, lat, lon, geo_precision, website, website_ok (true/false = last link check, null = unknown), collected_at, distance_km, distance_approximate, fyndling_url, extra{} (e.g. zustand/slug for castles). No event fields.
Historical Recipes
list_recipe_sources
List all available cookbooks with metadata (year, language, region, recipe count) and the full course taxonomy (atomic values + aliases).
No parameters.
Sources (40 active cookbooks, ordered by date):
Key | Title | Year | Language | Recipes |
| Kogebog (Harpestreng-Handschrift NKS 66) | ~1300 | Old Danish | 25 |
| Le Viandier de Taillevent | ~1300 | Old French | 55 |
| Das Buch von guter Speise | ~1350 | Middle High German | 101 |
| Nürnberg, Germanisches Nationalmuseum, Hs 3227a | ~1389 | Middle High German (East Central German) | 15 |
| Anonimo Toscano (Libro della cocina) | ~1390 | Tuscan Volgare | 40 |
| The Forme of Cury | ~1390 | Middle English | 192 |
| Ménagier de Paris | 1393 | Old French | 378 |
| Registrum Coquine (Johannes von Bockenheim) | ~1433 | Medieval Latin | 70 |
| Münchner Handschrift Cgm 811 | ~1440 | Early New High German (Swabian–Bavarian) | 4 |
| Haus- und Arzneibuch (Karlsruhe, Cod. Donaueschingen 793) | ~1445 | Early New High German (Bavarian, lower Inn valley) | 56 |
| Rheinfränkisches Kochbuch | ~1445 | Rhine-Franconian (Middle High German) | 76 |
| Reichenauer Kochbuch (Karlsruhe, Cod. Aug. pap. 125) | 15th c. | Early New High German (Alemannic) | 104 |
| Haus- und Arzneibuch im Codex Donaueschingen 792 | ~1450 | Early New High German (Alemannic, Lake Constance region) | 2 |
| Berlin, Staatsbibliothek, Ms. germ. qu. 1187 | ~1450 | Early New High German (Bavarian) | 269 |
| Vienna, Austrian National Library, Cod. 2897 | ~1450 | Early New High German (Bavarian-Austrian) | 234 |
| Kochbuch Meister Eberhards | ~1450 | Early New High German (Bavarian) | 23 |
| Tegernseer Speisenbuch | 1453–1534 | Early New High German (Bavarian) | 51 |
| Kochbuch des Meisters Hans (UB Basel, A.N.V. 12) | ~1460 | Early New High German (Alemannic–Swabian) | 289 |
| Klosterkochbuch Rott am Inn (Clm 15632) | 1458/1464 | Early New High German (Bavarian) | 55 |
| Libro de Arte Coquinaria | ~1465 | Early Italian | 268 |
| Königsberger Kochbuch (Deutschordensarchiv) | 15th c. | Early New High German (Bavarian / East-Central) | 34 |
| Münchner Handschrift Cgm 384 | ~1470 | Early New High German (Alemannic) | 83 |
| Kölner Küchenmeisterei (Historisches Archiv der Stadt Köln, Best. 7004, 27) | 15th–16th c. (disputed) | Early New High German (Ripuarian/West-Central German) | 24 |
| Von guten und edlen Speisen (Wel ende edelike spijse) | ~1475 | Middle Dutch | 62 |
| Hausbuch aus Dietramszell (Cgm 467) | ~1477 | Early New High German (Bavarian) | 3 |
| Mondseer Kochbuch (Graz, UB Ms. 1609) | ~1480 | Early New High German (Bavarian–Austrian) | 268 |
| Münchner Handschrift Cgm 725 | late 15th c. | Early New High German (Bavarian) | 22 |
| Solothurner Küchenmeisterei (Zentralbibliothek Solothurn, Cod. S 490) | ~1487 | Early New High German (Alemannic) | 26 |
| Alemannisches Büchlein von guter Speise | 1492–1494 | Early New High German (Swabian) | 26 |
| Weinbuch im Codex Donaueschingen | ~1500 | Early New High German (South Rhine-Franconian) | 28 |
| Münchner Handschrift Cgm 349 | 16th c. (addendum) | Early New High German (Bavarian) | 4 |
| Regensburger Kochbuch (Cgm 5919) | ~1505 | Early New High German (Bavarian) | 104 |
| Kuchařství (Böhmisches Kochbuch) | 1535 | Early Czech | 147 |
| Wolfenbüttel, Herzog-August-Bibliothek, Cod. Guelf. 42.3-5. Aug. 4° | 1543 | Early New High German | 116 |
| Das Kochbuch der Philippine Welser | 1543 | Early New High German (East Swabian/Augsburg, Tyrolean-Bavarian additions) | 242 |
| Ein künstlichs vnd nutzlichs Kochbuch (Balthasar Staindl) | 1545 | Early New High German (Swabian/Augsburg) | 294 |
| Das Kochbuch der Sabina Welserin | 1553 | Early New High German (East Swabian/Augsburg) | 206 |
| Kochbuch der Maria Stenglerin | 1554 | Early New High German (Swabian/Augsburg) | 144 |
| Koch und Kellermeisterei | 1574 | Early New High German | 110 |
| Ein new Kochbuch (Marx Rumpolt) | 1581 | Early New High German (Frankfurt/Mainz) | 400 |
The Recipes column above is the number of recipes currently available from each source. list_recipe_sources returns two figures per source: recipe_count (imported and searchable now) and recipe_count_original (recipes in the manuscript or edition, null if unknown). Descriptions may quote the original figure, so the two legitimately differ for sources still being ingested. The corpus is reviewed and published source-by-source, so all counts grow over time.
list_recipe_tags
List the controlled tag vocabulary, grouped by category (dish_type, diet, social_class), with labels, descriptions and current recipe counts. Use these tag IDs as values for the tags parameter in search_recipes and compose_menu.
No parameters.
Tag groups:
Group | Tags |
|
|
|
|
|
|
|
|
|
|
The response also lists uncontrolled_tags: free-form editorial/internal tags that exist on recipes but are not valid tags filter values.
Tag IDs are German (kebab-style). Pass them verbatim to search_recipes(tags=[...]). Multiple tags combine with AND logic — tags=["hofkueche", "vegetarisch"] returns only vegetarian dishes that are also tagged as courtly cuisine. Social-class tags can co-occur on a single recipe when a source explicitly addresses multiple classes (classic Bockenheim pattern: "et erit bonum pro ciuibus Rusticis et nobilibus" → both bauernkueche and hofkueche).
Diet tags and optional ingredients: the BASE version of a recipe (without optional ingredients) decides the tag. If optional ingredients would break it (e.g. optional meat and eggs in a vegan recipe, optional lard in a vegetarian one), the recipe keeps its tag and carries dietary_note ("Basisfassung vegan (ohne optionale Zutaten); optional erweiterbar mit: Eier, Fleisch, Ziegenmilch"), shown automatically when dietary or a diet tag is filtered and available via fields. "Menge nach Belieben" is an amount, not an optional ingredient.
The dietary filter in search_recipes is a convenience alias: dietary="vegetarian" is equivalent to tags=["vegetarisch"], and dietary="vegan" to tags=["vegan"]. Note that vegan recipes also carry the vegetarisch tag, so dietary="vegetarian" returns both groups.
search_recipes
Search historical recipes with filtering and ingredient matching.
Parameter | Type | Required | Description |
| string | — | See course types below |
| integer 1–3 | — | 1=easy, 2=medium, 3=advanced |
| boolean | — | Only recipes suitable for outdoor/camp cooking |
| string | — | Filter by cookbook key. Call |
| string | — |
|
| string[] | — | Controlled-vocabulary tag filter (AND logic, max 6). Vocabulary: |
| integer | — | Earliest source year (e.g. |
| integer | — | Latest source year (e.g. |
| string[] | — | Include filter: all listed must be present (AND). Case-, umlaut- and ß-folded ( |
| string[] | — | Exact filter by Wikidata QID, e.g. |
|
| — |
|
| string | — | Free-text search (min. 3 chars; special characters such as |
| array | — | Where |
|
| — | Default |
| string[] | — | Exclude these course types |
| string[] | — | Exclude recipes containing any of these ingredients (same matching as |
| string | — | Recipe id: only recipes related to it (see |
| boolean | — | With |
| string[] | — | With |
| string[] | — | Role a recipe plays, independent of |
| integer | — | Page size, default 20, max 100 |
| integer | — | Skip this many matches; pass |
|
| — | Default |
| string[] | — | Whitelisted fields ADDED to the default (e.g. |
|
| — |
|
Response: total (all matches), count (this page), offset, sort, has_more, next_offset, recipes. With an ingredient filter each hit carries matched_ingredients; with ingredient_qids the response adds qid_coverage (only ~75% of ingredient lines have a QID — recipes without one are not found by that filter). Results are ordered by id (title hits first with query), so check has_more on broad searches.
Course types:
Value | Description |
| Starters / appetisers |
| Beef mains |
| Pork mains |
| Poultry mains (chicken, goose, …) |
| Game mains (venison, hare, …) |
| Fish mains |
| Other mains |
| Vegetarian mains |
| Side-dish mains |
| Meat mains whose animal is unspecified (mutton, lamb, offal, mixed) — and the alias for all meat mains, see below |
| Alias — every main course (beef, pork, poultry, game, meat, fish, vegetarian, side, other) |
| Side dishes |
| Desserts / sweet dishes |
| Beverages ( |
| Sauces, spice pastes |
| Miscellaneous |
main_meat is deliberately both a stored value and an alias: unspecified meat is meat, so course=main_meat returns every meat main (beef, pork, poultry, game and the unspecified ones) — never vegetarian or fish. beverage does not include cellar.
Example — desserts with cinnamon and ginger:
{
"course": "dessert",
"ingredients": ["Zimt", "Ingwer"],
"limit": 5
}Example — easy camp-cooking poultry dishes from before 1450:
{
"course": "main_poultry",
"difficulty_max": 1,
"lagerkueche": true,
"epoch_to": 1450
}Example — all recipes from the oldest source (13th-century Denmark):
{
"source_key": "harpestreng",
"limit": 25
}Example — Flemish court cuisine from the late 15th century:
{
"source_key": "edelike_spijse",
"course": "main_poultry",
"limit": 10
}Example — the Regensburg manuscript (Cgm 5919, ~1500):
{
"source_key": "muenchner_cgm5919",
"limit": 20
}Example — vegan desserts (lent-friendly sweets, no animal products):
{
"course": "dessert",
"dietary": "vegan",
"limit": 10
}Example — courtly bread-based dishes (banquet-grade Backwerk):
{
"tags": ["hofkueche", "brot"],
"limit": 10
}Example — peasant-class lent food (rural fast-day dishes):
{
"tags": ["bauernkueche", "fastenspeise"],
"limit": 20
}Recipe list fields (full details stripped for list performance; v2 also drops applied_delta_ids, quality_score_details, review_dates from list results — get_recipe still returns everything): id, source_key, title_modern, course, difficulty, serves, prep_time_min, ingredients, lagerküche, published_at, fyndling_url (canonical link to the recipe page on fyndling.de)
get_recipe
Get the full details of a single recipe.
Parameter | Type | Required | Description |
| string | ✓ | Recipe ID (e.g. |
Full response includes:
text_modern— modern German adaptation of the recipeingredients— structured list withamount,unit,name,original_text,original(medieval source text)transcript— original medieval text with language and sourceannotations— glossary of archaic termsfaq— common questions answeredinterpretive_choices— editorial decisions on ambiguous passagesscan— link to manuscript scan imagefyndling_url— canonical link to the recipe page on fyndling.de (e.g.https://fyndling.de/rezepte/mar-005/)
Ingredient units: g, kg, ml, l, TL (Teelöffel/teaspoon), EL (Esslöffel/tablespoon), tsp, tbsp, pinch, piece, slice, clove, bunch, sprig, leaf, cm. Use original_text for display; amount + unit are for scaling only.
Example ingredient object:
{
"original": "ein phunt mandels",
"amount": 500,
"unit": "g",
"name": "Mandeln",
"original_text": "500 g Mandeln"
}get_related
The recipes related to one recipe, with how they are related. The recommended way to explore twins, variants and alternatives; get_recipe keeps related_recipes (plain id list) for compatibility and adds related (id, title, relation).
Parameter | Type | Required | Description |
| string | ✓ | Recipe id, e.g. |
| string[] | — | Only these types (OR). Default: all except |
| boolean | — | Default |
|
| — | Default |
| integer | — | Page size (default 20, max 100) / skip |
Relation types: twin (same recipe, other transmission), variant (same technique, different quantities or ingredients), alternative_role (fulfils the same function with another approach, e.g. a different tart base), parallel_other_language (same recipe in another language), similar (automatic, untyped, from the curated related lists), depends_on (directed: "as written above"; entries carry direction: outgoing = this recipe depends on the listed one, incoming = the listed one depends on this recipe). All but depends_on are symmetric.
Entry (slim): id, title_modern, source_key, course, difficulty, prep_time_min, relation, confidence, quelle, direction (only depends_on); standard adds fyndling_url, source_ref and reason (one sentence, taken from the recipe notes where they describe the difference). Details on confidence (high/medium/low), quelle (curated = individually checked against the recipe texts, auto = derived in bulk from text references, concordances and related lists; neither is a final human verdict). Order: relation strength, then quality_score, then id. A recipe appears once per relation type; a pair carries two relations only if both are curated and say different things (e.g. wo10-044 is a variant of wo10-042 and depends_on it). total counts exactly the entries you can page through. Same envelope as search_recipes. An unknown id is an MCP error.
compose_menu
Compose a multi-course menu from historical recipes, one recipe per course. Per course the pick is: least ingredient overlap with the courses chosen so far, then a cookbook not yet used in the menu (menus mix sources when quality allows), then highest quality_score. Candidates are the 200 best-reviewed matches per course.
Parameter | Type | Required | Description |
| string[] | ✓ | Ordered course list, 1–6 entries (use course type values from above) |
| integer | — | Number of persons. Echo only — amounts are not scaled. |
|
| — | Default |
| integer 1–3 | — | Maximum difficulty for any course |
| boolean | — | Only camp-cooking-suitable recipes |
| string | — |
|
| string[] | — | Controlled-vocabulary tags applied to every course (AND logic, max 6). Useful for thematic menus, e.g. |
| integer | — | Earliest source year |
| integer | — | Latest source year |
Example — 4-course dinner for 8, 14th-century only:
{
"courses": ["starter", "main_fish", "main_poultry", "dessert"],
"persons": 8,
"epoch_from": 1300,
"epoch_to": 1400
}Example — vegetarian 3-course menu for 6:
{
"courses": ["starter", "main_vegetarian", "dessert"],
"persons": 6,
"dietary": "vegetarian"
}Example — courtly banquet (5-course Hofküche dinner for 12):
{
"courses": ["starter", "main_fish", "main_poultry", "main_game", "dessert"],
"persons": 12,
"tags": ["hofkueche"]
}Coverage
Events: Germany, Austria, Switzerland, France, Poland, Czech Republic, Italy, Spain, Portugal, UK, Ireland, Belgium, Netherlands, Luxembourg, Denmark, Sweden, Norway, Finland, Estonia, Lithuania, and more — plus renaissance faires in the United States, Canada, Mexico, and beyond.
Recipes: Forty cookbooks spanning Old Danish, Old French, Middle High German, Middle English, Tuscan Volgare, Medieval Latin, Middle Dutch, Early New High German (Bavarian, Alemannic–Swabian, Rhine-Franconian, Ripuarian), Early Italian, and Early Czech — from Copenhagen, Paris, London, Würzburg, Florence, the papal court at Rome, Ghent, Cologne, Solothurn, the Upper Rhine, northern Italy, Prague, Frankfurt-am-Main, and a dense cluster of South-German manuscripts: Munich (BSB Cgm 384, 467, 725, 811, 5919, Cgm 349, Clm 15632), Tegernsee, Rott am Inn, Dietramszell, Regensburg, the Reichenau/Lake Constance region (Karlsruhe, Cod. Aug. pap. 125), the lower Inn valley (Karlsruhe, Cod. Donaueschingen 793), and the Teutonic-Order Königsberg fragment. Covering the 13th to 16th century.
Notable sources: The Harpestreng manuscript (NKS 66, ~1300) is the earliest surviving cookbook from northern Europe. Le Viandier de Taillevent (~1300) is one of the most influential French court cookbooks of the Middle Ages. The Registrum Coquine of Johannes von Bockenheim (~1433, BnF Ms. Latin 7054) is a Latin compilation from the papal court of Martin V that explicitly labels recipes by social class — "pro magnatibus", "pro communibus", "pro rusticis". The Ghent manuscript (BHSL.HS.1035, ~1475) is the only fully preserved Middle Dutch recipe collection of its era. The Tegernseer Speisenbuch (BSB Cgm 8137, 1453–1534) documents Benedictine monastery cuisine from Bavaria and contains the oldest known written record of the name Rutschart (today's Ritschert). The South-German manuscript cluster (Munich/Regensburg/Tegernsee) makes Fyndling one of the largest structured digital corpora of 15th–16th-century German cookbook recipes.
License & Attribution
Event data is aggregated from public sources; accuracy is not guaranteed — always verify with the organiser.
Recipe texts and modern adaptations: © Fyndling, CC BY-SA 4.0. Original medieval texts are in the public domain.
This server cannot be deployed
Maintenance
Related MCP Connectors
AI marketplace — flights, tours, activities, transport & more via MCP. No auth required.
Live Google Maps business search, review, and photo data for AI agents over MCP.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceAgentic commerce infrastructure for AI agents. MCP-native product discovery, contextual ad matching, and purchase facilitation with European privacy compliance (nDSG/GDPR).MIT- AlicenseNot gradedqualityAmaintenance62 real-time data tools for AI agents via MCP. Finance, crypto, FMCSA, sanctions, courts, weather, vehicles, cybersecurity. One bearer token, one bill. Free tier available.MIT
- AlicenseAqualityCmaintenanceUK planning application data for AI agents. Search, look up, and geo-query every UK planning application from Claude, Cursor, or any MCP client — conversationally.462 npmMIT

GetAppNiche MCPofficial
AlicenseNot gradedqualityAmaintenanceEnables AI agents to query live App Store and Google Play data, including app search, revenue/download metrics, keyword difficulty, and reviews, via a hosted MCP server with API-key authentication.76 npmMIT