Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
OZON_HOSTNoBind address for the sse transport0.0.0.0
OZON_PORTNoPort serving /sse and /metrics8084
OZON_STATENoPath to the saved authenticated session/data/state.json
OZON_TRANSPORTNostdio (client spawns the process) or sse (HTTP service)stdio
OZON_IMPERSONATENocurl_cffi TLS-impersonation profilechrome124
OZON_ENABLE_WRITESNoAllow cart/favorites/list mutations0
OZON_MONITOR_STORENoFavorites 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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_cartA

The whole cart (paginated through): items with title, price, quantity and checked — the tick is what decides the order's contents — plus Ozon's own group headings ("Доступны для заказа", «Бронирование товаров»).

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: ok=false with the reason in detail means the call was accepted and changed nothing — an out-of-stock product, or an apparel base SKU with no size chosen (use the variant sku from product_details()). Being in the cart is not being in the order: tick it with select_cart_items() before checkout.

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: price is «С банками» — what the account actually pays and the figure to compare lots on — price_regular is «С другими банками», price_old the struck-through comparison. available says whether it is on sale at all. cheaper_offers / cheaper_from are Ozon's own count and lowest price for other offers of this product; find_cheaper() lists them. Each variant carries its own sku, price and availability — that sku is what goes into the cart, and for apparel it is the only one that will add. with_description / with_reviews fetch those too (separate requests each); get_description() and get_reviews() do the same on their own.

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 limit (default 10). Looks in both places Ozon keeps them: its own «Есть дешевле или быстрее» offers for this exact product, and a price-sorted search by the card's title, which reaches the same product listed separately. Entries carry seller and delivery when they came from the offers list, and offers have no title — confirm the model with product_details() before quoting one. Raises when the base price cannot be read, rather than answering "nothing is cheaper" for a product it failed to price.

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 deliveries (each with its shipments in split_keys and its selectable pickup_points), the shipments with their delivery dates, points choices and the money breakdown — totals.total is what Ozon charges today (0 ₽ on a fully deferred order) and totals.order_total is what the order costs.

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 shipments are loaded with their items, each carrying prepaid (null when it holds items from both sides). shipment_items forces that loading on (true) or off (false); by default it happens only when scope is "partial".

Forms the checkout itself if Ozon has not yet. If it reports available=false, reason says what to fix — usually: select cart items. Change it with configure_checkout, submit with place_order.

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: amount_due is the charge, shortfall is set when the Ozon Card balance does not cover it (top up by that much), and next_step is the instruction to relay. payment_url is where the payment is completed — that page signs the account in to Ozon Bank, which is the owner's step, so this server never finishes the charge itself. Tell the user plainly: top up by shortfall if present, then finish at payment_url. Ordering with pay-on-delivery avoids all of it.

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 cancelled in the result — Ozon may answer with a retention offer instead, and detail then carries what it asked.

list_favoritesA

Favorites as product tiles: sku, title, price, old price, url. Paginated through for you — limit caps how many come back, there is no page to ask for.

set_favoriteA

[GATED by writes_enabled] Add a product to favorites or remove it. Ozon reports no outcome for this, so detail names the read that confirms it — list_favorites(). Favorites are what check_favorite_price_drops() watches.

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 contains, so a product already in a list is not added twice. Ozon's «Подборки» are a different thing, kept elsewhere and not exposed.

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 detail names the read that confirms it — get_lists(sku).

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 query Ozon searches its own purchase history server-side, which is much cheaper than paging through all of it. Orders, statuses and totals are not here: that is list_orders().

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 — limit caps how many come back.

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 public — whether it is published to the account's public profile. list_selections() does not carry the description or public; this does, and it is the only reliable read of visibility, because a selection under review is listed as "На модерации" either way.

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 items count that comes back.

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(). public defaults to false on purpose: publishing puts it on the account owner's public profile, so ask them before passing true.

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 items count that comes back.

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 login (account email or phone). Use this when session_status() reports signed_in=false and the kept profile copy did not recover it. Ozon delivers the code out of band (email, SMS or a flash call), so ask the user for it and pass it to submit_login_code().

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

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