Skip to main content
Glama
SZhukovWork
by SZhukovWork

dns-shop-mcp

English · Русский

An MCP server that gives LLM agents live, honestly-labelled data from DNS (dns-shop.ru), a large Russian electronics and home-appliance retailer: search with real pages, sorting, price windows and stock filters; the full product card for one city; per-store stock that separates packaged units from showcase samples; per-product ratings and reviews; weekly price history.

Buyer side, anonymous: no DNS account is used. Nothing is added to a cart and nothing is ordered.

Why this server

DNS's own numbers are easy to misread. The server is built around not doing that:

DNS pitfall

What this server does

Every dynamic page answers 401 with a Qrator proof-of-work challenge

A headless Chromium visit (≈1.5–2 s) earns the qrator_jsid2 cookie; the browser is closed and all data comes over plain HTTP. One fresh visit on a challenge or 403, then a clear error

The city depends on the client (geo-IP or Moscow by default); prices and stock differ by city

The city is set explicitly on every call (default Екатеринбург) and checked against the city each page and availability widget echoes; a mismatch is an error, not data

The rating on a card or tile merges all variants of a "multi-card" — colours, memory sizes, even different hardware models (iPhone 16: 2 268 reviews on the card, 452 for the black 128 GB A3287)

rating.shown_on_card (scope "card") next to rating.this_product; merges_several_models flag

Tiles round review counts: "2.3k отзывов"

Parsed as ≈2300 with reviews_approx: true; exact counts come from the card

"В наличии в 13 магазинах" counts stores that hold only a showcase sample

