Skip to main content
Glama
RT-codes

marktplaats-2dehands-mcp

by RT-codes

Marktplaats MCP

An agent-oriented MCP server for searching and monitoring Marktplaats.nl (and the inherited 2dehands.be support).

Instead of only exposing a single marketplace search, this version adds multi-query hunts: an AI agent can turn one shopping goal into several complementary searches, merge the results, remove duplicates, remember what it has already seen, and later ask for only the genuinely new listings.

Good for things like:

  • finding a specific laptop without trusting one exact search phrase

  • hunting for gaming-PC bargains across complete systems, GPUs and vague titles

  • monitoring a saved search over time

  • giving an AI a compact candidate pool it can rank semantically

No Marktplaats login or API key is needed for the public search tools.

Why this version exists

The upstream project already provided a solid MCP retrieval layer for Marktplaats and 2dehands. This wrapper keeps that useful base and adds a more agent-native hunting workflow on top.

User goal
   ↓
Agent invents several purposeful searches
   ↓
hunt(...)
   ↓
bounded Marktplaats searches
   ↓
deduplicate by listing ID
   ↓
found_by provenance
   ↓
compact candidate pool
   ↓
agent ranks the best matches

A saved hunt can then continue later:

save_hunt
   ↓
run_hunt
   ↓
check_new_matches
   ↓
only listings the agent has not seen before

Related MCP server: Begagnad MCP

Main tools

Tool

What it does

search_listings

Run one filtered marketplace search.

hunt

Run up to 20 complementary searches and deduplicate the combined results.

save_hunt

Save a reusable named hunt locally.

list_hunts

List saved hunts and their seen-listing counts.

run_hunt

Re-run a saved hunt.

check_new_matches

Return only listings not seen on earlier checks.

get_listing_details

Fetch fuller details for one candidate.

get_seller_info

Fetch seller information.

list_categories

List known marketplace categories.

get_category_filters

Inspect category-specific filters.

The inherited single-query saved-search tools are still available too.

What is different from the upstream MCP?

The original gjoris/marktplaats-2dehands-mcp is a general Marktplaats / 2dehands MCP with normal search, listing details, category helpers, saved searches and optional account-oriented functionality.

This version focuses on goal-driven marketplace hunting:

  • one hunt can run many complementary searches at once

  • every hunt has hard fan-out / result limits so an agent cannot explode the context window

  • results are deduplicated by stable listing ID

  • found_by shows which different searches discovered the same listing

  • named hunt packs can be saved and reused

  • seen listing IDs are remembered locally

  • check_new_matches returns only genuinely unseen ads

  • the returned candidate payload is intentionally compact for LLM ranking

  • account/login tools are not exposed in the lean MCP surface

In short:

Upstream:
"Let an AI search Marktplaats."

This version:
"Give an AI a shopping goal, let it search several clever ways,
merge the evidence, remember what it saw, and come back later
with only the new interesting listings."

Install into any MCP-capable agent

This is a standard stdio MCP server. If your agent/client can launch an MCP command, it can usually use this server.

Option A — run directly from GitHub with uvx

Install uv first, then:

uvx --from git+https://github.com/RT-codes/marktplaats-mcp.git \
  marktplaats-2dehands-mcp

Generic MCP configuration

Most stdio-capable MCP clients use a configuration shaped roughly like this:

{
  "mcpServers": {
    "marktplaats": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/RT-codes/marktplaats-mcp.git",
        "marktplaats-2dehands-mcp"
      ]
    }
  }
}

The exact settings screen or config-file location differs per agent, but the important part is always the same:

command: uvx
args: --from git+https://github.com/RT-codes/marktplaats-mcp.git marktplaats-2dehands-mcp
transport: stdio

Option B — local clone

git clone https://github.com/RT-codes/marktplaats-mcp.git
cd marktplaats-mcp
uv sync
uv run marktplaats-2dehands-mcp

Then point your MCP client at the local command. For example:

{
  "mcpServers": {
    "marktplaats": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/marktplaats-mcp",
        "run",
        "marktplaats-2dehands-mcp"
      ]
    }
  }
}

Quick single-search example

search_listings(
  query="MacBook Air M2",
  price_to=800,
  sort_by="date",
  sort_order="desc",
  limit=10
)

Distance filtering needs a postcode:

search_listings(
  query="RTX 4070 gaming pc",
  zip_code="3511",
  distance_km=50,
  price_to=1000,
  limit=10
)

Example 1 — MacBook bargain hunt

Prompt to the agent

Find me a good used MacBook for under €700. Prefer M1 or newer, but also check vague or badly titled listings that might be bargains.

What the agent might summarize

16 searches → 91 raw matches → 58 unique listings

Top candidates
1. MacBook Air M2 2022 — €675
   Found by: macbook-m2, macbook-air, apple-laptop

2. MacBook Pro M1 16GB — €620
   Found by: macbook-m1-16gb, macbook-pro

3. "Apple laptop 2021" — €490
   Found by: vague-apple-bargain

Those numbers and listings are illustrative — the real output depends on what is currently for sale.

What the technical MCP call can look like

{
  "per_search_limit": 10,
  "searches": [
    {
      "label": "macbook-m2",
      "query": "MacBook M2",
      "price_to": 700
    },
    {
      "label": "macbook-m1-16gb",
      "query": "MacBook M1 16GB",
      "price_to": 700
    },
    {
      "label": "macbook-air",
      "query": "MacBook Air",
      "price_to": 700
    },
    {
      "label": "vague-apple-bargain",
      "query": "Apple laptop",
      "price_to": 700
    }
  ]
}

And a compact candidate returned by hunt is shaped roughly like:

{
  "id": "m1234567890",
  "title": "MacBook Air M2 2022",
  "description": "Very good condition, battery still strong...",
  "price": "€ 675.00",
  "price_cents": 67500,
  "condition": "used",
  "location": {
    "city": "Utrecht",
    "distance_km": null
  },
  "link": "https://link.marktplaats.nl/m1234567890",
  "found_by": [
    "macbook-m2",
    "macbook-air"
  ],
  "found_by_count": 2
}

The important bit is that the agent does not need to trust one search phrase. It can search several angles and reason over one deduplicated result set.

Example 2 — gaming PC value hunt

Prompt to the agent

Find me the best gaming PC under €900. GPU value matters more than RGB or a fancy case. Check normal gaming-PC listings, complete PCs with RTX cards, workstations with gaming GPUs, and vague titles that might hide a bargain.

What the agent might summarize

14 searches → 108 raw matches → 73 unique listings

Top candidates
1. Ryzen 7 + RTX 4070 PC — €850
   Strongest overall gaming value.

2. "Game computer Nvidia" with RTX 3080 — €650
   Weak title, unusually good GPU for the price.

3. Dell Precision + RTX 3070 — €575
   Found through both workstation and RTX searches.

One candidate was discovered independently by 4 searches.

Again, this is an illustrative result rather than a snapshot of current listings.

What the technical MCP call can look like

{
  "per_search_limit": 10,
  "searches": [
    {
      "label": "gaming-pc",
      "query": "gaming pc",
      "price_to": 900
    },
    {
      "label": "rtx-4070-pc",
      "query": "RTX 4070 pc",
      "price_to": 900
    },
    {
      "label": "rtx-3080-pc",
      "query": "RTX 3080 computer",
      "price_to": 900
    },
    {
      "label": "workstation-gpu",
      "query": "Dell Precision RTX",
      "subcategory": "desktops",
      "price_to": 900
    },
    {
      "label": "vague-nvidia-pc",
      "query": "computer Nvidia",
      "subcategory": "desktops",
      "price_to": 900
    }
  ]
}

A technical hunt response contains summary counters plus the deduplicated candidates:

{
  "search_count": 5,
  "successful_searches": 5,
  "failed_searches": 0,
  "raw_result_count": 50,
  "unique_count": 34,
  "duplicates_removed": 16,
  "candidates": [
    {
      "id": "m0987654321",
      "title": "Ryzen 7 Gaming PC RTX 4070",
      "price": "€ 850.00",
      "price_cents": 85000,
      "found_by": [
        "gaming-pc",
        "rtx-4070-pc"
      ],
      "found_by_count": 2
    }
  ],
  "errors": []
}

The MCP deliberately does not decide what is a good gaming PC. Retrieval stays broad; the calling agent performs the semantic ranking.

Saved hunts and “what is new?”

A useful hunt can be saved once:

save_hunt(
  name="gaming-pc-under-900",
  per_search_limit=10,
  searches=[
    {"label": "gaming", "query": "gaming pc", "price_to": 900},
    {"label": "4070", "query": "RTX 4070 pc", "price_to": 900},
    {"label": "workstation", "query": "Dell Precision RTX", "price_to": 900}
  ]
)

Run it whenever you want:

run_hunt(name="gaming-pc-under-900")

Or ask only for listings that have not appeared in earlier checks:

check_new_matches(name="gaming-pc-under-900")

The first check records the currently discovered listing IDs. Later checks can therefore return only genuinely unseen candidates.

Hunt safety bounds

Hunts are intentionally bounded for agent use:

  • maximum 20 searches per hunt

  • maximum 25 requested results per individual search

  • one failed search does not abort the other searches

  • results are deduplicated before they are returned to the agent

This makes it practical to let an LLM generate an adventurous search portfolio without giving it unlimited fan-out.

Local state

Saved hunts live at:

~/.local/share/marktplaats-2dehands-mcp/saved_hunts.json

Legacy saved searches live at:

~/.local/share/marktplaats-2dehands-mcp/saved_searches.json

You can override the state directory with:

MARKTPLAATS_MCP_STATE_DIR

The inherited MARKTPLAATS_2DEHANDS_STATE_DIR remains supported as a fallback.

Backend note

Search currently uses the internal Adevinta / Marktplaats JSON search endpoint behind the website. It does not currently require an API key, login, headless browser or proxy for public search.

That endpoint is undocumented and may change. The retrieval code is deliberately kept behind a small internal layer so the transport can be repaired without redesigning the public MCP tool interface.

Credits & origin

This project would not exist without the work it builds on.

Primary upstream

gjoris/marktplaats-2dehands-mcp — MIT licensed.

That project provided the base MCP server, Marktplaats / 2dehands retrieval layer, category tooling, listing-detail support and saved-search foundation that this repository was adapted from.

Earlier formatting / parsing work

The upstream project credits listing-formatting helpers and related parsing work to:

PonClick/marktplaats-mcp — MIT licensed, © 2026 lessClick AI.

This repository preserves that attribution because parts of the inherited implementation still derive from that work.

Additions in this repository

The RT-codes/marktplaats-mcp version adds the agent-oriented hunt layer, including:

  • bounded multi-query hunts

  • cross-search deduplication

  • found_by provenance

  • reusable saved hunt packs

  • persistent seen-listing memory

  • new-match detection

  • a compact candidate payload designed for LLM ranking

  • a lean search-focused MCP surface

Thank you to the upstream maintainers for making the original work available under MIT.

License

MIT — see LICENSE.

Available Tools

14 tools
check_new_matchesB

Run a saved hunt and return only listings not seen before.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
mark_seenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/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 discloses that only unseen listings are returned, which suggests a stateful 'seen' mechanism. However, it omits what happens to the seen state (e.g., marking listings as seen by default), any side effects, or rate limits, leaving significant behavioral gaps.

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?

A single, efficient sentence that front-loads the core action and outcome. It earns its place but could benefit from slightly more detail given the lack of annotations and schema descriptions.

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

Completeness3/5

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

An output schema exists, so return values needn't be explained. However, with no annotations and 0% schema coverage, the description should do more to cover parameter semantics and side effects. It is adequate but leaves clear gaps for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain the parameters. It only mentions 'run a saved hunt' (implying 'name') and 'seen before' (implying 'mark_seen'), but does not clarify that 'mark_seen' defaults to true or what the parameter does. Most parameter meaning is left to inference from titles.

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

Purpose4/5

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

States a specific verb and resource ('Run a saved hunt'), and clarifies the output scope ('return only listings not seen before'). It's distinguishable from siblings like run_hunt, but the description doesn't explicitly say how it differs from that tool, leaving a small ambiguity.

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 the tool is used to check for new matches from a saved hunt, but it doesn't specify when to use this versus run_hunt or check_saved_search. No explicit when-not or alternative tool guidance is provided.

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

get_category_filtersC

Discover the attribute filters available within a category.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNomarktplaats
categoryNo
subcategoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the whole burden. It implies a read/discovery operation but never states that it is side-effect free, whether it is cached, or what happens when category/subcategory are omitted (both default to null).

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 with no filler; the verb and the object of discovery come first.

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

Completeness3/5

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

