Skip to main content
Glama

avito-mcp

English · Русский

Buyer-side MCP server for Avito, focused on used PC components in Yekaterinburg. Search live listings, inspect a full card, and compare exact offers. No Avito account or API key is required.

It reads the public storefront in a normal Playwright Chromium session. It is unofficial and does not use Avito's seller/business API.

Experimental: live search and card parsing were observed, but Avito blocked the subsequent MCP card call during validation. Full live coverage is incomplete; see the actual checks and limitations.

What it gets right

  • Search results can include other cities. local_only=true (default) checks each listing's URL city and excludes those offers. The page heading alone is not proof that every result is local.

  • search_used_parts opens full cards and only returns an explicit Б/у in the structured condition field. It does not infer used condition from a snippet, and does not pretend an ignored native condition parameter worked.

  • A used part can be broken. Repair, mining, defect and testing mentions carry excerpts and are text signals, not a diagnosis or a fraud score. Negated phrases such as “без артефактов” can also produce a mention.

  • Prices are asking prices, excluding unknown shipping/fees. From-prices and instalments are not passed off as a full item price. Missing values stay null.

  • Seller ratings are labelled as seller ratings, not hardware-model ratings.

  • Native price, seller-type and sort controls are checked in the returned page; ignored or changed filters fail explicitly. Requested price bounds are also applied locally to parsed prices.

  • Every network result includes its source URL and fetched_at. Unexpected layouts fail instead of returning a fake empty result.

Related MCP server: Avito Personal MCP

Tools

Tool

Purpose

search_listings(query, city, page, sort, price_min, price_max, seller_type, local_only, limit)

One page of computer-goods listings (new/used/unknown), asking prices, seller ratings, snippets and links. Sort: relevance, price_asc, price_desc, newest. Seller: all, private, company.

search_used_parts(query, city, page, sort, price_min, price_max, seller_type, local_only, offset, inspect_limit)

Search plus up to 5 full card reads, default 3. Returns only seller-declared used items; reports new/unknown/unavailable exclusions. Continue with next_offset on the same page, then next_page.

get_listing(url)

Full title, price, structured model/condition/specs, description, seller rating/type, date text, views and quoted hardware signals.

compare_listings(urls)

Refresh up to five exact listings side by side. Does not calculate a misleading “market value” from unrelated parts.

get_status()

Local default city, saved-session presence and remaining cooldown; no network request or credentials.

Example requests:

Find used RTX 3060 12GB in Yekaterinburg under 25,000 rubles.
Check the full cards; separate 3060 Ti and broken/repair offers.

Compare these two listing URLs: exact model, memory, seller, condition,
price and what the seller says about repairs or tests.

Install

Python 3.11+, Playwright Chromium and its system libraries are required. Docker and an account are not required. A display is needed only for the optional manual browser window.

With uv:

uvx --from playwright playwright install chromium
codex mcp add avito --env AVITO_CITY=ekaterinburg -- uvx --from git+https://github.com/SZhukovWork/avito-mcp avito-mcp

The Chromium version must match the installed Playwright package. If the server reports a missing browser, use the checkout instructions below to install it with that exact Python environment. On a minimal Debian/Ubuntu machine, python -m playwright install --with-deps chromium installs OS dependencies as well (requires the appropriate system privileges).

From a checkout:

python3 -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
.venv/bin/python -m playwright install chromium
.venv/bin/avito-mcp

Any stdio MCP client:

{
  "mcpServers": {
    "avito": {
      "command": "/absolute/path/to/.venv/bin/avito-mcp",
      "env": {"AVITO_CITY": "ekaterinburg"}
    }
  }
}

For Codex, allow enough time for a bounded used-parts scan:

[mcp_servers.avito]
command = "/absolute/path/to/.venv/bin/avito-mcp"
startup_timeout_sec = 30
tool_timeout_sec = 420

[mcp_servers.avito.env]
AVITO_CITY = "ekaterinburg"

Configuration

Variable

Default

Meaning

AVITO_CITY

ekaterinburg

Avito city slug. Екатеринбург and Екб also work. Per-call city overrides it.

AVITO_MIN_INTERVAL

4

Seconds between page reads in this process; minimum 3. Parallel tools share one browser lock.

AVITO_HEADLESS

1

0 shows the server's browser; requires a desktop display.

AVITO_PROXY

unset

Optional Playwright proxy server URL. No proxy rotation.

AVITO_TIMEOUT

45

Navigation timeout in seconds (10–90), plus up to 15 seconds for rendering.

