Skip to main content
Glama
README.md
# migros-mcp 🇹🇷

mcp-name: io.github.mohammad-abbasi-sh/migros-mcp

Unofficial **read-only** MCP server for **Migros Sanal Market** (migros.com.tr), Türkiye's largest supermarket chain — live product search, prices, Money-discount promotions, categories and price stats.

> Part of the "Turkey MCP factory". Not affiliated with Migros. Note: this is the **Turkish** Migros (migros.com.tr) — not the Swiss Migros, which has its own unrelated `migros-mcp` on npm. Price comparison across chains is covered by `yibudak/marketfiyati_mcp` (marketfiyati.org.tr); this server covers Migros's own catalogue, promos and categories.

## For AI agents

Add to your MCP client config (stdio):

```json
{
  "mcpServers": {
    "migros": {
      "command": "uvx",
      "args": ["migros-mcp"]
    }
  }
}
```

Or run locally: `python -m migros_mcp.server` (needs `mcp<2`, `curl-cffi`).

## Tools

| Tool | Description |
|------|-------------|
| `migros_search_products` | Search products — `query` (Turkish, e.g. "süt"), `page`, `sort`: relevance / best_seller / discount / discount_amount / price_asc / price_desc |
| `migros_get_product` | Full detail for one product — `product_id` (numeric, from search) |
| `migros_list_categories` | Top-level store categories (11) |
| `migros_list_promotions` | Money-discounted products for a keyword, best discount first |
| `migros_price_stats` | Price stats (min/median/max/mean, cheapest & priciest) for a keyword |

Example output (`migros_search_products` / "süt", price_asc):

```json
{"query": "süt", "hit_count": 371, "page_count": 13, "count": 36,
 "products": [{"id": 20000011010208, "name": "Sütaş Latte 1 L",
 "brand": "Sütaş", "category": "Uzun Ömürlü Süt",
 "price_tl": 189.0, "money_discount_pct": 0, ...}]}
```

Notes:
- Prices are Turkish Lira (TRY); the API reports kuruÅŸ (1/100 TRY).
- `money_discount_pct` is the **Money-loyalty discount** percentage, not a strikethrough — the shelf price is what a guest pays.
- The first search result is often a sponsored/pinned product; the rest follow the requested sort.
- Data: Migros's public `product-bff` JSON API (`migros.com.tr/rest/product-bff`) — no key, no login, read-only.
- Store lookup and delivery slots need an authenticated session, so this server does not offer them.

## Development

```bash
python3 -m venv .venv && .venv/bin/pip install "mcp<2" curl-cffi pytest
.venv/bin/python -m pytest tests/ -q
```

- `tests/test_products.py` — offline, parses real captured API fixtures
- `tests/test_live.py` — 4 cautious live requests against migros.com.tr

## License

MIT

TDQS

A3.6/5.0

Scored across 5 tools

Disambiguation4/5

The tools are mostly distinct, but migros_search_products with discount-related sort options overlaps conceptually with migros_list_promotions. Descriptions help differentiate general search from Money-discount-specific promotions, while get_product, categories, and price_stats are clearly separate.

Naming Consistency4/5

All tools use the migros_ prefix and snake_case, which is consistent. Four follow a verb_noun pattern, with migros_price_stats being a noun-only minor deviation.

Tool Count5/5

Five tools are well-scoped for a product search/catalog/price-information server. Each tool has a clear role, and the set avoids unnecessary bloat.

Completeness3/5

Core capabilities like product search, product detail, categories, promotions, and price statistics are present. However, migros_list_categories is a dead end without a tool to fetch products by category, and search/price stats are limited to the first page of up to 36 results without explicit pagination control.

Maintenance

ActivityMaintained
ResponsivenessOutdated data