Avito Ads MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| AVITO_ADS_API_BASE | No | API root override (replaces the environment prefix too). | https://api.avito.ru/ads/ |
| AVITO_ADS_CLIENT_ID | Yes | OAuth2 client id (Client Key) of your Avito application. | |
| AVITO_ADS_ACCOUNT_ID | Yes | Ad account id, a positive integer. Injected into every path. | |
| AVITO_ADS_TIMEOUT_MS | No | Per-request timeout, ms (covers reading the body). | 30000 |
| AVITO_ADS_ENVIRONMENT | No | production or sandbox. | production |
| AVITO_ADS_MAX_RETRIES | No | Retries on 429; on 5xx/network for reads only. | 4 |
| AVITO_ADS_CLIENT_SECRET | Yes | OAuth2 client secret. Treat as a password. | |
| AVITO_ADS_TOKEN_LEEWAY_SECONDS | No | Refresh the access token this long before it expires. | 60 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_accountA | Returns the legal details of the ad account this server is bound to: inn, kpp, ogrn, shortName, longName, legalAddress, actualAddress and the contact / manager blocks. Takes no arguments — the account is fixed by AVITO_ADS_ACCOUNT_ID and cannot be chosen per call. Carries no money figures (use get_balance) and no campaign data. Like every tool here, the result also reports apiPointBalance: the API points left this week (the quota refills Mondays 00:00 UTC). |
| get_balanceA | Returns the current balance of the configured ad account in rubles: balance (real money) and bonusBalance (bonus rubles, spendable on ads only). Takes no arguments. It is a snapshot of right now, not a history — for money spent over a period use the statistics tools. Does not top the account up. |
| create_sandbox_accountA | SANDBOX ONLY: creates a test advertiser account and returns its accountID. This server refuses the call unless AVITO_ADS_ENVIRONMENT=sandbox, and the refusal costs no API point. contact must be a non-empty object, e.g. {"name":"Ivan Ivanov","email":"ivan@example.com","phone":"+79001234567"} — an empty one is rejected before any request goes out. Calling twice creates two accounts. It cannot edit or delete an account, and the server keeps working against AVITO_ADS_ACCOUNT_ID: the new id is not adopted, put it in the config to use it. |
| list_child_accountsA | Lists the child (sub-)accounts of the configured agency account. Each entry is {account:{id,shortName}, contract}. Balances are NOT included — use list_child_accounts_with_balances for those. Returns every child in one call: no paging, no filter, no search. |
| list_child_accounts_with_balancesA | Same list as list_child_accounts, plus each child's balance: {balance, bonusBalance} in rubles and bonus rubles. Use it to see which child is out of money before transfer_funds / transfer_bonus, and to verify a transfer landed. Shows the children's balances only — the parent's own balance comes from get_balance. |
| create_child_accountA | Creates a non-payer child account under the configured agency account and returns {accountID, clientKey, clientSecret} — the new account's own API credentials, handed out only here, so store them immediately. Non-payer means the child cannot top up its own balance: fund it with transfer_funds from the parent. Cannot create a payer account, cannot rename or delete one, and cannot re-read the secret later. Calling it twice creates two accounts. |
| transfer_fundsA | Moves REAL MONEY out of the configured account into another account (normally one of its children): |
| transfer_bonusA | Moves bonus rubles (the |
| create_advertiserA | Registers an advertiser (an ORD counterparty) under the account and returns {id} plus apiPointBalance (weekly API points left). The id is what campaigns and contracts reference. Legal details must match the state register: inn (10 digits for ul, 12 for ip), ogrn, and both addresses; kpp applies to companies (ul) only. legalRole marks the ORD role — rd (advertiser), ra (agency), rr (distributor). There is no edit or delete endpoint: a wrong advertiser can only be superseded by creating another one, so check list_advertisers for an existing record first. |
| list_advertisersA | Returns one page of advertisers registered under the account: {total, items, page, limit, hasNextPage} plus apiPointBalance (weekly API points left). Each item carries id, shortName, longName, inn, ogrn, kpp, legalAddress, actualAddress, legalType (ul|ip) and legalRole (rd|ra|rr). Narrow the page with filter.ids / filter.inns / filter.roles; there is no free-text search, so match on names yourself. limit is 1..100 (default 20); page is 1-based. |
| create_contractA | Registers an ORD contract between the account and an advertiser and returns {id} plus apiPointBalance (weekly API points left). Which fields are mandatory depends on type: service needs subject, isReportingRequired, date and number (cid is rejected); intermediary needs all of those plus object and isFundsAllocationToPrincipal (cid is rejected); external needs cid only (parentId is rejected). Pass the contractor's legal details in intermediary — required unless parentId is set; with parentId the record is an additional agreement to that contract and must omit intermediary. There is no edit or delete endpoint, so a wrong contract stays on the account forever. |
| list_contractsA | Returns one page of contracts registered under the account: {total, items, page, limit, hasNextPage} plus apiPointBalance (weekly API points left). Each item carries id, type, number, date, subject, object (the contract action), cid, description (the counterparty type), parentId (set on additional agreements) and the client/contractor legal details. Narrow the page with filter.ids / filter.numbers / filter.clients (advertiser ids) / filter.contractors. limit is 1..100 (default 20); page is 1-based. |
| list_campaignsA | Lists the account's ad campaigns, one page at a time. Returns {total, items, page, limit, hasNextPage} plus apiPointBalance — the weekly API points left, which refill Mondays 00:00 UTC. Each campaign carries id, name, status, budget (rubles), paymentModel (CPM/CPC), campaignType, startDate/endDate, advertiserId, contractId, managerID and timestamps. All filter fields are AND-ed and each list keeps only the values it names. This API cannot create, edit, pause, resume, archive or delete a campaign and cannot touch its targeting — the only writes available anywhere are change_group_budget and change_group_price on an ad group. |
| list_groupsA | Lists the account's ad groups, one page at a time. Returns {total, items, page, limit, hasNextPage} plus apiPointBalance (weekly API points left). The group is the level that holds the money: each item carries id, name, campaignID, status, budget and price (the bid) in rubles, paymentModel, campaignType, advertiserID, haveCreative and timestamps. Use change_group_budget / change_group_price to change those two numbers — they are the only writable fields in the whole ad object tree. Groups cannot be created, renamed, paused, resumed or deleted here, and their targeting is not exposed. |
| list_creativesA | Lists the account's creatives — the ads themselves — one page at a time. Returns {total, items, page, limit, hasNextPage} plus apiPointBalance (weekly API points left). Each creative carries id, name, title, description, buttonText, link, status, groupID, campaignID, advertiserID, paymentModel, campaignType and legalInfo (the ad-registry/ERID data). Read-only: creatives cannot be uploaded, edited, sent to moderation, paused or deleted through this API — only ad-group budget and bid are writable. |
| change_group_budgetA | Sets one ad group's budget to the given amount in rubles (at least 1). The value replaces the current budget rather than adding to it, so repeating the call is safe. Only groups on manual bid management accept it; the API rejects the rest. Returns the API's acknowledgement plus apiPointBalance. It cannot change the campaign budget, the bid (use change_group_price), or the group's status — this API cannot pause, resume or delete a group at all. Read the current budget with list_groups first. |
| change_group_priceA | Sets one ad group's bid (the API calls it price) to the given amount in rubles (at least 1). The unit follows the group's paymentModel: rubles per 1000 impressions for CPM, rubles per click for CPC. The value replaces the current bid rather than adding to it, so repeating the call is safe. Only groups on manual bid management accept it. Returns the API's acknowledgement plus apiPointBalance. It cannot change the budget (use change_group_budget) or the group's status — this API cannot pause, resume or delete a group at all. Read the current bid from the price field of list_groups. |
| campaign_statsA | Statistics for ONE campaign over a date range, with its per-group and per-creative breakdowns: {campaign, groups[], creatives[]}. Every entity carries data[] (one row per day, stamped with timestamp) and totalData (the period aggregate). Metrics per row: views (impressions), clicks, ctr, spend, spendBonus, cpm, cpc, plus videoViews25/50/75/100, q25/q50/q75 and vtr for video campaigns; money is in rubles, rates pass through unchanged. The period is inclusive, YYYY-MM-DD, and must span at most 100 days. Cannot aggregate across campaigns and has no sub-day granularity; get campaignId from list_campaigns. Costs weekly API points; the reply's apiPointBalance is what is left until the quota refills Monday 00:00 UTC, so prefer one wide period over many narrow calls. |
| group_statsA | Per-group statistics for the groups you name in one campaign: a flat array with one entry per ad group ({id, name, paymentModel, campaignType, data[] per day, totalData for the period}). Same metrics as campaign_stats — views (impressions), clicks, ctr, spend, spendBonus, cpm, cpc, video quartiles, vtr — with money in rubles. groupIds is required: this tool narrows, it does not enumerate. The period is inclusive, YYYY-MM-DD, and must span at most 100 days. Returns no campaign-level totals; for every group of a campaign call campaign_stats, which carries the same breakdown. Costs weekly API points; the reply's apiPointBalance is what is left until the quota refills Monday 00:00 UTC, so prefer one wide period over many narrow calls. |
| creative_statsA | Per-creative statistics for the creatives you name in one campaign: a flat array with one entry per creative ({id, name, groupId, paymentModel, campaignType, data[] per day, totalData for the period}). Same metrics as campaign_stats — views (impressions), clicks, ctr, spend, spendBonus, cpm, cpc, video quartiles, vtr — with money in rubles. creativeIds is required: this tool narrows, it does not enumerate. The period is inclusive, YYYY-MM-DD, and must span at most 100 days. Returns no campaign-level totals; for every creative of a campaign call campaign_stats, which carries the same breakdown. Costs weekly API points; the reply's apiPointBalance is what is left until the quota refills Monday 00:00 UTC, so prefer one wide period over many narrow calls. |
| list_usersA | Lists the users with access to the ad account — one {id, role, hasLoggedIn} per user, where role is admin or viewer and hasLoggedIn says whether the invited person has ever signed in. Use the ids with set_user_role and delete_user. Scoped to the configured account: it cannot list the users of a child account. Returns apiPointBalance alongside the data (weekly points left). |
| add_userA | Grants an existing Avito user access to the ad account with the given role. userId is that person's numeric Avito user id — this tool cannot invite by email or phone, and cannot create an Avito account. If the user already has access, change their role with set_user_role instead. Returns the API's confirmation plus apiPointBalance. |
| set_user_roleA | Changes the role of a user who already has access to the ad account. Applying the role a user already holds is a no-op. It does not grant access (use add_user) and does not revoke it (use delete_user). Returns the API's confirmation plus apiPointBalance. |
| delete_userA | Revokes a user's access to the ad account. Destructive: the only way back is add_user with an explicit role. It does not delete the person's Avito account, their campaigns or their spend history. Returns the API's confirmation plus apiPointBalance. |
| raw_requestA | Escape hatch to call any Avito Ads API path directly, for endpoints without a dedicated tool — e.g. GET "v1/account/{accountID}/balance" or POST "v1/account/{accountID}/campaigns". Paths are relative to the API base and account-scoped; the literal {accountID} placeholder is replaced with the configured account id, a path naming a different account is refused, and so is one that escapes the API base. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/A1-x-Tech/mcp-avito-ads'
If you have feedback or need assistance with the MCP directory API, please join our Discord server