{
	"name": "dk.grundfast/danish-address-property-data",
	"title": "Grundfast — Danish property & geodata",
	"description": "Danish address & property lookup: BBR, Matriklen, DAR, CVR. A DAWA/Datafordeler-compatible source.",
	"version": "1.0.0",
	"websiteUrl": "https://grundfast.dk/mcp-server",
	"documentationUrl": "https://grundfast.dk/docs/mcp",
	"icons": [
		{
			"src": "https://grundfast.dk/icon-512.png",
			"sizes": "512x512",
			"mimeType": "image/png"
		}
	],
	"remotes": [
		{
			"type": "streamable-http",
			"url": "https://api.grundfast.dk/mcp",
			"headers": [
				{
					"name": "Authorization",
					"description": "Grundfast API key as a bearer token. Create one free at https://grundfast.dk/dashboard — use a gf_test_ key to explore without being billed, or a gf_live_ key for metered production traffic.",
					"isRequired": true,
					"isSecret": true,
					"format": "string",
					"placeholder": "Bearer gf_live_..."
				}
			]
		}
	],
	"supportedProtocolVersions": [
		"2025-06-18"
	],
	"protocolVersion": "2025-06-18",
	"serverInfo": {
		"name": "grundfast",
		"title": "Grundfast",
		"version": "1.0.0"
	},
	"transport": {
		"type": "streamable-http",
		"endpoint": "https://api.grundfast.dk/mcp"
	},
	"capabilities": {
		"tools": {}
	},
	"authentication": {
		"required": true,
		"schemes": [
			"bearer"
		],
		"description": "A Grundfast API key as `Authorization: Bearer gf_live_…` (or `gf_test_…` for the never-billed sandbox). Create one free at https://grundfast.dk/dashboard."
	},
	"instructions": "Danish property and geodata. Resolve an address first (adresse_soeg, then adresse_opslag for its BFE property number), then call the per-property tools with that BFE, or the coordinate tools with WGS84 lon/lat. Every successful tools/call is metered as one API call.",
	"tools": [
		{
			"name": "bbr_ejendom",
			"description": "Full BBR property rollup (buildings, units, land) for a Danish BFE number. Each building also carries `fredning` — whether it is FREDET under bygningsfredningsloven and its SAVE bevaringsværdi 1-9 (1 is the highest) — joined from FBB (Slots- og Kulturstyrelsen). Neither is in BBR, and they are what decides whether a building may be demolished or altered at all, so this tool answers that too. `fredning: null` means we could not answer for the building (no FBB row, or the lookup did not complete); it is NOT `fredet: false`, and it must never be reported as \"not protected\".",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "bbr_historik",
			"description": "Bitemporal version history for a BBR property: each current building's registration timeline (newest-first), with the four registrering/virkning timestamps per version.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "matrikel_ejendom",
			"description": "Cadastre rollup (parcels, ejerlav name) from Matriklen for a BFE number.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "adresse_soeg",
			"description": "Autocomplete Danish addresses (DAR) by free-text query; ranked nearest matches.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"q": {
						"type": "string",
						"description": "Search text (min 2 chars)"
					},
					"per_side": {
						"type": "integer",
						"description": "Max results (1-20, default 8)",
						"minimum": 1,
						"maximum": 20
					}
				},
				"required": [
					"q"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "adresse_opslag",
			"description": "Resolve a DAR address UUID to the clean, structured address (with BFE bridge).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"uuid": {
						"type": "string",
						"description": "DAR id_lokalId (UUID)",
						"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
					}
				},
				"required": [
					"uuid"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "adresse_historik",
			"description": "Bitemporal version history for a DAR address UUID: the registration timeline (newest-first) of the addressed entity (unit-level Adresse or access-level Husnummer).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"uuid": {
						"type": "string",
						"description": "DAR id_lokalId (UUID)",
						"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
					}
				},
				"required": [
					"uuid"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "adresse_datavask",
			"description": "Clean a dirty Danish address string to ranked DAR candidates with an A/B/C confidence band.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"betegnelse": {
						"type": "string",
						"description": "Address string to clean (min 2 chars)"
					}
				},
				"required": [
					"betegnelse"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "adgangsadresse_reverse",
			"description": "Nearest Danish access addresses to a WGS84 coordinate (reverse geocoding).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					},
					"radius_m": {
						"type": "integer",
						"description": "Search radius in metres (1-1000, default 200)",
						"minimum": 1,
						"maximum": 1000
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "cvr_virksomhed",
			"description": "Resolve a Danish CVR number to the clean, re-joined company record (CVR register). Lookup is by the exact 8-digit CVR number ONLY — there is no name search, so never guess or construct a number. If you only have a company name, ask the user for the CVR number (it is printed on invoices and on virk.dk).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"cvr": {
						"type": "string",
						"description": "8-digit CVR number",
						"pattern": "^\\d{8}$"
					}
				},
				"required": [
					"cvr"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "dagi_reverse",
			"description": "Hvilke administrative områder en WGS84-koordinat ligger i: region, kommune, sogn, retskreds, politikreds og opstillingskreds (DAGI). Et tema der IKKE står i svaret er et tema opslaget ikke kunne afgøre — det betyder aldrig at punktet ligger uden for det. En TOM liste er derimod et svar: ingen dansk administrativ inddeling dækker punktet, hvilket er tilfældet til havs.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "dagi_omraade",
			"description": "Slå ét administrativt område op på tema + kode og få dets navn og geometri (DAGI): kommune 101 er København, region 1084 er Hovedstaden. Dette er den modsatte retning af dagi_reverse — brug det, når du HAR en kode (fra en BBR-rollup, en matrikel eller et datasæt) og mangler navnet, ikke når du har et punkt. Koden må gerne være uden nulforan (\"101\" og \"0101\" er samme kommune), og den må gerne komme som tal. Navnet svares ALTID offline fra det medfølgende register, mens geometrien er best-effort: er \"geometri\" null, betyder det at polygonen ikke kunne hentes, ALDRIG at området ikke har nogen. En ukendt kode er en 404 — det er et svar om registret, ikke om landet.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"tema": {
						"type": "string",
						"description": "Administrative theme: region | kommune | sogn | retskreds | politikreds | opstillingskreds"
					},
					"kode": {
						"type": "string",
						"description": "Area code within the theme, padded or not (e.g. 101 / 0101)"
					}
				},
				"required": [
					"tema",
					"kode"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "orto_luftfoto_aargange",
			"description": "Hvilke ortofoto-årgange der faktisk er FLØJET over en WGS84-koordinat — grundlaget for en \"ejendommen gennem tiden\"-visning. Danmark flyves i en regional rotation, så den udgivne serie er ikke et nationalt årligt mosaik: målt live har København fjorten årgange og Skagen tre. Feltet daekker har TRE tilstande: true og false er begge målinger, mens null betyder at opslaget ikke nåede at afgøre det. Vis aldrig null (eller et manglende år) som \"ikke fløjet her\" — i en gennem-tiden-visning læses et manglende foto som en manglende bygning. Selve billedet hentes som XYZ-tiles på /v1/orto/tile/{z}/{x}/{y}?aar=ÅÅÅÅ, som ikke kan leveres gennem MCP (det er JPEG, ikke JSON).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "dhm_hoejde",
			"description": "Terrain and surface elevation (DHM) at a WGS84 coordinate in Denmark.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "dhm_bygningshoejder",
			"description": "Målt højde på HVER bygning på en ejendom (BFE). Højden måles i DHM-cellerne INDE i bygningens GeoDanmark-fodaftryk — tag_m er 95-percentilen af overfladen (ikke maksimum, så et træ over taget ikke tæller), terraen_m er medianen af terrænet under fodaftrykket, og hoejde_m er forskellen. Alle koter er DVR90. En højde er enten målt eller null med en aarsag — den er ALDRIG 0 som stand-in for \"ukendt\", og den er aldrig gættet ud fra BBR-etager. Hver bygning bærer desuden sit TAG (tag.tagform: fladt/ensidig/saddeltag/valm), passet til de samme celler: kip_retning_grader er kippens retning i grader med uret fra nord i [0,180), fald_retning_grader er den dominerende tagflades NEDADrettede retning i [0,360) — den halvdel en kipretning ikke kan bære, og den eneste måde et ensidigt tag kan tegnes rigtigt på — haeldning_grader er den dominerende hældning og tagfod_m tagfodens højde over terraen_m. tagform er en MÅLING eller null med en aarsag — den gættes aldrig ud fra byggeår eller tagmateriale, og en null skal tegnes som en flad masse, ikke som et gæt.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "ejendomsvurdering",
			"description": "Vurderingsstyrelsens ejendomsvurderinger for en ejendom (BFE) — hele serien, nyeste først, med ejendomsværdi, grundværdi og vurderet areal. BELØB ER I HELE KRONER, ikke ører. LÆS \"antal_vurderingsejendomme\" FØR \"seneste\". Et BFE-nummer er ikke det samme som en vurderingsejendom: ét BFE kan bestå af flere, i hver sin kommune og vurderet under hinanden — målt på en rigtig ejendom var forskellen 59 gange for samme år. Er der mere end én, er \"seneste\" null på øverste niveau, og svaret ligger i \"vurderingsejendomme[].seneste\". Den null betyder \"der findes ikke ét ærligt tal\", ALDRIG \"ikke vurderet\"; en ejendom uden vurdering giver 404. Ét år kan optræde FLERE gange med forskellige beløb (samme ejendom, 2020: 880.000 kr og 796.000 kr under hver sin \"vurderingsmarkering\"). \"seneste\" er derfor højeste år, og ved uafgjort den række der sidst er ajourført — ikke bare max(år). Koderne (\"benyttelseskode\", \"aendringskode\", \"vurderingsmarkering\") gives RÅ. Der findes ingen offentliggjort værdiliste for dem, og en hjemmelavet oversættelse ville ikke kunne skelnes fra en verificeret — i tal der ender i vurderinger og klagesager er det ikke en risiko værd. Hvor Vurderingsstyrelsen selv leverer teksten, følger den med (\"juridisk_kategori\", \"juridisk_underkategori\").",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "jord_omraadeklassificering",
			"description": "Er en WGS84-koordinat omfattet af kommunens områdeklassificering (jordforureningslovens § 50 a), og ligger den i et analysefrit delområde? Kilden er vejledende — kommunens jordregulativ er det juridiske grundlag. Et \"omraadeklassificeret: false\" er et MÅLT svar og kommer aldrig af en upstream-fejl (den giver en fejl i stedet).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "jord_kortlaegning",
			"description": "Ligger en WGS84-koordinat på et areal, der er kortlagt som forurenet efter jordforureningsloven — på vidensniveau 1 (V1: viden om aktiviteter, der kan have forurenet) eller vidensniveau 2 (V2: dokumenteret forurening)? Kilden er regionernes DKjord-register. Svaret giver status (v1, v2, v1_og_v2 eller ingen), lokalitetsnummer, region, seneste inddateringsdato og regionens officielle jordforureningsattest pr. matrikel. Et \"kortlagt: false\" er et MÅLT svar og kommer aldrig af en upstream-fejl (den giver en fejl i stedet). For en hel matrikel, brug jord_kortlaegning_matrikel.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "jord_kortlaegning_matrikel",
			"description": "Er et jordstykke (ejerlavskode + matrikelnummer) kortlagt som forurenet på vidensniveau 1 eller 2? Svaret bygger på to uafhængige test, som begge rapporteres pr. flade: om regionen har registreret netop denne matrikel på fladen, og hvor stor en andel af jordstykkets omrids fladen dækker. Et jordstykke er ofte V1 på én del og V2 på en anden — så er status \"v1_og_v2\", og andelene står pr. flade. \"rumlig_kontrol: false\" betyder, at omridset ikke kunne hentes, og at svaret kun bygger på registrets lister; sådan et svar er altid et ja, aldrig et nej. \"attest_url\" er regionens officielle jordforureningsattest for jordstykket.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"ejerlavskode": {
						"type": "integer",
						"description": "Ejerlavskode, e.g. 2000176"
					},
					"matrikelnr": {
						"type": "string",
						"description": "Matrikelnummer, e.g. \"2333b\""
					}
				},
				"required": [
					"ejerlavskode",
					"matrikelnr"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "natur_skovbyggelinje",
			"description": "Ligger en WGS84-koordinat inden for en registreret skovbyggelinje (naturbeskyttelseslovens § 17, 300 m fra skov), eller er linjen ophævet netop dér? Registret KORTLÆGGER reglen — linjen følger af loven, og kommunen kan reducere eller ophæve den ved afgørelse. Et \"skovbyggelinje: false\" er et MÅLT svar og kommer aldrig af en upstream-fejl (den giver en fejl i stedet). Bemærk at laget indeholder både gældende og ophævede linjer: byggelinjens egen status (Skovs_kode) er noget andet end registreringens (Statuskode), og de er uenige om 1532 af 11293 polygoner — linjen afgør. Er registreringen kun \"Ukendt\", \"Forslag\" eller \"Kladde\", rapporteres linjen stadig (kommunen kortlægger linjen, den vedtager den ikke), og \"usikker\": true markerer et ja, som ingen vedtaget registrering står bag. Svaret indeholder aldrig en dom over et konkret projekt: § 17 stk. 2 undtager bl.a. mindre bygninger på højst 50 m² i byzone ved et eksisterende beboelseshus, og stk. 3 begrænser forbuddet til strækningen mellem bygningen og skoven.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "natur_byggelinjer",
			"description": "Hvilke af naturbeskyttelseslovens byggelinjer rammer en WGS84-koordinat? Ét opslag dækker ti registre: strandbeskyttelse (§ 15) og klitfredning (§ 8), sø- og åbeskyttelseslinje (§ 16), skovbyggelinje (§ 17), fortidsmindebeskyttelseslinje (§ 18), kirkebyggelinje (§ 19), § 3-beskyttet naturtype og § 3-beskyttet vandløb, samt beskyttede sten- og jorddiger (museumslovens § 29 a). SVARET ER ALDRIG EN DOM over et konkret projekt, og der findes hverken et kraever_dispensation- eller et forbudt-felt. Hver paragraf har sine egne undtagelser, og de ligner ikke hinanden; § 3-beskyttelsen er oven i købet DEKLARATORISK — et areal kan være beskyttet uden at stå i registret, og et registreret areal kan vise sig ikke at være beskyttet, fordi beskyttelsen følger naturen på stedet frem for kortet. Rapportér linjen og lad brugeren eller kommunen anvende undtagelsestesten. Særligt om strandbeskyttelseslinjen: forbuddet er ABSOLUT og administreres af Kystdirektoratet, ikke kommunen — der er ingen § 17 stk. 2-agtig liste over småbygninger, og dispensationer gives sjældent. \"inden_for\": false er MÅLT og kommer aldrig af en fejl: svigter en kilde, får netop den linje \"status\": \"utilgaengelig\" og \"inden_for\": null, mens de øvrige linjer svarer normalt — læs derfor altid status før inden_for. \"usikker\": true kvalificerer altid et JA (ingen vedtaget registrering står bag linjen), aldrig et nej. \"afstand_m\" er fortegnet: NEGATIV inde, POSITIV ude, meter til nærmeste kant inden for \"soegeradius_m\", og null hvis der intet er inden for radius. Bemærk fælden i sø- og åbeskyttelseslinjerne: linjens egen tilstand (Kategori_kode) er en anden kolonne end registreringens (Statuskode), og 145 polygoner er ophævede linjer med en registrering, der stadig står som \"Gældende / Vedtaget\".",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "plan",
			"description": "Planloven på et WGS84-punkt, fra Plandata.dk: zonen (byzone, landzone eller sommerhusområde), de lokalplaner og lokalplan-delområder der dækker punktet, og kommuneplanrammen — hver med plannummer, navn, status, datoer, anvendelse, bebyggelsesprocent (og hvad den beregnes af), max etager, max højde og planens PDF. STATUS ER REGISTRETS EGEN: \"vedtaget\", \"forslag\" eller \"aflyst\" — læs den, ikke plannavnet (en vedtaget plan kan hedde \"Forslag til lokalplan …\"). Et forslag binder ikke; aflyste planer står for sig i \"aflyste_lokalplaner\". LANDZONE ER AFLEDT: zonekortet rummer kun byzone og sommerhusområder, og efter planlovens § 34 er resten landzone — derfor \"zone.kilde\": \"afledt\". Ligger punktet uden for alle kommuner (på havet), er svaret en fejl, ikke landzone. \"har_lokalplan\": false og en landzone er MÅLTE svar; en upstream-fejl giver en fejl, aldrig en tom liste. Kommuneplanrammen binder kommunens planlægning, ikke grundejeren direkte — findes der en lokalplan, er det den der gælder for grunden. Planens tekst (dokument_url) er altid afgørende. Restbyggeret beregnes kun af plan_ejendom (det kræver grundareal og bygninger).",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "plan_ejendom",
			"description": "Samme svar som \"plan\", men for en ejendom (BFE): planerne slås op i et punkt INDE i ejendommens største jordstykke, og svaret får en VEJLEDENDE \"restbyggeret\" — bebyggelsesprocent/100 × grundareal (Matriklen) − eksisterende etageareal (BBR samlet bygningsareal), med alle input gentaget. Bebyggelsesprocenten tages fra den mest specifikke VEDTAGNE plan: delområde, så lokalplan, så kommuneplanramme. Tallet er null med en begrundelse i \"ikke_beregnet\", når det ikke kan beregnes ærligt: procenten gælder \"Området som helhed\", den er 0 (Plandata bruger 0 både for \"intet byggeri\" og \"ikke angivet\"), to vedtagne planer er uenige, den gælder \"Det enkelte jordstykke\" på en ejendom med flere jordstykker, eller BBR kunne ikke læses. Præsentér ALDRIG restbyggeretten som en byggeret: bygningsreglementet afgør hvad der tæller som etageareal (kældre, carporte, udhuse), og planteksten er afgørende. Et negativt tal betyder at ejendommen allerede er bebygget ud over procenten.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "miljoe_screening",
			"description": "Registerbaseret miljø-forhåndsscreening af en ejendom (BFE) før renovering eller nedrivning, for alle bygningstyper. For HVER bygning og hver bygningsdel (tag, facade, vinduer/fuger, gulve, indervægge, installationer, vådrum, fundament/kælder) gives et bånd — \"hoej\", \"mulig\", \"lav\" eller \"ikke_vurderet\" — for asbest, PCB, bly, PAH/tjære, klorerede paraffiner og tungmetaller. Båndene udledes af Miljøstyrelsens Bygningsatlas (Miljøprojekt nr. 2269, 2024) ud fra opførelsesår og om-/tilbygningsår (en ombygning TILFØJER perioder, men fjerner aldrig nogen), BBR's ydervægs- og tagmaterialer, BBR's asbestregistrering og energimærkets ruder og forbedringsforslag. Hver celle har begrundelse og regel-id'er. Svaret har også en grund-sektion (V1/V2-kortlægning, områdeklassificering, olietanke), bindinger (fredning/SAVE, byggelinjer, zone, lokalplaner) og et vejledende affaldsestimat mod 1-tonsgrænsen i bekendtgørelse nr. 496/2024 § 2, nr. 7. Gengiv ALTID \"disclaimer\": det er en registerbaseret forhåndsscreening, ikke en lovpligtig miljø- og ressourcekortlægning. \"ikke_vurderet\" betyder at et input manglede (årsagen står i \"ikke_vurderet_aarsag\") og må ALDRIG gengives som lav eller fri for stoffer.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "miljoe_stoej",
			"description": "Trafik- og industristøj på et WGS84-punkt fra Miljøstyrelsens strategiske støjkortlægning (EU's støjdirektiv): det højeste Lden- og Lnight-interval (5 dB-klasser, fx \"60-64 dB\", øverst \"≥ 75 dB\"/\"≥ 70 dB\") pr. kilde — vej, jernbane, lufthavn og industri — samt hvert kortlagt lag punktet ligger i, med beregningshøjde (1,5 m eller 4 m) og delkilde (fx \"Større veje\", \"Veje i by\", \"Større jernbaner (Banedanmark)\"). KORTLÆGNINGSÅRET ER 2017 og står i \"kortlaegning.aar\": det er den runde Miljøstyrelsen udstiller som tjeneste; 2022-runden findes kun som download. Sig årstallet, når du bruger tallet. NULL ER IKKE \"STILLE\": kortlægningen dækker kun de største veje og baner, Københavns Lufthavn og byområderne København, Aarhus, Odense og Aalborg, og kun ned til 55 dB Lden / 50 dB Lnight. null betyder \"ikke kortlagt på eller over grænsen her\" — punktet kan være stille ELLER ligge uden for det kortlagte. En upstream-fejl giver altid en fejl, aldrig null. Kortlægningen er strategisk og beregnet, ikke en måling på adressen; brug den til at sammenligne og screene, ikke som dokumentation for en grænseværdi.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "stednavne_naer",
			"description": "Named places (Stednavne) near a WGS84 coordinate in Denmark.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"lon": {
						"type": "number",
						"description": "Longitude (WGS84 decimal degrees)"
					},
					"lat": {
						"type": "number",
						"description": "Latitude (WGS84 decimal degrees)"
					},
					"radius_m": {
						"type": "integer",
						"description": "Search radius in metres (1-5000, default 1000)",
						"minimum": 1,
						"maximum": 5000
					}
				},
				"required": [
					"lon",
					"lat"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "geodanmark_bygninger",
			"description": "Per-building GeoDanmark footprint polygons (WGS84) for a BFE number.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"bfe": {
						"type": "integer",
						"description": "BFE property number",
						"minimum": 1
					}
				},
				"required": [
					"bfe"
				],
				"additionalProperties": false
			}
		},
		{
			"name": "adresse_aendringer",
			"description": "Adgangsadresser oprettet, ændret eller nedlagt i den daglige DAR-opdatering, i én eller flere kommuner, postnumre eller for bestemte adgangsadresse-id’er (mindst ét af dem kræves; kommaseparerede lister er tilladt). Hver ændring har et stigende \"sekvens\"-nummer; send svarets \"naeste_efter\" som \"efter\" for at læse videre, og \"flere\": true betyder at der allerede venter flere. \"aendrede_felter\" siger præcis hvilke felter der ændrede sig, med \"foer\" og \"efter\". Ændringer gemmes i 35 dage.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"kommunekode": {
						"type": "string",
						"description": "4-digit kommunekode(r), comma-separated (e.g. \"0101,0147\")"
					},
					"postnr": {
						"type": "string",
						"description": "Postnummer(e), comma-separated"
					},
					"adgangsadresse_id": {
						"type": "string",
						"description": "DAR adgangsadresse id(s) (UUID), comma-separated"
					},
					"haendelse": {
						"type": "string",
						"description": "Only this kind: adresse.oprettet, adresse.aendret or adresse.nedlagt"
					},
					"efter": {
						"type": "integer",
						"description": "Return changes after this sekvens (default 0)",
						"minimum": 0
					},
					"antal": {
						"type": "integer",
						"description": "Max changes returned (1–100, default 100)",
						"minimum": 1,
						"maximum": 100
					}
				},
				"required": [],
				"additionalProperties": false
			}
		},
		{
			"name": "bbr_bygningssoegning",
			"description": "Find every standing building in one kommune or postnummer that matches BBR facts: use (anvendelse codes or groups like bolig, enfamiliehus, sommerhus), construction year, heating installation and fuel, roof and wall material, registered asbestos, floor areas and an oil tank in use on the plot. Returns `antal` (the exact number of matches) and one page of buildings with address, BFE, coordinates and translated codes. kommunekode or postnr is required. Plans without full building search get the count and the first page only.",
			"inputSchema": {
				"type": "object",
				"properties": {
					"kommunekode": {
						"type": "string",
						"description": "Kommunekode, e.g. \"0751\"",
						"pattern": "^\\d{3,4}$"
					},
					"postnr": {
						"type": "string",
						"description": "Postnummer, e.g. \"8000\"",
						"pattern": "^\\d{4}$"
					},
					"anvendelse": {
						"type": "string",
						"description": "Comma-separated byg021 codes and/or groups: bolig, enfamiliehus, raekkehus, etagebolig, landbrug, industri, energi, handel_kontor, institution, sommerhus, fritid, udhus_garage"
					},
					"opfoert_fra": {
						"type": "integer",
						"description": "Built in or after this year",
						"minimum": 1000
					},
					"opfoert_til": {
						"type": "integer",
						"description": "Built in or before this year",
						"maximum": 2100
					},
					"varme": {
						"type": "string",
						"description": "byg056 varmeinstallation codes, e.g. \"2,7\""
					},
					"opvarmning": {
						"type": "string",
						"description": "byg057 opvarmningsmiddel codes, e.g. \"3\" (oil)"
					},
					"tag": {
						"type": "string",
						"description": "byg033 tagdækning codes, e.g. \"3\" (fibercement)"
					},
					"ydervaeg": {
						"type": "string",
						"description": "byg032 ydervæg codes"
					},
					"asbest": {
						"type": "string",
						"description": "\"ja\" = asbestos registered, \"nej\" = registered free of it"
					},
					"areal_min": {
						"type": "integer",
						"description": "Min samlet bygningsareal (m²)",
						"minimum": 0
					},
					"areal_max": {
						"type": "integer",
						"description": "Max samlet bygningsareal (m²)",
						"minimum": 0
					},
					"olietank": {
						"type": "string",
						"description": "\"ja\" or \"nej\": an oil tank in use on the plot"
					},
					"side": {
						"type": "integer",
						"description": "Page number (default 1)",
						"minimum": 1
					},
					"per_side": {
						"type": "integer",
						"description": "Page size (default 100, max 1000)",
						"minimum": 1,
						"maximum": 1000
					}
				},
				"required": [],
				"additionalProperties": false
			}
		}
	]
}
