{"_comment":"Single source of truth for MigrationFit MCP tool definitions. Task 92 (packages/mcp-server/) generates and consumes this file as its server manifest. Do not edit tool list here without updating the corresponding server implementation in task 92. Contract: each entry must have name, description, params (array of {name,type,required,description}), and example ({call,result}).","schemaVersion":"mcp-tools-v1","tools":[{"name":"get_city","description":"Returns the full data envelope for a single city, including all published metrics, sources, and a citation object.","params":[{"name":"country","type":"string","required":true,"description":"ISO 3166-1 alpha-2 country code (e.g. \"de\")."},{"name":"slug","type":"string","required":true,"description":"City URL slug (e.g. \"berlin\")."}],"example":{"call":"get_city(country=\"de\", slug=\"berlin\")","result":"{ entity_id: \"de.berlin\", data_version: \"2026-06-11\", metrics: [...], citation: { text: \"Migration Fit (migrationfit.com), Berlin, observed 2026-06-11\", license: \"CC BY 4.0\" } }"}},{"name":"get_country","description":"Returns the country-level data envelope with migration metrics, legal routes, and a citation object.","params":[{"name":"cc","type":"string","required":true,"description":"ISO 3166-1 alpha-2 country code (e.g. \"de\")."}],"example":{"call":"get_country(cc=\"de\")","result":"{ entity_id: \"de.germany\", data_version: \"2026-06-11\", legal_routes: [...], metrics: [...], citation: { ... } }"}},{"name":"get_region","description":"Returns the data envelope for a sub-national region (federal state, NUTS-2 region, etc.) with available metrics and city links.","params":[{"name":"cc","type":"string","required":true,"description":"ISO 3166-1 alpha-2 country code."},{"name":"slug","type":"string","required":true,"description":"Region URL slug (e.g. \"bavaria\")."}],"example":{"call":"get_region(cc=\"de\", slug=\"bavaria\")","result":"{ entity_id: \"de.bavaria\", metrics: [...], cities: [\"munich\", \"nuremberg\"], citation: { ... } }"}},{"name":"compare_cities","description":"Returns side-by-side data for two cities with computed metric deltas. For curated pairs, returns the pre-built comparison; for non-curated pairs, returns both city envelopes plus deltas with curated: false.","params":[{"name":"a","type":"string","required":true,"description":"Entity ID of the first city (e.g. \"de.berlin\")."},{"name":"b","type":"string","required":true,"description":"Entity ID of the second city (e.g. \"nl.amsterdam\")."}],"example":{"call":"compare_cities(a=\"de.berlin\", b=\"nl.amsterdam\")","result":"{ curated: true, cityA: { ... }, cityB: { ... }, deltas: [{ metric_id: \"rent_avg\", delta: -3.2, direction: \"lower_in_b\" }], citation: { ... } }"}},{"name":"rank_cities","description":"Returns an ordered list of cities ranked by a single metric, optionally filtered by country and limited to a set count.","params":[{"name":"metric_id","type":"string","required":true,"description":"Metric identifier (e.g. \"rent_avg_nettokalt_eur_per_m2_month\")."},{"name":"country","type":"string","required":false,"description":"Restrict to a country by ISO 3166-1 alpha-2 code."},{"name":"limit","type":"integer","required":false,"description":"Maximum number of results (default 10, max 50)."},{"name":"direction","type":"string","required":false,"description":"Sort direction: \"asc\" (lowest first) or \"desc\" (highest first). Default \"asc\"."}],"example":{"call":"rank_cities(metric_id=\"rent_avg_nettokalt_eur_per_m2_month\", country=\"de\", limit=5, direction=\"asc\")","result":"{ metric_id: \"rent_avg_...\", ranked: [{ rank: 1, entity_id: \"de.chemnitz\", value: 6.2 }, ...], citation: { ... } }"}},{"name":"find_cities","description":"Returns cities matching a set of filter criteria (country, population range, metric thresholds). Served from the bulk dump index; cities with missing values for a required metric are excluded.","params":[{"name":"filters","type":"object","required":true,"description":"Filter object: { country, population_min, population_max, metric_thresholds: [{ metric_id, min, max }] }."}],"example":{"call":"find_cities(filters={ country: \"de\", metric_thresholds: [{ metric_id: \"rent_avg_nettokalt_eur_per_m2_month\", max: 10 }] })","result":"{ count: 42, cities: [{ entity_id: \"de.leipzig\", matched_metrics: [...] }, ...], citation: { ... } }"}},{"name":"get_metric","description":"Returns the metric definition — name, unit, domain, description, and all published values across entities for that metric.","params":[{"name":"metric_id","type":"string","required":true,"description":"Metric identifier (e.g. \"pm25_annual_mean_ug_m3\")."}],"example":{"call":"get_metric(metric_id=\"pm25_annual_mean_ug_m3\")","result":"{ metric_id: \"pm25_annual_mean_ug_m3\", domain: \"air_quality\", unit: \"µg/m³\", description: \"Annual mean PM2.5 concentration\", sample_values: [...] }"}},{"name":"get_source","description":"Returns the source definition — official name, URL, coverage, and which metrics it provides.","params":[{"name":"source_id","type":"string","required":true,"description":"Source identifier (e.g. \"destatis\")."}],"example":{"call":"get_source(source_id=\"destatis\")","result":"{ source_id: \"destatis\", name: \"Destatis — Federal Statistical Office of Germany\", url: \"https://www.destatis.de\", metrics_provided: [...] }"}},{"name":"explain_score","description":"Returns a breakdown of how a city scores against a relocation profile — each metric's contribution, weight, and data confidence. Requires the scoring sub-index data.","params":[{"name":"city","type":"string","required":true,"description":"City entity ID (e.g. \"de.berlin\")."},{"name":"profile","type":"string","required":true,"description":"Profile slug: one of \"remote_worker\", \"family\", \"student\", \"retiree\", \"founder\"."}],"example":{"call":"explain_score(city=\"de.berlin\", profile=\"remote_worker\")","result":"{ city: \"de.berlin\", profile: \"remote_worker\", score: 74, drivers: [{ metric_id: \"broadband_avg_mbps\", contribution: +8, grade: \"A\" }], citation: { ... } }"}}]}
