Featured

Deploy OpenClaw in 60 seconds β€” 20% off logoDeploy OpenClaw in 60 seconds β€” 20% off

Launch OpenClaw on Hostinger in about 60 seconds and keep your agent live 24/7. Our referral link gives you 20% off, no coupon code needed.

Launch on Hostinger β†’
Run your Hermes agent on Hostinger, fully managed logoRun your Hermes agent on Hostinger, fully managed

Launch Hermes on Hostinger in one click, fully managed, no VPS knowledge needed. Use code ZACAARON10 for 10% off.

Launch on Hostinger β†’
Crawl and scrape any site into clean data, 10% off logoCrawl and scrape any site into clean data, 10% off

Firecrawl crawls and scrapes any site into clean markdown for your agent. Get 1,000 free credits, and new users get 10% off their first purchase.

Try Firecrawl free β†’
Your own AI agent, running 24/7 with QwikClaw logoYour own AI agent, running 24/7 with QwikClaw

QwikClaw sets up and runs an always-on OpenClaw agent for you. One click, no config files, no server setup.

Deploy now β†’
One API to scrape, enrich, and extract the internet. logoOne API to scrape, enrich, and extract the internet.

Context.dev gives your agents a single API to scrape, enrich, and extract live web data β€” no proxies, no parsers, no maintenance.

Start building free β†’
SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it β€” secured from day one.

Get it set up for you β†’
SEO data APIs for your agent, $1 free credit logoSEO data APIs for your agent, $1 free credit

DataForSEO gives your agent live access to SERP results, keyword data, backlinks, and on-page SEO data through one API. New accounts get a $1 credit, good for up to 20,000 keyword or backlink lookups.

Try DataForSEO free β†’
Reach 47,000+ AI builders

A flat monthly placement in front of developers actively installing AI tools. No lock-in, cancel anytime.

Advertise here β†’

Works with

Claude CodeClaude DesktopCursorVS CodeClineCodex CLIOpenClaw+ any MCP client

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

PCDCK/ozon-mcp MCP server](https://glama.ai/mcp/servers/PCDCK/ozon-mcp/badges/score.svg)](https://glama.ai/mcp/servers/PCDCK/ozon-mcp) 🐍 ☁️ 🍎 πŸͺŸ 🐧 - Knowledge-rich MCP server for the full Ozon Seller + Performance API (466 methods, 15 MCP tools).

README.md

ozon-mcp

MCP server for the Ozon Seller & Performance APIs. Connect any AI agent to your Ozon cabinet in minutes.

![CI](https://github.com/PCDCK/ozon-mcp/actions/workflows/ci.yml) !Python !License !MCP

ozon-mcp is a knowledge-rich MCP server that turns the entire Ozon seller toolkit into 15 high-leverage tools. AI agents (Claude, Cursor, Cline, Continue, Goose, Zed, …) can search the API in Russian or English, drill into any of 466 methods with a fully-resolved JSON Schema, and execute calls with built-in safety guards. Subscription- aware, automatic pagination over all 4 cursor styles, retry/back-off on 429s, and 13 ready-to-use analytical workflows.

Key facts: 466 indexed methods (420 Seller + 46 Performance), 55 sections, 5 subscription tiers modelled, 38 paginated endpoints auto-walked, 43 destructive methods double-gated, 13 curated workflows for typical seller scenarios.

---

Quick start

Prerequisites

  • Python 3.12 or 3.13
  • uv package manager β€” install with

curl -LsSf https://astral.sh/uv/install.sh | sh

  • Ozon Seller API credentials (Client-Id + Api-Key) β€” get them at

<https://seller.ozon.ru/app/settings/api-keys>

Installation

git clone https://github.com/PCDCK/ozon-mcp.git
cd ozon-mcp
uv sync

Verify it works

uv run ozon-mcp --help

You should see the FastMCP usage line. The server speaks the MCP stdio protocol β€” point any compatible client at it (instructions below).

---

Connecting to your AI agent

ozon-mcp uses the standard MCP stdio transport. Every example below exposes the same 15 tools β€” pick whichever client you already use.

Claude Desktop

Edit: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows).

{
  "mcpServers": {
    "ozon": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/ozon-mcp",
                "run", "ozon-mcp"],
      "env": {
        "OZON_CLIENT_ID": "your-seller-client-id",
        "OZON_API_KEY": "your-seller-api-key",
        "OZON_PERFORMANCE_CLIENT_ID": "your-perf-client-id",
        "OZON_PERFORMANCE_CLIENT_SECRET": "your-perf-secret"
      }
    }
  }
}

