Hemnet Mcp

io.github.chrischallPublished by GitHub account chrischallv1.2.0Updated Nov 7, 2026

Hemnet.se real estate for Claude: search, sold prices, listings & market stats

Overview

AI-generated overview

Searches hemnet.se, Sweden's largest real-estate portal, letting an assistant find for-sale and sold listings, pull details and photos, compute market stats…

What you can do
  • Resolve place names to Hemnet location ids and street addresses to live listings
  • Search active for-sale listings by location, price band, rooms, area, property type and keywords
  • Fetch full listing detail and gallery photo URLs, and compare up to 20 listings side by side
  • Search sold listings (slutpriser) with final price, asking price and over/under-asking percentage, and aggregate median/average market stats
  • Calculate Swedish monthly mortgage cost locally, including amortisation and after-tax totals
  • Run a healthcheck on the Hemnet GraphQL endpoint and the browser bridge
When to use it
Useful when researching the Swedish housing market: valuing a home from sold-price comps, screening listings in an area, comparing candidates, or estimating monthly ownership costs. It is specific to hemnet.se, so it is only relevant for Swedish property.
Requirements
Runs locally via npx hemnet-mcp (Node.js). No login or API key is needed for anonymous read queries. If Hemnet serves a Cloudflare challenge, the default HEMNET_TRANSPORT=auto switches to a browser bridge that needs the ContextMint Bridge extension in Chrome, with FETCHPROXY_IDENTITY_DIR, FETCHPROXY_WS_HOST and HEMNET_WS_PORT for its local identity and concentrator.
Before you install
Read-only lookups, but the browser-bridge fallback sends the same queries from a signed-in hemnet.se tab in your own browser and stores a long-term identity keypair under FETCHPROXY_IDENTITY_DIR. The extension is loaded unpacked from a release zip, so verify it against the published checksum. The project is AI-built and maintained, and use must stay within hemnet.se's terms of service. The mortgage calculator is a local estimate, not financial advice.

Installation

In SourceWeft

  1. Open Hemnet Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Hemnet MCP

[CI] [npm] [license]

An MCP server for hemnet.se, Sweden's largest real-estate portal. Search for-sale listings, look up sold prices (slutpriser), pull full listing detail and photos, compute market statistics, resolve addresses, and run a Swedish mortgage calculation — all from Claude.

⚠️ This project is built and maintained by AI (Claude). It reads hemnet.se through its public GraphQL API. Use at your own discretion and within hemnet.se's terms of service.

Highlights

  • No configuration. Hemnet serves its read queries anonymously — no login, no API key. npx hemnet-mcp just works (a browser extension is only needed if Hemnet serves a Cloudflare challenge — see below).
  • Sold prices (slutpriser). Hemnet's signature dataset: achieved final price, asking price, and over/under-asking percentage — the comps an agent needs to value a home.
  • Swedish-native. Money in SEK, areas in m², rooms, bostadsrätt fees (avgift), energy class, and a mortgage model that follows Swedish rules (amorteringskrav, ränteavdrag).
  • Embeddable. Ships as a standalone MCP server and as a library so it can be composed into a larger multi-portal server.

Install

Claude Code / Claude Desktop (npx)

json
{  "mcpServers": {    "hemnet": {      "command": "npx",      "args": ["-y", "hemnet-mcp"]    }  }}

If Hemnet serves a Cloudflare challenge

