{"ok":true,"site":{"host":"movetogermany.lol","url":"https://movetogermany.lol/","type":"live","desc":"move to germany, lol — because the paperwork is enough drama. You and your AI agent build your everyday essentials together: supermarket, doctors, dentist & 80 more categories — real data, sorted by…","tools":[{"name":"list_categories","kind":"answer","impl":"imperative","description":"List all 80+ business categories of the underlying German directory network (slug, label, emoji) plus which ones are pre-selected as everyday essentials. Call this first to learn valid category slugs. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"get_profile","kind":"answer","impl":"imperative","description":"Read the shared arrival profile: household (solo/couple/family), pet, language needs (en_only/de_ok), mobility (walk/bike/car) and profession. Use it to personalize every decision — categories, job queries, outreach drafts. For null fields, FIRST fill in what you already know about your user from your own memory/context (confirm it briefly), and ask only about genuine gaps — then store via set_profile. Read-only.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"set_profile","kind":"act","impl":"imperative","description":"Update the shared arrival profile (partial update; only provided fields change). The user sees every change immediately, and relevant categories are auto-added (pet → vet & pet store, family → hospital & tutoring, car → gas station & repair shop, bike → bike repair). Prefer what you already KNOW about your user (your memory/context) — mention what you filled in so they can correct it — and interview only for real gaps. Never guess; the profile stays on this page, share only what is relevant here.","inputSchema":{"type":"object","properties":{"household":{"type":"string","enum":["solo","couple","family"],"description":"Who is moving"},"pet":{"type":"string","enum":["none","dog","cat"],"description":"Pet in the household"},"languages":{"type":"string","enum":["en_only","de_ok"],"description":"en_only = needs English communication"},"mobility":{"type":"string","enum":["walk","bike","car"],"description":"Main way of getting around"},"work":{"type":"string","description":"Profession/role, used to prefill job search (e.g. 'python developer')"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"set_home_plz","kind":"act","impl":"imperative","description":"Set the user's new home postal code (German PLZ) — the center of all searches. Call generate_starter_plan or find_nearby afterwards. Changes page state.","inputSchema":{"type":"object","properties":{"plz":{"type":"string","pattern":"^[0-9]{5}$","description":"Five-digit German postal code, e.g. 10115"}},"required":["plz"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"find_nearby","kind":"act","impl":"imperative","description":"Search the closest providers of ONE category around the configured PLZ and render them on the page for the user. Returns JSON with name, city, distance in km, phone, website, rating. category must be a slug from list_categories. Requires set_home_plz first.","inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"Category slug, e.g. supermarkt, zahnarzt (dentist), friseur (hairdresser)"},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Max results (default 5)"}},"required":["category"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"generate_starter_plan","kind":"act","impl":"imperative","description":"The one-step relocation helper: searches the configured PLZ across the essential categories in parallel (or a provided list of category slugs) and puts the CLOSEST provider per category into the shared plan. Existing plan entries are kept. Everything renders on the page immediately; the user can then remove, swap and annotate entries.","inputSchema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"string"},"description":"Optional list of category slugs; without it the default 12 everyday essentials are used"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"add_to_shortlist","kind":"act","impl":"imperative","description":"Add one concrete provider from the current search results (find_nearby / generate_starter_plan) to the shared plan. Reference it by category slug + exact name.","inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"Category slug of the provider"},"name":{"type":"string","description":"Exact name as returned in the search results"}},"required":["category","name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"remove_from_shortlist","kind":"act","impl":"imperative","description":"Remove one entry from the shared plan (id from get_shortlist). Only when the user wants it — never silently delete entries the human saved themselves.","inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Entry id from get_shortlist"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"get_shortlist","kind":"answer","impl":"imperative","description":"Read the shared plan including the user's handwritten NOTES and who created each entry (human/agent). Call before modifying or summarizing the plan. Read-only.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"set_note","kind":"act","impl":"imperative","description":"Write or update a note on a plan entry (e.g. 'book an appointment', 'open till 6pm weekdays'). The user sees the note in the plan immediately.","inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Entry id from get_shortlist"},"note":{"type":"string","description":"Note text (replaces the previous note)"}},"required":["id","note"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"propose_appointment","kind":"act","impl":"imperative","description":"Propose 1-3 concrete appointment slots for one provider on the plan (e.g. after the user said when they are free). The proposal renders on the page; the HUMAN confirms a slot with one click — that opens a pre-written email to the provider and saves a tentative calendar (.ics) file. Nothing is ever sent automatically. Check get_shortlist afterwards for the confirmed slot.","inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Plan entry id from get_shortlist"},"slots":{"type":"array","minItems":1,"maxItems":3,"items":{"type":"string","description":"ISO 8601 date-time, e.g. 2026-09-02T14:00"},"description":"1-3 proposed slots in the user's local time"},"service":{"type":"string","description":"Optional service, e.g. \"men's haircut\", \"first checkup\""}},"required":["id","slots"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"draft_outreach","kind":"act","impl":"imperative","description":"Draft a ready-to-send first-contact message (email/phone text) to one provider on the plan — asking about availability and English communication, and including the user's note on that entry as a question. Returns the draft plus the provider's email/phone if known; refine it before the user sends it. Read-only, sends nothing itself.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Plan entry id from get_shortlist"},"language":{"type":"string","enum":["en","de"],"description":"Draft language (default en)"}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"find_bookable","kind":"answer","impl":"imperative","description":"Unified booking lookup: online-bookable service providers (hairdresser, massage, physio, vet, driving school …) around the configured PLZ, normalized across booking platforms with one deep link each — booking completes on the provider's platform. Renders results for the user. Optionally restrict to one category slug. Requires set_home_plz. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"Optional category slug (e.g. friseur, massage)"},"limit":{"type":"integer","minimum":1,"maximum":10,"description":"Max per category (default 5)"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"find_jobs","kind":"answer","impl":"imperative","description":"Search real job openings around the configured PLZ via the OFFICIAL German Federal Employment Agency (Bundesagentur fuer Arbeit) API. Returns title, employer, city, salary range when stated, home-office flag and an official application link per job, plus the total count. Use 'what' for a free-text role query (e.g. 'python developer', 'nurse'). Requires set_home_plz. Read-only.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"what":{"type":"string","description":"Free-text job/role query; empty returns all jobs nearby"},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Max results (default 5)"},"radius":{"type":"integer","minimum":5,"maximum":200,"description":"Search radius in km (default 25)"}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"get_paperwork_checklist","kind":"answer","impl":"imperative","description":"Return the German bureaucracy starter pack: the ordered official steps after moving (Anmeldung, tax ID, health insurance, bank account, Kindergeld child benefit, Buergergeld, broadcasting fee) with official government links only. Use when the user asks about paperwork, registration, benefits or 'what do I need to do after moving'. Read-only, static data.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"set_home_location_form","kind":"act","impl":"declarative","description":"Set the new home postal code (German PLZ) and load nearby everyday essentials.","inputSchema":{"type":"object","properties":{"plz":{"type":"string","description":"Your new postal code, e.g. 10115"}}},"__source":"spec","__declarative":true,"page":"/","pages":["/"]}],"favicon":"/favicons/movetogermany.lol.png","apiSurface":"spec","category":"Travel & Events","toolCount":16}}