Skip to main content
Glama
OurFamilyWizard MCP

OurFamilyWizard MCP

by chrischall

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.

Related MCP server: OurFamilyWizard MCP

Install

Claude Code / Claude Desktop (npx)

{
  "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

git clone https://github.com/chrischall/hemnet-mcp
cd hemnet-mcp
npm install
npm run build
node dist/index.js

Tools

Tool

What it does

hemnet_autocomplete_location

Resolve a place name ("Vasastan") to Hemnet location ids — the starting point for search.

hemnet_search_listings

Search active for-sale listings by location + filters (price SEK, rooms, m², property type, keywords).

hemnet_get_listing

Full detail for one listing (price, fee, running costs, m², rooms, tenure, energy class, broker, description, photos).

hemnet_get_listing_photos

Just the gallery photo URLs.

hemnet_search_sold

Search sold listings with final price, asking price, and over/under-asking %.

hemnet_get_sold_listing

Full detail for one sold listing.

hemnet_get_market_stats

Median/average final price and price-per-m² for a location, over the most recent max_sales sales (default 200).

hemnet_compare_listings

Fetch several listings at once for side-by-side comparison.

hemnet_get_by_address

Resolve a free-text street address to a live listing.

hemnet_calculate_mortgage

Local Swedish monthly-cost calculator (interest + amortisation + fee, gross & after-tax). No network.

hemnet_healthcheck

Verify 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 925970
2. hemnet_search_listings { location_ids: ["925970"], rooms_min: 2, price_max: 6000000 }
   → listing summaries
3. 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):

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

npm test               # vitest (mocked transport, no network)
npm run test:coverage  # 100% coverage enforced on src/**
npm run typecheck
npm 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

Available Tools

11 tools
hemnet_autocomplete_locationResolve a place name to Hemnet location idsA
Read-onlyIdempotent

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.

Inputs: query (required), limit.

hemnet_calculate_mortgageCalculate a Swedish monthly mortgage costA
Read-onlyIdempotent

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.

Inputs: price (required), interest_rate (required), monthly_fee, down_payment, +4 more.

hemnet_compare_listingsCompare several Hemnet listingsA
Read-onlyIdempotent

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.

Inputs: ids (required).

hemnet_get_by_addressResolve a street address to a Hemnet listingA
Read-onlyIdempotent

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.

Inputs: address (required), location (required), price_max, price_min.

hemnet_get_listingGet a Hemnet for-sale listing by id or URLA
Read-onlyIdempotent

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.

Inputs: id (required), photo_limit.

hemnet_get_listing_photosGet photo URLs for a Hemnet listingA
Read-onlyIdempotent

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

Inputs: id (required), limit.

hemnet_get_market_statsHemnet sold-price market statisticsA
Read-onlyIdempotent

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.

Inputs: sort, limit, offset, keywords, +10 more.

hemnet_get_sold_listingGet a Hemnet sold listing by id or URLA
Read-onlyIdempotent

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.

Inputs: id (required).

hemnet_healthcheckVerify the ContextMint Bridge connection end-to-endA
Read-onlyIdempotent

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.

Inputs: no named parameters.

hemnet_search_listingsSearch Hemnet for-sale listingsA
Read-onlyIdempotent

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.

Inputs: sort, limit, offset, keywords, +9 more.

hemnet_search_soldSearch Hemnet sold listings (slutpriser)A
Read-onlyIdempotent

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.

Inputs: sort, limit, offset, keywords, +9 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 11 tools

    Disambiguation5/5

    Tools are cleanly separated by resource and action: get_listing vs get_sold_listing, search_listings vs search_sold, plus distinct utilities like compare, mortgage, healthcheck. No overlapping purposes.

    Naming Consistency5/5

    Consistent snake_case with hemnet_ prefix and verb_noun pattern throughout (get_*, search_*, autocomplete_*, calculate_*, healthcheck). Predictable and readable.

    Tool Count5/5

    11 tools is well-scoped for a real-estate data server covering search, detail, sold comps, comparison, address resolution, calculator, and diagnostics.

    Completeness4/5

    Complete read-only real-estate lifecycle: search/list/sold/stats/compare/mortgage/healthcheck. Minor gaps like saved searches, broker contact, or listing alerts, but core workflows are fully covered.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that enables Claude (or any MCP client) to read and write Clio Manage data—contacts, matters, activities—directly from chat, with flat-fee billing support in one call.
      -