Skip to main content
Glama
README.md
# finn-mcp

MCP server that exposes [finn.no](https://www.finn.no) — Norway's largest
online classifieds marketplace — to Claude across four verticals:

- **BAP / Torget** — used goods
- **Real estate** — homes for sale and rentals
- **Cars** — used (new cars are only available via the official API)
- **Jobs** — full-time listings

## Tools

| Tool | Purpose |
|------|---------|
| `search_finn` | Search a vertical by keyword + optional filters. |
| `get_listing` | Fetch a full listing by `finnkode`. |
| `save_search` | Persist a named recurring search. |
| `list_saved_searches` | List all saved searches. |
| `delete_saved_search` | Remove a saved search. |
| `check_saved_search` | Run a saved search and return only hits that are new since the last check. |

## Install & run (recommended)

Requires [uv](https://docs.astral.sh/uv/). Then use `uvx` to run the server
without cloning or installing anything permanently:

```bash
uvx finn-mcp
```

## Register with Claude Code

```bash
claude mcp add finn-mcp -- uvx finn-mcp
```

Or add to your `.mcp.json` (or Claude Desktop's `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "finn-mcp": {
      "command": "uvx",
      "args": ["finn-mcp"]
    }
  }
}
```

## Data access

There is no self-serve public finn.no API. For v1 this server scrapes the
public web pages and parses JSON-LD on detail pages. A stable `FinnBackend`
interface separates the MCP surface from the data source, so the scraper can
be swapped for the official partner API (`cache.api.finn.no/iad/`) later.

Backend selection is controlled by the `FINN_BACKEND` environment variable:

- `FINN_BACKEND=scraper` (default) — the scraper implementation.
- `FINN_BACKEND=official` — stub; raises `NotImplementedError` until
  partner credentials are wired up.

Responses are cached for 24 hours in a local SQLite database at
`$XDG_DATA_HOME/finn-mcp/cache.sqlite` (defaults to
`~/.local/share/finn-mcp/cache.sqlite`).

## Develop from source

```bash
git clone https://github.com/aHk-coder/finn-mcp
cd finn-mcp
uv sync
uv run pytest
uv run finn-mcp   # stdio server
```

Tests run against saved HTML fixtures in `tests/fixtures/` and do not hit
finn.no over the network.

## License

MIT. See [LICENSE](./LICENSE).

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: fetching a single listing, searching, and managing saved searches. No overlap or ambiguity.

Naming Consistency5/5

All tool names use snake_case with a verb_noun pattern (get_listing, search_finn, save_search, etc.), consistently applied.

Tool Count5/5

6 tools is well-scoped for a finn.no interface, covering search, retrieval, and saved search lifecycle without bloat.

Completeness4/5

Core operations are present, but missing an update tool for saved search parameters and a way to list all results from a saved search (not just new ones). Minor gap.

Maintenance

ActivityInactive
ResponsivenessNo issues