mcpField
M
mcp-dutch-rental-listings

mcp-dutch-rental-listings

Local
github.com/mambalabsdevBusiness & Marketing0Updated 1d ago

About mcp-dutch-rental-listings

mcp-dutch-rental-listings is an MCP server for searching Dutch rental listings through an Apify actor. It combines listings from Kamernet, HousingAnywhere, and 11 anti-squat agency sites, with deduplication and registration details.

Key features

  1. 01Search three rental source groups
  2. 02Combine and deduplicate listings
  3. 03Filter by rent, size, and type
  4. 04Check registration status and evidence
  5. 05Track listings across searches

Use cases

  1. 01Find rooms in Utrecht under a rent limit
  2. 02Locate rentals that allow municipal registration
  3. 03Check newly seen anti-squat listings
  4. 04Filter rentals by availability date

MCP support

Exposes the search_dutch_rental_listings tool to MCP clients. It starts an Apify actor run and returns its dataset rows.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"com-mambabuilt-mcp-dutch-rental-listings": {
"command": "npx",
"args": [
"-y",
"@mambalabsdev/mcp-dutch-rental-listings"
],
"env": {
"APIFY_TOKEN": "<APIFY_TOKEN>"
}
}
}
}
Run commandnpx -y @mambalabsdev/mcp-dutch-rental-listings
Environment variables to set
APIFY_TOKENSecretApify API token from https://console.apify.com/account/integrations

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npm@mambalabsdev/mcp-dutch-rental-listings1.0.2

Tools

1

Saved tool list · updated 1d ago