AVITO_IDLE_TIMEOUT

300

Close Chromium after this many idle seconds (minimum 30).

AVITO_COOLDOWN

600

Pause after an unresolved access challenge (minimum 60), persisted across restarts.

AVITO_CACHE_DIR

$XDG_CACHE_HOME/avito-mcp or ~/.cache/avito-mcp

Browser state and pause marker. Created directory mode 0700; session files 0600.

The browser launches lazily, not during MCP initialization. No browser downloads occur silently at startup. Ordinary tool calls make only reads of public pages; they do not reveal phone numbers, contact sellers, add to cart, order, or pay.

Access checks and manual setup

Avito can limit an IP, show a captcha, or warn about a VPN. If usable listing data is absent, the server stops and reports the problem. It never solves a captcha automatically or rotates proxies. A warning overlay alongside parsed data is reported in site_warning, not hidden.

Check the site in a browser, wait for the restriction to expire, or run:

avito-mcp browser

Complete any challenge yourself in the separate window, then press Enter in the terminal to save its session and close it. This explicit setup clears the local cooldown; it does not guarantee that Avito accepts the next request. Use avito-mcp status to see the local state. Account login is not required and this server does not expose account actions. If you log in manually, the saved browser state can contain account credentials: do not share or commit it.

Limits and interpretation

  • Computer goods only in this release. Search can match irrelevant products or accessories: check the full model; “RTX 3060” also matches Ti and other cards.

  • Used search is a bounded scan, not a site-wide native Б/у filter. It may return no items after inspecting three new listings even when used ones exist later. next_offset and next_page make this explicit. Pages can shift, so deduplicate by listing id when continuing.

  • total_found is Avito's total before local filtering. limit truncates the current page; increase it to 50 to inspect the rest rather than assuming next_page resumes after the last returned item.

  • Local filtering uses URL city, not distance or a pickup address. Delivery estimates and landed cost are not quoted.

  • No claim of availability beyond the rendered page, no guarantee of working condition, no completed-sales history, no image diagnosis, no full seller review feed and no reliable promoted-listing detection.

  • Contact patterns in descriptions are masked. Public seller display names and profile links are retained; phone-reveal endpoints are never called.

  • Rate spacing is per process. Avoid running multiple clients against the same IP at once. Avito may change its UI/markers at any time.

Development

python -m pytest                 # offline parsers + real MCP stdio handshake
python -m pytest -m live -s      # optional: one search + one card against Avito

Offline tests use synthetic markup matching observed DOM structures; no browser session, private data, captured page scripts or cookies are shipped. Live tests are excluded from the CI template in ci/github-actions.yml. To enable GitHub Actions, copy it to .github/workflows/tests.yml and push with a credential that allows workflow changes. It is not active in this initial repository publication. See VALIDATION.md for the release checks.

Not affiliated with Avito. Intended for occasional personal buyer research. Respect the site's terms and request limits. MIT license.

Available Tools

5 tools
compare_listingsA
Read-onlyIdempotent

Refresh up to five exact listings side by side. No automatic bargain/risk score. Compare model, memory, condition, included accessories and quoted defects before prices.

NameRequiredDescriptionDefault
urlsYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the description only needs to add context. It does: it discloses that no bargain/risk verdict is produced and that the comparison is refreshed live, which sets correct output expectations — a genuinely useful addition 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.

Conciseness4/5

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

Two short sentences with the capability front-loaded and the caveat second. The trailing 'before prices' is slightly compressed prose but still earns its place by sequencing attributes ahead of price.

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 read-only, single-parameter tool with no output schema, the description supplies the scope limit, the non-goal (no scoring), and the attributes compared (model, memory, condition, accessories, defects), which implicitly describes the returned structure. Nothing essential to calling it correctly 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?

Schema coverage is 0%, so the description carries the burden. 'Up to five exact listings' partly compensates: it identifies the input as listing URLs (not search queries) and matches the maxItems=5 bound. It never states that at least one URL is required, nor the URL form expected.

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 — refresh/compare exact listings side by side — with the hard limit of five that separates it from get_listing (single listing) and search_listings (discovery). Siblings are not named explicitly, so the distinction is inferred rather than stated.

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?

'Compare ... before prices' implies the situation (deciding between known listings) and 'No automatic bargain/risk score' rules out expecting a verdict. But there is no explicit when-to-use, when-not, or pointer to get_listing for a single item, so routing is left to inference.

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

get_listingA
Read-onlyIdempotent

