makiti-mcp
# đ Makiti â MCP Shopping Assistant
**Makiti** est un serveur MCP (Model Context Protocol) qui agit comme assistant shopping intelligent.
Il sâappuie sur **Hound** pour chercher le web et scraper les retailers, et fournit des outils MCP pour :
- đ rechercher des produits,
- đ·ïž trouver le meilleur prix sur les retailers canadiens,
- âïž comparer des items,
- đ° trouver les meilleurs deals,
- đ estimer lâhistorique de prix.
---
## đ Installation
```bash
git clone https://github.com/seasayDev/makiti-mcp.git
cd makiti-mcp
npm install
```
---
## âïž Configuration requise
| Dépendance | Description |
|---|---|
| **Node.js >= 18** | Runtime requis |
| **Hound MCP** | Serveur MCP de recherche web (wrapper Hermes) |
| **Hermes Agent** | Pour consommer les outils Makiti via MCP |
### Architecture
Makiti ne parle pas Ă Hound par HTTP : il **spawn Hound en sous-processus** et
communique en **JSON-RPC stdio** (protocole MCP), exactement comme le fait Hermes.
Le chemin du wrapper Hound est configurable via la variable d'environnement
`HOUND_WRAPPER` (défaut : `/data/data/com.termux/files/home/.hermes/scripts/hound-wrapper.sh`).
```
[ Agent / Hermes ] ââstdioââ> [ Makiti MCP ] ââspawnââ> [ Hound MCP ] ââ> web
```
---
## đ ïž Outils disponibles
### `product_search`
Rechercher des produits sur le web avec filtres de prix, marque, retailer, condition.
Les résultats sont **triés du moins cher au plus cher** quand un prix est détecté.
```json
{
"query": "iPhone 15",
"max_price": 1200,
"brand": "Apple",
"retailer": "amazon.ca",
"condition": "new",
"limit": 10
}
```
### `find_best_price` â (nouveau)
**Scraper directement les pages de recherche des retailers canadiens** (Amazon.ca, Walmart.caâŠ)
pour trouver le prix le plus bas réel, lu en direct sur les sites.
Plus fiable que `product_search` car il lit les pages produits elles-mĂȘmes.
```json
{
"query": "usb flash drive 128gb",
"retailers": ["amazon.ca", "walmart.ca"],
"limit": 5
}
```
Retailers supportés : `amazon.ca`, `walmart.ca`, `bestbuy.ca`, `canadiantire.ca`, `staples.ca`, `newegg.ca`.
> â ïž Best Buy Canada bloque le scraping automatisĂ© (HTTP 403) â les erreurs sont listĂ©es dans la rĂ©ponse.
### `product_compare`
Comparer deux produits cĂŽte Ă cĂŽte : specs, prix, verdict.
```json
{
"product_a": "iPhone 15",
"product_b": "Samsung Galaxy S24",
"category": "smartphone",
"budget": 1100
}
```
### `find_deals`
Trouver les deals/promo actifs pour un produit ou une catégorie (filtré sur la région Canada).
```json
{
"query": "Nike running shoes",
"region": "Canada",
"retailer": "amazon.ca",
"limit": 10
}
```
### `price_history`
Suivre/estimer lâhistorique de prix dâun produit sur plusieurs retailers.
```json
{
"product": "PlayStation 5",
"retailers": ["amazon.ca", "bestbuy.ca", "walmart.ca"],
"days_back": 90
}
```
### `makiti_guide`
Obtenir des conseils dâutilisation selon ton scĂ©nario shopping.
```json
{
"scenario": "acheter un laptop sous 800 CAD"
}
```
---
## đ§ Leçons apprises (retour d'expĂ©rience rĂ©el)
Makiti a été mis à l'épreuve sur une vraie recherche (« meilleur prix clé USB 128GB Canada »).
Voici ce que cette expérience a révélé, et comment le code a été corrigé.
### Leçon 1 â Les filtres `site:` tuent les recherches Hound
**ProblĂšme :** `product_search` gĂ©nĂ©rait des requĂȘtes comme `USB flash drive 128GB site:amazon.ca price` â
**0 résultat** sur tous les moteurs de Hound.
**Cause :** les opĂ©rateurs `site:` combinĂ©s Ă des requĂȘtes longues font Ă©chouer les moteurs.
**Correction :**
- plus aucun `site:` dans les requĂȘtes ;
- les noms de retailers sont convertis en mots-clĂ©s (`amazon.ca` â `amazon canada`) ;
- les requĂȘtes sont gardĂ©es **courtes** (`< 8 mots`).
### Leçon 2 â Fallback automatique des moteurs de recherche
**ProblÚme :** pendant la session, les moteurs `google` et `brave` étaient bloqués
(`engine_blocked`), donnant 0 résultat pendant plusieurs minutes.
**Correction :** `hound-client.js` implémente un **fallback en 3 paliers** :
1. `google, brave, duckduckgo, yahoo`
2. `duckduckgo, yahoo, qwant, mojeek`
3. `startpage, bing`
Si un palier renvoie 0 résultat **et** des moteurs bloqués, on passe au palier suivant.
### Leçon 3 â La recherche web seule ne suffit pas : il faut scraper les retailers
**ProblÚme :** les résultats web donnent des liens de blogs/deals, pas de prix fiables.
**La méthode gagnante :** le **fetch direct** des pages de recherche des retailers
(`amazon.ca/s?k=...`, `walmart.ca/en/search?q=...`) a donné les vrais prix en CAD,
y compris les promotions en cours (Kingston 64GB Ă 13,97$ Walmart, PNY 128GB Ă 26,08$ Amazon).
**Correction :** nouvel outil `find_best_price` qui scrappe Amazon.ca et Walmart.ca en parallĂšle
et extrait (produit, prix) avec une heuristique ligne par ligne.
### Leçon 4 â Les rĂ©sultats « deals » partent en vrille gĂ©ographique
**ProblÚme :** `find_deals` sur « USB flash drive » renvoyait des deals **hotukdeals (UK)**
et des sites pakistanais.
**Correction :** filtrage gĂ©ographique â on garde les hits contenant des indices canadiens
(`.ca`, `Canada`, `CAD`, `quĂ©bec`, `redflagdeals`, `slickdeals`âŠ) et on Ă©limine les indices
Ă©trangers (`hotukdeals`, `.co.uk`, `pakistan`, `karachi`, `indiamart`âŠ).
### Leçon 5 â Le parsing de prix est un champ de mines
**ProblÚme :** les pages retailers mélangent prix réels (`Now $13.97`) et bruit
(`You save $6.02`, `$890` sans décimales, `Up to $15`, headers markdown `##`).
**Correction (heuristique actuelle) :**
- les lignes `You save $X` ne fournissent **jamais** un prix ;
- on privilégie les prix **avec décimales** (`$13.97`) ;
- on ignore la navigation, les headers markdown, `More buying choices`, `List:`, `You pay` ;
- les titres sont nettoyĂ©s (`...284.6786 out of 5 stars. 28 reviews` â nom seul).
### Leçon 6 â La fraĂźcheur compte
Les prix bougent vite. Toutes les réponses rappellent que les prix sont **relevés à l'instant du fetch**
et doivent ĂȘtre vĂ©rifiĂ©s sur la page produit avant achat (taxes/livraison non incluses).
---
## đșïž Roadmap (amĂ©liorations futures)
- [ ] **Parsing JSON-LD/structured data** des pages retailers (au lieu de l'heuristique lignes) pour des prix exacts + URLs produits.
- [ ] **Contournement Best Buy** via le browser stealthy de Hound (actions click/form) â actuellement bloquĂ© 403.
- [ ] **`price_alert`** â outil cron qui surveille un produit et notifie quand le prix passe sous un seuil.
- [ ] **Cache prix par produit** (TTL court) pour éviter de refrapper les retailers à chaque appel.
- [ ] **Support USDâCAD** pour les retailers amĂ©ricains (conversion + droits de douane indicatifs).
- [ ] **Détection de taxes/livraison** par province depuis les pages produit.
- [ ] **`compare_retailers`** â outil dĂ©diĂ© qui croise les prix d'un mĂȘme modĂšle sur 4+ retailers.
---
## đŠ Enregistrement dans Hermes
Dans `~/.hermes/config.yaml`, ajoute :
```yaml
mcp_servers:
makiti:
command: node
args: ["/chemin/absolu/vers/makiti-mcp/server.js"]
```
Puis redémarre Hermes :
```bash
hermes gateway restart # depuis un shell Termux, pas depuis le chat
```
Vérification :
```bash
hermes mcp list # makiti doit apparaĂźtre â enabled
hermes mcp test makiti # â Connected + tools discovered
```
---
## đ§Ș DĂ©veloppement / test
```bash
# Vérifier le handshake MCP + un outil réel
printf '%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"product_search","arguments":{"query":"iPhone 15","limit":3}}}' \
| timeout 100 node server.js
```
> â ïž Hound dĂ©marre en ~15 s au premier appel (proot Ubuntu). Patience sur le premier `tools/call`.
---
## đ§ Scripts npm
```bash
npm start # lancer le serveur MCP (alias node server.js)
```
---
## đ License
MIT © seasayDev
TDQS
Scored across 6 tools
The tools cover distinct shopping functions: broad search, price comparison, deal hunting, price history, and product comparison. product_search and find_best_price both provide pricing but are differentiated by scope and accuracy; descriptions make this clear. Overall, minimal confusion.
Names use a mix of noun-verb (product_compare, product_search), verb-noun (find_best_price, find_deals), and noun-noun (price_history, makiti_guide) patterns. While all use snake_case, the inconsistent verb placement makes the naming less predictable.
Six tools is an appropriate size for a shopping assistant, covering core workflows without being overwhelming. Each tool has a defined role.
The tool set covers search, price comparison, price history, and deals, which are the main shopping decision processes. A guide tool adds helpful meta-navigation. No significant gaps are apparent.