finn-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@finn-mcpsearch for used cars under 200k NOK in Oslo"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 a vertical by keyword + optional filters. |
| Fetch a full listing by |
| Persist a named recurring search. |
| List all saved searches. |
| Remove a saved search. |
| Run a saved search and return only hits that are new since the last check. |
Related MCP server: datanorge
Install & run (recommended)
Requires uv. Then use uvx to run the server
without cloning or installing anything permanently:
uvx finn-mcpRegister with Claude Code
claude mcp add finn-mcp -- uvx finn-mcpOr 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; raisesNotImplementedErroruntil 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 serverTests run against saved HTML fixtures in tests/fixtures/ and do not hit
finn.no over the network.
License
MIT. See LICENSE.
Available Tools
6 toolscheck_saved_searchA
Run a saved search, return only listings that are new since the last check.
Updates the saved search's ``last_checked_at`` and ``last_finnkodes``.
On the first call all current results are "new".
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool updates last_checked_at and last_finnkodes, which are side effects beyond the schema. It also explains the first-call behavior. Since no annotations are provided, the description fully carries the transparency burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences and a list of side effects. Every line serves a purpose, and the main verb 'Run' leads the text. No superfluous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (not shown but known), the description adequately covers the behavior and side effects. However, it could explain the term 'last_finnkodes' and provide more context about the input format, but it remains sufficient for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter 'name' exists, and the description does not mention it at all. With schema coverage at 0%, the description should add meaning (e.g., what names are valid or how to construct them), but it fails to do so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: run a saved search and return new listings. It specifies the resource (saved search) and the unique behavior (only new results). This distinguishes it from siblings like search_finn or list_saved_searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that on the first call all results are new, implying subsequent calls yield only new changes. However, it does not explicitly state when to use this tool versus alternatives like search_finn, nor does it list preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_saved_searchA
Delete a saved search by name. Returns True if it existed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides basic behavioral details: it deletes by name and returns True if it existed. However, it does not disclose whether the action is reversible, required permissions, or the behavior on invalid input. The mention of return value adds some transparency but is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences convey the purpose and a key behavioral detail with no unnecessary words. The description is front-loaded and efficient, earning its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (context signal), the description covers the return value concisely. However, it lacks context about error handling, prerequisites, or relation to sibling tools like check_saved_search. It is adequate for a simple tool but has room for improvement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no description for the 'name' parameter (0% coverage). The description adds meaning by specifying that the tool operates 'by name', clarifying the parameter's role as the identifier of the saved search to delete. This compensates for the schema gap effectively for a single string parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb (Delete) and resource (saved search) with a specific identifier (by name). It distinguishes from siblings like save_search, list_saved_searches, and check_saved_search by describing a unique delete operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives, such as using check_saved_search first or handling non-existence. The description implies it can be used to delete a saved search, but does not provide context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| finnkode | Yes | ||
| vertical | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
save_searchB
Persist a named search for repeated monitoring via check_saved_search.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| query | Yes | ||
| filters | No | ||
| vertical | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| query | Yes | |
| filters | No | |
| vertical | Yes | |
| last_finnkodes | No | |
| last_checked_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only says 'persist', implying a write operation, but lacks details about side effects, permissions, rate limits, or what the response contains. This is inadequate for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise (one sentence), but it sacrifices necessary detail. It is front-loaded with purpose but lacks parameter explanations and behavioral context, making it underspecified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (4 parameters, 3 required, write operation) and the presence of an output schema, the description should at least explain parameter roles. It does not, leaving significant gaps in understanding. The description is minimally adequate for a simple tool but insufficient for its actual complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no information about any of the 4 parameters (name, query, filters, vertical). The schema provides types and enums, but the description fails to explain their meaning or usage, leaving the agent without guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool persists a named search for repeated monitoring via check_saved_search. It uses specific verb 'persist' and resource 'named search', and distinguishes its purpose from siblings like list_saved_searches or delete_saved_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that this tool is for repeated monitoring via check_saved_search, providing clear usage context. However, it does not explicitly mention when not to use it or list alternatives beyond check_saved_search.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| query | Yes | ||
| filters | No | ||
| vertical | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
check_saved_search - First observed
delete_saved_search - First observed
get_listing - First observed
list_saved_searches - First observed
save_search - First observed
search_finn
TDQS
Each tool has a clearly distinct purpose: fetching a single listing, searching, and managing saved searches. No overlap or ambiguity.
All tool names use snake_case with a verb_noun pattern (get_listing, search_finn, save_search, etc.), consistently applied.
6 tools is well-scoped for a finn.no interface, covering search, retrieval, and saved search lifecycle without bloat.
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
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
Public MCP server for discovering open jobs. Search, filter, and get application links.
Capability registry for the agentic economy. Semantic search over verified MCP server listings.
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
Related MCP Servers
- AlicenseBqualityDmaintenanceAn 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.3MIT
- AlicenseAqualityBmaintenanceAn MCP server to find and fetch Norwegian open government data from data.norge.no. Enables search, metadata retrieval, and data download.53MIT
- AlicenseBqualityAmaintenanceMCP 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.47MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that searches Facebook Marketplace and Craigslist for items for sale, returning structured JSON listings with filtering, deduplication, and optional deep description checks.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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