junggo-listing
by Sangmoo
README.md
---
title: 중고거래 판매글 생성기
emoji: 📦
colorFrom: yellow
colorTo: red
sdk: static
pinned: false
app_file: dist/index.html
license: mit
short_description: 물건 사진으로 중고거래 판매글을 만드는 웹 + MCP 서버
tags:
- korean
- claude
- mcp
- vue
---
# 📦 중고거래 판매글 생성기 (웹 + MCP)
물건 사진을 넣으면 Claude가 제품과 상태를 분석해 당근·번개장터·중고나라 스타일의 판매글을 써 줍니다.
- 사진에서 보이는 하자를 숨기지 않고 정리
- 사진만으로 알 수 없는 정보는 "추가하면 좋은 정보"로 안내
- 사진 속 송장·주소·얼굴 등 개인정보 경고
- 구매가를 넣으면 상태 등급 기준 희망 가격 범위 계산 (코드 계산, 참고용)
| 사용 방법 | 위치 | 키 |
|---|---|---|
| 웹 | https://huggingface.co/spaces/Sangmoo/junggo-listing-mcp | 화면에 본인 Anthropic API 키 입력 (브라우저 → api.anthropic.com 직접 호출, 저장 서버 없음) |
| MCP 서버 | 이 저장소의 `mcp_server/` (로컬 stdio) | MCP 클라이언트 설정의 `env.ANTHROPIC_API_KEY` |
## 역할 분담
Claude는 "보고 읽고 쓰는 일"만 하고, 틀리면 안 되는 부분은 코드가 처리합니다.
| Claude | 코드 |
|---|---|
| 제품 식별, 상태 등급, 하자·개인정보 발견, 글쓰기 | 응답 스키마 검증·정규화, 희망가 범위 계산, 해시태그 정리, 결과 조립 |
Claude 응답은 structured outputs(`output_config.format`)로 항상 스키마 형태의 JSON으로 받고, 그래도 생길 수 있는 타입 어긋남(소문자 등급, 문자열로 온 배열 등)은 `validate`가 한 번 더 맞춥니다.
## 구조
```
├── shared/prompts.json # 시스템 프롬프트 + 출력 스키마 (웹·MCP 공용, 여기만 고치면 됨)
├── src/ # Vue 3 웹앱 (npm run build → dist/, dist/를 커밋해 Space가 서빙)
│ ├── App.vue
│ ├── components/ # API 키 패널, 파일 선택, 복사 버튼, MCP 안내
│ └── lib/
│ ├── claude.ts # 브라우저에서 Messages API 호출 (structured outputs)
│ ├── files.ts # 이미지 EXIF 회전·축소(긴 변 1568px)·JPEG 변환
│ ├── validate.ts # 스키마 기반 출력 검증·정규화
│ └── logic.ts # 희망가 계산·결과 조립
├── mcp_server/ # 로컬 stdio MCP 서버 (Python)
│ ├── server.py # generate_listing 툴
│ ├── claude_util.py # 키 결정, 이미지/URL 입력, 구조화 호출
│ ├── validate.py # validate.ts와 동일 동작
│ ├── logic.py # logic.ts와 동일 동작
│ └── prompts.py # shared/prompts.json 로드
└── tests/
├── fixtures/cases.json # Python·TypeScript 공용 검증 데이터
├── test_logic.py / logic.test.ts
└── test_server.py # 가짜 Claude로 전체 흐름 + 실제 stdio MCP 프로토콜
```
## MCP 서버로 쓰기
```bash
git clone https://github.com/Sangmoo/junggo-listing-mcp.git
cd junggo-listing-mcp
python -m venv .venv
.venv\Scripts\activate # macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt
```
`claude_desktop_config.json` (경로는 실제 위치로):
```json
{
"mcpServers": {
"junggo-listing": {
"command": "C:/path/to/junggo-listing-mcp/.venv/Scripts/python.exe",
"args": ["C:/path/to/junggo-listing-mcp/mcp_server/server.py"],
"env": { "ANTHROPIC_API_KEY": "sk-ant-...", "CLAUDE_MODEL": "claude-sonnet-5-5" }
}
}
}
```
툴: `generate_listing(images, platform="당근", seller_note="", purchase_price=None)`
- `images`: 로컬 파일 절대 경로 또는 http(s) 이미지 URL, 1~6장
- `platform`: `당근` | `번개장터` | `중고나라`
- `purchase_price`: 구매가(원). 넣으면 등급별 비율(S 75~90%, A 60~75%, B 40~60%, C 20~40%)로 범위 계산
빠른 확인: `npx @modelcontextprotocol/inspector` → STDIO, command에 위 python 경로, args에 `mcp_server/server.py`.
## 개발
```bash
npm install
npm run dev # http://localhost:5173
npm test # TypeScript 검증 (vitest)
npm run build # 타입 체크 + dist/ 빌드 → dist/도 커밋 (Space가 그대로 서빙)
pip install -r requirements-dev.txt
python -m pytest -q # Python 검증 + MCP stdio 프로토콜 테스트
```
## 배포
- GitHub: https://github.com/Sangmoo/junggo-listing-mcp
- Hugging Face Space(static): https://huggingface.co/spaces/Sangmoo/junggo-listing-mcp — 빌드된 `dist/`를 그대로 서빙합니다 (HF의 static 빌드는 유료 크레딧 필요). 코드를 고친 뒤에는 `npm run build`로 `dist/`를 다시 만들어 함께 커밋하세요.
결과는 참고용입니다. 가격은 구매가와 상태 등급으로 계산한 단순 추정치이며, 제품 식별과 정품 여부는 직접 확인하세요.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo recent community issues