avito-mcp
Universal MCP server for the Avito API (Russia's largest classifieds marketplace), built for autonomous AI agents to operate an account hands-free β 145 tools across 18 domains (listings, messenger, orders, delivery, promotion, autoload, reviews, analytics). Safe-by-default: dry-run, idempotency, structured errors, confirmation flow.
README
avito-mcp
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.5 β tool-definition quality pass: every tool's description and parameters rewritten for agent legibility (purpose, usage, side-effects, disambiguation), honest
destructiveHinton irreversible actions, and aglama.jsonlisting claim. See the CHANGELOG for full history.
What it does
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.
- π Universal β works with 15+ MCP clients (Claude Desktop, Cursor, Cline, Continue, Windsurf, Zed, ChatGPT, β¦)
- π Local-only β stdio transport, your OAuth credentials never leave your machine
- π€ Built for autonomy β pairs naturally with multi-agent runtimes and cron-scheduled agents for hands-off, always-on operation
- β‘ Zero install β
npx -y avito-mcp, no clone/build, no Docker
Quick start (β90 seconds)
1. 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.
Built for autonomous workflows
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:
- Reactive agent β a Claude/Cursor session permanently open, monitoring chats and replying to customers in your tone of voice.
- Cron-scheduled agent β a runtime fires up your agent every N minutes to triage new orders, top up promotion budgets, refresh stats.
- Multi-agent swarm β separate agents for "support", "promotion", "logistics" each holding only the tools they need.
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.
What's included β up to 145 tools
| 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.
<details> <summary>π <b>Listings</b> β 11 tools (items_*)</summary>
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 once </details>
<details> <summary>π¬ <b>Messenger</b> β 13 tools (messenger_*)</summary>
messenger_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β unsubscribe </details>
<details> <summary>π¦ <b>Orders</b> β 12 tools (orders_*)</summary>
orders_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) </details>
<details> <summary>π <b>Autoload</b> β 17 tools (autoload_*)</summary>
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 reference-
- 6 deprecated v1 endpoints, kept under their original names for compatibility </details>
<details> <summary>π <b>Delivery</b> β 31 tools (delivery_*) <i>Β· 3PL partner API</i></summary>
Avito'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.
</details>
<details> <summary>π <b>Promotion & CPA</b> β 25 tools (promotion_, cpa_, cpa_target_, cpa_auction_)</summary>
- BBIP promotion (7) β promotion_get_bbip_forecasts_by_items_v1, promotion_create_bbip_order_for_items_v1 β οΈ, promotion_get_order_status_v1, β¦
- CPA (11) β chats/calls by time, balance v2/v3, complaints, phone info β
cpa_* - CPA target action (5) β
cpa_target_get_bids,cpa_target_save_auto_bidβ οΈ,cpa_target_save_manual_bidβ οΈ, β¦ - CPA auction (2) β
cpa_auction_get_user_bids,cpa_auction_save_item_bidsβ οΈ </details>
<details> <summary>π€ <b>Profile, Stock, Hierarchy, Reviews</b> β 14 tools</summary>
- User (3) β
user_get_user_info_self,user_get_user_balance,user_post_operations_history - Stock (2) β
stock_get_stocks_info,stock_update_stocksβ οΈ - Hierarchy (5) β sub-accounts, employees, item assignment (multi-employee setups)
- Reviews (4) β
reviews_get_reviews_v1,reviews_create_review_answer_v1β οΈ,reviews_remove_review_answer_v1β οΈ,reviews_get_ratings_info_v1</details>
<details> <summary>π οΈ <b>Misc</b> β 12 tools (tariffs_, trxpromo_, calltracking_, msg_discounts_)</summary>
- Tariffs (1) β transport-category tariff reference
- TrxPromo (3) β transactional promotion: commissions / apply / cancel
- CallTracking (3) β call records and audio retrieval
- Messenger discounts (5, beta) β bulk discount campaigns in chats </details>
<details> <summary>π <b>Auth & Meta</b> β 4 tools</summary>
- Auth (3) β
auth_get_access_token(debug; the server manages tokens automatically),auth_get_access_token_authorization_code,auth_refresh_access_token_authorization_code - Meta (1) β
meta_get_rate_limitsβ observe X-RateLimit-* across all domains </details>
β οΈ 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.
MCP resources & prompts (v0.6.0)
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).
Resources
| 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.
Prompts
| 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 "Π½Π΅ ΠΏΠΎΠΊΡΠΏΠ°ΠΉ" |
Structured tool outputs
Every tool now returns structuredContent alongside the text block β clients can parse Avito responses as JSON without regex:
- Objects β
{ status, ...data } - Arrays β
{ status, items, count } - Binary (PDF labels, audio) β
{ status, mimeType, sizeBytes, base64 } - Errors β
{ error_kind, status?, request, body? }withisError: true
MCP logging
Selected 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.
Universal safety primitives (v0.7.0)
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.
Dry-run
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.
Idempotency
Every destructive tool also accepts an optional idempotencyKey: string. The server keeps an in-memory ledger keyed by (tool, key, hash(args)):
- First call with a key: executes, caches the result.
- Repeat call with the same key + identical args within TTL: returns the cached result, marked
structuredContent.idempotent_replay: true. No second HTTP call. - Repeat call with the same key + different args: returns a structured
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).
Structured error taxonomy
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.
Health / auth / capabilities meta-tools
| 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.
Cross-process token lock
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).
CLI flags
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
Connect your AI client
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:
<details> <summary><b>Claude Desktop</b> (macOS / Windows / Linux)</summary>
| 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).
</details>
<details> <summary><b>Claude Code</b> (CLI)</summary>
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.
</details>
<details> <summary><b>Cursor</b></summary>
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").
</details>
<details> <summary><b>ChatGPT Desktop</b> (Connectors / MCP)</summary>
OpenAI's Desktop app added MCP server support via the Connectors UI. Settings β Connectors β Add custom MCP server β fill in:
- Name:
Avito - Type:
stdio - Command:
npx - Arguments:
-y avito-mcp - Environment variables:
Client_id,Client_secret,Profile_id</details>
<details> <summary><b>Windsurf</b> (Codeium)</summary>
Path: ~/.codeium/windsurf/mcp_config.json. Use the Quick Start JSON. Alternative: Settings β Cascade β MCP Servers β Add Server (UI).
</details>
<details> <summary><b>Cline</b> (VS Code extension)</summary>
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. </details>
<details> <summary><b>Continue</b> (VS Code / JetBrains)</summary>
Add to ~/.continue/config.json:
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "npx",
"args": ["-y", "avito-mcp"],
"env": { "Client_id": "...", "Client_secret": "...", "Profile_id": "..." }
}
}
]
}
}
</details>
<details> <summary><b>Zed</b></summary>
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": "..." }
}
}
}
}
</details>
<details> <summary><b>VS Code</b> (GitHub Copilot Chat with MCP)</summary>
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.
</details>
<details> <summary><b>Codex CLI</b> (OpenAI)</summary>
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 = "..." }
</details>
<details> <summary><b>JetBrains AI Assistant</b></summary>
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.
</details>
<details> <summary><b>Goose</b> (Block)</summary>
Block's open-source CLI agent. Add via goose configure β MCP server β paste the Quick Start JSON. Config lives in ~/.config/goose/config.yaml.
</details>
<details> <summary><b>Roo Code / Kilo Code</b> (Cline forks, VS Code)</summary>
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.
</details>
<details> <summary><b>LibreChat</b> (self-hosted ChatGPT alternative)</summary>
Edit librechat.yaml:
mcpServers:
avito:
type: stdio
command: npx
args: ["-y", "avito-mcp"]
env:
Client_id: "..."
Client_secret: "..."
Profile_id: "..."
</details>
<details> <summary><b>Cherry Studio</b></summary>
Settings β MCP Servers β Add. UI fields: name avito, command npx, args -y avito-mcp, env vars same as above.
</details>
<details> <summary><b>Any other MCP client</b></summary>
The server speaks stock stdio MCP. Universal parameters:
command:npxargs:["-y", "avito-mcp"]env:{ Client_id, Client_secret, Profile_id }transport:stdio
Browse the MCP clients directory for new ones. </details>
Example prompts
Drop these into your AI client to see what's possible:
π Analyse
- "What's my Avito balance and how much did I spend on promotion this month?"
- "Top 10 listings by contacts last week β table with views/contacts/conversion."
- "Find listings whose calls dropped 50%+ compared to the previous week."
π¬ Communicate
- "Show me unread chats from the last 24 hours and reply with: 'Hi! Yes, still available, where would you like delivery?'"
- "Read the full conversation in chat X and suggest the best next reply in my tone."
π° Promote
- "Forecast a 1000β½ BBIP boost on item 12345 β is it worth it?"
- "Set a manual CPA bid of 500β½ on top-10 listings in category 'Electronics'."
π¦ Fulfil
- "List all orders with status
ready_to_shipand generate labels in a single PDF." - "For order ABCD, find an available courier slot tomorrow morning."
π€ Automate
- "Every weekday at 9am, send me Telegram with: balance, new orders count, unread chats count, top promotion spends."
- "If any chat has been unread for 6+ hours, draft a reply and ping me to approve."
What's NOT supported
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).
Security
- Local stdio only β no proxy, no remote endpoints, no telemetry.
- Credentials live in your MCP client's
envblock or local.env. They're never sent anywhere exceptapi.avito.ru. - OAuth tokens cached in a per-user state directory (chmod 600):
- Linux:
$XDG_STATE_HOME/avito-mcp/token.json(β~/.local/state/avito-mcp/token.json) - macOS:
~/Library/Application Support/avito-mcp/token.json - Windows:
%APPDATA%\avito-mcp\token.json - Override with
AVITO_TOKEN_FILE. Delete the file to force a refresh.
- Linux:
- Three-layer safety model (every layer opt-in via env vars; defaults preserve v0.1.x behaviour for trivial calls but harden everything destructive):
AVITO_MCP_MODE(read_only/guarded/full_access) β registration-time gate. Hidden tools never appear intools/list.read_onlyβ 80 tools,guardedadds writes (~123 tools),full_accessis 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 callmeta_confirm_actionto 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 assensitiveand hidden by default even infull_access.AVITO_MCP_ALLOWED_UPLOAD_DIRSβmessenger_upload_imagesreads files from disk; without an explicit directory allowlist it doesn't register at all. Path validation usesrealpath(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.
- Every tool is tagged with one of five risks (
sensitive/read/write/money/public), exposed as MCPToolAnnotations(readOnlyHint,destructiveHint) and as_meta.risk, and listed indist/manifest.json. Well-behaved MCP clients warn before destructive calls. - See
docs/safety.mdfor 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). - All 138 Avito tools hit production β Avito has no sandbox. Write methods cost real money or are visible to real customers. Safe read-only tools for first runs:
user_get_user_balance,items_get_items_info,messenger_get_chats_v2,meta_get_rate_limits. - Found a security issue? Private reporting via SECURITY.md β don't open a public issue.
Community & support
- Bug? Open an issue.
- Question or idea? Start a discussion.
- Need help picking the right tool or setting up your client? See SUPPORT.md.
- Want to contribute? Adding a new Avito swagger takes ~10 minutes β see CONTRIBUTING.md.
- Like the project? Star the repo and tell another Avito seller who uses AI.
Install from source
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.
CLI flags
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).
Contributing
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.
License
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.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.