trendyol-seller-mcp
An unofficial MCP server for the Trendyol Marketplace seller API, so Turkish e-commerce sellers can drive day-to-day store operations from an AI assistant (Claude Desktop, Claude Code, or any other MCP client): list products, check order packages, review returns, and — when explicitly enabled — answer customer questions and update stock/prices.
Not affiliated with Trendyol. This is an independent open-source project by Koray Nar (Istanbul). It talks to the official seller API using your own API credentials, which you can find in the Trendyol Seller Panel: Satıcı Paneli > Hesap Bilgilerim > Entegrasyon Bilgileri (visible only to the panel's master user).
Built by Koray to support his own AI-automation practice and published as part of his public portfolio. It is a working tool with a mocked test suite — no user counts, clients, or production claims implied.
Türkçe Özet
trendyol-seller-mcp, Trendyol Pazaryeri satıcı API'si için resmi olmayan
bir MCP sunucusudur. Claude gibi bir yapay zeka asistanının mağazanızla
konuşmasını sağlar: ürünleri listeler, sipariş paketlerini ve iadeleri
görüntüler, müşteri sorularını okur. Yazma işlemleri (soru cevaplama,
stok/fiyat güncelleme) varsayılan olarak kapalıdır; yalnızca
TRENDYOL_ALLOW_WRITES=true ortam değişkenini ayarlarsanız çalışır.
Gerekli bilgiler: Satıcı ID, API Key ve API Secret — bunları Satıcı Paneli > Hesap Bilgilerim > Entegrasyon Bilgileri sayfasında bulabilirsiniz. Proje Trendyol ile bağlantılı değildir; kendi API bilgilerinizle, kendi sorumluluğunuzda kullanılır. Sipariş verilerinde müşteri adı ve adresi varsayılan olarak gizlenir (yalnızca şehir gösterilir).
Tools
| Tool | Type | What it does |
|---|---|---|
get_products(page=0, size=50, approved=None, barcode="") | read | Paged product list, trimmed to barcode, title, quantity, salePrice, listPrice, approved. |
get_orders(status="", start_date="", end_date="", page=0, size=50, include_pii=False) | read | Order packages: orderNumber, status, orderDate, totalPrice, lines, and customer city only. Name/full address are redacted unless include_pii=True. Dates accept YYYY-MM-DD or epoch ms. Status values: Created, Picking, Invoiced, Shipped, Cancelled, Delivered, UnDelivered, Returned, AtCollectionPoint, UnSupplied. |
get_customer_questions(status="WAITING_FOR_ANSWER", page=0, size=50) | read | Customer Q&A: id, question text, status, product, existing answer. Other statuses: WAITING_FOR_APPROVE, ANSWERED, REPORTED, REJECTED. |
answer_question(question_id, text) | write | Publishes an answer (10–2000 chars, per Trendyol's rules). Guarded — see below. |
update_price_and_stock(items_json) | write | Batch stock/price update. items_json is a JSON array of {"barcode", "quantity", "salePrice", "listPrice"} (max 1000 items). Returns Trendyol's batchRequestId. Guarded — see below. |
get_claims(page=0, size=20) | read | Returns/claims summary with per-item status and customer reason. Customer names excluded. |
Write guard (read this first)
The two write tools are double-guarded:
- They refuse with a clear message unless the environment variable
TRENDYOL_ALLOW_WRITES=trueis set for the server process. Without it, the server is strictly read-only — an AI assistant cannot change your store. - Client-side validation runs before any request leaves your machine (answer length 10–2000 characters, max 1000 items per stock/price batch, barcode required per item).
Recommended: run read-only first, and only set TRENDYOL_ALLOW_WRITES=true
once you trust the workflow. Answers to customer questions are public and can
only be posted once per question.
Configuration
| Env var | Required | Meaning |
|---|---|---|
TRENDYOL_SELLER_ID | yes | Your seller (cari) ID. |
TRENDYOL_API_KEY | yes | API key from Entegrasyon Bilgileri. |
TRENDYOL_API_SECRET | yes | API secret from Entegrasyon Bilgileri. |
TRENDYOL_BASE_URL | no | Defaults to https://apigw.trendyol.com/integration. Set to https://stageapigw.trendyol.com/integration for Trendyol's stage environment. |
TRENDYOL_ALLOW_WRITES | no | Set to true to enable the two write tools. Anything else keeps them disabled. |
Requests use HTTP Basic auth (key/secret) and the User-Agent Trendyol requires
for self-integrations: "<sellerId> - SelfIntegration".
Quickstart
Requires Python 3.11+ and uv.
git clone https://github.com/koraynar/trendyol-seller-mcp
cd trendyol-seller-mcp
uv venv && uv pip install -e '.[dev]'
uv run --extra dev pytest # all tests are offline (httpx.MockTransport), no live calls
Claude Code
claude mcp add trendyol-seller \
--env TRENDYOL_SELLER_ID=123456 \
--env TRENDYOL_API_KEY=your-key \
--env TRENDYOL_API_SECRET=your-secret \
-- uv run --directory /absolute/path/to/trendyol-seller-mcp trendyol-seller-mcp
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"trendyol-seller": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/trendyol-seller-mcp",
"trendyol-seller-mcp"
],
"env": {
"TRENDYOL_SELLER_ID": "123456",
"TRENDYOL_API_KEY": "your-key",
"TRENDYOL_API_SECRET": "your-secret"
}
}
}
}
Add "TRENDYOL_ALLOW_WRITES": "true" to env only when you want the write
tools active.
Privacy notes
get_ordersredacts customer name and full shipping address by default and returns only the city; passinclude_pii=trueper call when you actually need it.get_customer_questionsandget_claimsnever return customer names.- Credentials come from environment variables only; nothing is written to disk.
Limitations (honest list)
- Unofficial: Trendyol can change the API at any time; endpoints were
verified against
developers.trendyol.com(v2.0 docs, EN) on 2026-08-25. - Covers six common operations, not the full API surface (no product creation, shipping label, invoice, or webhook endpoints).
update_price_and_stockreturns Trendyol'sbatchRequestIdbut does not poll the batch result endpoint; check the batch status yourself if needed.- Trendyol's docs cap question pages at 50 items and order pages at 200; this server clamps to those. No documented cap was found for the product filter (V1) page size, so it is passed through as-is.
- Trendyol's international (non-TR) marketplace API is not targeted or tested.
- No caching, no retry loop — a 429 is surfaced with the
Retry-Aftervalue so the calling assistant can decide when to retry. - Built and tested against mocked responses; field names include tolerant fallbacks where Trendyol's docs show more than one name for the same field.
License
MIT © 2026 Koray Nar