atcmarket-mcp
by pokys
README.md
# atcmarket-mcp
Remote MCP server (Streamable HTTP) nad verejnym katalogem
[atcmarket.cz](https://www.atcmarket.cz) (AT Computers). Bez loginu,
bez state — cte verejne dostupne stranky katalogu a parsuje je (zadne
JSON API na zdrojovem webu neexistuje).
## Nastroje
- **`hledej_produkt(dotaz)`** — fulltextove hledani v celem katalogu.
Vraci nazev, kod, cenu s/bez DPH a dostupnost. Siroke — muze vratit
nesouvisejici produkty z jinych kategorii (napr. "Gigabyte zakladni
deska" vrati i notebooky a CPU chladice znacky Gigabyte).
- **`hledej_v_kategorii(kategorie, filtry?, pouze_skladem?, strana?)`**
— presne hledani omezene na jednu kategorii, volitelne filtrovane
podle vyrobce/typu (napr. `kategorie: "zakladni_desky", filtry:
["Gigabyte"]`). Pouziva reverse-engineerovany filtrovaci mechanismus
webu (viz nize) — nevraci sum z jinych kategorii.
- **`podporovane_filtry()`** — vypise podporovane kategorie a jejich
filtry. Zavolat pred pouzitim `hledej_v_kategorii` s konkretnim
filtrem, aby se predeslo chybe "neznamy filtr".
- **`detail_produktu(kod)`** — detail podle objednaciho kodu: nazev,
vyrobce, kod vyrobce, zaruka, dostupnost, obe ceny a tabulka
technickych parametru.
- **`porovnej_produkty(kody)`** — srovná 2 až 5 produktů podle
objednacích kódů (např. dva notebooky nebo dvě desky). Stáhne
detaily paralelně, sjednotí parametry do jedné tabulky (chybějící
hodnota u produktu, který daný parametr nemá, se ukáže jako `—`).
Funguje i napříč kategoriemi, i když to pak nemusí dávat věcný smysl.
## Podporovane kategorie (stav k nasazeni)
| Klíč | Název | Příklady filtrů |
| --- | --- | --- |
| `notebooky` | Notebooky | `intel`, `amd`, `windows_11_home`, `windows_11_pro` |
| `zakladni_desky` | Zakladni desky | `asus`, `gigabyte`, `am5`, `lga1851` |
| `procesory` | Procesory a chladice | `amd`, `intel`, `am5`, `lga1700` |
| `pameti` | Pameti | `ddr4`, `ddr5`, `kingston`, `crucial` |
| `skrine_a_zdroje` | Skříně a zdroje | `corsair`, `midi_tower`, `atx_3_1`, `80plus_gold` |
| `graficke_karty_a_tv_tunery` | Grafické karty a TV tunery | `nvidia`, `rtx_5070`, `amd`, `rx_9070_xt` |
| `disky` | Disky | `ssd`, `m_2_pcie_4_0_nvme`, `wd`, `seagate` |
| `monitory_a_lfd` | Monitory a LFD | `ips`, `oled`, `vyskove_nastavitelny_stojan`, `usb_c` |
| `tiskarny_multifunkce_a_plotry` | Tiskárny, multifunkce a plotry | `multifunkce`, `laserova`, `wifi`, `duplex` |
| `klavesnice_mysi_herni_ovladace` | Klávesnice, myši, herní ovladače | `logitech`, `hyperx`, `hp`, `asus` |
| `sluchatka` | Sluchátka | `logitech`, `hyperx`, `hp`, `endorfy` |
> Omezení: kategorie `procesory` sdružuje procesory a chladiče. ATC
> Market je rozlišuje pouze podkategorií, kterou současný model
> `hledej_v_kategorii` neserializuje; pro praktické zúžení použij
> filtr výrobce (Intel/AMD → CPU, Arctic/Scythe/Endorfy → chladiče)
> nebo socket/patici (am4/am5/lga1700/lga1851), který CPU vrací čistě.
Kompletní seznam filtrů pro danou kategorii vrátí nástroj
`podporovane_filtry()`.
V kazde kategorii lze kombinovat vice filtru najednou (napr. notebooky
+ `["Intel", "Lenovo"]` = jen Intel notebooky znacky Lenovo).
## Jak filtrovaci mechanismus funguje (pro rozsireni na dalsi kategorie)
Web nema JSON API, ale ma funkcni server-side filtr pouzivany strankou
"Komfortni hledani" (`/adv-search/{kat}/{templateId}`). Zjistil jsem
dva mechanismy:
1. **Kategorie-specificky numericky filtr** — kazda hodnota v UI ma
`data-pid` (ID parametru) a `data-vid` (ID hodnoty). Vysledky se
pak nactou z `/itemspage/zbozi?kat={kat}&templateId={templateId}
&sort=1&page=1&skladem=0&c={pid}I{vid}`. Vice filtru se retezi
pres `P`: `c=371I26531P1117I5067`.
2. **Univerzalni filtr vyrobce** — kdyz ma hodnota `data-pid="brands"`,
pouziva se misto toho samostatny parametr `vyr={vid}` (ne `c=`).
Postup pro pridani nove kategorie:
1. Najdi kategorii v katalogu, ziskej jeji `kat` a `templateId` z
odkazu `/adv-search/{kat}/{templateId}`.
2. Na strance `/adv-search/{kat}/{templateId}` najdi pozadovanou
hodnotu v DOM (napr. pres DevTools), precti jeji `data-pid`
a `data-vid`.
3. Pokud `data-pid="brands"`, pouzij typ `"vyr"` s dane `vid`.
Jinak pouzij typ `"c"` s danym `pid`+`vid`.
4. Pridej zaznam do `CATEGORIES` v `route.ts`.
Poznamka: nektere facety (napr. "Pamet RAM (GB)" na noteboocich,
"Kapacita pameti (GB)" na pametech, "Velikost pameti VGA (GB)" u
grafickych karet) jsou rozsahove slidery, ne diskretni hodnoty — ty
nejsou v teto verzi podporovane (vyzaduji jiny zpusob automatizace).
Overeno: grafické karty nemají ani obecnější facet na úrovni generace
(jen konkrétní modely jako rtx_5070).
## Lokalni spusteni
```bash
npm install
npm run dev
# http://localhost:3000/api/mcp
```
## Deploy na Vercel
```bash
vercel --prod
```
nebo pres [vercel.com/drop](https://vercel.com/drop) — nahraj zip bez
`node_modules` a `.next`.
## Pripojeni klienta
```json
{
"mcpServers": {
"atcmarket": { "url": "https://<tvuj-projekt>.vercel.app/api/mcp" }
}
}
```
Pro stdio-only klienty pres `mcp-remote` proxy (viz README u ares-mcp).
## Zname omezeni
- **Jen verejny katalog.** Ceny a dostupnost jsou ty, co vidi
neprihlaseny navstevnik — ne partnerske ceny z atcomp.cz. Server pro
atcomp.cz (prihlaseny B2B ucet) je samostatny projekt.
- **HTML scraping, ne API.** Parser je navazany na aktualni CSS tridy
webu. Redesign webu ho muze rozbit.
- **atcmarket.cz posila neuplny TLS certifikatovy retezec** (chybi
mezilehly CA certifikat — bezne u IIS/ASP.NET serveru). Bezne
prohlizece to tolerovaly (AIA-fetching/cachovana duveryhodna
uloziste), ale Node fetch to odmital chybou "unable to get local
issuer certificate". Server proto pouziva `node:https` s vypnutou
strict verifikaci certifikatu (`rejectUnauthorized: false`) POUZE
pro volani na atcmarket.cz — ne globalne. Kompromis: prijima riziko
MITM na tomto jednom odchozim spojeni vymenou za funkcnost; jde jen
o cteni verejnych katalogovych dat, zadne credentials se neposilaji.
- **atcomp.cz odkaz.** Každá položka a detail nese kromě odkazu na
atcmarket.cz i odkaz na B2B portál `https://www.atcomp.cz/ItemDetail/
Index/{kod}` — sestavený jen ze stejného objednacího kódu, žádný
další scraping. Odkaz je za loginem (potvrzeno uživatelem, že stejné
ID platí na obou systémech).
- **Neexistujici kod** se pozna podle `<title>` obsahujiciho
"Nenalezeno" — web nevraci jasny HTTP chybovy stavovy kod.
- **Rozsahove filtry (RAM GB, cena, frekvence) nejsou podporovane** —
jen diskretni hodnoty (vyrobce, typ pameti, CPU vyrobce...).
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues