Ozon MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OZON_HOST | No | Bind address for the sse transport | 0.0.0.0 |
| OZON_PORT | No | Port serving /sse and /metrics | 8084 |
| OZON_STATE | No | Path to the saved authenticated session | /data/state.json |
| OZON_TRANSPORT | No | stdio (client spawns the process) or sse (HTTP service) | stdio |
| OZON_IMPERSONATE | No | curl_cffi TLS-impersonation profile | chrome124 |
| OZON_ENABLE_WRITES | No | Allow cart/favorites/list mutations | 0 |
| OZON_MONITOR_STORE | No | Favorites price-history file | /data/price_history.json |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_cartA | The whole cart (paginated through): items with title, price, quantity and
|
| set_cart_quantityA | [GATED by writes_enabled] Set how many of a product are in the cart.
Adding, changing and removing are all this one call: quantity=0 removes.
Ozon reports nothing about the outcome, so the cart is read back: |
| select_cart_itemsA | [GATED by writes_enabled] Choose which cart items make up the order. This is the step that composes a checkout: get_checkout() reports nothing orderable until something is ticked, and it orders exactly what is ticked — so "buy these two" is mode="only" with those two skus, whatever else the cart holds. Returns the cart as it is afterwards, so the ticks can be checked before ordering. |
| searchA | Storefront search → product tiles (sku/title/price/url). Give a text query, a category slug ("produkty-dlya-doma-9200"), or both. limit is depth, not page size: pages are walked until there are that many results, so raise it when looking for the cheapest — a page holds a few dozen and the cheapest lot is often further down. sort="cheap" ranks on the payable price (Ozon's own order goes by a different figure). Ozon's text search is literal about words: a lot whose own title omits the brand does not come back for a query that includes it, so search the model ("Basilisk V3 X HyperSpeed") rather than brand-plus-model, and confirm what a lot actually is with product_details() — a tile's title is the seller's wording and may name no model at all. A tile is not a card: for variants, characteristics, photos and stock call product_details() with its sku. filters comes from get_search_filters() — {key: option_value} for a checkbox or category facet, {key: "min;max"} for a range, e.g. {"currency_price": "200;600"}. Narrowing by price is a filter, not a sort. |
| get_search_filtersA | Facets available for a query: {name, key, type, options|range}. Apply them with search(filters={key: value}) — checkbox/category value = option.value, range value = "min;max". Flow: search → get_search_filters → search(filters). |
| product_detailsA | Product card: title, three prices, variants, characteristics, gallery photos.
Money as Ozon prints it: |
| get_reviewsC | Reviews on their own: overall score, individual reviews (author/score/text/date) and review photos. |
| get_descriptionB | Product description text plus the images embedded in it. |
| delivery_estimateA | When a product would arrive, to which of the account's addresses, and from which warehouse ("Завтра, 2 сентября" / "ул. Данилова, 17" / "Со склада Ozon"). The date is relative to that address, so quote both. This is per product, before ordering; for an existing order the dates are in list_orders(), and for an order being formed in get_checkout(). |
| find_cheaperA | The cheapest lots of the same thing, ranked by payable price — top |
| get_checkoutA | The order being formed from the selected cart items, with everything that
can be changed: payment methods (each with its payment_type), the
pay-on-delivery switch, one entry per destination in Pay-on-delivery does not always cover the whole order. pay_after_receipt
.scope is one of "full", "partial" (some items must be paid up front:
prepayment_amount now, post_payment_amount on receipt) or "none", and .note
states it in words. On a partial order pay_now_items and pay_on_receipt_items
name the lines on each side, as Ozon itself splits them, and the Forms the checkout itself if Ozon has not yet. If it reports
available=false, |
| configure_checkoutA | Set checkout options and return the recomputed order — one call can set several. Omit an argument to leave that option alone. Every value comes from a get_checkout() answer, so read that first; passing something Ozon does not offer is refused with the list of what it does. Applied in the order Ozon recalculates them: destination, payment, pay-on-delivery, points. Turning points on can withdraw the pay-on-delivery offer, so check the result rather than assuming. |
| place_orderA | [GATED by orders_enabled — SPENDS REAL MONEY] Submit the order that get_checkout() describes. Not undoable from here except by cancel_order(). Read get_checkout() immediately before, show the user totals.order_total — what the order costs — and pass back the figure they agreed to. The call is refused if that no longer matches, and nothing is ordered. Returns once the order actually exists, with its order_number: keep it, it is what cancel_order() and pay_order() need. Paying from the Ozon Card balance settles with the order; pay-on-delivery leaves nothing to pay today. |
| pay_orderA | [GATED] Ask Ozon to charge an order left in «Ожидаем оплаты», and report
what the user must still do.
The result spells it out: |
| list_cancel_reasonsA | Reasons Ozon will accept for cancelling an order, with their reason_id. The catch-all one (needs_comment=true) is refused without a comment. |
| cancel_orderA | [GATED by writes_enabled] Cancel an order, by default returning its items
to the cart.
skus cancels only those lines and leaves the rest of the order standing — an
order can be cancelled item by item, in as many passes as it has items. Omit
it to cancel the whole order. The selection is checked against what Ozon
reports back and refused on a mismatch, since cancelling the wrong line is
not undoable.
reason_id from list_cancel_reasons; "504" (изменить заказ и оформить заново)
is the neutral default, "508" needs a comment.
Check |
| list_favoritesA | Favorites as product tiles: sku, title, price, old price, url.
Paginated through for you — |
| set_favoriteA | [GATED by writes_enabled] Add a product to favorites or remove it.
Ozon reports no outcome for this, so |
| get_listsA | The account's wishlists (вишлисты), each with its size and list_id — which
is what set_list_membership() and delete_list() take. With a sku, every list
also carries |
| create_listA | [GATED by writes_enabled] Create an empty wishlist and return it with its list_id, ready for set_list_membership(). An empty name is refused by Ozon. Wishlists are the only list this account can create — «Подборки» are not made this way. |
| delete_listA | [GATED by writes_enabled] Delete a wishlist. The products in it are not deleted — they stay in favorites and in any other list. Not undoable: the list itself is gone, so confirm with the user first. |
| set_list_membershipA | [GATED by writes_enabled] Put a product into a collection or wishlist,
or take it out. Ozon reports no outcome for this, so |
| check_favorite_price_dropsA | Record the current favorites prices and return the diff against the last run: {drops, rises, added, removed}. Call it periodically — the comparison is only as old as the previous call. |
| get_financesA | Ozon Card balance and the total points. This balance is what a card payment draws on, so it is what decides whether pay_order() will need a top-up. Breakdown by point type → get_points(). |
| get_pointsB | Points by type (Ozon points, miles, WOW points, stars) with amounts, burning points, and per-store seller bonuses. |
| list_ordersA | Orders with status, state (active/received/cancelled), pickup point, delivery slot/ETA and their items. No order total: Ozon states none on the list. Money is amount_due_at_pickup («К оплате при получении», what is owed on collection) per entry, and price plus paid true/false per item. An item's price is not the order's; paid null means unknown, not unpaid. An entry is a delivery group: items arriving together share it, so order_numbers can hold several and its items can be paid and unpaid. Giving either date searches the archive and stops paginating once past the window — cheaper than pulling the whole history for one month. Pass an entry's order number or detail_link on to order_products(), cancel_order() or pay_order(). |
| order_productsB | Items of one order: sku, title, price paid, chosen variant, seller and a product-card link. Accepts an order number ("44563249-0865") or a detail_link from list_orders()[].detail_link. |
| purchasesA | Everything ever bought, as product tiles (sku/title/price/url) — the
answer to "have I bought this before" and "buy that thing again".
With |
| list_returnsA | Returns this account has opened, newest first: the return number, the
date of the application, Ozon's own status badge ("Деньги отправлены", "Ждём
товар") and the sentence under it, the amount, and the products going back.
Paginated through — |
| list_selectionsA | The account's «Подборки» — curated, publishable lists of products, a different thing from the wishlists in get_lists(). Each carries the uuid every other selection tool takes, how many products it holds, and Ozon's own status: "Личная подборка" while private, "N сохранений" once public, "На модерации" while a publication is being reviewed. |
| get_selectionA | One «Подборка» in full: name, description, product count, status and
|
| selection_productsA | The products a «Подборка» holds: sku, title, price and a card link. Neither list_selections() nor get_selection() carries them — they state a count only — so this is the read to make before changing what is in there. |
| add_to_selectionA | [GATED by writes_enabled] Add products to a «Подборка», keeping what is
already in it. Products must be in favorites first — Ozon draws only from
there and drops the rest silently, so check the |
| remove_from_selectionA | [GATED by writes_enabled] Take products out of a «Подборка», keeping the rest. Fails if the selection holds none of them, rather than reporting a removal that did not happen. |
| create_selectionA | [GATED by writes_enabled] Create a «Подборка» around one product and
return it with its uuid. More products go in with add_to_selection().
|
| set_selection_itemsA | [GATED by writes_enabled] Set which products a selection holds, as the
whole list. For "add this" / "take that out" use add_to_selection() and
remove_from_selection(), which read the current products first; this one
replaces them, and an empty list empties the selection.
Products must be in favorites first — Ozon draws only from there, and a
product that is not is dropped silently, so check the |
| edit_selectionA | [GATED by writes_enabled] Rename a selection, and optionally replace its description. Visibility is preserved: an edit carries it, so a public selection stays public and a private one stays private. |
| set_selection_publicA | [GATED by writes_enabled] Publish a selection to the account owner's public profile, or unpublish it. Outward-facing — confirm with them before publishing. Publication is reviewed by Ozon, so the status comes back as "На модерации" rather than public. |
| delete_selectionA | [GATED by writes_enabled] Delete a «Подборка». The products in it are not deleted. Ozon's own warning: «Восстановить её не получится» — so confirm with the user first. |
| session_statusA | Start here. Reports whether the stored session still acts as the account and what this server is allowed to do: writes_enabled covers cart, favorites and lists, orders_enabled covers placing an order. Both are the operator's settings and no tool can change them — plan around them. When signed_in is false, every other tool raises instead of answering, because a signed-out session otherwise looks exactly like an empty account: no orders, no balances, no explanation. Recovery is start_login() + submit_login_code(), and backup_available=true means it will most likely recover by itself on the next call. |
| start_loginA | Ask Ozon to send a one-time login code to |
| submit_login_codeA | Finish the login with the code Ozon sent, and keep a copy of the restored profile so the next sign-out costs nobody a code. Codes expire and are single-use: if it is refused, call start_login() again. |
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/Alexander-Zhukov/ozon-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server