Skip to main content
Glama
README.md
# wholesale-mcp

AI 코딩 어시스턴트(Claude Code, Cursor 등)에서 도매 사이트를 직접 탐색/분석/주문할 수 있는 MCP 서버.

## 기능

### 브라우저 탐색 (Playwright)
| 도구 | 설명 |
|------|------|
| `open_site(url)` | 브라우저에서 URL 열기 + 네트워크 로그 초기화 |
| `snapshot_page()` | 현재 페이지의 모든 버튼/링크/입력/폼/iframe 목록 추출 |
| `snapshot_iframe(selector)` | iframe 내부 요소 목록 추출 |
| `click_element(selector)` | CSS 셀렉터로 요소 클릭 |
| `fill_input(selector, value)` | 입력 필드에 값 채우기 |
| `submit_form(selector)` | 폼 제출 + 네트워크 요청 캡처 |
| `get_network_log(filter)` | 캡처된 HTTP 요청/응답 목록 |
| `get_page_html(selector)` | 페이지 HTML (전체 또는 특정 영역) |
| `screenshot()` | 현재 화면 캡처 |
| `execute_js(code)` | JavaScript 실행 |

### 레시피 기반 HTTP 실행 (SiteExecutor)
| 도구 | 설명 |
|------|------|
| `list_sites()` | 등록된 도매사이트 목록 |
| `get_recipe(site_id)` | 레시피 JSON 조회 |
| `recipe_login(site_id, user, pass)` | HTTP 로그인 |
| `recipe_search(site_id, keyword)` | HTTP 검색 |
| `recipe_add_to_cart(site_id, code, qty)` | HTTP 장바구니 추가 |

### 세션 관리
| 도구 | 설명 |
|------|------|
| `get_cookies()` | 브라우저 쿠키 목록 |
| `set_cookies(json)` | 쿠키 주입 |
| `get_session_info(site_id)` | HTTP 세션 상태 |
| `close_browser()` | 브라우저 종료 |

## 설치

```bash
pip install -r requirements.txt
playwright install chromium
```

## 설정

프로젝트 루트에 `.mcp.json` 생성:

```json
{
  "mcpServers": {
    "wholesale-tools": {
      "command": "python",
      "args": ["path/to/wholesale-mcp/server.py"],
      "cwd": "path/to/wholesale-mcp"
    }
  }
}
```

## 레시피 추가

`recipes/` 폴더에 사이트별 JSON 파일을 추가합니다:

```json
{
  "recipe_version": 1,
  "site_id": "example_com",
  "site_name": "예시 도매",
  "site_url": "https://example.com",
  "encoding": "utf-8",
  "login": {
    "method": "POST",
    "url": "https://example.com/login",
    "payload": {
      "user_id": "{USERNAME}",
      "user_pw": "{PASSWORD}"
    },
    "success_indicator": {
      "type": "cookie",
      "key": "session_id"
    }
  },
  "search": {
    "method": "GET",
    "url": "https://example.com/search",
    "params": { "keyword": "{KEYWORD}" },
    "response_type": "html",
    "parsing": {
      "selector": "tr.product-row",
      "fields": {
        "product_name": { "selector": "td.name", "attribute": "text" },
        "product_code": { "selector": "input[name='code']", "attribute": "value" },
        "unit_price": { "selector": "td.price", "attribute": "text" }
      }
    }
  },
  "cart_add": {
    "method": "POST",
    "url": "https://example.com/cart/add",
    "payload": {
      "product_code": "{PRODUCT_CODE}",
      "quantity": "{QUANTITY}"
    }
  }
}
```

## 사용 예시

### 새 사이트 분석
```
AI: open_site("https://새도매사이트.com")
AI: snapshot_page()         → 로그인 폼, 버튼, 링크 발견
AI: fill_input("#id", "사용자")
AI: fill_input("#pw", "비번")
AI: submit_form("#loginForm")
AI: get_network_log()       → POST /login 요청 캡처 → 레시피 작성
AI: snapshot_page()         → 메뉴 구조 파악
AI: click_element("약품주문 링크")
AI: get_network_log()       → 검색 API 엔드포인트 발견
```

### 레시피 검증
```
AI: recipe_login("example_com", "user", "pass")  → 성공/실패
AI: recipe_search("example_com", "타이레놀")     → 검색 결과
AI: recipe_add_to_cart("example_com", "P001", 1) → 장바구니 추가
```

## 워크플로우

```
1. 분석:  브라우저로 사이트 열기 → 모든 버튼/폼/API 발견
2. 작성:  캡처된 네트워크 로그 기반 → 레시피 JSON 작성
3. 검증:  recipe_login/search/add_to_cart로 즉시 실행
4. 반복:  안 되면 브라우저로 다시 분석 → 레시피 수정
```

## 라이선스

MIT