Claude Code (CLI)

cd /path/to/ozon-mcp
claude mcp add ozon -- uv run ozon-mcp

Or add to ~/.claude/mcp.json with the same shape as the Claude Desktop config above.

Cursor

Settings β†’ MCP β†’ Add new MCP Server, or edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "ozon": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/ozon-mcp",
                "run", "ozon-mcp"]
    }
  }
}

Windsurf

Edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "ozon": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/ozon-mcp",
                "run", "ozon-mcp"]
    }
  }
}

Cline (VS Code extension)

Cline β†’ Settings β†’ MCP Servers β†’ Add:

{
  "ozon": {
    "command": "uv",
    "args": ["--directory", "/absolute/path/to/ozon-mcp",
              "run", "ozon-mcp"]
  }
}

Continue.dev

Edit ~/.continue/config.json:

{
  "experimental": {
    "modelContextProtocolServers": [
      {
        "transport": {
          "type": "stdio",
          "command": "uv",
          "args": ["--directory", "/absolute/path/to/ozon-mcp",
                    "run", "ozon-mcp"]
        }
      }
    ]
  }
}

Goose, Zed, or any other MCP client

Any client that speaks MCP stdio will work. Generic config:

command: uv
args: ["--directory", "/absolute/path/to/ozon-mcp", "run", "ozon-mcp"]
transport: stdio
env:
  OZON_CLIENT_ID: ...
  OZON_API_KEY: ...

Browse the official MCP client list at <https://modelcontextprotocol.io/clients>.

---

Usage examples

All examples below show realistic responses copied from tests/fixtures/responses/ β€” anonymized identifiers (99000001, TEST-SKU-001) but real shape.

Example 1 β€” Get all your products

You: Use ozon_fetch_all with operation_id="ProductAPI_GetProductList" to get all my products.

The agent calls:

{
  "operation_id": "ProductAPI_GetProductList",
  "params": {"filter": {"visibility": "ALL"}},
  "max_items": 10000
}

Server walks the last_id cursor automatically and returns:

{
  "ok": true,
  "items": [
    {"product_id": 99000001, "offer_id": "TEST-SKU-001", "archived": false},
    {"product_id": 99000002, "offer_id": "TEST-SKU-002", "archived": false},
    {"product_id": 99000003, "offer_id": "TEST-SKU-003", "archived": true}
  ],
  "total_fetched": 3,
  "truncated": false,
  "pages_fetched": 1
}

Example 2 β€” Find products at risk of going out of stock

You: Run the oos_risk_analysis workflow for my cabinet.

Agent first inspects the workflow:

ozon_get_workflow({"name": "oos_risk_analysis"})

β†’ tells the agent to call AnalyticsAPI_StocksTurnover (rate-limited to 1 req/min β€” the server's per-endpoint queue handles that for you) and how to interpret turnover_grade. The call returns:

{
  "items": [
    {"sku": 99000001, "current_stock": 12, "ads": 1.5,
     "idc": 8.0, "turnover_grade": "DEFICIT",
     "turnover_grade_cluster": "DEFICIT_GROWING"},
    {"sku": 99000002, "current_stock": 25, "ads": 0.8,
     "idc": 31.25, "turnover_grade": "OPTIMAL",
     "turnover_grade_cluster": "OPTIMAL_FALLING"},
    {"sku": 99000003, "current_stock": 0, "ads": 0.0,
     "idc": 0.0, "turnover_grade": "NO_SALES",
     "turnover_grade_cluster": "NO_SALES"}
  ]
}

The workflow's interpret field tells the agent to flag SKUs where idc < 14 or turnover_grade ∈ {DEFICIT, NO_SALES} and surface them sorted by idc asc.

Example 3 β€” Full cabinet health check

You: Check the health of my Ozon cabinet using the cabinet_health_check workflow.

The workflow tells the agent to read three endpoints in parallel β€” RatingAPI_RatingSummaryV1, SellerAPI_SellerInfo, AverageDeliveryTimeSummary. The first call returns:

{
  "groups": [
    {
      "group_name": "Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ°Π·ΠΎΠ²",
      "items": [
        {"rating": "rating_on_time", "name": "ΠŸΡ€ΠΎΡ†Π΅Π½Ρ‚ Π·Π°ΠΊΠ°Π·ΠΎΠ² воврСмя",
         "current_value": 97.5, "status": "OK", "value_type": "PERCENT"},
        {"rating": "rating_review_avg_score", "name": "БрСдняя ΠΎΡ†Π΅Π½ΠΊΠ°",
         "current_value": 4.7, "status": "OK", "value_type": "RATING"}
      ]
    },
    {
      "group_name": "ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ сСрвиса",
      "items": [
        {"rating": "rating_price_index", "name": "ИндСкс Ρ†Π΅Π½",
         "current_value": 1.01, "status": "OK", "value_type": "INDEX"}
      ]
    }
  ],
  "premium_scores": [
    {"rating": "rating_on_time", "value": 97.5,
     "penalty_score_per_day": 0, "scope": "premium_plus"}
  ]
}

Example 4 β€” Analyze product pricing

You: Which of my products have a red price index?

Agent runs the pricing_analysis workflow and inspects the price_indexes.color_index field on every item:

{
  "product_id": 99000001, "offer_id": "TEST-SKU-001",
  "price": {"price": "399.0000", "marketing_seller_price": "399.0000",
             "min_price": "299.0000"},
  "price_indexes": {
    "color_index": "WITHOUT_INDEX",
    "ozon_index_data": {"minimal_price": "395.0000",
                          "price_index_value": 1.01}
  },
  "commissions": {"sales_percent_fbo": 0.13, "sales_percent_fbs": 0.13}
}

The workflow's common_mistakes list reminds the agent to compare against marketing_seller_price (the actual buyer-facing price), not just the base price.

Example 5 β€” Content audit

You: Find products with low content rating and tell me what to improve.

Agent runs content_audit, gets per-SKU ratings + the list of attributes that would lift the score:

{
  "products": [
    {
      "sku": 99000001, "rating": 85,
      "groups": [
        {"key": "media", "rating": 100},
        {"key": "characteristics", "rating": 75,
         "improve_attributes": [
           {"id": 4191, "name": "Π¦Π²Π΅Ρ‚"},
           {"id": 8292, "name": "ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»"}
         ],
         "improve_at_least": 4}
      ]
    }
  ]
}

The workflow tells the agent that a +10 lift to rating measurably improves search ranking β€” so filling in those two attributes is worth ~4 points.

---

Available tools (15)

| Tool | What it does | |---|---| | ozon_call_method | Execute any Ozon API method with safety + subscription guards | | ozon_fetch_all | Auto-paginate β€” get every page, not just the first | | ozon_describe_method | Full docs for a method: schema, examples, rate limit, quirks | | ozon_search_methods | BM25 search across 466 methods (Russian or English, with stemming) | | ozon_list_sections | Browse the API by section | | ozon_get_section | All methods inside one section | | ozon_list_workflows | List ready-made analytical workflows (filterable by category) | | ozon_get_workflow | Full step-by-step plan for one workflow | | ozon_get_related_methods | Methods that work well together (auto-extracted graph) | | ozon_get_examples | Curated request/response examples for a method | | ozon_get_rate_limits | Per-method, per-section, or all | | ozon_get_subscription_status | Read your current cabinet's subscription tier | | ozon_list_methods_for_subscription | What you unlock on a given tier | | ozon_get_swagger_meta | Check that bundled API specs are still fresh | | ozon_get_error_catalog | Look up any Ozon error code |

---

Ready-made workflows (13)

Workflows are curated step-by-step recipes. Use ozon_get_workflow("name") to fetch the full plan, including interpret, when_to_use, common_mistakes, and the recommended DB schema for sync-style workflows.

| Workflow | Category | What it solves | |---|---|---| | oos_risk_analysis | analytics | Find products about to go out of stock | | cabinet_health_check | health | Check all seller-rating metrics in one shot | | content_audit | content | Find low-content-rating cards + actionable attributes | | pricing_analysis | pricing | Find products with non-competitive pricing | | warehouse_stock_distribution | warehouse | Per-warehouse stock breakdown for FBO | | sync_products_catalog | catalog | Full product catalog snapshot | | sync_orders_fbo | orders | Incremental FBO order sync | | sync_orders_fbs | orders | Incremental FBS / rFBS order sync | | sync_finance_transactions | finance | Finance transactions for unit economics | | sync_analytics_daily | analytics | Daily revenue / orders time series | | sync_advertising_campaigns | advertising | Performance API ads catalog | | sync_warehouse_stocks | warehouse | FBS warehouse stocks | | sync_returns_rfbs | returns | rFBS returns sync |

---

API coverage

| API | Methods | Sections | |---|---|---| | Ozon Seller API | 420 | 49 | | Ozon Performance API | 46 | 6 | | Total | 466 | 55 |

Subscription tiers modelled (low β†’ high): LITE β†’ STANDARD β†’ PREMIUM β†’ PREMIUM_PLUS β†’ PREMIUM_PRO.

---

Key features

Subscription-aware

The server knows which methods are gated on Premium tiers and refuses the call before it leaves your machine β€” saves your API quota:

{
  "error": "subscription_gate",
  "error_type": "subscription_gate",
  "code": 7,
  "message": "Endpoint requires PREMIUM_PRO, cabinet has PREMIUM_PLUS",
  "operation_id": "ProductPricesDetails",
  "required_tier": "PREMIUM_PRO",
  "cabinet_tier": "PREMIUM_PLUS",
  "retryable": false,
  "http_call_skipped": true
}

Rate-limit management

  • Auto-retry with exponential back-off on 429.
  • Honours Retry-After (both delta-seconds and RFC 7231 HTTP-date).
  • Per-endpoint semaphore for slow methods (e.g.

/v1/analytics/turnover/stocks is hard-limited to 1 req/min on the Ozon side β€” the server queues parallel calls automatically).

Auto-pagination

ozon_fetch_all handles all four pagination patterns Ozon uses: offset/limit, cursor, last_id, page_number. It also detects the rare case where the server returns the same cursor twice in a row and breaks the loop instead of spinning forever.

ozon_fetch_all(
  operation_id="ProductAPI_GetProductList",
  params={"filter": {"visibility": "ALL"}},
  max_items=10_000,
)
# β†’ {"items": [...all products...], "total_fetched": 847,
#    "truncated": false, "pages_fetched": 1}

Unified error envelope

Every tool that can fail returns the same shape β€” easy to branch on in any agent or downstream code:

{
  "error": "rate_limit_exceeded",
  "error_type": "rate_limit | subscription_gate | not_found | invalid_params | server_error | timeout | auth | forbidden | conflict | ...",
  "message": "Human-readable explanation",
  "code": 429,
  "operation_id": "AnalyticsAPI_StocksTurnover",
  "endpoint": "/v1/analytics/turnover/stocks",
  "retryable": true,
  "retry_after_seconds": 60
}

Safety classification baked into the catalog

Every method carries a safety field β€” read, write, or destructive. Write requires confirm_write=True; destructive requires both confirm_write=True AND i_understand_this_modifies_data=True. Heuristics from the schema extractor are reinforced by 43 curated safety_warning entries in quirks.yaml so the agent always sees a clear reminder before mutating anything.

---

Keeping the API specs up to date

Ozon refreshes their swagger periodically. To sync:

cd parser/                               # the parser repo / drop-zone
python parse_swagger.py                  # downloads + sanitises both APIs
cp seller_swagger.json ../src/ozon_mcp/data/
cp perf_swagger.json   ../src/ozon_mcp/data/
cp swagger_meta.json   ../src/ozon_mcp/data/

Run ozon_get_swagger_meta to confirm the bundled snapshot is fresh (the CI also fails the build when the snapshot is older than 14 days).

---

Development

git clone https://github.com/PCDCK/ozon-mcp.git
cd ozon-mcp
uv sync --extra dev

# Tests (β‰ˆ25s, 274 currently)
uv run pytest tests/ --ignore=tests/live

# Code quality
uv run ruff check src tests
uv run mypy src/ozon_mcp

# Coverage
uv run pytest tests/ --ignore=tests/live --cov=src/ozon_mcp \
    --cov-report=term-missing

See CONTRIBUTING.md for how to add knowledge (workflows, examples, quirks, subscription overrides).

---

License

MIT

See related servers & alternatives β†’

Related MCP servers

Browse all β†’

Related guides

Hand-picked reading to help you choose and use Vector & Memory servers.