mcpField
F
Fyndling

Fyndling

Remote
github.com/neongrauGames & Entertainment0Updated today
Repository

About Fyndling

Fyndling MCP serves medieval-market fans, reenactors, and living-history enthusiasts with data on European events, themed places, and historical recipes. Clients can search by location, date, and recipe tags.

Key features

  1. 01Search events by location, radius, and dates
  2. 02Find castles, meaderies, and other places
  3. 03Search historical medieval recipes
  4. 04Browse recipe sources and tag categories
  5. 05Filter results and paginate

Use cases

  1. 01Plan visits to nearby medieval events
  2. 02Locate castles or meaderies nearby
  3. 03Explore historical recipes by dish or diet

MCP support

The service exposes event, place, and recipe search tools through the Streamable HTTP MCP endpoint https://fyndling.de/mcp, with no authentication.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://fyndling.de/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

Tools

9
ParameterTypeRequiredDescription
latnumberYesLatitude of the center point
lonnumberYesLongitude of the center point
radius_kmnumberNoSearch radius in kilometers (default 50)
date_fromstringNoFilter: start date ISO 8601 (e.g. 2026-06-01)
date_tostringNoFilter: end date ISO 8601 (e.g. 2026-06-30)
typesarrayNoFilter by event type. Omit for all types.
limitintegerNoMax results (default 20)

Details

From the project README

fyndling-mcp

smithery badge neongrau/fyndling-mcp MCP server

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 — 6,350+ recipes from forty-one cookbooks spanning c. 1300–1598, 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"
    }
  }
}

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.

  • category is the stored category (market, concert, burg_event, renfaire); categories[] adds flag-based memberships such as living_history. Filters (category, types) test categories[], so response and filter never disagree.
  • flags[] includes living_history, beerenweine, free_admission, sold_out and the derived party (dance and party nights such as "Bal Renaissance", classified as market).
  • geo_precision is derived, not verified: venue, address, plz or city. Coordinates shared by many venues (e.g. one point per city) count as city. 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.

ParameterTypeRequiredDescription
latnumber✓Latitude, -90 to 90
lonnumber✓Longitude, -180 to 180
radius_kmnumber—Search radius in km (default 50, max 500)
date_fromstring—YYYY-MM-DD, a real calendar date. Default: today (Europe/Berlin)
date_tostring—YYYY-MM-DD, not before date_from
typesarray—market, concert, burg_event, renfaire, living_history
limit / offsetinteger—Page size (default 20, max 100) / skip
include_cancelledboolean—Default false. Cancelled = DB flag or "abgesagt" in name/description
dedupeboolean—Default true: hide display duplicates (same category, normalised name, date and place); the kept entry lists duplicate_ids. IDs and scraper keys are untouched

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.

ParameterTypeRequiredDescription
categorystring—market, concert, burg_event, renfaire, living_history
countrystring—ISO 3166-1 alpha-2 code (e.g. DE, AT, FR, PL)
date_from / date_tostring—YYYY-MM-DD; date_from defaults to today (Europe/Berlin)
limit / offsetinteger—Page size (default 20, max 100) / skip
include_cancelled, dedupeboolean—As in find_events_near

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.

ParameterTypeRequiredDescription
idstring✓Event ID (16-char hex, e.g. a1b2c3d4e5f6a7b8)

find_pois_near

Find permanent medieval-themed locations, sorted by effective distance, then id.

ParameterTypeRequiredDescription
lat / lonnumber✓Coordinates (validated like above)
radius_kmnumber—Default 100, max 1000
poi_typestring—meadery (mead producer; metkellerei and metkellereien are accepted aliases), burg (castle), ma_gastronomie (medieval restaurant; the country is a separate field). Output poi_type is always canonical and equals the filter value
limit / offsetinteger—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 (41 active cookbooks, ordered by date):

