agentsclimarketplace

Hemnet fpx

Skill chrischall/hemnet-mcp/skills/hemnet-fpx

Query hemnet.se (Swedish property portal) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the hemnet-mcp server — resolve locations, search for-sale and sold listings, and read listing detail via one-shot GraphQL calls through a signed-in browser tab. Use when you want Hemnet data without the MCP, in a script, or on a machine where the MCP isn't installed.From its SKILL.md

Install
npx -y skills add chrischall/hemnet-mcp --skill hemnet-fpx

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

3.3 KB, as published. Nobody here has run it

Hemnet via fpx (no MCP)

Hemnet fronts www.hemnet.se — including /graphql — with a Cloudflare managed challenge that 403s any plain curl/Node request. fpx routes the request through the user's own signed-in browser tab (the Transporter extension), which has already cleared the challenge, so the same anonymous GraphQL query succeeds. No Hemnet login is needed — just a normal open tab.

This is the same data the hemnet_* MCP tools return (money in SEK strings, areas in m²), reached with one CLI call instead of a running server.

One-time setup

npm install -g @fetchproxy/cli            # provides `fpx`
fpx profile add hemnet --domain hemnet.se # only the fetch capability is needed
fpx pair -p hemnet                        # prints a pair code → approve in Transporter

Requirements: the Transporter browser extension installed, with an open www.hemnet.se tab, and its Chrome Site access allowing hemnet.se. Pairing persists — after the first approval every later fpx call reuses it.

Core call

Every query is a POST of {"query": "...", "variables": {...}} to the GraphQL endpoint. Send the body raw (no --json) so stdout is the GraphQL JSON, ready for jq:

fpx post-json 'https://www.hemnet.se/graphql' @query.json -p hemnet \
  | jq '.data'

@file reads the body from a file; a literal '{...}' string works too but shell-quoting the embedded query is fiddly — prefer a heredoc into a file.

Ready-to-run query bodies (autocomplete, for-sale search, listing detail, sold search) with jq recipes are in references/graphql-queries.md. Exhaustive field lists live in the repo at src/graphql.ts — the operations here are compact, live-verified subsets.

The one rule: resolve the location first

Hemnet searches take numeric location ids, never place names. Always autocomplete first, take the locationId, then search:

printf '{"query":"query($q:String!,$l:Int!){autocompleteLocations(query:$q,limit:$l){hits{locationId fullName parentFullName}}}","variables":{"q":"Höllviken","l":3}}' > /tmp/q.json
fpx post-json 'https://www.hemnet.se/graphql' @/tmp/q.json -p hemnet \
  | jq -r '.data.autocompleteLocations.hits[] | "\(.locationId)\t\(.fullName)"'
# 898675  Höllviken tätort

Exit codes (fetch verbs)

  • 0 — success (a GraphQL errors array can still ride in a 0 body; check it).
  • 2 — bridge unavailable: extension not connected or pairing pending → run fpx pair -p hemnet, confirm a hemnet tab is open.
  • 3 — bot wall: the tab hasn't cleared Cloudflare → open/refresh a www.hemnet.se tab and retry.
  • 4 — upstream non-2xx from Hemnet.

Notes

  • Anonymous reads only — this touches the same public GraphQL surface as the MCP; no account data. Stay within hemnet.se's terms.
  • fpx health -p hemnet shows bridge connection state when a call fails.
  • This project is developed and maintained by AI (Claude).

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.