An output schema exists, so return values need not be described. However, with no annotations and completely undocumented parameters, the definition leaves the calling contract underspecified for a 3-parameter tool.

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

Parameters2/5

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

All three parameters (site, category, subcategory) have 0% schema description coverage, and none are explained in the description. Defaults such as site='marktplaats' and nullable category/subcategory are left for the agent to interpret, so the description fails to compensate for the coverage gap.

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

Purpose4/5

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

The description states a specific verb ('Discover') and resource ('the attribute filters available within a category'), which is clearly distinct from siblings like list_categories or get_listing_details. It stops short of explicitly naming those siblings as alternatives, but an agent can tell what this tool returns.

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

Usage Guidelines2/5

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

There is no when-to-use context, no prerequisite (e.g. needing a known category id), and no mention of how this differs from list_categories. The agent must infer the workflow entirely.

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

get_listing_detailsB

Fetch a listing page and return title, price, description, images, stats.

Args: listing_id: e.g. "m2340580395" (the 'm' prefix is added if missing). site: "marktplaats" or "2dehands".

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNomarktplaats
listing_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the return fields, but omits whether authentication is needed, rate limits, error behavior for invalid IDs, and whether this is a read-only operation. For a fetch tool with zero annotation coverage this is a gap.

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?

Front-loaded with the purpose and return fields, followed by a compact args block. No wasted sentences, though the args formatting is informal.

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?

An output schema exists, so the description needn't explain return types; it still lists the fields, which is a slight redundancy but harmless. Parameter coverage is complete and the purpose is clear. The main gap is usage context against siblings, but for a simple detail-fetch this is close to complete.

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 description coverage is 0%, so the description must compensate and it does: it gives a concrete example for listing_id and explains the 'm' prefix normalization, and it enumerates the valid values for site. Both parameters are documented with enough detail to call the tool correctly.

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

Purpose4/5

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

States a specific verb (Fetch) and resource (listing page) and enumerates the returned fields, so the agent knows exactly what this tool retrieves. It does not explicitly distinguish itself from siblings like search_listings or hunt, though the singular 'listing page' implies detail-fetch versus search.

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

Usage Guidelines2/5

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

No guidance on when to use this versus search_listings or the hunt tools. The agent must infer that this is a detail lookup, but there are no stated conditions, prerequisites, or exclusions.

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

get_seller_infoB

Fetch a seller profile (verification status, payment method, reviews).

Note: the endpoint does not return seller name/id — those are available from the listing response. It only exposes verification flags, the accepted payment method, and aggregated review stats.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNomarktplaats
seller_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it usefully discloses a negative behavioral trait: the endpoint does not return seller name/id and only exposes verification flags, payment method, and aggregated review stats. It says nothing about auth requirements, rate limits, error behavior, or that this is a read-only lookup.

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?

Purpose is front-loaded in the first sentence and the caveat follows in a compact second sentence. No filler, though the parenthetical and note could be tightened into one line.

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

Completeness3/5

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

An output schema exists, so return-value detail is not required, and the description adds the non-obvious negative caveat. However, with 0% parameter coverage and no annotations, the missing param and safety context leaves it only minimally adequate for calling the tool correctly.

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

Parameters2/5

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

Schema description coverage is 0% with two parameters, so the description must compensate. It only indirectly alludes to seller id via the listing-response note and never explains the 'site' parameter or its 'marktplaats' default, leaving both parameters semantically undocumented.

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

Purpose4/5

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

States a specific verb+resource ('fetch a seller profile') and enumerates the payload contents (verification status, payment method, reviews). It does not name or differentiate from siblings like get_listing_details, so it lands at 4 rather than 5.

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

Usage Guidelines2/5

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

No explicit when-to-use, when-not-to-use, or alternative selection guidance. The note that name/id come from the listing response hints at a workflow but never says when to call this tool versus the listing tools.

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

huntA

Run several complementary Marktplaats searches as one bounded hunt.

Each search is a dict containing normal search_listings arguments plus an optional human-readable label used for provenance.

Example: [ {"label": "p100 nearby", "query": "Tesla P100", "price_to": 150}, {"label": "cheap workstation", "query": "Dell Precision", "price_to": 120}, ]

Results are deduplicated by Marktplaats listing ID. Every candidate keeps a found_by list showing which searches independently discovered it.

