avito-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., "@avito-mcpFind used RTX 3060 12GB in Yekaterinburg under 25,000 rubles."
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.
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_partsopens 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 |
| One page of computer-goods listings (new/used/unknown), asking prices, seller ratings, snippets and links. Sort: |
| Search plus up to 5 full card reads, default 3. Returns only seller-declared used items; reports new/unknown/unavailable exclusions. Continue with |
| Full title, price, structured model/condition/specs, description, seller rating/type, date text, views and quoted hardware signals. |
| Refresh up to five exact listings side by side. Does not calculate a misleading “market value” from unrelated parts. |
| 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-mcpThe 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-mcpAny 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 slug. |
|
| Seconds between page reads in this process; minimum 3. Parallel tools share one browser lock. |
|
|
|
| unset | Optional Playwright proxy server URL. No proxy rotation. |
|
| Navigation timeout in seconds (10–90), plus up to 15 seconds for rendering. |
|
| Close Chromium after this many idle seconds (minimum 30). |
|
| Pause after an unresolved access challenge (minimum 60), persisted across restarts. |
|
| 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 browserComplete 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_offsetandnext_pagemake this explicit. Pages can shift, so deduplicate by listing id when continuing.total_foundis Avito's total before local filtering.limittruncates the current page; increase it to 50 to inspect the rest rather than assumingnext_pageresumes 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 AvitoOffline 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 toolscompare_listingsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes |
TDQS
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.
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.
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.
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.
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.
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_listingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
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.
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.
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.
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.
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.
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_statusARead-onlyIdempotent
Local status: default city, saved browser session, request count and access cooldown. Does not contact Avito or disclose cookies, tokens or account data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_listingsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| page | No | ||
| sort | No | relevance | |
| limit | No | ||
| query | Yes | ||
| price_max | No | ||
| price_min | No | ||
| local_only | No | ||
| seller_type | No | all |
TDQS
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.
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.
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.
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.
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.
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_partsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| page | No | ||
| sort | No | relevance | |
| query | Yes | ||
| offset | No | ||
| price_max | No | ||
| price_min | No | ||
| local_only | No | ||
| seller_type | No | all | |
| inspect_limit | No |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
compare_listings - First observed
get_listing - First observed
get_status - First observed
search_listings - First observed
search_used_parts
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Real eBay sold prices for used GPUs, CPUs, RAM and more in 7 markets, and eBay listing price checks.
31Free, read-only price comparison for products sold in Australia. Search products, browse categories, open a product with every seller's current price (eBay Australia, Amazon, JB Hi-Fi and more), and compare two products head to head. No login or API key. Answers come from Lianex's cached catalogue, so they are fast and never place an order or change anything. Docs: https://lianex.ai/developers
Merchant product catalogs for AI agents: price, availability, specs, variants, buy links. Read-only.
Read-only PC game search, current store offers and recorded price history. No account required.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA 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.-
- AlicenseAqualityCmaintenanceEnables 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.22MIT
- AlicenseAqualityCmaintenanceEnables 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.7MIT
- AlicenseBqualityBmaintenanceEnables 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.182MIT