Read a full Avito listing URL: price, seller-declared condition, model/parameters, description, seller rating/type and quoted defect/mining/repair/testing mentions. No phone reveal, login, messaging or purchase. A visible listing may already be sold.

NameRequiredDescriptionDefault
urlYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new context beyond them: no phone reveal or login-gated data, no side effects such as messaging or purchase, and that a visible listing may already be sold (staleness caveat).

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?

Three short sentences with the capability front-loaded, boundaries second, and the staleness caveat last. No filler, no restatement of the tool name.

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?

No output schema exists, and the description fills that gap by naming the fields returned and the content deliberately excluded. Combined with the annotations, an agent has enough to call it correctly and to interpret what it will and won't get back.

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 single required parameter is only identified as 'url'. The description implies it must be an Avito listing URL but gives no format, canonicalization, or error behavior for invalid/shortened links, so it only partially compensates for the bare 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?

States a specific verb plus resource ('Read a full Avito listing URL') and enumerates exactly what is returned: price, seller-declared condition, model/parameters, description, seller rating/type, and quoted defect/mining/repair/testing mentions. This clearly separates it from search_listings and compare_listings, which operate over sets rather than a single fetched listing.

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 exclusions ('No phone reveal, login, messaging or purchase') tell the agent what this tool cannot accomplish, which is useful negative guidance. However, it never states when to prefer this over search_listings or compare_listings, nor what input conditions are required (e.g. a canonical listing URL).

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

get_statusA
Read-onlyIdempotent

Local status: default city, saved browser session, request count and access cooldown. Does not contact Avito or disclose cookies, tokens or account data.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, but the description adds substantive context the annotations cannot convey: no network contact with Avito and no exposure of cookies, tokens, or account data. That directly addresses an agent's privacy/side-effect concerns, going beyond the safety hints.

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?

Two sentences, no filler. The list of returned fields comes first and the safety constraint second, so the most decision-relevant information is front-loaded.

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?

With no output schema, the description is the only source of return-value information, and it enumerates the four fields adequately. It could be slightly richer (e.g., what 'access cooldown' means numerically), but an agent has enough to call it and interpret the result.

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 disambiguate. Baseline of 4 applies; no parameter-related gaps exist.

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 first sentence names the concrete payload of the tool — default city, saved browser session, request count, access cooldown — so an agent knows exactly what a call returns. It implicitly separates itself from the remote-query siblings by labeling this 'Local status', though it never explicitly references them.

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 second sentence implies a safe, offline context and rules out any Avito-side effects, which hints at when this is appropriate (checking local state before a real request). But it never states when to call it versus get_listing/search_listings, nor any precondition such as 'call this first to check cooldown'.

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

search_listingsA
Read-onlyIdempotent

Search Avito's computer-goods category, default Екатеринбург. Includes new/used/unknown.

Price window, sorting and seller filter are checked against the site's controls. Returns one site page (up to 50 listings), asking prices, links, seller ratings, snippet text and lexical hardware signals. local_only filters by listing URL city. total_found is BEFORE local filters. Use get_listing to confirm condition and health claims.

NameRequiredDescriptionDefault
cityNo
pageNo
sortNorelevance
limitNo
queryYes
price_maxNo
price_minNo
local_onlyNo
seller_typeNoall

TDQS

A4.5/5.0
Behavior5/5

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

Annotations cover the safety profile, and the description adds substantial behavior the agent could not infer: exactly one site page per call (up to 50 listings), the returned fields (asking prices, links, seller ratings, snippet text, lexical hardware signals), and the crucial caveat that total_found is counted BEFORE local filters. It also flags that price/sort/seller filters are validated against the site's own controls, which explains silent filter degradation.

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?

Dense and front-loaded: category and default city come first, return shape and caveats follow. A few lines are compressed into run-ons ('Includes new/used/unknown') but no sentence is filler.

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?