stores_with_packaged_units and showcase_only_stores from the store list (checked against the site's store dialog)

"доп. скидка 1 600 ₽" applies only when paid online (СБП); the checkout total stays 15 999 ₽

price_rub stays the regular price; the discount is a separate field and price_if_paid_online_estimate_rub is labelled as a conditional estimate

Products DNS no longer sells still carry a price: the last sale price

not_sold: true, price_rub absent, last_sale_price_rub separately

Marketplace ("DNS Селлер") items sit in the same search: another seller, 100 % prepayment, not in DNS stores

seller with legal name and INN, prepayment_required

Search silently narrows a query to one category and drops the order, price window and page on that redirect; some queries go to a catalog or brand page instead

The server repeats the request with every parameter; resolved_category, other_categories; brand queries return the brand's categories

"Cheapest first" is not strictly monotonic

Items re-sorted by price within the page, DNS's order kept in position, a note says so

Different products share one name; "Модель" in characteristics can be generic ("Apple iPhone 16")

code everywhere; model plus variant_specs (e.g. "A3287 (Nano-SIM + eSIM)") and all variants of a multi-card

A stale page token makes DNS answer "no states" — which looks like "no price"

Refreshed once, then an error; never reported as "no price"

Delivery cost is computed only in the cart

delivery_cost_rub: null with a note; only the courier ETA text is given

Every answer carries fetched_at (UTC) and city — the city id, name, where the choice came from and which part of DNS's answer confirmed it.

Related MCP server: wildberries-mcp

Tools

Tool

What it returns

search_products(query, page, sort, price_min, price_max, availability, category, city, with_availability)

24 items per page (fixed by DNS); sort popular / price_asc / price_desc / rating / reviews / newest / discount; availability any (site default, includes products no longer sold) / on_sale / in_stock / today / tomorrow / later / out_of_stock. resolved_category, other_categories, total_found_in_category, has_more, the category's price range and DNS's price buckets (page 1). Per item: code, name, short specs, price fields, not_sold + last_sale_price_rub, marketplace seller, avail_status, availability summary and stores_with_any_unit, card rating (scope "card"), reliability label, URL

get_product(product, city, include_stores, include_price_history, include_characteristics)

product = code, URL, 16-hex id or GUID. Price block (price, pre-discount price, each discount with its condition, online-payment estimate, credit payment, standard warranty and paid extensions), seller, availability (stores with any unit / with a packaged unit / showcase-only, pickup points, courier ETA, delivery_cost_rub: null), per-store stock with pickup time, card rating vs this product's rating with star split and aspect grades, DNS reliability statistic (share of units without service claims, reasons, category average), characteristics incl. "Модель", description, variants of a multi-card, price-history summary, questions count

get_reviews(product, page, limit, scope, sort, min_rating, max_rating, verified_buyers_only, with_photos, search, city)

scope product (default) or multicard (all variants of the card); sort newest / helpful / best; star filter (max_rating=2 = complaints); DNS's "real buyer" and photo filters; text search inside reviews. Date, stars, pros, cons, comment, usage period, bought variant, votes, photo count; statistics for the scope. No reviewer names

get_price_history(product, city)

DNS's weekly average selling prices (≈24 weeks) next to the live price; current_week_is_partial

compare_products(products, city)

Up to 24 products: one price request and one availability request for all, plus one review-statistics request each. Price fields, not-sold/prepayment flags, availability, this product's rating and the multi-card flag

Questions & answers are deliberately not fetched: they live on club.dns-shop.ru, whose rules forbid automated scripts.

Requirements

Measured on 2026-09-25 (Linux, home Russian IP, Playwright 1.63, Chromium 1243):

Python

≥ 3.10, with uv (or pip)

Browser

Playwright's Chromium, downloaded automatically on first run into ~/.cache/ms-playwright (≈660 MB on disk: headless shell 261 MB + Chromium 393 MB used as a fallback; shared by all Playwright tools). It runs only to pass the Qrator challenge: 1.5–2.0 s, then it is closed

Memory

Peak ≈500 MB (PSS of the server plus Chromium, during a Qrator pass); ≈75 MB between passes (the Python server alone)

Cold start

MCP initialize 1.4 s; the first tool call adds one Qrator pass (1.5–2 s) — a first search took 13.7 s in total

Call duration

Requests are paced 2 s apart: search 7–10 s (4–5 requests), get_product 21–26 s (10–12; 12–15 s for marketplace or not-sold items), get_reviews 3–7 s (1–3), get_price_history 5–9 s (3–4), compare_products ≈2 s × (2 + number of products). A single request takes 0.1–0.35 s

Re-pass

After ~15 min without calls the cookie expires (Max-Age 1000 s); the next call passes Qrator again (+1.5–2 s)

Display

Not needed: everything runs headless

Docker

Not needed

System libraries

Present on desktop Linux, macOS and Windows. On a minimal Debian/Ubuntu server install them once (root): uvx --from playwright playwright install --with-deps chromium

Network

A Russian IP without VPN: Qrator blocks foreign, VPN and datacenter addresses. Or set DNS_PROXY

Tested on

Linux (CachyOS). macOS and Windows are supported by Playwright but untested

Install

Claude Code:

claude mcp add dns-shop -- uvx --from git+https://github.com/SZhukovWork/dns-shop-mcp dns-shop-mcp

Any MCP client (claude_desktop_config.json, .mcp.json, …):

{
  "mcpServers": {
    "dns-shop": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/SZhukovWork/dns-shop-mcp", "dns-shop-mcp"]
    }
  }
}

From a checkout: uv venv && uv pip install -e . && .venv/bin/dns-shop-mcp.

Configuration (environment variables)

Variable

Default

Meaning

DNS_CITY

Екатеринбург

Default city: name as on the site, Name, Region for ambiguous names, the city slug or its GUID. Every tool also takes city

DNS_MIN_INTERVAL

2.0

Seconds between requests to DNS; values below 1.5 are raised to 1.5

DNS_PROXY

—

Proxy URL for HTTP and the browser, e.g. http://user:pass@host:3128

DNS_CACHE_DIR

~/.cache/dns-shop-mcp ($XDG_CACHE_HOME/dns-shop-mcp if set)

Session (cookie, city cookies, page tokens; file mode 0600, directory 0700) and the city directory (refreshed daily)

DNS_HEADLESS

1

0 shows the browser window during the Qrator pass (debugging)

