tweakers-aanbod-mcp
Click on "Deploy 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., "@tweakers-aanbod-mcpsearch laptops between €300 and €550 near Utrecht, cheapest first"
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.
tweakers-aanbod-mcp
MCP server for Tweakers Vraag & Aanbod, the Dutch second-hand marketplace for electronics. It lets Claude (or any MCP client) search listings in a category, filter on price, condition, seller type and distance, and open a single advertisement.
"Find laptops between €300 and €550 within 30 km of Utrecht, nearest first, and open the best one."
For new products and shop prices, see rleroi/tweakers-mcp (Pricewatch). This server covers the second-hand side.
Install
Needs uv (brew install uv).
Claude Code
claude mcp add tweakers-aanbod -- uvx --from git+https://github.com/frankwiersma/tweakers-aanbod-mcp tweakers-aanbod-mcpClaude Desktop: add this to ~/Library/Application Support/Claude/claude_desktop_config.json
(Windows: %APPDATA%\Claude\claude_desktop_config.json) and restart Claude Desktop. Desktop does not
use your shell PATH, so use the absolute path from which uvx:
{
"mcpServers": {
"tweakers-aanbod": {
"command": "/absolute/path/to/uvx",
"args": ["--from", "git+https://github.com/frankwiersma/tweakers-aanbod-mcp", "tweakers-aanbod-mcp"]
}
}
}Related MCP server: marktplaats-mcp
Tools
Tool | What it does |
| The ~220 Vraag & Aanbod categories with their slugs ( |
| One page (~40 listings) of a category: title, price, date, seller rating, city, distance |
| The full advertisement: description, condition, warranty, age, delivery, payment, photos, seller |
search_listings filters on Tweakers' side, so a narrow search costs one request:
Argument | Example | Notes |
|
| |
|
| Euros |
|
| Place name or full Dutch postcode ( |
|
|
|
|
|
|
|
| 1 to 5 stars |
|
|
|
|
| |
|
| Also return "gevraagd" posts |
How it works
It reads the same public pages a browser does: the category listing at /<category>/aanbod/ (with
the query parameters of its filter form) and the advertisement at /aanbod/<id>/. It stays out of
the paths that robots.txt disallows (/aanbod/zoeken, /ajax, ...), which is why every search
needs a category.
Requests go out one at a time, at least two seconds apart. Tweakers rate limits busy IPs; when that happens the tool returns a clear error and you can retry after a minute. Nothing is cached to disk or stored.
Caveats
Unofficial and not affiliated with Tweakers. It parses HTML, which can change at any time.
Listings include seller nicknames and locations as Tweakers shows them. Tweakers' terms do not allow collecting other members' personal data systematically, so use this for your own searches, not for building datasets.
Tweakers ignores a place name it cannot resolve. The tool detects that and returns an error instead of unfiltered results.
An old listing id still opens; check
posted_at.
Development
git clone https://github.com/frankwiersma/tweakers-aanbod-mcp && cd tweakers-aanbod-mcp
uv sync
uv run pytest # offline, against fixtures in tests/fixtures
uv run tweakers-aanbod-mcp # stdio serverMIT licensed.
Available Tools
3 toolsget_listingARead-only
Open one advertisement: full description, condition, warranty, age, delivery and payment options,
photos, and the seller's location, rating and history. Old ids still resolve, so check posted_at.
| Name | Required | Description | Default |
|---|---|---|---|
| listing_id | Yes | The `id` from search_listings, or the number in /aanbod/<id>/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| age | Yes | |
| url | Yes | |
| title | Yes | |
| views | Yes | |
| images | Yes | |
| seller | Yes | |
| payment | Yes | |
| delivery | Yes | How the item changes hands, e.g. 'ophalen en (pakket)post nationaal'. |
| warranty | Yes | |
| condition | Yes | |
| posted_at | Yes | |
| price_eur | Yes | |
| price_text | Yes | |
| description | Yes | |
| pricewatch_url | Yes | Linked Pricewatch product, if the seller picked one. |
| shipping_costs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the description needn't restate safety. It adds genuinely non-obvious behavior: legacy ids still resolve, meaning the returned record may be stale and `posted_at` should be inspected — a caveat an agent could not derive from the structured fields.
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 tight sentences, front-loaded with the action and the returned payload, with the staleness caveat placed last where it belongs. No filler or restatement of the tool name.
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?
An output schema exists, so enumerating return fields is a bonus rather than a necessity, and the stale-id behavior is covered. What's missing is only edge-case handling (invalid/removed ids, how precise the seller location is) — minor for a single-record fetch.
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 100% and already explains where listing_id comes from (search_listings `id` or the /aanbod/<id>/ number), so the baseline is 3. The description adds the extra semantic that an id need not be current, which changes how an agent should interpret and validate the argument.
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?
States a specific verb and resource ("Open one advertisement") and enumerates exactly what the record contains — description, condition, warranty, delivery/payment, photos, seller info. The singular "one" implicitly contrasts with search_listings, but no sibling is named, so an agent must infer the split.
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?
Usage is only implied: this is the detail fetch for an item found via search_listings, and the id-source hint lives in the schema rather than the description. The closing note about old ids is a data-freshness caveat rather than explicit when/when-not guidance or a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesARead-only
List Vraag & Aanbod categories (about 220, e.g. laptops, videokaarten, cameras).
| Name | Required | Description | Default |
|---|---|---|---|
| contains | No | Case-insensitive text to match in slug or name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context about result volume (~220 entries) and the domain of category values, but says nothing about ordering, pagination, or how the 'contains' filter narrows the set.
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?
One sentence, front-loaded with the verb and resource, and every clause earns its place by adding cardinality and concrete examples. No filler or redundancy.
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?
With an output schema present, return values needn't be explained, and the single parameter is fully covered by the schema. The remaining gap is minor: it doesn't say what happens with large unfiltered results.
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 100%, and the single 'contains' parameter is fully documented in the schema as a case-insensitive slug/name match. The description contributes nothing about the filter (e.g. that omitting it returns the full ~220 list), so baseline 3 applies.
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?
States a specific verb and resource ('List Vraag & Aanbod categories') and adds cardinality (~220) plus concrete examples (laptops, videokaarten, cameras), so an agent knows exactly what comes back. It does not explicitly contrast with search_listings or get_listing, so it stops short of a 5.
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?
Usage is only implied: an agent can infer this is the lookup to call before filtering listings by category, but the description never says when to use it versus search_listings or get_listing. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_listingsARead-only
Search one Vraag & Aanbod category. Filtering happens on Tweakers' side, so narrow filters cost no extra requests. Returns about 40 listings per page with price, seller rating and city.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | Place name ('Utrecht') or full Dutch postcode ('3521DT'). Adds the distance to each listing. A 4-digit postcode alone may resolve to Belgium. | |
| page | No | Result page; each page holds about 40 listings. | |
| sort | No | newest | |
| keyword | No | Words that must appear in the listing. | |
| category | Yes | Category slug from list_categories, e.g. 'laptops'. | |
| max_price | No | Maximum asking price in euros. | |
| min_price | No | Minimum asking price in euros. | |
| conditions | No | Keep only these conditions. | |
| seller_type | No | Private sellers or businesses only. | |
| include_wanted | No | Also return 'gevraagd' (wanted) posts. | |
| max_distance_km | No | Only listings within this distance of `near`. | |
| min_seller_rating | No | Minimum seller rating, 1 to 5 stars. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| page | Yes | |
| pages | Yes | |
| total | Yes | |
| listings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds useful behavior beyond that: filtering is server-side, narrow filters do not cost extra requests, and each page returns about 40 listings with price, seller rating and city. It does not cover auth, rate limits, or edge-case behavior, but it goes meaningfully beyond the annotations.
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 three tight sentences with the category-scoping constraint and filtering-cost caveat front-loaded. Every sentence adds useful information without repeating the schema or annotations.
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?
With 12 parameters, 92% schema coverage, annotations, and an output schema, the description only needs to supply high-value context. It does so by noting server-side filtering, page size, and returned listing fields. The main remaining gap is sibling routing, but the essential search behavior is covered.
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 92%, so the schema already documents nearly all parameters. The description adds the page size and server-side filtering context, but it does not add parameter-specific semantics beyond what the schema provides, making 3 the appropriate baseline.
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 states a specific verb ('Search') and resource ('listings') constrained to one category, so the core purpose is clear. It does not explicitly distinguish itself from the sibling tools list_categories or get_listing, though the category-scoped search framing helps.
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?
It implies usage by saying to search one category and notes that narrow filters cost no extra requests, which encourages precise filtering. However, it does not explicitly say when to use this versus list_categories or get_listing, nor does it state any exclusions or prerequisites.
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.
3 tool updates
v0.1.0- First observed
get_listing - First observed
list_categories - First observed
search_listings
TDQS
Scored across 3 tools
The three tools form a clear funnel: browse categories, search within a category, then open a specific listing. Each has a distinct resource and action, with no overlapping purposes. An agent can easily select the right tool.
All tool names follow a consistent verb_noun snake_case pattern: list_categories, search_listings, get_listing. There are no mixed conventions or vague verbs.
Three tools are exactly enough for a read-only marketplace browsing server: one for category discovery, one for search, and one for detail retrieval. No tool feels redundant or missing within that narrow scope.
The core browse-search-detail workflow is fully covered, including categories, listings, and rich detail such as seller history. Minor gaps exist, such as no explicit cross-category search or pagination control, but agents can work around them via the documented search behavior.
Maintenance
Related MCP Connectors
Search MCP servers, MCP clients and AI agents, and retrieve listing details. Free, read-only access.
Federated listings from personal humanMCP servers. Search offers, trades by humans.
Gamedeals MCP — wraps CheapShark API (game deal aggregator, no auth required)
AI-agent-first offers directory: search and publish listings via MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for interacting with Bazos.cz, Bazos.sk, Bazos.at, and Bazos.pl. Supports searching ads, retrieving ad details, and fetching user ratings.3113 npm4AGPL 3.0
- AlicenseAqualityDmaintenanceEnables AI assistants to search and view advertisements on Marktplaats.nl with extensive filtering options.520MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search and monitor Dutch and Belgian classifieds (Marktplaats and 2dehands) for listings, seller profiles, and categories.863 PyPI4MIT
- AlicenseAqualityBmaintenanceRead-only MCP server for Marktplaats.nl (Dutch classifieds) that lets agents search listings and read price, specs, condition, delivery, location, and seller details.34 npmMIT