With no output schema, 9 parameters and 0% schema coverage, the description supplies the return-value and filter-caveat information that would otherwise be missing. Remaining gaps are query-syntax expectations, pagination limits beyond `page`, and failure/empty-result behavior for an open-world scraper.

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 carry parameter meaning, and it does for most: city default, price window, sort, seller filter, and especially local_only (filters by listing URL city) and total_found semantics that the schema never explains. It does not clarify `page` behavior or the interplay between `limit` and the stated 'up to 50 listings' cap.

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 and resource ('Search Avito's computer-goods category') plus the default scope (Екатеринбург) and category boundary, which implicitly separates it from search_used_parts. It also names the follow-up sibling get_listing, so an agent can place the tool in the workflow without opening a sibling schema.

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?

Gives an explicit handoff rule ('Use get_listing to confirm condition and health claims') and explains that local_only/total_found interact in a non-obvious way. It never states when to prefer search_used_parts or compare_listings, so the alternative selection is left to inference.

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

search_used_partsA
Read-onlyIdempotent

Find used PC parts by checking the actual condition in full listing cards.

One search plus up to 5 card reads (default 3). Only structured condition Б/у passes; new/unknown items are excluded and counted. Broken/repair items remain and carry text signals. This is a bounded scan of ONE page, not exhaustive or globally cheapest. Continue with next_offset on the SAME page, then next_page. Results can shift between calls.

NameRequiredDescriptionDefault
cityNo
pageNo
sortNorelevance
queryYes
offsetNo
price_maxNo
price_minNo
local_onlyNo
seller_typeNoall
inspect_limitNo

TDQS

A3.7/5.0
Behavior4/5

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

Beyond the annotations it explains the inspection budget (one search plus up to 5 card reads, default 3), the filter semantics (only structured Б/у passes, new/unknown excluded and counted, broken/repair retained with text signals), and result instability across calls. readOnlyHint/destructiveHint are consistent with this; 'results can shift between calls' sits in mild tension with idempotentHint but does not contradict it since no environment state is modified.

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?

Four short sentences, front-loaded with the purpose, then the cost model, the filter rule, and the scope limits. No filler, and each sentence carries a distinct operational fact.

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?

The core mechanics of a 10-parameter, no-output-schema tool are covered, but the definition is silent on the majority of filter parameters and on what a result record contains beyond condition text. An agent can call it correctly on query/inspect_limit/pagination but will underuse the filtering surface.

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% across 10 parameters, so the description must carry the load; it does explain the non-obvious dual pagination (offset within a page, then page) and inspect_limit's default/max. It says nothing about city, sort, price_min/price_max, local_only, or seller_type, leaving most filtering parameters to be guessed from the schema alone.

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 concrete verb and resource ('Find used PC parts') plus the distinguishing mechanism ('checking the actual condition in full listing cards'), which separates it from a plain listing search. It never names the sibling search_listings explicitly, so the boundary is implied rather than stated.

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?

Gives real usage boundaries — 'bounded scan of ONE page, not exhaustive or globally cheapest' and continuation instructions. However, those are pagination rules rather than a when-to-use-this-vs-search_listings/get_listing/compare_listings rationale, so an agent still has to infer tool selection.

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_listings
    • First observedget_listing
    • First observedget_status
    • First observedsearch_listings
    • First observedsearch_used_parts

TDQS

A4/5.0

Scored across 5 tools

Disambiguation4/5

Most tools have clearly distinct roles: get_listing reads one listing, compare_listings compares up to five, get_status reports local state. search_listings and search_used_parts overlap because both search Avito, but the specialized condition-filtered purpose of search_used_parts is explained well enough to reduce confusion.

Naming Consistency4/5

Names consistently use snake_case with a leading verb (get_, search_, compare_), which is predictable. Minor deviations include singular/plural noun forms (get_listing vs search_listings) and the extra adjective in search_used_parts, but the pattern remains readable.

Tool Count5/5

Five tools are well-scoped for a read-only Avito listing research server: general search, used-parts search, single-listing read, comparison, and local status. Each tool has a clear place and the set is neither thin nor bloated.

Completeness4/5

The surface covers the core read-only workflow: search listings, find used parts by condition, inspect a listing, compare exact listings, and check local status. Minor gaps remain, such as no dedicated seller/profile retrieval or category discovery, but agents can work around these via existing search and listing reads.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A remote MCP server that searches Avito for new classified ads, filtering by price and returning only previously unseen listings. Designed for scheduled monitoring via ChatGPT tasks.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables local-first, read-only interaction with Avito through your own authenticated Chrome session, without sharing credentials with the MCP client. Provides tools for searching listings, viewing your listings, favorites, chats, and messages.
    2
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables LLM agents to fetch live Yandex Market data via plain HTTP, with honest labeling of prices (pay-card vs plain vs discounted), sponsored tiles, seller and model-group ratings, reviews, questions, and seller legal details. It avoids common scraped-data traps such as misleading discounts, captcha pages, and cross-border or conditional offers.
    7
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables an LLM to control a separate Chrome session on Avito for searching and parsing listings, reading account and Pro dashboards/statistics, switching profiles, and editing forms. Requires explicit confirmation for irreversible actions.
    18
    2
    MIT