Server data from the Official MCP Registry
Avito API MCP for autonomous AI agents to operate an account hands-free - not a scraper.
Avito API MCP for autonomous AI agents to operate an account hands-free - not a scraper.
Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry.
3 files analyzed · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: Client_id
Environment variable: Client_secret
Environment variable: Profile_id
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-elchin92-avito-mcp": {
"env": {
"Client_id": "your-client-id-here",
"Profile_id": "your-profile-id-here",
"Client_secret": "your-client-secret-here"
},
"args": [
"-y",
"avito-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
Give your AI agents hands and feet on Avito. Local MCP server that lets Claude, Cursor, Cline and any other AI assistant do real work on Avito for you — answer customers, manage listings, run promotions, fulfil orders, analyse stats. 138 Avito API tools + 7 local/meta tools = up to 145 MCP tools across 18 official Avito APIs, one
npxcommand to install.
🇷🇺 Русская версия / Russian version →
New in v0.7.2 — bugfix sweep: 6 input schemas brought in line with the real Avito request bodies (
stock_update_stocksquantity, BBIP forecasts, account spendings grouping, promotion ordersperPage, delivery custom-area-schedule array, create-parcel required fields) + README tool-count correction (145). See CHANGELOG.v0.7.1 —
promotion_create_bbip_order_for_items_v1matches the AvitoBbipOrderByItemV1contract ({itemId, duration, oldPrice, price}); the oldbudgetfield made every BBIP order fail.v0.7.0 — universal-package hardening: opt-in
dryRunandidempotencyKeyon every destructive tool, cross-process token-file lock, structured error taxonomy (error.type,retryable,retryAfter), three new typed meta tools (meta_health,meta_auth_status,meta_capabilities), CLI flags (--readonly/--dry-run/--health/--no-confirmation). No breaking changes; safe defaults preserved.v0.6.0 — full MCP 2025-11-25 alignment: 6 MCP resources, 5 prompts, structured tool outputs, MCP logging mirroring, subscribable
state/pending-actions.
Avito is Russia's largest classifieds marketplace (~250M monthly visits). Selling there involves dozens of repetitive operations every day: replying in chats, refreshing listings, applying paid promotion, generating shipping labels, watching stats.
avito-mcp exposes every public Avito API as a tool your AI agent can call. Plug it into your favourite MCP client and your agent can run an entire Avito storefront — autonomously — from natural language.
npx -y avito-mcp, no clone/build, no Docker1. Get OAuth credentials from the Avito Developer Portal: Client_id, Client_secret, and your Profile_id (your numeric account ID, shown on the same page).
2. Add this snippet to your MCP client's config (the JSON is the same for every client — only the file path differs, see the next section):
{
"mcpServers": {
"avito": {
"command": "npx",
"args": ["-y", "avito-mcp"],
"env": {
"Client_id": "YOUR_CLIENT_ID",
"Client_secret": "YOUR_CLIENT_SECRET",
"Profile_id": "YOUR_PROFILE_ID"
}
}
}
}
3. Restart your client. Ask your agent:
"What's my Avito balance and how many unread chats do I have?"
Done. Two API calls, real answer.
Most MCP servers are designed to be called by hand from a chat window. avito-mcp is designed to be left running — picked up by multi-agent runtimes and scheduled agents that operate without you watching.
Typical deployment patterns:
The stdio transport keeps every credential and API response on your machine. No proxy. No SaaS in the middle.
→ See the full list of compatible runtimes at modelcontextprotocol.io/clients.
| Configuration | Tools visible |
|---|---|
Default (AVITO_MCP_MODE=full_access, no opt-ins) | 141 |
+ AVITO_MCP_EXPOSE_AUTH_TOOLS=1 | 144 (+3 auth) |
+ AVITO_MCP_ALLOWED_UPLOAD_DIRS=… | 142 (+1 upload) |
| + Both opt-ins | 145 |
AVITO_MCP_CONFIRMATION_MODE=off | −3 (hides meta_*_action) |
AVITO_MCP_MODE=read_only | ~80 (only risk=read) |
AVITO_MCP_MODE=guarded | ~123 (adds write, hides money/public) |
138 wrap Avito API endpoints; 7 are local meta tools: meta_get_rate_limits, three meta_*_action for the confirmation flow (when enabled), plus meta_health, meta_auth_status, meta_capabilities (v0.7.0). Run npm run generate:manifest to dump the full inventory to dist/manifest.json.
Every public endpoint from Avito's 18 OpenAPI specs is exposed. Click any group to expand.
Avito API snapshot date: 25 May 2026. The bundled swaggers (
./swaggers/) reflect Avito's public API as of that date. Avito occasionally adds or revises endpoints — if you spot drift (404 on a known method, new method missing), open an issue and we'll bump the snapshot.
items_get_items_info — list your listings (pagination, status, category filters)items_get_item_info — full details of one listingitems_post_calls_stats — call statistics per item per dayitems_post_vas_prices — promotion service prices for given itemsitems_post_item_stats_shallow — basic views/contacts/calls over a perioditems_post_item_analytics — extended analytics with grouping & sortingitems_post_account_spendings — spend breakdown by service typeitems_update_price ⚠️ — change listing priceitems_put_item_vas ⚠️ — apply one paid VAS serviceitems_put_item_vas_package_v2 ⚠️ — apply a VAS packageitems_apply_vas ⚠️ — apply multiple VAS slugs at oncemessenger_get_chats_v2 — list chats (filters: unread, item_ids, chat_types)messenger_get_chat_by_id_v2 — details of one chatmessenger_get_messages_v3 — message history in a chat (paginated)messenger_get_voice_files — download URLs for voice messagesmessenger_get_subscriptions — current webhook subscriptionsmessenger_post_send_message ⚠️ — send a real text reply to a customermessenger_post_send_image_message ⚠️ — send an image (use upload first)messenger_upload_images — multipart upload, returns image_idsmessenger_delete_message ⚠️ — delete a messagemessenger_chat_read — mark all unread in a chat as readmessenger_post_blacklist_v2 ⚠️ — block users (with reason codes)messenger_post_webhook_v3 ⚠️ — subscribe to push notifications (needs public URL)messenger_post_webhook_unsubscribe — unsubscribeorders_get_orders — list orders with filtersorders_get_courier_delivery_range — available courier time slotsorders_download_label — fetch generated label PDForders_markings ⚠️ — submit "Честный знак" (mandatory product marking)orders_accept_return_order ⚠️ — choose Russian Post office for returnorders_apply_transition ⚠️ — change order status (confirm/ship/cancel)orders_check_confirmation_code — verify pickup codeorders_cnc_set_details ⚠️ — click-and-collect order detailsorders_set_courier_delivery_range ⚠️ — pick a courier time slotorders_set_tracking_number ⚠️ — set carrier tracking numberorders_generate_labels — generate labels (≤100 orders)orders_generate_labels_extended — generate labels (≤1000 orders)XML/YML/CSV feed uploads, report retrieval, ID mapping, category schema lookup. Includes both v1 (deprecated, kept for compatibility) and v2/v3.
autoload_upload ⚠️ — trigger a feed upload (rate-limited to 1/hour)autoload_get_profile_v2, autoload_create_or_update_profile_v2 ⚠️ — manage feed profileautoload_get_reports_v2 — list upload reports with paginationautoload_get_report_by_id_v3, autoload_get_last_completed_report_v3 — report detailsautoload_get_report_items_by_id, autoload_get_report_items_fees_by_id — per-item resultsautoload_get_ad_ids_by_avito_ids, autoload_get_avito_ids_by_ad_ids — ID mappingautoload_user_docs_tree, autoload_user_docs_node_fields — category schema referenceAvito's logistics partner API for delivery service providers. Most users will never call these — they're for shipping companies integrating with Avito Delivery. Includes both production endpoints and sandbox endpoints for partner testing. Full list in the source: src/domains/delivery.ts.
cpa_*cpa_target_get_bids, cpa_target_save_auto_bid ⚠️, cpa_target_save_manual_bid ⚠️, …cpa_auction_get_user_bids, cpa_auction_save_item_bids ⚠️user_get_user_info_self, user_get_user_balance, user_post_operations_historystock_get_stocks_info, stock_update_stocks ⚠️reviews_get_reviews_v1, reviews_create_review_answer_v1 ⚠️, reviews_remove_review_answer_v1 ⚠️, reviews_get_ratings_info_v1auth_get_access_token (debug; the server manages tokens automatically), auth_get_access_token_authorization_code, auth_refresh_access_token_authorization_codemeta_get_rate_limits — observe X-RateLimit-* across all domains⚠️ marks methods that spend real money or affect live data (price changes, paid promotion, customer-facing messages, blocked users). Safe read-only smoke tools:
user_get_user_balance,items_get_items_info,messenger_get_chats_v2,meta_get_rate_limits.
Beyond tools, the server exposes MCP resources (data your agent can fetch without an API call) and prompts (canned workflows that orchestrate the right tools in the right order).
| URI | Type | What's in it |
|---|---|---|
avito://docs/safety | text/markdown | Safety modes + confirmation guide |
avito://manifest | application/json | Live tool catalogue (risk / domain / title / annotations) |
avito://state/config | application/json | Active config snapshot — secrets redacted |
avito://state/rate-limits | application/json | Latest X-RateLimit-* per Avito domain |
avito://state/pending-actions | application/json | Pending confirmations — subscribable, emits notifications/resources/updated |
avito://swaggers/{slug} | application/json | One resource per file in swaggers/ (autocomplete via complete) |
Subscribe to avito://state/pending-actions and your client sees every create/confirm/cancel/expire in real time — perfect for UIs that want a "things waiting for human" indicator.
| Name | Args | Purpose |
|---|---|---|
avito_daily_overview | days? (default 7) | Balance + active items + spendings (read-only, no confirmation) |
avito_check_unread_chats | limit? (default 20) | Triage unread chats; explicit "don't send / don't blacklist" guard |
avito_safety_report | — | Self-describe via state/config + manifest + docs/safety |
avito_explain_tool | tool_name | Cross-reference one tool's manifest entry + matching swagger |
avito_promote_item | item_id | Gather everything needed before a paid VAS purchase; explicit "не покупай" |
Every tool now returns structuredContent alongside the text block — clients can parse Avito responses as JSON without regex:
{ status, ...data }{ status, items, count }{ status, mimeType, sizeBytes, base64 }{ error_kind, status?, request, body? } with isError: trueSelected pino events (mode changes, hidden-tool reports, confirmation lifecycle, rate-limit warnings) are forwarded to the client as notifications/message with logger: "avito-mcp". Clients that adjust verbosity via logging/setLevel work as expected. Pino → stderr is preserved.
These are opt-in primitives meant to make the package safe to use in any automation context — manual chat, scheduled jobs, multi-agent runtimes, server farms — without committing to a specific orchestrator or backend.
Every destructive tool (risk: write | money | public) accepts an optional dryRun: boolean parameter. When true, the tool returns a structured preview of the HTTP request it would have made — no call to Avito. Useful both for human inspection ("what is the agent about to do?") and for agents that want to think before acting.
{
"name": "items_update_price",
"arguments": { "item_id": 12345, "price": 1400, "dryRun": true }
}
→ structuredContent: { dryRun: true, operation: { tool, method, path, ... }, request_preview: { ... } } and fetch is never called.
You can flip the default for the entire server: AVITO_MCP_DRY_RUN_DEFAULT=true or --dry-run. Then every destructive tool short-circuits unless the agent explicitly passes dryRun: false.
Every destructive tool also accepts an optional idempotencyKey: string. The server keeps an in-memory ledger keyed by (tool, key, hash(args)):
structuredContent.idempotent_replay: true. No second HTTP call.IdempotencyConflictError (the dedupe contract was violated).This is the simplest reliable defence against duplicate sends after retries, crashes, or race conditions between concurrent agents. TTL via AVITO_MCP_IDEMPOTENCY_TTL_SEC (default 1 hour).
All errors return both human text and a machine envelope:
{
"isError": true,
"structuredContent": {
"error": {
"type": "AVITO_RATE_LIMIT",
"message": "Avito API 429 for POST ...",
"retryable": true,
"retryAfter": 60,
"httpStatus": 429
}
}
}
type ∈ AVITO_BAD_REQUEST | AVITO_UNAUTHORIZED | AVITO_FORBIDDEN | AVITO_NOT_FOUND | AVITO_RATE_LIMIT | AVITO_SERVER_ERROR | AVITO_API_ERROR | NETWORK_ERROR | TIMEOUT | INTERNAL_ERROR.
Agents can branch on retryable and retryAfter programmatically — no regex over English text.
| Tool | What it returns |
|---|---|
meta_health | Overall health snapshot: version, uptime, capabilities, safety mode, counters (pending actions, idempotency entries, rate-limit snapshots) |
meta_auth_status | OAuth token metadata only — tokenPresent, expiresInSec, last error. The token value is NEVER exposed. With probe: true will attempt a refresh. |
meta_capabilities | Machine-readable config: mode, allow/deny counts, feature flags (dryRun, idempotency, confirmation, hardConfirmation, fileUploads, sensitiveAuthTools) |
All three have strict outputSchema (zod) — clients can validate against the contract.
If you run multiple avito-mcp processes against the same token file (cron + chat + CLI), they no longer hit Avito's /token endpoint in parallel. The first to acquire {tokenFile}.lock refreshes; the rest wait, then read the freshly-refreshed token from disk. Stale locks (dead PID, ancient timestamp) are reclaimed automatically. Tunable via AVITO_MCP_TOKEN_LOCK_TIMEOUT_MS (default 30s).
Convenience shortcuts that translate to env vars (env wins if both set):
avito-mcp --readonly # AVITO_MCP_MODE=read_only
avito-mcp --guarded # AVITO_MCP_MODE=guarded
avito-mcp --dry-run # AVITO_MCP_DRY_RUN_DEFAULT=true
avito-mcp --no-confirmation # AVITO_MCP_CONFIRMATION_MODE=off
avito-mcp --health # print JSON health snapshot and exit
--health does not connect stdio transport — ideal for Docker / Kubernetes / supervisord health probes:
healthcheck:
test: ["CMD", "avito-mcp", "--health"]
interval: 30s
The JSON snippet from the Quick Start section above works in every MCP-compatible client — only the path to the config file changes. Pick yours below:
| OS | Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
Create the file if it doesn't exist; otherwise add the avito entry to the existing mcpServers block. Fully quit Claude Desktop (system tray) and reopen — a 🔌 avito indicator should appear at the bottom of the chat.
Logs: ~/Library/Logs/Claude/mcp-server-avito.log (macOS).
Easiest — one command:
claude mcp add avito npx -y avito-mcp \
-e Client_id=YOUR_CLIENT_ID \
-e Client_secret=YOUR_CLIENT_SECRET \
-e Profile_id=YOUR_PROFILE_ID
Or add .mcp.json to your project root (use the JSON from Quick Start, plus "type": "stdio"). Verify with claude mcp list.
Path: ~/.cursor/mcp.json (global) or <project>/.cursor/mcp.json (per-project). Use the Quick Start JSON as-is. Reload window after saving (Cmd/Ctrl + Shift + P → "Reload Window").
OpenAI's Desktop app added MCP server support via the Connectors UI. Settings → Connectors → Add custom MCP server → fill in:
Avitostdionpx-y avito-mcpClient_id, Client_secret, Profile_idPath: ~/.codeium/windsurf/mcp_config.json. Use the Quick Start JSON. Alternative: Settings → Cascade → MCP Servers → Add Server (UI).
In VS Code: Cline icon → ⚙️ → MCP Servers → Edit cline_mcp_settings.json.
| OS | Path |
|---|---|
| macOS | ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json |
| Windows | %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json |
| Linux | ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json |
Use the Quick Start JSON. Cline auto-reloads without VS Code restart.
Add to ~/.continue/config.json:
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "npx",
"args": ["-y", "avito-mcp"],
"env": { "Client_id": "...", "Client_secret": "...", "Profile_id": "..." }
}
}
]
}
}
Open Settings (Cmd+,), find the context_servers block:
{
"context_servers": {
"avito": {
"command": {
"path": "npx",
"args": ["-y", "avito-mcp"],
"env": { "Client_id": "...", "Client_secret": "...", "Profile_id": "..." }
}
}
}
}
Microsoft added MCP support to Copilot Chat in 2025. Create .vscode/mcp.json in your workspace or use the Command Palette → "MCP: Add Server". Same Quick Start JSON.
OpenAI's CLI assistant supports MCP via ~/.codex/config.toml:
[mcp_servers.avito]
command = "npx"
args = ["-y", "avito-mcp"]
env = { Client_id = "...", Client_secret = "...", Profile_id = "..." }
Settings → Tools → AI Assistant → MCP → Add server. Fill the same fields (command npx, args -y avito-mcp, env variables). Applies to IntelliJ IDEA, PyCharm, WebStorm, GoLand, Rider.
Block's open-source CLI agent. Add via goose configure → MCP server → paste the Quick Start JSON. Config lives in ~/.config/goose/config.yaml.
Both are forks of Cline and use the same config format and path patterns — replace saoudrizwan.claude-dev in the path with the fork's extension ID (rooveterinaryinc.roo-cline or kilocode.kilo-code). JSON is identical.
Edit librechat.yaml:
mcpServers:
avito:
type: stdio
command: npx
args: ["-y", "avito-mcp"]
env:
Client_id: "..."
Client_secret: "..."
Profile_id: "..."
Settings → MCP Servers → Add. UI fields: name avito, command npx, args -y avito-mcp, env vars same as above.
The server speaks stock stdio MCP. Universal parameters:
command: npxargs: ["-y", "avito-mcp"]env: { Client_id, Client_secret, Profile_id }transport: stdioBrowse the MCP clients directory for new ones.
Drop these into your AI client to see what's possible:
📊 Analyse
💬 Communicate
💰 Promote
📦 Fulfil
ready_to_ship and generate labels in a single PDF."🤖 Automate
Avito provides separate APIs for the following verticals — their swagger specs are not bundled:
| Category | Where to find |
|---|---|
| 🏷️ Auction | Avito Auction API |
| 🤖 Auto-strategies (automated bidding) | Avito Autostrategy API |
| 🚗 Autoteka (vehicle history) | Avito Autoteka API |
| 💼 Jobs / Vacancies | Avito Jobs API |
| 📊 Real-estate reports | Avito Realty Reports API |
| 🏠 Short-term rent | Avito STR API |
Also out of scope: authorization_code OAuth flow (no public redirect URI on a local CLI), webhook receiver (needs a public URL), Avito sandbox (no sandbox credentials).
env block or local .env. They're never sent anywhere except api.avito.ru.$XDG_STATE_HOME/avito-mcp/token.json (≈ ~/.local/state/avito-mcp/token.json)~/Library/Application Support/avito-mcp/token.json%APPDATA%\avito-mcp\token.jsonAVITO_TOKEN_FILE. Delete the file to force a refresh.AVITO_MCP_MODE (read_only / guarded / full_access) — registration-time gate. Hidden tools never appear in tools/list. read_only ≈ 80 tools, guarded adds writes (~123 tools), full_access is the full 138 Avito + 7 meta (+ opt-in extras).AVITO_MCP_ALLOW_TOOLS / AVITO_MCP_DENY_TOOLS — per-tool gating. Deny wins over allow.AVITO_MCP_CONFIRMATION_MODE (off / money_public (default) / all_destructive) — runtime gate. Destructive tools return {requires_confirmation: true, confirmation_id: ...}; agent must call meta_confirm_action to execute. Pending state is in-memory, TTL'd (default 15 min), one-shot.AVITO_MCP_EXPOSE_AUTH_TOOLS (default: 0) — auth_* tools return OAuth tokens; classed as sensitive and hidden by default even in full_access.AVITO_MCP_ALLOWED_UPLOAD_DIRS — messenger_upload_images reads files from disk; without an explicit directory allowlist it doesn't register at all. Path validation uses realpath (symlink-escape proof), extension allowlist (jpg/jpeg/png/webp), size cap (AVITO_MCP_MAX_UPLOAD_MB, default 15), magic-byte sniff with extension cross-check.sensitive / read / write / money / public), exposed as MCP ToolAnnotations (readOnlyHint, destructiveHint) and as _meta.risk, and listed in dist/manifest.json. Well-behaved MCP clients warn before destructive calls.docs/safety.md for ready-to-paste configs (analytics-only, customer-support with confirmation, listings-only, full admin) and a frank discussion of what the confirmation flow is and isn't (it's a server-side two-step + audit layer, not a cryptographic human-approval mechanism).user_get_user_balance, items_get_items_info, messenger_get_chats_v2, meta_get_rate_limits.For development, air-gapped installs, or when you want to modify a tool:
git clone https://github.com/elchin92/avito-mcp.git
cd avito-mcp
npm install
cp .env.example .env # fill in your credentials
npm run build
Then point your MCP client at:
{ "command": "node", "args": ["/absolute/path/to/avito-mcp/dist/server.js"] }
A template config is in .mcp.json.example.
npx avito-mcp --version # print the installed version
npx avito-mcp --help # show env vars + usage
The server has no other flags by design — all knobs are env vars (see --help output).
Adding a new Avito swagger? One file in src/domains/ plus one line in src/meta/domain-registry.ts — see CONTRIBUTING.md. The factory in src/core/tool-factory.ts handles HTTP, OAuth, retries, rate-limit observability, error mapping, and Profile_id auto-injection — you'll never write a fetch() call inside a tool.
Issues and PRs welcome.
MIT. Not affiliated with Avito.ru. "Avito" is a trademark of its respective owner. Use of the Avito API is subject to Avito's Terms of Service.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.