shop-mcp
by detushar
README.md
<p align="center">
<img src="https://img.shields.io/badge/MCP-Server-blue?style=for-the-badge" alt="MCP Server"/>
<img src="https://img.shields.io/badge/Python-3.10+-green?style=for-the-badge&logo=python" alt="Python"/>
<img src="https://img.shields.io/badge/Playwright-Browser-orange?style=for-the-badge&logo=playwright" alt="Playwright"/>
<img src="https://img.shields.io/badge/Sites-Amazon.in%20%7C%20Flipkart-purple?style=for-the-badge" alt="Sites"/>
</p>
<h1 align="center">shop-mcp</h1>
<p align="center">
<b>A local MCP server for personal shopping automation on Amazon.in & Flipkart</b><br/>
Search products, compare prices, manage cart, and place orders — all through your AI assistant with safety guards built in.
</p>
<p align="center">
<a href="#-quick-start">Quick Start</a> •
<a href="#-architecture">Architecture</a> •
<a href="#-tools">Tools</a> •
<a href="#-safety-guards">Safety Guards</a> •
<a href="#-mcp-client-config">Client Config</a>
</p>
---
## How It Works
```mermaid
graph LR
A[AI Assistant<br/>Claude / Open AI / Kiro / Any AI Chat or LLM Model] -->|MCP Protocol<br/>stdio| B[shop-mcp<br/>Server]
B -->|Playwright<br/>Browser Automation| C[Amazon.in]
B -->|Playwright<br/>Browser Automation| D[Flipkart]
B --- E[Saved Sessions<br/>cookies only<br/>no passwords]
style A fill:#4A90D9,color:#fff
style B fill:#2ECC71,color:#fff
style C fill:#FF9900,color:#fff
style D fill:#F7D02C,color:#000
style E fill:#95A5A6,color:#fff
```
```mermaid
flowchart LR
AI["🤖 YOUR AI ASSISTANT\nClaude Desktop · Kiro · Any MCP Client"]
subgraph SERVER["🖥️ shop-mcp SERVER"]
direction TB
RO["📖 Read-Only\nsearch_product\nview_cart\nget_product_details\nget_order_status"]
MU["✏️ Mutations\nadd_to_cart"]
GC["🔐 Guarded Checkout\ncheckout_dry_run\nplace_order\nToken + ₹3000 cap\n5 min expiry"]
end
subgraph SITES["🌐 Shopping Platforms"]
direction TB
AMZ["🟠 Amazon.in\nSession cookies\nManual login once"]
FK["🔵 Flipkart\nSession cookies\nManual login once"]
end
AI -->|"MCP Protocol\nstdio"| SERVER
SERVER -->|"Playwright\nChromium"| SITES
style AI fill:#1a73e8,stroke:#0d47a1,stroke-width:3px,color:#fff
style SERVER fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#2e7d32
style RO fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20
style MU fill:#fff9c4,stroke:#f9a825,stroke-width:2px,color:#e65100
style GC fill:#ffcdd2,stroke:#c62828,stroke-width:2px,color:#b71c1c
style SITES fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#6a1b9a
style AMZ fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#bf360c
style FK fill:#e8eaf6,stroke:#283593,stroke-width:2px,color:#1a237e
```
---
## Key Features
| Feature | Description |
|---------|-------------|
| **Price Comparison** | Search the same product on both platforms and compare prices instantly |
| **Cart Management** | View, add to cart across Amazon.in and Flipkart |
| **Guarded Checkout** | Orders require a dry-run summary + confirmation token + price cap |
| **No Password Storage** | You log in manually once; only session cookies are saved |
| **Headed Browser** | Visible Chromium window — no stealth, no detection issues |
| **MCP Standard** | Works with any MCP-compatible AI client via stdio transport |
---
## Quick Start
```bash
# 1. Clone & setup
git clone https://github.com/detushar/shop-mcp.git
cd shop-mcp
python -m venv .venv
.venv\Scripts\activate # or source .venv/bin/activate on Linux/macOS
# 2. Install dependencies
pip install -r requirements.txt
playwright install chromium # downloads browser binary (~180MB)
# 3. Login to sites (one-time, manual)
python -m browser.login amazon
python -m browser.login flipkart
# 4. Run the MCP server
python server.py
```
> **Note:** `playwright install chromium` downloads the Chromium binary that Playwright controls.
> This is separate from the Python package and required for the server to work.
---
## Tools
| Tool | Effect | Risk Level |
|------|--------|------------|
| `search_product` | Search a site for products | Read-only |
| `get_product_details` | Get price, title, availability for a product URL | Read-only |
| `view_cart` | List current cart contents | Read-only |
| `get_order_status` | Look up an existing order by ID | Read-only |
| `add_to_cart` | Add a product to the cart | Reversible |
| `checkout_dry_run` | Load checkout summary WITHOUT submitting | Read-only |
| `place_order` | Submit the order | **Irreversible** — guarded |
---
## Safety Guards
```
place_order() will REFUSE if:
✗ No checkout_dry_run() was called first
✗ confirm_token doesn't match the latest dry-run
✗ Token is older than 5 minutes (stale prices)
✗ Order total exceeds ₹3,000 (configurable cap)
```
Configure in `config.py`:
| Setting | Default | Purpose |
|---------|---------|---------|
| `MAX_ORDER_TOTAL_INR` | 3000 | Hard price ceiling per order |
| `REQUIRE_CONFIRM_TOKEN` | True | Forces dry-run before every purchase |
| `CONFIRM_TOKEN_TTL_SECONDS` | 300 | Token expiry (forces fresh price check) |
---
## MCP Client Config
Example config file: [`mcp-config-example.json`](mcp-config-example.json)
### Claude Desktop
`%APPDATA%\Claude\claude_desktop_config.json` (Windows) or `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):
```json
{
"mcpServers": {
"shop-mcp": {
"command": "C:\\path\\to\\shop-mcp\\.venv\\Scripts\\python.exe",
"args": ["C:\\path\\to\\shop-mcp\\server.py"],
"env": { "PYTHONUNBUFFERED": "1" }
}
}
}
```
### Kiro IDE
Add to `.kiro/settings/mcp.json`:
```json
{
"mcpServers": {
"shop-mcp": {
"command": "python",
"args": ["server.py"],
"cwd": "D:\\path\\to\\shop-mcp",
"env": { "PYTHONUNBUFFERED": "1" },
"disabled": false
}
}
}
```
### Linux / macOS
```json
{
"mcpServers": {
"shop-mcp": {
"command": "/path/to/shop-mcp/.venv/bin/python",
"args": ["/path/to/shop-mcp/server.py"],
"env": { "PYTHONUNBUFFERED": "1" }
}
}
}
```
> Always use the Python from your `.venv` so all dependencies are available.
---
## Project Structure
```
shop-mcp/
├── server.py # MCP server — tool definitions & checkout guards
├── config.py # Safety settings, timeouts, site URLs
├── requirements.txt # Python dependencies
├── mcp-config-example.json # Client configuration template
├── browser/
│ ├── base.py # Playwright session management (cookies, context)
│ ├── amazon.py # Amazon.in browser actions (search, cart, checkout)
│ ├── flipkart.py # Flipkart browser actions
│ └── login.py # Manual login helper (opens browser for you)
└── sessions/ # Auto-created, .gitignored — stores login cookies
```
---
## Important Notes
| | |
|---|---|
| **Terms of Service** | Amazon.in and Flipkart restrict bot access. This is for *personal, low-volume* use of your own account only. |
| **Selectors Break** | Both sites change their DOM frequently. Expect to update CSS selectors in `browser/amazon.py` and `browser/flipkart.py` when things stop working. |
| **Headed Mode** | Both sites detect headless browsers. Everything runs with a visible Chromium window (`headless=False`). |
| **Session Expiry** | When cookies expire, re-run `python -m browser.login <site>` to refresh. |
---
## Tech Stack
| Component | Technology |
|-----------|-----------|
| Server Framework | [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) via `fastmcp` |
| Browser Automation | [Playwright](https://playwright.dev/python/) (Chromium) |
| Language | Python 3.10+ |
| Transport | stdio (local server) |
---
## License
MIT License. See [LICENSE](LICENSE) for details.
---
<p align="center">
<i>Built for personal use. Use responsibly. Your account, your risk.</i>
</p>
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues