Skip to main content
Glama
chrischall

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: whoop-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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 10.
queryYesPlace name, e.g. "Vasastan" or "Malmö".

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so safety is covered. The description adds that results are ranked and enumerates returned fields, but it does not disclose ranking criteria, no-match behavior, or ambiguity handling; this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the action, and the return fields plus downstream usage are useful. The final 'Read-only.' is mildly redundant with readOnlyHint=true, so it is not completely waste-free.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter lookup tool with rich annotations, the description is complete: it states the input shape, names the returned fields, and explains how to consume the result. Since there is no output schema, explicitly listing location_id, full_name, and parent_full_name gives the agent enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters already have descriptions, so the baseline is 3. The description adds meaning by explaining that query is a free-text place name and enumerating acceptable location levels (municipality, district, or area), which is more precise than the schema's bare 'Place name' label.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object ('Look up Hemnet location ids') and scopes the input to free-text place names such as municipality, district, or area. It clearly differentiates this from sibling tools like hemnet_search_listings and hemnet_get_listing, which operate on listings rather than resolving location identifiers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the intended workflow by telling the agent to feed the returned location_id into hemnet_search_listings or hemnet_search_sold, giving clear context for when to use this tool. It does not explicitly name alternatives or list when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
priceYesPurchase price in SEK.
monthly_feeNoBRF monthly fee (avgift) in SEK — for bostadsrätt apartments.
down_paymentNoSEK
interest_rateYesAnnual interest rate %, e.g. 3.5
amortization_rateNoOverride the computed amortisation rate (annual % of loan).
gross_yearly_incomeNoDeprecated and ignored: income no longer affects amortisation (the debt-ratio rule was abolished 1 April 2026).
down_payment_percentNoPercent of price; defaults to the legal 10% minimum.
monthly_operating_costNoMonthly operating cost (driftkostnad) in SEK — typically houses.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses that the tool is local-only, makes no network call, applies Swedish amortisation rules as of 1 April 2026, handles after-tax deductions (ränteavdrag), and ignores the deprecated income parameter. This is rich behavioral context and contradicts nothing in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but compact: purpose, output breakdown, key parameter rule, and side-effect note all fit in three sentences. Each sentence contributes meaning and important facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having eight parameters and no output schema, the description explains the return composition, currency, and tax treatment, while the schema covers all parameter details. An agent has everything needed to decide when to call it and what response shape to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter. The description adds useful semantic value by stating the down_payment OR down_payment_percent choice and the legal 10% default, which is not obvious from the JSON schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Local-only Swedish mortgage calculator,' then lists exactly what the tool returns (interest, amortisation, BRF fee, operating cost, gross and after-tax totals). It is clearly distinct from sibling listing/search/photo tools, which all concern property lookup rather than calculation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It supplies clear context for invocation: Swedish property purchase in SEK, with the legal 10% down-payment default and the choice between down_payment and down_payment_percent. Because no sibling performs mortgage calculation, there is no need for an explicit alternative; 'No network call' and 'Local-only' further signal the intended use as a pure calculator.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesHemnet listing ids or /bostad/ URLs (max 20).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, openWorld, idempotent), the description adds meaningful behavioral constraints: up to 20 targets, input order is preserved, per-row errors are captured, and the operation is read-only. This gives the agent useful execution expectations without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences convey purpose, accepted input format, cardinality, ordering behavior, error handling, and read-only nature. Every clause earns its place and the most important info is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with rich annotations and a fully documented schema, the description covers the key operational details: what it does, what inputs it accepts, limits, order preservation, and error behavior. No critical gap prevents correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the ids parameter, so the baseline is 3. The description adds value beyond the schema by stating that input order is preserved and that each row can have its own captured error, which affects how the agent should interpret the array parameter and results.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('fetch and normalise') and a specific resource ('multiple active for-sale Hemnet listings'), and clarifies the purpose: side-by-side comparison. This clearly distinguishes it from single-listing siblings like hemnet_get_listing and sold-listing tools like hemnet_get_sold_listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended context explicit: use it when you need multiple active listings at once for comparison. It does not explicitly name sibling alternatives or state when not to use it, but the context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesStreet address incl. number, e.g. "Gäddstigen 1".
locationYesCity / area / municipality, e.g. "Södertälje" or "Vasastan".
price_maxNoSEK, narrows the search rung.
price_minNoSEK, narrows the search rung.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint/idempotentHint annotations, the description adds meaningful behavioral detail: it scans up to 500 listings, a miss with truncated: true is not definitive, and matches include a score and matched_via. 'Read-only' and 'live … listing' align with the annotations; there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences front-load the core purpose, then cover inputs, output shape, and the truncation caveat in logical order; every sentence earns its place. The only waste is the trailing 'Read-only,' which duplicates the readOnlyHint annotation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description rightly takes on the job of spelling out return values—matched: true, score, matched_via, or { resolved: false }—and explains the failure mode plus mitigations. Minor gaps remain: the fields inside a matched listing and how matched_via is populated, which an agent would need to chain to hemnet_get_listing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with worked examples ('Gäddstigen 1', 'Södertälje', 'Vasastan'), so the baseline is 3. The description adds modest value by linking price_min/price_max to 'narrowing the search rung' in the truncation caveat, but this is incremental to what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair—'Resolve a free-text Swedish street address to a live Hemnet for-sale listing'—and immediately distinguishes itself from siblings like hemnet_search_listings (broad search) and hemnet_get_listing (fetch by ID). It states what goes in (address + location) and what comes out, so an agent cannot mistake its job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is explicit: call this when you have a free-text street address and want the matching live for-sale listing. It also gives concrete conditional guidance—on a truncated miss, narrow with price_min/price_max or a smaller location—but it never names sibling alternatives or states when not to use it (e.g., sold listings via hemnet_search_sold), leaving some routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHemnet listing id, or a full hemnet.se /bostad/ URL.
photo_limitNoMax gallery photos to include. Default 50.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is clear. The description adds the active-only scoping and the sold-listing exclusion, but otherwise mostly enumerates return fields and repeats 'Read-only' rather than disclosing additional behavioral traits like rate limits, error cases, or URL/detail variations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words: purpose, return contents, and alternative routing. The long list of returned fields is dense but valuable given there is no output schema, and the most important scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, two-parameter single-listing tool, this is complete. The return field list compensates for the missing output schema, the id/URL input is documented in the schema, annotations cover safety behavior, and the sold-listing exception is explicitly handled. Nothing essential for invoking the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both id and photo_limit are clearly documented in the input schema, including the id-or-URL form and the default/maximum for photo_limit. The description adds no semantic detail beyond the schema, so it neither improves nor harms the parameter story.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Fetch') and resource ('full detail of a single active for-sale listing'), and identifies the input mechanism ('by its Hemnet id or a /bostad/ URL'). It also distinguishes itself from the sold-listing sibling directly, so an agent can select it correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to use hemnet_get_sold_listing for sold listings, and the 'active for-sale' phrasing makes the scope clear. However, it does not mention when to prefer hemnet_get_listing_photos or hemnet_get_by_address over this tool, leaving some sibling-routing implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHemnet listing id, or a full hemnet.se /bostad/ URL.
limitNoMax photos to return. Default 50.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and idempotentHint annotations already cover the safety profile, and the description reinforces it with 'Read-only' while adding an active-for-sale constraint. It does not, however, disclose failure behavior for invalid or inactive listing IDs, nor the shape of the returned URL collection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence states the action, resource, scope, and accepted input form with no filler. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only tool with a fully described schema and annotations, this is nearly complete: it names the return concept (photo URLs), restricts to active for-sale listings, and tells how to specify the listing. It only lacks an explicit note about response format/empty results and sibling routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters at 100% coverage, including that id can be an id or a full /bostad/ URL and that limit has a default of 50. The description adds no parameter meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it returns gallery photo URLs for active for-sale Hemnet listings, and it accepts either an id or a /bostad/ URL. This scope clearly separates it from sibling tools like hemnet_get_listing and hemnet_get_sold_listing, even though no sibling is named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the intended context: active for-sale listings requiring photo URLs, which implies it is not for sold/inactive listings. It does not explicitly name alternatives such as hemnet_get_listing for full details, so it stops just short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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. Provide location_ids or a free-text location. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoNEWEST (default) or OLDEST.
limitNoDefault 25, max 50.
offsetNoPagination offset.
keywordsNoFree-text keyword filter (e.g. "sjönära", "balkong").
locationNoFree-text place name (e.g. "Vasastan", "Göteborg") resolved to its top Hemnet location. Ignored when `location_ids` is set.
price_maxNoSEK
price_minNoSEK
rooms_maxNo
rooms_minNo
location_idsNoNumeric Hemnet location ids (from hemnet_autocomplete_location). Provide this OR `location`.
living_area_maxNom²
living_area_minNom²
housing_form_groupsNoProperty-type groups: HOUSES (villa), APARTMENTS (lägenhet/bostadsrätt), ROW_HOUSES (radhus/parhus), VACATION_HOMES (fritidshus), PLOTS (tomt), OTHERS.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered without contradiction. The description adds context about the data source ('recent SOLD listings') and the computed metrics, but it does not disclose additional runtime behavior such as pagination behavior, response shape, or what happens when a free-text location cannot be resolved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it opens with the core purpose and the exact statistics returned before moving to input guidance. It has no filler, though 'Read-only' mildly repeats the readOnlyHint annotation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter tool with no output schema, the description supplies the key call pattern (location_ids or location), the optional filter dimensions, and the return metric set. It does not detail output structure or edge cases like both location inputs being supplied, but the schema covers most of the remaining operational details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 85%, so the schema already documents nearly all parameters in detail. The description reinforces the key choice between location_ids and location and mentions property-type/size filters, but it adds no syntax or semantic information beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific operation ('Aggregate median/average statistics from recent SOLD listings') and names the resource/scope: a location with optional property-type/size filters. This clearly differentiates it from sibling tools like hemnet_search_sold and hemnet_get_sold_listing, which return individual listing records rather than aggregate market statistics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the core input requirement ('Provide location_ids or a free-text location') and mentions optional filters, but it never explicitly tells an agent when to choose this tool over hemnet_search_sold or when not to. Usage is implied by the aggregate-statistics framing rather than stated as a rule with exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesHemnet sold-listing id, or a full hemnet.se /salda/ URL.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, open-world, and idempotent behavior. The description adds useful context by enumerating the returned data: final price, asking price, price change, m², rooms, tenure, broker, and coordinates. There is no contradiction and no hidden mutation or side-effect concern.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the operation and input form, and followed by a compact list of return fields. Every sentence earns its place with no filler or redundant explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only lookup with no output schema, the description is complete: it states the accepted input forms and the main returned data fields. An agent has enough information to select the tool, invoke it, and understand the expected result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema description already states that id is either a Hemnet sold-listing id or a full hemnet.se /salda/ URL. The tool description repeats the accepted input forms but adds no new format, validation detail, or examples beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch'), names the exact resource ('SOLD listing'), and specifies both accepted input forms (Hemnet id or /salda/ URL). The 'SOLD' qualifier clearly distinguishes this from sibling tools like hemnet_get_listing and hemnet_search_sold.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this is for retrieving full detail of a single sold listing when an id or URL is already known, rather than for searching or listing multiple results. It does not explicitly name alternatives or state when not to use it, so it stops short of full top-tier guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hemnet_healthcheckVerify the fetchproxy bridge end-to-endA
Read-onlyIdempotent