Hard limits: - maximum 20 searches per hunt - maximum 25 returned listings per individual search

ParametersJSON Schema
NameRequiredDescriptionDefault
searchesYes
per_search_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose real behavior: deduplication by Marktplaats listing ID, the found_by provenance list, and hard limits (max 20 searches, max 25 listings per search). It does not clarify whether the hunt is persisted or has side effects (the existence of save_hunt/run_hunt makes this ambiguity meaningful), nor does it state read-only status or request cost.

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?

Front-loads the purpose, then example, then hard limits as a scannable list; each block earns its place. Slightly verbose around the example/limits but nothing is filler.

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

Completeness3/5

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

An output schema exists so return structure needn't be explained, and the description covers the nested searches argument and result semantics (dedup, found_by) adequately. The remaining gap is the unclear relationship to save_hunt/run_hunt, which an agent needs in order to choose correctly among these siblings.

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 description coverage is 0%, so the description must compensate, and it does well for the complex searches parameter: it explains that each entry is a dict of search_listings arguments plus an optional label, and provides a concrete two-element example. The per_search_limit parameter is not named directly, though the stated 25-listing cap gives implied bounds on it.

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

Purpose4/5

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

States a clear verb and resource: 'Run several complementary Marktplaats searches as one bounded hunt,' which distinguishes it from the single-search sibling search_listings. However, it never differentiates itself from run_hunt or save_hunt, leaving an agent to guess how 'hunt' relates to those near-identical siblings.

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?

Usage is implied by 'several complementary searches as one bounded hunt' and the multi-search example, so an agent can infer it is for batching related queries. But there is no explicit when-to-use rule and no named alternative (e.g., why pick this over run_hunt or individual search_listings calls), which matters given the crowded hunt-related sibling set.

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

list_categoriesB

List the supported main categories and common subcategories.

Same IDs work on both marktplaats.nl and 2dehands.be.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNomarktplaats

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. It's clearly a read-only list operation, but the description doesn't state that explicitly or describe rate limits, caching, or pagination. It mentions the same IDs work on both sites, which is useful cross-site context, but nothing about behavior beyond that.

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?

Very concise, two short sentences. Front-loaded with the main purpose. The second sentence about IDs working across sites is useful but could be integrated more clearly. No wasted words.

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

Completeness3/5

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

With an output schema present, return values needn't be explained. However, for a reference tool with no annotations and an undocumented parameter, the description is minimal. It doesn't explain what 'main categories and common subcategories' look like or how to use them, nor does it clarify the site parameter's effect. Adequate but incomplete.

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 0% and there's 1 parameter ('site' with default 'marktplaats'). The description mentions 'marktplaats.nl and 2dehands.be' which implies the site parameter controls platform, but it doesn't map the parameter values to the domains or explain the default. This adds marginal value but leaves the parameter's enum/usage ambiguous.

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 (list) and resource (categories/subcategories) with clear scope. Distinguishes itself from siblings like get_category_filters which presumably returns filters for a category, and from search_listings. The description makes it clear this is a reference/list tool.

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

Usage Guidelines2/5

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

No explicit when-to-use guidance or alternatives are named. The description implies it's a reference tool for discovering categories before searching, but it doesn't say when to use it vs get_category_filters or search_listings. No prerequisites or exclusions stated.

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

list_huntsB

List locally saved hunts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: no read-only confirmation (only implied by 'List'), no note on auth, ordering, or size of the result set. With zero annotation coverage, this is a real gap even for a simple read 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?

A single front-loaded sentence with no filler, which is appropriate for this trivial tool. It is efficient but so brief that it leaves the sibling ambiguity unaddressed.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and there are no parameters to document, which keeps the required scope small. However, with no annotations and no clarification of how 'hunts' differ from 'saved searches', the definition is only minimally complete.

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 takes zero parameters, so per the rubric the baseline is 4. There is nothing parameter-related the description could add, and the empty schema is consistent with the description.

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

Purpose4/5

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

The description gives a specific verb (List) and resource (locally saved hunts), so an agent knows exactly what the tool returns. It does not, however, distinguish itself from close siblings such as list_saved_searches or the hunt/run_hunt family, leaving the 'hunts vs searches' boundary implicit.

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?