ParameterTypeRequiredDescription
maxRentnumberNoDrop listings above this rent. A listing with no rent stays.
minSizenumberNoDrop listings smaller than this. A listing with no size stays.
sourcesarrayNokamernet, housinganywhere, antisquat_agencies (11 Dutch anti-squat agency sites). Default: all three.
llmModelstringNoA model name from your provider. Empty uses gpt-4o-mini, claude-haiku-4-5-20251001, gemini-2.5-flash, or llama-3.3-70b-versatile.
locationstringNoA Dutch city (Kamernet's 212 cities, such as Utrecht or Den Haag), a province as province:noord-holland, or netherlands for the whole country. A bare name that is both a city and a province (Utrecht, Groningen) is the city.
minRoomsnumberNoDrop listings with fewer rooms. Kamernet states rooms only on the detail page, so this works there with includeDetails on.
radiusKmnumberNoKamernet only: also search this far around the city. 0, 1, 2, 5, 10 (default), or 20; other values round up. HousingAnywhere and the agencies search the city itself.
furnishedarrayNoKeep only these: furnished, unfurnished, uncarpeted. A listing that does not say stays.
llmApiKeystringNoYour own key for the provider above. It goes only to that provider, is never stored or logged, and is never sent to the model.
maxDraftsnumberNoMost messages to draft in one run. Default 20.
tenantAgenumberNoKamernet's own filter: your age in years, 16 to 99.
maxResultsnumberNoListings to return as charged rows. Default 50.
availableBystringNoYYYY-MM-DD. Drop listings available only after this day. A listing with no date stays.
hasInternetenumNoKamernet's own filter, sent with the search.false | true
llmProviderenumNoopenai (default), anthropic, gemini, or groq. Used only with draftMessages.openai | anthropic | gemini | groq
petsAllowedenumNoKamernet's own filter.false | true
roommatesMaxenumNoKamernet's own filter: none, up_to_4, or up_to_8.none | up_to_4 | up_to_8
tenantGenderenumNoKamernet's own filter: male or female.male | female
trackChangesbooleanNotrue (default): keep first seen and last seen for this search in a named key-value store in your own Apify account, so later runs mark new and stale listings.
draftMessagesbooleanNotrue: write a first message to each landlord with your own model key and applicantProfile. Turns on includeDetails. Needs llmApiKey; without one the run fails with a plain error.
landlordTypesarrayNoKamernet's own filter: private, agent.
privateToiletenumNoKamernet's own filter.false | true
propertyTypesarrayNoKeep only these: room, studio, apartment, house, anti-squat, student-residence, other. Empty keeps all.
includeDetailsbooleanNotrue: read each returned listing's detail page for the full text, house rules, landlord type, deposit, and the text based registration and hide rules. Charged per page read. Default false.
max_charge_usdstringNoOptional. The run stops before a charge that would pass this amount. Free rows are always returned.
numberOfPeopleenumNoKamernet's own filter: 1 to 5 tenants.1 | 2 | 3 | 4 | 5
privateKitchenenumNoKamernet's own filter.false | true
smokingAllowedenumNoKamernet's own filter.false | true
privateBathroomenumNoKamernet's own filter.false | true
roommateGendersarrayNoKamernet's own filter: male, female, mixed.
applicantProfilestringNoFacts about you for the drafts, as JSON such as {"name": "Sam", "age": 29, "work": "software engineer", "move_in": "2026-12-01", "contact": "[email protected]"} or plain lines. The model restates only these facts.
excludeShortStaybooleanNotrue: a listing whose text or listed maximum stay is under 3 months becomes a free hidden_listing row.
registrationOnlybooleanNotrue: keep only listings whose text or listed field says municipal registration is possible (registration_status yes, listed_yes, or flag). Text needs includeDetails on.
excludeGenderOnlybooleanNotrue: a listing whose text limits it to one gender becomes a free hidden_listing row with the matched sentence. false: it is returned with the reason in hide_reasons.
blockedLandlordIdsarrayNoLandlord account IDs (landlord_id) whose listings are returned as free hidden_listing rows instead of charged rows.
excludeStudentOnlybooleanNotrue: a listing whose text limits it to students becomes a free hidden_listing row.
excludeLanguageOnlybooleanNotrue: a listing whose text limits it to Dutch or Polish speakers becomes a free hidden_listing row.
includeLandlordNameenumNotrue: add the landlord's display name. Off by default, because on Kamernet most landlords are private people.false | true

Details

From the project README

Netherlands Rental Listings MCP Server

Glama score MCP Registry npm version npm downloads license

An MCP server for the Mamba Labs Netherlands Rental Listings actor on Apify. One deduplicated list of Dutch rentals, with registration status.

What's Inside

What it does

Give a Dutch city, province, or the whole country. The actor reads Kamernet, HousingAnywhere, and 11 anti-squat agency sites over plain HTTP, merges them into one list without repeats, and returns rent, size, type, registration status with the proving sentence, hide reasons, and first seen and last seen per listing. It does not cover Pararius, Huurwoningen, Funda, or Gapph.

All of the work runs on Apify. This package is a thin client that starts the actor run, waits for it, and hands back the dataset rows.

Quick start

You need Node.js 18 or newer and an Apify account with an API token.

Add this to your Claude Desktop config (claude_desktop_config.json), Cursor, or any MCP client:

{
  "mcpServers": {
    "mamba-dutch-rental-listings": {
      "command": "npx",
      "args": [
        "-y",
        "@mambalabsdev/mcp-dutch-rental-listings"
      ],
      "env": {
        "APIFY_TOKEN": "your-apify-token"
      }
    }
  }
}

Restart the client. The search_dutch_rental_listings tool appears.

Prerequisites

Example prompts

  • "Find rooms in Utrecht under 800 euros a month."
  • "List new anti-squat places in Noord-Holland since my last search."
  • "Show Amsterdam studios where municipal registration is possible."

Tool

search_dutch_rental_listings. One tool. Example arguments:

{
  "location": "Utrecht",
  "sources": [
    "kamernet",
    "housinganywhere"
  ],
  "maxResults": 20
}

Inputs

Every buyer facing input of the actor. Omitted inputs take the actor's own defaults.

InputTypeRequiredDescription
locationstringnoA Dutch city (Kamernet's 212 cities, such as Utrecht or Den Haag), a province as province:noord-holland, or netherlands for the whole country. A bare name that is both a city and a province (Utrecht, Groningen) is the city.
radiusKmnumbernoKamernet only: also search this far around the city. 0, 1, 2, 5, 10 (default), or 20; other values round up. HousingAnywhere and the agencies search the city itself.
sourcesarraynokamernet, housinganywhere, antisquat_agencies (11 Dutch anti-squat agency sites). Default: all three.
propertyTypesarraynoKeep only these: room, studio, apartment, house, anti-squat, student-residence, other. Empty keeps all.
maxResultsnumbernoListings to return as charged rows. Default 50.
maxRentnumbernoDrop listings above this rent. A listing with no rent stays.
minSizenumbernoDrop listings smaller than this. A listing with no size stays.
minRoomsnumbernoDrop listings with fewer rooms. Kamernet states rooms only on the detail page, so this works there with includeDetails on.
furnishedarraynoKeep only these: furnished, unfurnished, uncarpeted. A listing that does not say stays.
registrationOnlybooleannotrue: keep only listings whose text or listed field says municipal registration is possible (registration_status yes, listed_yes, or flag). Text needs includeDetails on.
availableBystringnoYYYY-MM-DD. Drop listings available only after this day. A listing with no date stays.
hasInternetstringnoKamernet's own filter, sent with the search.
privateBathroomstringnoKamernet's own filter.
privateKitchenstringnoKamernet's own filter.
privateToiletstringnoKamernet's own filter.
petsAllowedstringnoKamernet's own filter.
smokingAllowedstringnoKamernet's own filter.
numberOfPeoplestringnoKamernet's own filter: 1 to 5 tenants.
tenantGenderstringnoKamernet's own filter: male or female.
tenantAgenumbernoKamernet's own filter: your age in years, 16 to 99.
roommatesMaxstringnoKamernet's own filter: none, up_to_4, or up_to_8.
roommateGendersarraynoKamernet's own filter: male, female, mixed.
landlordTypesarraynoKamernet's own filter: private, agent.
includeDetailsbooleannotrue: read each returned listing's detail page for the full text, house rules, landlord type, deposit, and the text based registration and hide rules. Charged per page read. Default false.
includeLandlordNamestringnotrue: add the landlord's display name. Off by default, because on Kamernet most landlords are private people.
blockedLandlordIdsarraynoLandlord account IDs (landlord_id) whose listings are returned as free hidden_listing rows instead of charged rows.
excludeGenderOnlybooleannotrue: a listing whose text limits it to one gender becomes a free hidden_listing row with the matched sentence. false: it is returned with the reason in hide_reasons.
excludeLanguageOnlybooleannotrue: a listing whose text limits it to Dutch or Polish speakers becomes a free hidden_listing row.
excludeStudentOnlybooleannotrue: a listing whose text limits it to students becomes a free hidden_listing row.
excludeShortStaybooleannotrue: a listing whose text or listed maximum stay is under 3 months becomes a free hidden_listing row.
trackChangesbooleannotrue (default): keep first seen and last seen for this search in a named key-value store in your own Apify account, so later runs mark new and stale listings.
draftMessagesbooleannotrue: write a first message to each landlord with your own model key and applicantProfile. Turns on includeDetails. Needs llmApiKey; without one the run fails with a plain error.
llmProviderstringnoopenai (default), anthropic, gemini, or groq. Used only with draftMessages.
llmApiKeystringnoYour own key for the provider above. It goes only to that provider, is never stored or logged, and is never sent to the model.
llmModelstringnoA model name from your provider. Empty uses gpt-4o-mini, claude-haiku-4-5-20251001, gemini-2.5-flash, or llama-3.3-70b-versatile.
applicantProfilestringnoFacts about you for the drafts, as JSON such as {"name": "Sam", "age": 29, "work": "software engineer", "move_in": "2026-12-01", "contact": "[email protected]"} or plain lines. The model restates only these facts.
maxDraftsnumbernoMost messages to draft in one run. Default 20.
max_charge_usdstringnoOptional. The run stops before a charge that would pass this amount. Free rows are always returned.

Pricing

Pay per event on Apify, billed to your Apify account. Prices in USD.

EventFree planBronzeSilverGold
listing-row, one listing$0.0011$0.001045$0.00099$0.000935
detail-page, one detail page read, with includeDetails on$0.002$0.0019$0.0018$0.0017
message-draft, one message drafted on your own key, with draftMessages on$0.003$0.00285$0.0027$0.00255
apify-actor-start, per run start$0.012$0.012$0.012$0.012

Hidden listings, source status rows, failed drafts, and refused input are free. Mamba Labs pays the platform costs of the run. Mamba Labs pays the platform costs of the run, Apify proxy traffic included.

Full actor documentation

apify.com/mambalabs/dutch-rental-listings

License

MIT. See LICENSE.

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.