What the numbers mean

  • price_rub: the price on dns-shop.ru in the reported city for a guest (not logged in) — the big price on the card. price_before_discount_rub is the struck-through price.

  • online_payment_discount_rub: the "доп. скидка" line. DNS applies it only when the order is paid online on the site (the badge says СБП); the card's "Итого" shows the regular price. price_if_paid_online_estimate_rub = price − discount, an estimate under that condition.

  • credit_monthly_rub: a loan or instalment payment — not a price.

  • not_sold / last_sale_price_rub: DNS does not sell the product now; the number is the last price it was sold at.

  • prepayment_required: 100 % prepayment (marketplace sellers).

  • Ratings: rating.shown_on_card is what the card shows and may merge all variants of a multi-card; rating.this_product counts only this product. Search tiles show the card rating (scope: "card").

  • Stock: stores_with_any_unit includes showcase samples; stores_with_packaged_units counts stores with a unit in its factory package; showcase_only_stores hold only a showcase sample. Pickup times are local time of the city as DNS sends them.

  • Reliability: DNS's own statistic of units sold in its stores without a service claim; not a manufacturer figure.

  • Price history: weekly average selling price ("За прошедшие недели отображается средняя цена продажи"); the last week is the current, partial one. Whether past weeks are city-specific is not confirmed (in a comparison of Moscow and Yekaterinburg past weeks matched while the current prices differed).

Limitations

  • Unofficial: relies on the site's internal endpoints and markup; DNS can change them any time. Parsers are isolated in parse.py and tested on recorded answers; when markup changes, fields go missing rather than being guessed.

  • robots.txt of dns-shop.ru disallows /search/ and URLs with ? for all robots; search cannot work without them. Keep the request rate human (the default pace is one request per 2 s) and use it for personal research only.

  • Qrator can change its challenge; a Playwright build that passes today may fail later. Qrator may bind the cookie to the IP (not verified).

  • No personal prices, ProZaPass bonuses or cart: no account is used.

  • Delivery cost is not available (only in the cart); only the courier ETA text.

  • Used/discounted units (/catalog/markdown/) are not supported: get_product refuses their URLs. Their card shows the rating of the new product. The markdown catalog ignores the search phrase, so a search tool needs more research.

  • Bundles ("Выгодные комплекты") and accessories/analogs sliders are not covered.

  • Questions & answers are not fetched (club.dns-shop.ru rules forbid scripts).

  • iPhones: buyers report units activated before sale; this server only passes such reviews on — it cannot check a unit.

  • DNS's "best rated" search order is its own ranking, not a strict sort by the shown rating; get_reviews(sort="best") means highest stars first.

Roadmap

  • Optional account mode (personal prices, bonuses) and cart — later.

  • Used/discounted units search — needs more research of the markdown catalog.

  • Checkout, payment and address changes are deliberately out of scope.

Development

uv venv && uv pip install -e '.[dev]'
.venv/bin/pytest            # offline tests on recorded, anonymised answers
.venv/bin/pytest -m live    # end-to-end over MCP stdio against live dns-shop.ru (Russian IP, ~30 requests)

Disclaimer

Not affiliated with DNS. The server uses the site's undocumented internal endpoints and passes its anti-bot check with a real browser. It is meant for personal price research at a human request rate; respect DNS's terms of use.

License: MIT.

Available Tools

5 tools
compare_productsA
Read-onlyIdempotent

Live side-by-side offers for up to 24 DNS products.

One price request and one availability request for all of them, plus one review-statistics request per product (≈2 s each). Per product: price, pre-discount price, online-payment discount (estimate), credit payment, not-sold flag, prepayment flag, availability summary, this product's own rating and whether its card merges several models.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity as on dns-shop.ru ('Екатеринбург', 'Москва', 'Name, Region') or its GUID; default: DNS_CITY or Екатеринбург
productsYesUp to 24 product codes (best), GUIDs or product URLs

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing the exact request pattern: one price request, one availability request, and one review-statistics request per product at approximately 2 seconds each. It also exposes the per-product result fields including the not-sold flag, prepayment flag, and whether the card merges several models. This is strong behavioral context beyond the read-only/idempotent hints.

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?

The description is compact and front-loaded with the core purpose. The second paragraph lists useful behavioral and field details without excessive elaboration. It could be slightly tighter by moving some field enumeration to the output schema, but it remains efficient and readable.

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

Completeness4/5

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

Given the rich annotations, full schema coverage, and presence of an output schema, the description covers the essential operational facts: batching, latency, and returned attributes. It is slightly less complete on when to choose this tool over siblings, but for actually invoking it correctly, the needed context is present.

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 100%, so the baseline is 3. The input schema already explains that products are codes, GUIDs, or URLs with a max of 24, and city is a DNS shop location or GUID. The description adds little parameter-level meaning beyond restating the 24-product limit, so it does not elevate above baseline.

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 opens with a clear verb and resource: 'Live side-by-side offers for up to 24 DNS products.' It makes the multi-product comparison intent obvious and distinguishes itself from single-item siblings like get_product or get_reviews, though it does not explicitly name those alternatives.

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 use case: compare up to 24 DNS products at once and receive aggregated pricing, availability, and review statistics. However, it never states when not to use this tool or when to prefer search_products, get_product, get_reviews, or get_price_history instead. Usage guidance is present only implicitly.

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

get_price_historyA
Read-onlyIdempotent

Weekly average selling prices DNS shows on the card (about 6 months), next to the live price.

Each point is one week's average selling price; the last point is the current, possibly partial week — it is not the current price (see current_price_rub). Whether past weeks are city-specific is not confirmed.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity as on dns-shop.ru ('Екатеринбург', 'Москва', 'Name, Region') or its GUID; default: DNS_CITY or Екатеринбург
productYesDNS product code ('Код товара', e.g. 5482008), product URL, the 16-hex id from the URL or the product GUID

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly, openWorld, and idempotent hints. The description adds valuable behavioral details: the data granularity (weekly averages), the partial week caveat for the last point, and the uncertainty about city-specificity. This goes beyond the structured hints and gives the agent realistic expectations about the data's nature and limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs, front-loaded with the main purpose. Every sentence contributes either data characteristics or a caveat. There is no redundancy or filler, making it highly efficient for an agent to parse quickly.

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?

Given the output schema already defines the return structure, the description covers all essential behavioral aspects: what the data represents, the partial week caveat, and a pointer to the current price. It is complete for a simple retrieval tool, leaving no critical information missing for correct invocation.

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 schema already describes both parameters with 100% coverage, including defaults and formats. The description adds a semantic note about the `city` parameter by warning that city-specificity is unconfirmed, which informs how to interpret results by city. This is a modest but useful addition beyond the schema.

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

Purpose5/5

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

The description clearly states the tool provides weekly average selling prices for a product, with the specific resource being the price history card on DNS. It distinguishes itself from current-price retrieval by explicitly noting the last point is not the current price and referencing `current_price_rub`, which differentiates it from sibling `get_product`.

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

Usage Guidelines4/5

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

The description guides usage by clarifying that the returned data is historical weekly averages, not the current price, and points to `current_price_rub` as the source for current price. However, it does not explicitly name an alternative sibling tool or state when to choose this tool over `get_product`, leaving some inference to the agent.

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

get_productA
Read-onlyIdempotent

Full, live product card for one DNS product in one city.

Price block (price, pre-discount price, each discount with its condition, online-payment estimate, credit payment, paid warranty extensions), marketplace seller with INN, availability (stores with any unit vs with a packaged unit vs showcase-only, pickup points, courier ETA; delivery cost is only known in the cart), per-store stock, the card rating next to this product's own rating with star split, DNS's reliability statistic, characteristics incl. "Модель", variants of a multi-card with their specs, and a weekly price-history summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity as on dns-shop.ru ('Екатеринбург', 'Москва', 'Name, Region') or its GUID; default: DNS_CITY or Екатеринбург
productYesDNS product code ('Код товара', e.g. 5482008), product URL, the 16-hex id from the URL or the product GUID
include_storesNoPer-store stock with packaged vs showcase units (+1 request)
include_price_historyNoWeekly price history summary (+1 request)
include_characteristicsNoFull characteristics incl. 'Модель', description, warranty (+1 request)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive behavior. The description adds valuable behavioral context: the data is live, delivery cost is only known in the cart, and the three include flags each add exactly one request. This goes well beyond the structured annotations.

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?