Round-trips a small public www.hemnet.se URL (/graphql) through the fetchproxy bridge 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 '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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, the description discloses that it makes a real round-trip, requires no auth, and reports hop-level failure categories (bridge never came up vs extension not connected vs remote-side problem). This is useful behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph, but each clause earns its place by naming a diagnostic field or the invocation condition. It front-loads the action and output before the usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter diagnostic tool with no output schema, the description fully specifies the returned diagnostics and the failure classes it can distinguish. Combined with the annotations and sibling list, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there is no parameter meaning for the description to add. Baseline 4 applies for a parameterless tool; no further documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete action (round-trips a public /graphql URL through the fetchproxy bridge) and the output (diagnostics about role, port, version, link, latency, and a plain-English fault hint). This distinguishes it sharply from the listing/search siblings, which are data-retrieval tools rather than infrastructure diagnostics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger: "Call this when a real tool fails and you want to know which hop broke." That tells an agent exactly when to invoke it and frames it as a diagnostic fallback, separate from normal Hemnet lookups.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoNEWEST (default) or OLDEST.
limitNoDefault 25, max 50.
offsetNoPagination offset.
keywordsNoFree-text keyword filter (e.g. "sjönära", "balkong").
locationNoFree-text place name (e.g. "Vasastan", "Göteborg") resolved to its top Hemnet location. Ignored when `location_ids` is set.
price_maxNoSEK
price_minNoSEK
rooms_maxNo
rooms_minNo
location_idsNoNumeric Hemnet location ids (from hemnet_autocomplete_location). Provide this OR `location`.
living_area_maxNom²
living_area_minNom²
housing_form_groupsNoProperty-type groups: HOUSES (villa), APARTMENTS (lägenhet/bostadsrätt), ROW_HOUSES (radhus/parhus), VACATION_HOMES (fritidshus), PLOTS (tomt), OTHERS.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description adds useful context beyond those: it only searches active listings, returns listing summaries with specific fields, and is read-only. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The purpose, key inputs, return content, and safety posture are all front-loaded and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter read-only search tool with strong schema coverage and no output schema, the description is sufficiently complete. It names the return fields and the required location mechanism; pagination and defaults are already covered by the schema. It does not describe error cases or result-count limits, but those are minor given the schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (85%), and the schema already documents most parameter units and meanings. The description summarizes filter categories (price, rooms, area, property-type groups, keywords) but does not add substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Search'), resource ('active for-sale property listings on hemnet.se'), and scope ('by location and optional filters'). The phrase 'active for-sale' clearly distinguishes it from hemnet_search_sold and hemnet_get_sold_listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives actionable guidance on the two mutually exclusive location inputs: use `location_ids` from hemnet_autocomplete_location or free-text `location`. It does not explicitly name a sibling alternative for sold listings, but 'active for-sale' makes that distinction clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoNEWEST (default) or OLDEST.
limitNoDefault 25, max 50.
offsetNoPagination offset.
keywordsNoFree-text keyword filter (e.g. "sjönära", "balkong").
locationNoFree-text place name (e.g. "Vasastan", "Göteborg") resolved to its top Hemnet location. Ignored when `location_ids` is set.
price_maxNoSEK
price_minNoSEK
rooms_maxNo
rooms_minNo
location_idsNoNumeric Hemnet location ids (from hemnet_autocomplete_location). Provide this OR `location`.
living_area_maxNom²
living_area_minNom²
housing_form_groupsNoProperty-type groups: HOUSES (villa), APARTMENTS (lägenhet/bostadsrätt), ROW_HOUSES (radhus/parhus), VACATION_HOMES (fritidshus), PLOTS (tomt), OTHERS.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds useful behavioral context beyond that: it confirms read-only behavior and reveals what each result carries (final price, asking price, over/under-asking percentage). It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: what the tool does, what the results mean, and how to specify the location. It is front-loaded and every sentence contributes essential information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with no output schema, the description covers what matters most: the returned comps signal, the location input pattern, and the read-only nature. The 13 optional parameters are adequately documented in the input schema, so the description does not need to enumerate them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 85% schema description coverage, the schema already documents most parameters. The description adds meaningful relational guidance: `location_ids` comes from hemnet_autocomplete_location and is an alternative to free-text `location`. It also adds the output semantics that make the parameters (price filters, location) relevant to valuation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Search') and a well-defined resource ('SOLD property listings (slutpriser) on hemnet.se'), immediately differentiating it from active-listing search and singular listing lookup. The mention of achieved price, asking price, and over/under percentage clarifies the specific comps-focused purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states how to specify the search scope: provide `location_ids` from hemnet_autocomplete_location or a free-text `location`. It does not explicitly say 'use hemnet_search_listings for active listings', but the SOLD designation and search semantics make the intended context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 1 tool updatev1.1.3
    • Changedhemnet_calculate_mortgage2 fields changed
      • changedInput schema / properties / down_payment_percent / description
        Previous value: -"Percent of price; defaults to the legal 15% minimum."New value: +"Percent of price; defaults to the legal 10% minimum."
      • changedInput schema / properties / gross_yearly_income / description
        Previous value: -"Gross household income/year in SEK — enables the +1% debt-ratio amortisation surcharge."New value: +"Deprecated and ignored: income no longer affects amortisation (the debt-ratio rule was abolished 1 April 2026)."
  2. 11 tool updatesv1.0.0
    • Changedhemnet_autocomplete_location1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_calculate_mortgage1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_compare_listings1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_get_by_address1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_get_listing1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_get_listing_photos1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_get_market_stats1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_get_sold_listing1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_search_listings1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedhemnet_search_sold1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. 33 tool updatesv0.2.0
    • Addedhemnet_autocomplete_location
    • Addedhemnet_calculate_mortgage
    • Addedhemnet_compare_listings
    • Addedhemnet_get_by_address
    • Addedhemnet_get_listing
    • Addedhemnet_get_listing_photos
    • Addedhemnet_get_market_stats
    • Addedhemnet_get_sold_listing
    • Addedhemnet_healthcheck
    • Addedhemnet_search_listings
    • Addedhemnet_search_sold
    • Removedofw_create_event
    • Removedofw_create_expense
    • Removedofw_create_journal_entry
    • Removedofw_delete_draft
    • Removedofw_delete_event
    • Removedofw_download_attachment
    • Removedofw_get_expense_totals
    • Removedofw_get_message
    • Removedofw_get_notifications
    • Removedofw_get_profile
    • Removedofw_get_unread_sent
    • Removedofw_list_drafts
    • Removedofw_list_events
    • Removedofw_list_expenses
    • Removedofw_list_journal_entries
    • Removedofw_list_message_folders
    • Removedofw_list_messages
    • Removedofw_save_draft
    • Removedofw_send_message
    • Removedofw_sync_messages
    • Removedofw_update_event
    • Removedofw_upload_attachment
  4. 22 tool updatesv2.4.4
    • First observedofw_create_event
    • First observedofw_create_expense
    • First observedofw_create_journal_entry
    • First observedofw_delete_draft
    • First observedofw_delete_event
    • First observedofw_download_attachment
    • First observedofw_get_expense_totals
    • First observedofw_get_message
    • First observedofw_get_notifications
    • First observedofw_get_profile
    • First observedofw_get_unread_sent
    • First observedofw_list_drafts
    • First observedofw_list_events
    • First observedofw_list_expenses
    • First observedofw_list_journal_entries
    • First observedofw_list_message_folders
    • First observedofw_list_messages
    • First observedofw_save_draft
    • First observedofw_send_message
    • First observedofw_sync_messages
    • First observedofw_update_event
    • First observedofw_upload_attachment