Naming it a lister implies the usage context, and 'locally saved' hints that this reads persisted state rather than running a live search. There is no explicit when-to-use statement or exclusion versus list_saved_searches, so the agent must infer the boundary.

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

list_saved_searchesC

List all persisted searches.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about read-only safety, result ordering, pagination, or authorization scope. Beyond confirming the operation is a listing, it discloses no behavioral traits.

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?

A single short sentence with no filler and the key concept front-loaded. It is appropriately sized for a zero-parameter listing tool, though it borders on under-specification rather than tight editing.

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

Completeness3/5

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

With 0 parameters and an output schema covering return values, the tool's complexity is low, so the minimal description is nearly sufficient. It still omits any hint of ordering, auth scope, or relation to the sibling saved-search tools, leaving a modest gap.

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 takes zero parameters, so there is nothing for the description to clarify and the baseline of 4 applies. Schema coverage is 100% but empty, and the description correctly implies a no-argument call.

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

Purpose3/5

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

"List all persisted searches" gives a clear verb and resource, so an agent knows the operation is a read of stored searches. However, "persisted" is essentially a paraphrase of "saved" in the name, and nothing distinguishes it from siblings like list_hunts or check_saved_search. It is minimally viable rather than specifically differentiated.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus check_saved_search, list_hunts, or save_search/delete_saved_search. The agent must infer the retrieval role purely from the name and description.

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

run_huntC

Run a previously saved hunt.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden yet discloses almost nothing beyond the verb. It doesn't say whether running a hunt mutates state, triggers notifications, is long-running, or what happens if the named hunt doesn't exist.

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?

A single front-loaded sentence with no wasted words. It is efficient, though arguably terse to the point of under-specification rather than optimally concise.

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

Completeness2/5

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

The output schema covers return values, so that need not be described. However, with zero annotations, an undocumented parameter, and no usage context, the description leaves an agent without enough information to invoke this confidently relative to its siblings.

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

Parameters2/5

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

Schema description coverage is 0% and the single parameter 'name' is unexplained. The description implies 'name' identifies the saved hunt, but adds no format, matching rules, or case-sensitivity details to compensate for the undocumented schema.

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

Purpose4/5

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

The description states a specific verb+resource pair ("Run a previously saved hunt") that is distinguishable from siblings like save_hunt and list_hunts. It does not explicitly contrast itself with the bare 'hunt' tool or explain what a hunt is, but the purpose is immediately clear.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites (e.g., the hunt must already exist), and no pointers to alternatives such as list_hunts to discover a name or save_hunt to create one first. The agent must infer the workflow entirely.

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

save_huntA

Save a reusable named hunt locally.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
searchesYes
per_search_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It states 'locally', which hints at storage scope, but it doesn't disclose persistence behavior, whether saving overwrites existing hunts with the same name, or return/error behavior. An output schema exists, so return format is partly covered, but mutation semantics remain opaque.

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?

One short sentence with zero waste, front-loading the action and object. No filler or repetition.

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

Completeness3/5

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

For a mutation tool with 3 params, no annotations, and a 0% schema coverage, the description is minimally adequate but missing critical context: what a hunt is versus a search, overwrite behavior, and parameter meanings. The output schema covers return values, but the input and behavioral aspects are underspecified.

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 0%, and the description adds no parameter information. All three parameters (name, searches, per_search_limit) are undocumented beyond their titles. The description does not compensate for this gap, though the parameter names are partially self-explanatory.

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

Purpose4/5

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

States a clear verb+resource: 'Save a reusable named hunt locally.' The agent can distinguish this from sibling save_search (saves a search, not a hunt) at a high level. However, it does not clarify what a 'hunt' is or how it differs from a 'saved search' beyond the noun.

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 word 'reusable' implies the purpose (create a saved collection for future use), but the description provides no explicit when-to-use guidance or alternatives. With siblings like save_search and run_hunt, the agent must infer the relationship without help.

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

search_listingsA

Search for listings on marktplaats.nl or 2dehands.be.

Args: site: "marktplaats" (NL, default) or "2dehands" (BE). query: Search query text (required if no category specified). category: Main category name (e.g., "computers en software"). subcategory: Subcategory name (e.g., "laptops", "elektrische fietsen"). zip_code: Postal code for distance filtering. NL: "1016LV". BE: "2000". distance_km: Maximum distance in km (default 1000). Requires zip_code. price_from / price_to: Price range in euros. condition: "new", "as_good_as_new", "used", "refurbished", "not_working". seller_type: "business" / "zakelijk" or "private" / "particulier". sort_by: "date", "price", "optimized", "location". sort_order: "asc" or "desc". limit: 1-100 (default 10). offset: Pagination offset. offered_since_days: Only show items posted within the last N days. attribute_ids: Category-specific filter IDs (use get_category_filters).

Returns: Dict with total_count, returned_count, listings, optional next_offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNomarktplaats
limitNo
queryNo
offsetNo
sort_byNooptimized
categoryNo
price_toNo
zip_codeNo
conditionNo
price_fromNo
sort_orderNoasc
distance_kmNo
seller_typeNo
subcategoryNo
attribute_idsNo
offered_since_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 the full burden and does reasonably well: it discloses defaults (limit 10, distance 1000), cross-parameter constraints (distance_km requires zip_code), pagination shape (next_offset) and the return dict contents. It omits anything about rate limits, error behavior, or result ordering guarantees, which keeps it out of the top band.

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?

Front-loaded one-line summary followed by a tight, scannable Args list where each line maps to one parameter; for a 16-parameter tool this is appropriately sized. The 'Returns:' block lightly duplicates the existing output schema, but it is one sentence and does not bloat the definition.

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?

An output schema exists so return values need not be explained, and the description nonetheless summarizes it. Combined with full per-parameter documentation at zero schema coverage and explicit inter-parameter conditions, an agent has everything needed to call this tool correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description is the only source of parameter meaning, and it documents all 16 parameters: allowed site values, per-site zip formats ('1016LV' vs '2000'), the five condition enums, seller_type aliases (business/zakelijk, private/particulier), sort_by options, and limit bounds. This is exactly the compensation the low schema coverage demands.

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

Purpose4/5

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

States a specific verb and resource ('Search for listings') plus the exact marketplaces (marktplaats.nl, 2dehands.be), which is more specific than a generic search tool. However it never distinguishes itself from sibling search-like tools such as hunt, save_search, or check_saved_search, so an agent must infer that this is the ad-hoc/one-shot search.

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?

Usage is implied through conditional notes, e.g. 'query: required if no category specified' and 'attribute_ids: use get_category_filters', which is genuinely useful routing. But there is no explicit when-to-use/when-not statement relative to hunt, save_search, or check_saved_search, so guidance is only partial.

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. 14 tool updatesv1.2.1
    • First observedcheck_new_matches
    • First observedcheck_saved_search
    • First observeddelete_saved_search
    • First observedget_category_filters
    • First observedget_listing_details
    • First observedget_seller_info
    • First observedhunt
    • First observedlist_categories
    • First observedlist_hunts
    • First observedlist_saved_searches
    • First observedrun_hunt
    • First observedsave_hunt
    • First observedsave_search
    • First observedsearch_listings

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation3/5

There is significant overlap between hunt, run_hunt, check_new_matches, and check_saved_search — all run searches and return listings, with only subtle differences in saved state. The persistent search tools (save_search, list_saved_searches, delete_saved_search, check_saved_search) are fairly distinct, but the hunt variants blur together.

Naming Consistency3/5

The tool set mixes several conventions: verb_noun (get_listing_details, list_categories), noun-only (hunt), and noun_verb (check_new_matches, check_saved_search). While each name is readable, there is no single predictable pattern.

Tool Count5/5

14 tools is a well-scoped count for a marketplace search and monitoring server. Each tool covers a distinct search or persistence operation, with no obvious bloat.

Completeness5/5

The surface covers search, detail retrieval, seller info, category discovery, filter discovery, and persistent saved searches with new-match tracking. Core read and monitoring workflows are complete, and no critical CRUD operation is missing.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with New Zealand's largest online marketplace through the Trade Me API. Supports searching listings, managing watchlists, placing bids, making purchases, and accessing marketplace data across all Trade Me categories.
    5
    -
  • F
    license
    Not graded
    quality
    F
    maintenance
    Enables AI agents to search and retrieve listings from Sweden's largest second-hand marketplaces, Blocket and Tradera. Returns unified data including prices, images, seller information, and direct links to listings.
    8
    -
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables AI assistants to search and view advertisements on Marktplaats.nl with extensive filtering options.
    16
    MIT