bolig-watch

Search Danish rental listings on boligportal.dk using natural language. Translates queries like "3-room apartment in Amager under 15k" into structured searches via the BoligWatch MCP server and returns results with links. Use when the user asks about apartments, rentals, or housing in Denmark.

BoligWatch Skill

Search boligportal.dk for rental listings using natural language.

When to activate

  • The user asks about apartments, rentals, or housing in Denmark
  • The user mentions boligportal, boligwatch, or Danish cities in a housing context
  • The user wants to check for new listings or track what they've already seen

Available MCP tools

ToolPurpose
search_listingsSearch with filters, returns all matches
get_new_listingsReturns only listings not previously seen
mark_seenMark listing IDs as reviewed
reset_seenClear all seen history
get_seen_statsCheck tracker state

How to translate natural language to search parameters

Map the user's intent to these filter parameters:

Location

User saysParameterExample value
"in Copenhagen" / "i K\u00f8benhavn"cities["k\u00f8benhavn"]
"in Frederiksberg"cities["frederiksberg"]
"K\u00f8benhavn and Frederiksberg"cities["k\u00f8benhavn", "frederiksberg"]
"in this area" + coordinatesmin_lat, min_lng, max_lat, max_lngbounding box

Size and price

User saysParameterExample value
"3 rooms" / "3-room"rooms_min + rooms_max3, 3
"at least 3 rooms" / "3+"rooms_min3
"2-4 rooms"rooms_min + rooms_max2, 4
"under 15k" / "max 15.000kr"max_rent15000
"at least 60m2" / "60 square meters"min_size_m260
"long-term" / "at least a year"min_rental_period12
"available by August" / "move in before Sept"max_available_from"2026-08-01"

Property type

User saysParameterExample value
"new-build" / "projekt" / "projektudlejning"newbuildtrue
"social housing" / "almen bolig"social_housingtrue

Lifestyle

User saysParameterExample value
"pet-friendly" / "allows pets" / "husdyr"pet_friendlytrue
"senior-friendly" / "seniorvenlig"senior_friendlytrue
"student housing" / "kun studerende"student_onlytrue
"shareable" / "delevenlig"shareabletrue

Facilities

User saysParameterExample value
"with balcony" / "altan" / "terrasse"balconytrue
"with parking" / "parkering"parkingtrue
"with elevator" / "has lift"elevatortrue
"EV charging" / "ladestander"electric_charging_stationtrue

Appliances

User saysParameterExample value
"furnished" / "m\u00f8bleret"furnishedtrue
"dishwasher" / "opvaskemaskine"dishwashertrue
"washing machine" / "vaskemaskine"washing_machinetrue
"dryer" / "t\u00f8rretumbler"dryertrue

City name mapping

The API uses lowercase Danish city names with original Danish characters:

  • K\u00f8benhavn \u2192 k\u00f8benhavn
  • Frederiksberg \u2192 frederiksberg
  • Aarhus / \u00c5rhus \u2192 aarhus
  • Odense \u2192 odense
  • Aalborg / \u00c5lborg \u2192 aalborg

Important: filter behavior

If no filters are passed, the full saved search from the config is used (the user's monitoring query). If ANY filter is passed, restrictive filters from the config are stripped — only structural settings (location, categories) carry over. This means "find the largest apartments" won't be silently capped by the config's rent limit, but "any new listings?" uses the saved search as expected.

Workflow

  1. Parse the user's request into search filters
  2. Decide: use get_new_listings if the user wants "new" or "unseen" listings, otherwise use search_listings
  3. Call the tool with the mapped parameters
  4. Format results as a readable summary with:
    • Monthly rent and deposit
    • Rooms, size, and location
    • Available from date
    • Notable features (pet-friendly, balcony, etc.)
    • Direct link to the listing on boligportal.dk
  5. If the user wants to track which listings they've reviewed, call mark_seen with the IDs

Response format

Present each listing clearly:

**Vesterbrogade 42, K\u00f8benhavn** \u2014 3 rooms, 78m\u00b2
12.500 kr/month (deposit: 37.500 kr) \u00b7 Available from 1 May 2026
Pet-friendly, balcony
\u2192 https://www.boligportal.dk/lejebolig/...

Group by area when showing multiple results. Mention the total count. If no results match, suggest relaxing filters.

Examples

User: "Find me a 2-3 room apartment in Copenhagen under 14.000kr"

\u2192 Call search_listings with:

{
  "cities": ["k\u00f8benhavn"],
  "rooms_min": 2,
  "rooms_max": 3,
  "max_rent": 14000
}

User: "Any new listings since last time?"

\u2192 Call get_new_listings with no filter overrides (uses server defaults)

User: "Show me furnished places with a washing machine, at least 70m2"

\u2192 Call search_listings with:

{
  "furnished": true,
  "washing_machine": true,
  "min_size_m2": 70
}

User: "Find social housing available before August"

\u2192 Call search_listings with:

{
  "social_housing": true,
  "max_available_from": "2026-08-01"
}

User: "New-build projects with EV charging and elevator"

\u2192 Call search_listings with:

{
  "newbuild": true,
  "electric_charging_station": true,
  "elevator": true
}

User: "What's the biggest apartment available right now?"

\u2192 Call search_listings with max_pages: 10, then sort results by size_m2 descending

User: "I've looked at listings 5619969 and 2987892, mark them"

\u2192 Call mark_seen with ids: [5619969, 2987892]