TDQS

A4.2/5.0

Scored across 11 tools

Disambiguation4/5

Most tools map cleanly to distinct actions: active vs sold, search vs detail, individual vs aggregate, and lookup vs calculation. The main overlap is `hemnet_get_listing_photos`, which duplicates the gallery photo URLs already returned by `hemnet_get_listing`, though the descriptions make the intended use fairly clear.

Naming Consistency4/5

All tools share the `hemnet_` prefix and snake_case with a generally verb-first pattern (`get_`, `search_`, `compare_`, `calculate_`). Minor deviations like `hemnet_healthcheck` and `hemnet_get_by_address` break the strict verb_noun pattern but do not hurt predictability.

Tool Count5/5

At 11 tools, the surface is well-scoped for a read-only property platform: location autocomplete, active/sold search, detail views, comparison, market stats, mortgage calculation, address resolution, and health diagnostics. The count is within the ideal range and each tool has a discernible role.

Completeness5/5

The set covers the main Hemnet workflows end to end: find location IDs, search active and sold listings, retrieve full details for both, compare listings, aggregate market stats, resolve addresses, and estimate mortgage costs. There are no obvious dead ends for a read-only property-research MCP.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server that gives Claude access to your WHOOP biometric data — recovery, sleep, strain, and workouts.
    33 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    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.
    -