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).
| 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=true is 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
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_orders redacts customer name and full shipping address by default and
returns only the city; pass include_pii=true per call when you actually
need it.
get_customer_questions and get_claims never 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_stock returns Trendyol's batchRequestId but 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-After value
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