Hemnet sometimes fronts its GraphQL API with a Cloudflare bot challenge. When that happens the server switches (under the default HEMNET_TRANSPORT=auto) to a browser bridge that sends the same anonymous queries from a www.hemnet.se tab in your own browser — no Hemnet login needed. That needs the ContextMint Bridge extension, installed from its releases: in Chrome, unzip the chrome zip and load it unpacked, then approve the pairing prompt the first time. Safari isn't available yet (it will ship inside the ContextMint app, which has no public download), so use Chrome for now.

ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (https://github.com/chrischall/fetchproxy#extension) points to it. Its source is public at https://github.com/nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the .sha256 file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).

From source

bash
git clone https://github.com/chrischall/hemnet-mcpcd hemnet-mcpnpm installnpm run buildnode dist/index.js

Tools

ToolWhat it does
hemnet_autocomplete_locationResolve a place name ("Vasastan") to Hemnet location ids — the starting point for search.
hemnet_search_listingsSearch active for-sale listings by location + filters (price SEK, rooms, m², property type, keywords).
hemnet_get_listingFull detail for one listing (price, fee, running costs, m², rooms, tenure, energy class, broker, description, photos).
hemnet_get_listing_photosJust the gallery photo URLs.
hemnet_search_soldSearch sold listings with final price, asking price, and over/under-asking %.
hemnet_get_sold_listingFull detail for one sold listing.
hemnet_get_market_statsMedian/average final price and price-per-m² for a location, over the most recent max_sales sales (default 200).
hemnet_compare_listingsFetch several listings at once for side-by-side comparison.
hemnet_get_by_addressResolve a free-text street address to a live listing.
hemnet_calculate_mortgageLocal Swedish monthly-cost calculator (interest + amortisation + fee, gross & after-tax). No network.
hemnet_healthcheckVerify the Hemnet GraphQL endpoint is reachable. Reports which transport served the probe (transport: direct fetch or the browser bridge, plus the configured HEMNET_TRANSPORT), the bridge's role/port/extension-link state (bridge, once a bridge exists), a classified error.kind (e.g. cloudflare_challenge, session_not_ready) and a next-step hint.

Example flow

1. hemnet_autocomplete_location { query: "Vasastan" }   → location_id 9259702. hemnet_search_listings { location_ids: ["925970"], rooms_min: 2, price_max: 6000000 }   → listing summaries3. hemnet_get_market_stats { location_ids: ["925970"], housing_form_groups: ["APARTMENTS"] }   → median final price, price-per-m²4. hemnet_calculate_mortgage { price: 4695000, interest_rate: 3.9, monthly_fee: 2800 }   → monthly cost, gross and after-tax

Or pass a free-text location to any search tool and it resolves the top hit for you.

Money & units

All output records use numbers: price / final_price / fee_monthly in SEK, living_area_sqm / land_area_sqm in m², rooms as a number. A derived price_per_sqm is always included when price and living area allow it (even when Hemnet omits it, common on houses). The original Hemnet-formatted strings are kept alongside as *_formatted.

Library use

hemnet-mcp is also importable, so it can serve as a Hemnet portal source inside a larger project (e.g. a cross-portal realty orchestrator):

ts
import { createHemnetClient, computeMarketStats } from 'hemnet-mcp';
const hemnet = createHemnetClient();const { cards } = await hemnet.searchSales({ locationIds: ['925970'] }, { limit: 50 });const stats = computeMarketStats(cards.map(formatSaleCard));

The library entry (import … from 'hemnet-mcp') re-exports the client, the normalised record types, the pure derivations (computeMarketStats, calculateSwedishMortgage, money/url helpers), and every tool registrar (registerHemnetTools(server, client) to graft the tools onto your own MCP server).

Development

bash
npm test               # vitest (mocked transport, no network)npm run test:coverage  # 100% coverage enforced on src/**npm run typechecknpm run build

Tests drive every tool and the client through an in-memory fake transport — no live hemnet.se calls. See CLAUDE.md for architecture, the GraphQL quirks, and contribution conventions.

License

MIT

Source: README.md at commit 1c70117

Tools

11

hemnet_autocomplete_location

Resolve a place name to Hemnet location ids

Look up Hemnet location ids for a free-text place name (municipality, district, or area). Returns ranked hits with `location_id`, `full_name`, and `parent_full_name`. Feed a `location_id` into hemnet_search_listings / hemnet_search_sold. Read-only.

Parameterslimitqueryrequired

hemnet_search_listings

Search Hemnet for-sale listings

Search active for-sale property listings on hemnet.se by location and optional filters (price band in SEK, rooms, living area in m², property-type groups, keywords). Returns listing summaries with price, fee, m², rooms, price-per-m², and coordinates. Provide `location_ids` (from hemnet_autocomplete_location) or a free-text `location`. Read-only.

Parameterssortlimitoffsetkeywordslocationprice_maxprice_minrooms_maxrooms_minlocation_idsliving_area_maxliving_area_min+1 more

hemnet_get_listing

Get a Hemnet for-sale listing by id or URL

Fetch the full detail of a single active for-sale listing by its Hemnet id or a /bostad/ URL. Returns price, monthly fee, yearly running costs, living/land area in m², rooms, tenure, construction year, energy class, broker, description, status labels, coordinates, and gallery photo URLs. For a SOLD listing use hemnet_get_sold_listing instead. Read-only.

Parametersidrequiredphoto_limit

hemnet_get_listing_photos

Get photo URLs for a Hemnet listing

Return the gallery photo URLs for an active for-sale Hemnet listing by id or /bostad/ URL. Read-only.

Parametersidrequiredlimit

hemnet_search_sold

Search Hemnet sold listings (slutpriser)

Search SOLD property listings ("slutpriser") on hemnet.se by location and optional filters. Each result carries the achieved final price, the asking price, and the over/under-asking percentage — the core comps signal for valuation. Provide `location_ids` (from hemnet_autocomplete_location) or a free-text `location`. Read-only.

Parameterssortlimitoffsetkeywordslocationprice_maxprice_minrooms_maxrooms_minlocation_idsliving_area_maxliving_area_min+1 more

hemnet_get_sold_listing

Get a Hemnet sold listing by id or URL

Fetch the full detail of a single SOLD listing by its Hemnet id or a /salda/ URL. Returns final price, asking price, price change, m², rooms, tenure, broker, and coordinates. Read-only.

Parametersidrequired

hemnet_compare_listings

Compare several Hemnet listings

Fetch and normalise multiple active for-sale Hemnet listings at once (by id or /bostad/ URL) for side-by-side comparison. Up to 20 targets; input order preserved; per-row errors captured. Read-only.

Parametersidsrequired

hemnet_get_by_address

Resolve a street address to a Hemnet listing

Resolve a free-text Swedish street address to a live Hemnet for-sale listing. Give the `address` (street + number) and a `location` (city/area/municipality). Returns the matched listing with a `matched: true`, the match `score`, and `matched_via`, or `{ resolved: false }` when nothing matches. Scans up to 500 listings in the location; a miss with `truncated: true` is not definitive — pass price_min/price_max or a smaller location to narrow it. Read-only.

Parametersaddressrequiredlocationrequiredprice_maxprice_min

hemnet_get_market_stats

Hemnet sold-price market statistics

Aggregate median/average statistics from recent SOLD listings for a location (and optional property-type/size filters): median & average final price, median & average price-per-m², and average over/under-asking percentage. The stats cover the most recent `max_sales` sales (default 200, max 500), not necessarily every match — compare `sampled_sales` with `total_matching_sales`. Provide `location_ids` or a free-text `location`. Read-only.

Parameterssortlimitoffsetkeywordslocationmax_salesprice_maxprice_minrooms_maxrooms_minlocation_idsliving_area_max+2 more

hemnet_calculate_mortgage

Calculate a Swedish monthly mortgage cost

Local-only Swedish mortgage calculator (all amounts SEK). Returns the monthly cost broken into interest, mandated amortisation (amorteringskrav from LTV, rules as of 1 April 2026), BRF fee (avgift), and operating cost — with both gross and after-tax (ränteavdrag) totals. Provide `down_payment` OR `down_payment_percent` (defaults to the legal 10% minimum). No network call.

Parameterspricerequiredmonthly_feedown_paymentinterest_raterequiredamortization_rategross_yearly_incomedown_payment_percentmonthly_operating_cost

hemnet_healthcheck

Verify the ContextMint Bridge connection end-to-end

Round-trips a small public www.hemnet.se URL (/graphql) through ContextMint Bridge (your signed-in browser tab) and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'this browser can't serve a capability' from 'real www.hemnet.se-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.

Takes no parameters.

Version history

19
  1. v1.2.0LatestNov 4, 2026
  2. v1.1.15Oct 29, 2026
  3. v1.1.14Oct 20, 2026
  4. v1.1.13Oct 17, 2026
  5. v1.1.12Oct 16, 2026
  6. v1.1.11Oct 10, 2026
  7. v1.1.10Oct 7, 2026
  8. v1.1.9Oct 5, 2026
  9. v1.1.8Oct 3, 2026
  10. v1.1.7Oct 1, 2026
  11. v1.1.6Sep 28, 2026
  12. v1.1.5Sep 25, 2026
  13. v1.1.4Sep 23, 2026
  14. v1.1.3Sep 23, 2026
  15. v1.1.2Sep 21, 2026
  16. v1.1.0Sep 20, 2026
  17. v1.0.0Sep 19, 2026
  18. v0.6.5Sep 17, 2026
  19. v0.6.4Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts