Skip to main content
Glama

finn-mcp

MCP server that exposes 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.

Related MCP server: datanorge

Requires uv. Then use uvx to run the server without cloning or installing anything permanently:

uvx finn-mcp

Register with Claude Code

claude mcp add finn-mcp -- uvx finn-mcp

Or add to your .mcp.json (or Claude Desktop's claude_desktop_config.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

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.

Available Tools

6 tools
get_listingA

Fetch a full listing by its finnkode.

If ``vertical`` is omitted the server tries a cache hint first, then
probes each vertical until one returns a valid page. Results are cached
for 24 hours in a local SQLite database.
ParametersJSON Schema
NameRequiredDescriptionDefault
finnkodeYes
verticalNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses caching for 24 hours, fallback probing of verticals, and cache hint behavior, offering solid transparency for a read-only tool.

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?

Two clearly separated paragraphs: one for purpose, one for behavior. Concise without excess, though could add bullet points for readability.

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?

Given simple parameters and an existing output schema, the description covers main behavior and caching. It omits return format but that's delegated to output schema.

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 0%, so description adds value: it explains vertical's behavior when omitted (cache hint, probing). Finnkode is only named, but its role is obvious from 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 clearly states 'Fetch a full listing by its finnkode', providing a specific verb and resource. It distinguishes from sibling search/save tools by focusing on single listing retrieval.

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 context implies use when a finnkode is known, but no explicit when-to-use/alternatives are given. Siblings like search_finn are not mentioned, leaving the agent to infer usage.

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

list_saved_searchesA

Return every saved search in the local store, ordered by name.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It explicitly states the tool returns all saved searches and orders them by name. It does not mention side effects or permissions, but for a read-only listing operation, the description is adequately transparent.

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 sentence that conveys the essential information without unnecessary words. It is front-loaded and efficient.

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?

Given no parameters, no annotations, and the presence of an output schema, the description is fairly complete. It could potentially mention that the output is a list or the ordering, but the output schema likely covers the return format. Overall, it is adequate.

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?

There are no parameters, and schema description coverage is 100%. The description does not add parameter-level meaning because none exist. Baseline for zero parameters is 4, which is appropriate.

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 clearly states the tool returns every saved search in the local store, ordered by name. It uses a specific verb ('Return') and resource ('saved searches'), and differentiates from sibling tools like save_search, delete_saved_search, etc.

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 does not explicitly state when to use this tool versus alternatives such as get_listing or search_finn. Usage is implied by the name and description, but no exclusions or comparison guidelines are provided.

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

search_finnA

Search finn.no within a vertical.

``vertical`` is one of: ``bap`` (Torget / used goods), ``homes`` (real
estate for sale), ``lettings`` (real estate for rent), ``cars_used``,
``cars_new`` (not yet supported by the scraper backend), ``jobs``.

``query`` is a free-text keyword. ``filters`` is a dict of extra
URL-query parameters understood by finn.no (e.g. ``{"price_to":"300000"}``
for cars, ``{"location":"1.20001.20061"}`` for Oslo).

Returns up to ~50 ``SearchResult`` entries. Fewer if finn.no returned
fewer matches; an empty list is a valid result.
ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
queryYes
filtersNo
verticalYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations, the description carries full burden. It discloses return behavior (up to ~50 SearchResult entries, empty list valid), unsupported backend (cars_new), and extra URL-query parameters for filters. This is thorough for behavioral expectations.

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?

Description is extremely concise: two short paragraphs front-loading the purpose, then details on parameters and return behavior. No redundant sentences; every line adds value.

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?

Given the tool complexity (4 params, output schema), the description covers essentials: verticals, query, filters, return limits, and unsupported items. Missing page parameter explanation is minor, and output schema details are not needed since it exists separately. Adequate for informed use.

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 0%, so description must compensate. It adds meaning to vertical (expands enum with descriptions), query (free-text), and filters (dict example). However, it omits the 'page' parameter entirely. Thus partial coverage, baseline 3.

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 clearly states 'Search finn.no within a vertical', specifying the verb (search) and resource (finn.no within a vertical). It lists all vertical options (bap, homes, lettings, etc.) and distinguishes from sibling tools (get_listing, save_search, etc.) which have different purposes.

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 implies usage through naming and vertical specification, but does not explicitly state when to use this tool vs. alternatives (e.g., 'use for general search; use get_listing for a single item'). No exclusions or when-not-to-use guidance is provided.

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. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.0
    • First observedcheck_saved_search
    • First observeddelete_saved_search
    • First observedget_listing
    • First observedlist_saved_searches
    • First observedsave_search
    • First observedsearch_finn

TDQS

A4/5.0
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
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP server for accessing the Fotocasa1 API to search real estate listings and retrieve detailed property information in Spain. It supports location suggestions, property filtering by type and price, and fetching specific property details.
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server to find and fetch Norwegian open government data from data.norge.no. Enables search, metadata retrieval, and data download.
    5
    3
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    MCP server providing typed tools for Norwegian public data sources, enabling natural language queries to official datasets like SSB, Brønnøysund, MET, Kartverket, Entur, and more, without requiring API keys.
    47
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that searches Facebook Marketplace and Craigslist for items for sale, returning structured JSON listings with filtering, deduplication, and optional deep description checks.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aHk-coder/finn-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server