KeyTitleYearLanguageRecipes
harpestrengKogebog (Harpestreng-Handschrift NKS 66)~1300Old Danish25
viandierLe Viandier de Taillevent~1300Old French55
buch-guter-speiseDas Buch von guter Speise~1350Middle High German101
corema_n2Nürnberg, Germanisches Nationalmuseum, Hs 3227a~1389Middle High German (East Central German)15
anonimo_toscanoAnonimo Toscano (Libro della cocina)~1390Tuscan Volgare40
form-of-curyThe Forme of Cury~1390Middle English192
menagierMénagier de Paris1393Old French378
bockenheimRegistrum Coquine (Johannes von Bockenheim)~1433Medieval Latin70
muenchner_cgm811Münchner Handschrift Cgm 811~1440Early New High German (Swabian–Bavarian)4
corema_ka2Haus- und Arzneibuch (Karlsruhe, Cod. Donaueschingen 793)~1445Early New High German (Bavarian, lower Inn valley)56
rheinfraenkisches_kochbuchRheinfränkisches Kochbuch~1445Rhine-Franconian (Middle High German)76
corema_ka1Reichenauer Kochbuch (Karlsruhe, Cod. Aug. pap. 125)15th c.Early New High German (Alemannic)104
hausbuch-donaueschingen-792Haus- und Arzneibuch im Codex Donaueschingen 792~1450Early New High German (Alemannic, Lake Constance region)2
corema_b4Berlin, Staatsbibliothek, Ms. germ. qu. 1187~1450Early New High German (Bavarian)269
corema_w1Vienna, Austrian National Library, Cod. 2897~1450Early New High German (Bavarian-Austrian)269
meister_eberhardKochbuch Meister Eberhards~1450Early New High German (Bavarian)23
tegernseeTegernseer Speisenbuch1453–1534Early New High German (Bavarian)51
meister_hansKochbuch des Meisters Hans (UB Basel, A.N.V. 12)~1460Early New High German (Alemannic–Swabian)289
muenchner_clm15632Klosterkochbuch Rott am Inn (Clm 15632)1458/1464Early New High German (Bavarian)55
martinoLibro de Arte Coquinaria~1465Early Italian268
koenigsberger_kochbuchKönigsberger Kochbuch (Deutschordensarchiv)15th c.Early New High German (Bavarian / East-Central)34
muenchner_cgm384Münchner Handschrift Cgm 384~1470Early New High German (Alemannic)83
corema_k1Kö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
edelike_spijseVon guten und edlen Speisen (Wel ende edelike spijse)~1475Middle Dutch62
muenchner_cgm467Hausbuch aus Dietramszell (Cgm 467)~1477Early New High German (Bavarian)3
mondseer_kochbuchMondseer Kochbuch (Graz, UB Ms. 1609)~1480Early New High German (Bavarian–Austrian)268
muenchner_cgm725Münchner Handschrift Cgm 725late 15th c.Early New High German (Bavarian)22
corema_so1Solothurner Küchenmeisterei (Zentralbibliothek Solothurn, Cod. S 490)~1487Early New High German (Alemannic)26
corema_n1Alemannisches Büchlein von guter Speise1492–1494Early New High German (Swabian)26
weinbuch-donaueschingenWeinbuch im Codex Donaueschingen~1500Early New High German (South Rhine-Franconian)28
muenchner_cgm349Münchner Handschrift Cgm 34916th c. (addendum)Early New High German (Bavarian)4
muenchner_cgm5919Regensburger Kochbuch (Cgm 5919)~1505Early New High German (Bavarian)104
severinKuchařství (Böhmisches Kochbuch)1535Early Czech147
corema_wo10Wolfenbüttel, Herzog-August-Bibliothek, Cod. Guelf. 42.3-5. Aug. 4°1543Early New High German116
philippine_welserDas Kochbuch der Philippine Welser1543Early New High German (East Swabian/Augsburg, Tyrolean-Bavarian additions)242
staindlEin künstlichs vnd nutzlichs Kochbuch (Balthasar Staindl)1545Early New High German (Swabian/Augsburg)294
sabina_welserinDas Kochbuch der Sabina Welserin1553Early New High German (East Swabian/Augsburg)206
stenglerinKochbuch der Maria Stenglerin1554Early New High German (Swabian/Augsburg)145
koch_kellermeistereiKoch und Kellermeisterei1574Early New High German110
rumpoltEin new Kochbuch (Marx Rumpolt)1581Early New High German (Frankfurt/Mainz)2028
weckerEin köstlich new Kochbuch (Anna Wecker)1598Early New High German (Upper German, Amberg/Upper Palatinate)50

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:

GroupTags
dish_typepasta, reis, brei, beilage, huelsenfruechte, brot
dietvegetarisch, vegan, fastenspeise
social_classhofkueche, buergerlich, bauernkueche
beveragemet, methiglyn, bochet, melomel, hippocras
occasionfesttag, schauspeise

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.

ParameterTypeRequiredDescription
coursestring—See course types below
difficulty_maxinteger 1–3—1=easy, 2=medium, 3=advanced
lagerkuecheboolean—Only recipes suitable for outdoor/camp cooking
source_keystring—Filter by cookbook key. Call list_recipe_sources for the full list (41 active sources).
dietarystring—vegetarian (no meat/fish, eggs/dairy allowed) or vegan (no animal products; almond milk and honey accepted by convention). Vegan recipes are also tagged vegetarian, so vegetarian includes the vegan ones. Equivalent to tags=["vegetarisch"] / tags=["vegan"].
tagsstring[]—Controlled-vocabulary tag filter (AND logic, max 6). Vocabulary: pasta, reis, brei, beilage, huelsenfruechte, brot (dish type); vegetarisch, vegan, fastenspeise (diet); hofkueche, buergerlich, bauernkueche (social class). Call list_recipe_tags for descriptions.
epoch_frominteger—Earliest source year (e.g. 1300)
epoch_tointeger—Latest source year (e.g. 1500)
ingredientsstring[]—Include filter: all listed must be present (AND). Case-, umlaut- and ß-folded (Apfel finds Äpfel); bracketed notes such as Öl (zum Braten der Äpfel) are ignored, and so are negations (fleischlose Brühe, ohne Fleisch, kein Fleisch do not match Fleisch in word/token mode); see ingredient_match.
ingredient_qidsstring[]—Exact filter by Wikidata QID, e.g. ["Q89"] = apple (AND). Independent of spelling, language and plural. Loses hits for ingredients without a QID (see qid_coverage).
ingredient_matchword | token | substring—word (default): term must start a word of the ingredient name (Apfel finds Äpfel, Apfelessig, not Granatäpfel). token: term must be a whole word (not Apfelessig). substring: anywhere (also Granatäpfel, Jakober-Äpfel). Plain plural stem on the term (Birnen = Birne).
querystring—Free-text search (min. 3 chars; special characters such as %, _, \ are plain punctuation, never wildcards, and a query without any letter or digit matches nothing; terms AND-ed, umlaut-folded). Terms ≤ 4 chars must start a word; longer terms match anywhere (Torte finds Quittentorte, not Törtchen).
query_inarray—Where query looks: title, text, ingredients, transcript. Default ["title","text","ingredients"]. Scoring per term and field, word start beats inside-a-compound: title 100/60, ingredients 30/15, text 10/5, transcript 3/1; ties by quality_score, then id.
sortrelevance | quality_score | id—Default relevance with query, else id. Relevance: (1) recipes with a title hit first, word-start before inside-a-compound; (2) among recipes without a title hit: ingredient hits before text hits; (3) quality_score descending; (4) id. Among title hits the order is therefore purely quality_score. Every order tie-breaks on id, so paging is stable.
exclude_coursesstring[]—Exclude these course types
exclude_ingredientsstring[]—Exclude recipes containing any of these ingredients (same matching as ingredients)
related_tostring—Recipe id: only recipes related to it (see get_related); combines with every other filter. Each hit then carries relation, reason, confidence, quelle; default order: strongest relation, then quality_score.
include_low_confidenceboolean—With related_to: also auto-derived relations with confidence: low (hidden by default; similar is hidden unless asked via relation)
relationstring[]—With related_to: restrict to twin, variant, alternative_role, parallel_other_language, similar, depends_on (OR).
dish_rolestring[]—Role a recipe plays, independent of course (OR): tortenboden, pastetenteig, teig_basis, fuellung, garnitur, sauce_basis, bruehe_basis, gelee_basis. Values and counts: list_recipe_tags → dish_roles.
limitinteger—Page size, default 20, max 100
offsetinteger—Skip this many matches; pass next_offset from the previous response
detailslim | standard—Default slim: id, source_key, source_ref, title_modern, course, lagerküche, difficulty, prep_time_min, tags (always an array, [] if none), fyndling_url. standard = full list entry (text, ingredients, annotations, FAQ).
fieldsstring[]—Whitelisted fields ADDED to the default (e.g. quality_score, tags, score, matched_ingredients, dish_role, relations = slim [{id, relation}]); missing values come back as null/[], unknown names are rejected.
fields_modeadd | only—add (default) extends the default; only returns just fields (+ id, fyndling_url).

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:

ValueDescription
starterStarters / appetisers
main_beefBeef mains
main_porkPork mains
main_poultryPoultry mains (chicken, goose, …)
main_gameGame mains (venison, hare, …)
main_fishFish mains
main_otherOther mains
main_vegetarianVegetarian mains
main_sideSide-dish mains
main_meatMeat mains whose animal is unspecified (mutton, lamb, offal, mixed) — and the alias for all meat mains, see below
mainAlias — every main course (beef, pork, poultry, game, meat, fish, vegetarian, side, other)
sideSide dishes
dessertDesserts / sweet dishes
drink / beverageBeverages (beverage is an alias for drink; cellar craft is not a drink)
condimentSauces, spice pastes
otherMiscellaneous

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.

ParameterTypeRequiredDescription
idstring✓Recipe ID (e.g. hkb-001, bgs-001, foc-015, men-042, m384-001, m5919-010)

Full response includes:

  • text_modern — modern German adaptation of the recipe
  • ingredients — structured list with amount, unit, name, original_text, original (medieval source text)
  • transcript — original medieval text with language and source
  • annotations — glossary of archaic terms
  • faq — common questions answered
  • interpretive_choices — editorial decisions on ambiguous passages
  • scan — link to manuscript scan image
  • fyndling_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).

ParameterTypeRequiredDescription
idstring✓Recipe id, e.g. wo10-042
relationstring[]—Only these types (OR). Default: all except similar (ask with relation: ["similar"])
include_low_confidenceboolean—Default false: auto-derived relations with confidence: low are hidden (mostly text-formula matches); curated relations always show
detailslim | standard—Default slim: no reason, no fyndling_url (page of any id: https://fyndling.de/rezepte/<id>/), ~70 tokens per entry. standard adds fyndling_url, source_ref and the full reason
limit / offsetinteger—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.

ParameterTypeRequiredDescription
coursesstring[]✓Ordered course list, 1–6 entries (use course type values from above)
personsinteger—Number of persons. Echo only — amounts are not scaled.
detailslim | standard—Default slim (id, title, course, source, difficulty, prep time, quality_score, URL; ~400 tokens for 3 courses). standard returns the full entries (~8k tokens per course).
max_difficultyinteger 1–3—Maximum difficulty for any course
lagerkuecheboolean—Only camp-cooking-suitable recipes
dietarystring—vegetarian or vegan — applied to every course (vegan recipes are also tagged vegetarian)
tagsstring[]—Controlled-vocabulary tags applied to every course (AND logic, max 6). Useful for thematic menus, e.g. ["hofkueche"] for a courtly banquet or ["bauernkueche"] for a peasant-class meal. See list_recipe_tags for the vocabulary.
epoch_frominteger—Earliest source year
epoch_tointeger—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.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.