The purpose is front-loaded in one clear sentence, followed by a dense enumeration of returned content. The list is long but every clause contributes useful information; it is slightly unwieldy as one continuous sentence, so it does not earn a 5.

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?

With an output schema present and annotations covering side effects, the description adds the missing context: live freshness, request-cost implications of flags, delivery-cost limitation, and the card's scope. An agent has enough information to select and invoke this tool correctly.

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 100%, and each parameter already has a clear description. The tool description does not add per-parameter semantics, so the baseline of 3 is appropriate; the schema carries the parameter documentation burden.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Full, live product card for one DNS product in one city.' It lists concrete card components, which clearly distinguishes it from sibling tools like search_products, get_reviews, compare_products, and get_price_history.

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

Usage Guidelines4/5

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

The description makes the intended context clear: use this when you need the complete live product card for a single product in a single city. It does not explicitly mention when not to use it or name alternative tools, but the scope is strong and unambiguous.

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

get_reviewsA
Read-onlyIdempotent

Buyer reviews from dns-shop.ru: date, stars, pros, cons, comment, usage period, bought variant, votes.

Also returns the statistics for the chosen scope (average, star split, per-aspect grades, tag cloud) on unfiltered requests, and whether the card merges several models. Reviewer names are never returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity as on dns-shop.ru ('Екатеринбург', 'Москва', 'Name, Region') or its GUID; default: DNS_CITY or Екатеринбург
pageNoPage of reviews
sortNo'newest' first; 'helpful' = most up-voted; 'best' = highest stars first. For complaints use max_rating=2newest
limitNoReviews per page
scopeNo'product' = only this product; 'multicard' = all variants merged on its card (the site's default view)product
searchNoOnly reviews containing this text (site's own search), e.g. 'шум'
productYesDNS product code ('Код товара', e.g. 5482008), product URL, the 16-hex id from the URL or the product GUID
max_ratingNoOnly reviews with at most this many stars
min_ratingNoOnly reviews with at least this many stars
with_photosNoOnly reviews with photos
verified_buyers_onlyNoDNS's 'real buyer' filter

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds genuinely non-obvious behavior beyond those annotations: statistics are only computed on unfiltered requests, the response indicates whether the card merges several models, and reviewer names are never returned. This is exactly the kind of contextual detail an agent needs before invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core output, then adds the conditional statistics behavior and a privacy caveat. There is no filler, and every sentence contributes operational value without requiring the agent to parse a long block of prose.

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?

Given the rich input schema, output schema, and annotations, the description is complete: it covers what the reviews contain, the conditional statistics behavior, the multicard scope implication, and the reviewer-name privacy constraint. Nothing essential for an agent to call and interpret this tool is missing.

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?

The input schema already describes all 11 parameters with high coverage (100%), so the baseline is 3. The description adds no per-parameter syntax or format details; its extra notes about unfiltered requests and scope are behavior-level observations rather than parameter semantics. The schema carries the weight here.

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

Purpose5/5

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

The description immediately identifies the resource as buyer reviews from dns-shop.ru and enumerates the concrete fields returned (date, stars, pros, cons, comment, usage period, bought variant, votes). This clearly distinguishes get_reviews from sibling tools like search_products, get_product, and compare_products, which are about product discovery and comparison rather than reviews.

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 use case is implied by the tool name and content: use this when you need buyer reviews or their statistics. However, the description never explicitly says when to use this instead of a sibling, nor does it mention any exclusions or alternative tools. The guidance is present but only by implication.

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

search_productsA
Read-onlyIdempotent

Search DNS like the site does: 24 items per page, sorting, price window, stock filter.

Per item: code, name, short specs, the live city price (with pre-discount price, online-payment discount as a conditional estimate, credit payment), not-sold flag with the last sale price, marketplace seller, availability summary, the card's rating (may merge variants) and DNS's reliability label. DNS narrows every query to one category (resolved_category); total_found_in_category counts only there, other_categories lists the rest. Confirm finalists with get_product.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity as on dns-shop.ru ('Екатеринбург', 'Москва', 'Name, Region') or its GUID; default: DNS_CITY or Екатеринбург
pageNoResult page, 24 items per page (fixed by DNS)
sortNoOrder as on the site; 'reviews' = most reviewed firstpopular
queryYesSearch phrase as typed on the site (Russian works best)
categoryNo16-hex category id (from `resolved_category` / `other_categories`); default: the category DNS picks
price_maxNoUpper price bound, rubles
price_minNoLower price bound, rubles
availabilityNoDNS's stock filter: 'any' = site default, INCLUDES products no longer sold; 'on_sale' = everything that can be bought (in stock or to order); 'in_stock' = in a store of the city now; 'today'/'tomorrow'/'later' = to order; 'out_of_stock' = not sold any moreany
with_availabilityNoAlso fetch each item's availability summary (+1 request)

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark the operation read-only, idempotent, and non-destructive. The description adds substantial behavioral detail beyond that: fixed 24-item pages, conditional price estimates, merged ratings, the resolved_category behavior, total_found_in_category semantics, and the extra request cost of with_availability. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it front-loads the core search behavior, then details per-item fields, category narrowing, and the next step. The colon-list structure makes it scannable without wasted words.

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?

For a complex 9-parameter tool, the description covers the important behaviors: result shape, category resolution, pricing nuances, stock semantics, and the follow-up tool. An output schema exists, so the description does not need to restate return types. The only minor gap is not explicitly covering all sibling alternatives, but the tool is fully usable.

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 100%, so the baseline is 3. The description reinforces concepts like price window and stock filter but adds little meaning beyond what the schema already provides. It does not introduce new parameter semantics or clarify formats beyond the schema.

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

Purpose5/5

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

The description clearly identifies the tool as a DNS product search with site-like behavior: pagination, sorting, price window, and stock filter. It also differentiates itself from get_product by stating 'Confirm finalists with get_product', so an agent can distinguish search from detail retrieval.

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

Usage Guidelines4/5

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

The description makes clear this is the discovery/search step and explicitly points to get_product as the follow-up for confirming finalists. It does not discuss when to prefer compare_products, get_reviews, or get_price_history, but the core usage context is unambiguous.

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. 5 tool updatesv0.1.0
    • First observedcompare_products
    • First observedget_price_history
    • First observedget_product
    • First observedget_reviews
    • First observedsearch_products

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a clearly distinct aspect: search discovers products, get_product gives one full card, get_reviews covers opinions, get_price_history tracks pricing over time, and compare_products does side-by-side offers. There is no meaningful overlap in purpose, and the descriptions reinforce the boundaries.

Naming Consistency5/5

All five tools follow the same verb_noun snake_case pattern: search_products, get_product, get_reviews, get_price_history, compare_products. The verbs are consistent and predictable, and the objects clearly indicate what each tool operates on.

Tool Count5/5

Five tools is well-scoped for a product information server: search, detail, reviews, price history, and comparison cover the core browsing workflow without redundancy or bloat. This feels like a focused, intentional set.

Completeness5/5

The set covers the full lifecycle of product discovery and evaluation: finding products, inspecting one deeply, reading reviews, viewing price trends, and comparing multiple products. Availability and seller details are embedded in get_product and compare_products, so there are no obvious dead ends or missing core operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables querying DNS Shop product data via MCP: search, product details, reviews, specifications, variants, categories, brand catalogs, availability by city, and store listings.
    12
    18
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables LLM agents to query live Wildberries marketplace data — product search with pages, sorting, price filters, per-article ratings and reviews, weekly price history, and seller legal details — with honest, sanity-checked answers and automatic anti-bot handling.
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables LLM agents to retrieve live, accurately-labelled product data from Ozon's public storefront, including search with pagination and sorting, all price variants, delivery dates, seller legal details, variants, and SKU-specific ratings and reviews, all without an Ozon account.
    4
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables LLM agents to access live aliexpress.ru storefront data, including variant-specific ruble prices, order-accurate coupons, delivery quotes to Russian cities, seller info, and paginated buyer reviews with filters.
    4
    MIT