Skip to main content
Glama
solid-hwan

법원경매 데이터 MCP

by solid-hwan
README.md
# 법원경매 데이터 MCP

법원경매 부동산을 조건으로 찾고, 상세를 확인하고, 수집한 자료를 Excel·CSV·JSONL로 저장합니다. **SIONLAB 제작 · MIT · Python 3.11+ · v0.1.0**

유료 AI·API 키·Supabase·개인 작업 환경 없이 CLI와 Python으로 실행할 수 있습니다. MCP를 연결하면 같은 기능을 AI 클라이언트에서 사용할 수 있습니다.

```mermaid
flowchart LR
    A[조건 정하기] --> B[물건 가져오기] --> C[상세 확인] --> D[엑셀 저장]
```

> 법원 사이트 내부 JSON 요청을 쓰는 **비공식 연동**입니다. 사이트 변경·점검·차단으로 멈출 수 있습니다. [공식 이용안내](https://openapi.scourt.go.kr/kgso202m01.do)는 2026-10-26 확인 시 일반 오픈API를 추후 제공 예정으로 안내합니다. 실제 입찰 전 법원 원문을 다시 확인하세요.

## 설치

[GitHub 릴리스](https://github.com/solid-hwan/court-auction-mcp/releases/tag/v0.1.0)의 ZIP과 SHA-256 파일을 받아 해시를 확인하고 압축을 풉니다. PyPI 배포는 하지 않습니다.

```bash
cd court-auction-mcp-0.1.0
python3 setup-lab.py
.venv/bin/python -m court_auction_mcp coverage
.venv/bin/court-auction-mcp codes
```

Windows에서는 `python setup-lab.py`와 `.venv\Scripts\python.exe -m court_auction_mcp coverage`를 사용합니다. 설치는 제품 폴더의 `.venv`에 한정됩니다. Linux에 `ensurepip`가 없고 기존 `uv`가 있으면 이를 사용합니다. 둘 다 없으면 Python의 venv 지원 환경이 필요합니다. Windows 실실행은 검증하지 않았습니다.

기존 가상환경에는 `python -m pip install -r requirements.lock` 뒤 `python -m pip install --no-build-isolation --no-deps .`로 설치할 수 있습니다.

## 먼저 가상 자료로 연습하기

```bash
.venv/bin/python examples/run_example.py
```

외부 요청 없이 가상 토지·건물 2개를 수집하고 세 형식 파일을 만든 뒤 Excel·CSV 원문 복원을 비교합니다. 출력 경로는 마지막 JSON에 표시됩니다. 실제 경매 데이터는 배포본에 없습니다.

## 실제 물건 검색과 상세

`examples/query.json`의 법원 또는 지역과 시작·종료일을 원하는 범위로 바꿉니다. 기본 페이지 크기는 10이며 기간은 매각기일 기준입니다.

```json
{
  "court": "B000210",
  "start": "2026-10-26",
  "end": "2026-11-30",
  "usage": "all",
  "page_size": 10
}
```

```bash
court-auction-mcp search --query examples/query.json
court-auction-mcp search --query examples/query.json --page 2
court-auction-mcp detail --court B000210 --case 2099타경123
```

마지막 사건번호는 **가상 예시**입니다. 실조회에서는 검색 결과의 `normalized.court_code`와 `normalized.case_no`를 사용하세요. `.venv/bin/` 경로를 생략하려면 가상환경을 활성화합니다. 모든 명령은 `python -m court_auction_mcp`로도 같습니다.

| 조건 | 입력 |
|---|---|
| 법원·지역 | `court`: 법원 코드 또는 유일하게 구분되는 이름, `region`: 시도 2자리, `district`: 시군구 5자리(시도와 함께) |
| 용도 | `usage`: `all`, `land`, `building`; 필요하면 `usage_mid`·`usage_small`에 공식 사이트의 5자리 코드 |
| 매각기일 | `start`, `end`: YYYY-MM-DD, 양 끝 포함 |
| 감정가 | `appraisal_min`, `appraisal_max`: 원 단위 정수 |
| 최저매각가 | `minimum_min`, `minimum_max`: 원 단위 정수 |
| 유찰 횟수 | `failures_min`, `failures_max`: 0 이상 정수 |

`codes`는 법원 60곳, 시도 17곳, 토지·건물 대분류를 제공합니다. 시군구·세부 용도 전체 목록의 동적 조회는 제공하지 않습니다.

**용도 검색은 매각물건 기준이며, 함께 매각되는 토지와 건물 목적물이 모두 반환될 수 있습니다.** 건물 검색에 연결된 토지가 나와도 삭제하지 않습니다. 개별 목적물의 `property_kind`와 매각물건의 `usage`를 구분하세요. 같은 사건의 토지·건물 행에 가격이 반복될 수 있으므로 목적물별 가격을 단순 합산하지 마세요.

## 수집·중단 후 재개·Excel 저장

```bash
court-auction-mcp collect --job-id seoul-oct --query examples/query.json --max-pages 3
court-auction-mcp status --job-id seoul-oct
court-auction-mcp collect --job-id seoul-oct --max-pages 3
court-auction-mcp export --job-id seoul-oct --name seoul-oct-export
```

기본 작업 DB는 `~/.court-auction-mcp/jobs.sqlite3`, 출력은 현재 폴더의 `output/`입니다. 전역 옵션 `--db`와 `--export-root`는 명령 앞에 둡니다. 예: `court-auction-mcp --db ./jobs.sqlite3 --export-root ./exports status --job-id seoul-oct`.

- HTTP 요청은 같은 DB를 쓰는 실행들 사이에서 순차 처리하고 최소 3초 간격을 둡니다. 여러 DB·프로세스를 나눠 병렬 수집하지 마세요.
- 신규 작업의 기본 한도는 **초기 연결·재시도 포함 누적 10회**입니다. 재개해도 초기화되지 않습니다. 세션 쿠키는 저장하지 않아 재개할 때 초기 연결 1회가 다시 필요합니다.
- 필요하면 `collect --job-id seoul-oct --max-calls 15 --max-pages 2`처럼 **누적 한도**를 명시적으로 늘립니다. 같은 작업의 검색 조건은 바꿀 수 없습니다.
- 기본 `max-pages`는 1입니다. `status=partial`, `reason=page_limit`는 요청한 페이지 수에서 멈춘 상태입니다. `call_limit`는 누적 호출 한도입니다. 남은 위치는 `next_page`입니다.
- 차단·CAPTCHA·`ipcheck=false`·403/429는 즉시 멈추고 같은 DB에서 이후 요청도 막습니다. IP·브라우저·새 DB로 우회하지 마세요. 자동 차단 해제 기능은 없습니다.
- 5xx·일시적 네트워크 오류만 최대 한 번 재시도합니다. 점검·형식 변경·식별자 불일치·반복 페이지는 별도 상태로 보존합니다.
- `complete`는 관측한 페이지 끝에 도달했다는 뜻입니다. 실시간 원본의 누락 없는 스냅샷을 보장하지 않습니다. 전체 건수가 변하면 `source_changed`와 `partial=true`로 남깁니다.

출력에는 `records.xlsx`, `records.csv`, `records.jsonl`, `manifest.json`이 포함됩니다. 기존 출력 폴더는 덮어쓰지 않습니다. Excel의 `Overview`는 보기용, `records`·`long_values`는 복원용, `Collection`은 수집 범위·완료 여부입니다. 빈 금액은 0이 아니며 원문과 누락 이유를 함께 확인하세요. 긴 CSV를 Python으로 읽을 때는 기본 필드 길이 제한이 있으므로 아래 복원 함수를 사용합니다.

```python
from court_auction_mcp.export import restore_excel, restore_csv
records = list(restore_excel("output/seoul-oct-export/records.xlsx"))
assert records == list(restore_csv("output/seoul-oct-export/records.csv"))
```

CLI 종료 코드: 정상 `0`, 입력·단일 요청 오류 `2`, 수집 미완료·중단 `3`입니다. 오류 메시지에 사이트 원문·쿠키를 포함하지 않습니다.

## Python과 MCP

```python
from court_auction_mcp import AuctionService
api = AuctionService(db="jobs.sqlite3", export_root="exports")
print(api.call("coverage"))
# api.call("search", {"query": {...}})
# api.call("collect", {"job_id": "sample", "query": {...}, "max_pages": 2})
```

`api.call()`은 CLI·MCP와 같은 오류 JSON을 반환합니다. `api.search()` 등 직접 메서드는 잘못된 입력에 `AuctionError`를 발생시킬 수 있습니다.

[examples/mcp-config.json](examples/mcp-config.json)을 참고해 사용하는 MCP 클라이언트에 직접 연결합니다. `command`에는 가상환경의 실행 파일 절대 경로를 쓰면 됩니다. 이 패키지는 운영 MCP 설정을 변경하지 않습니다.

| CLI | MCP |
|---|---|
| `codes` | `auction_codes` |
| `search` | `auction_search` |
| `detail` | `auction_detail` |
| `collect` | `auction_collect` |
| `status` | `auction_job_status` |
| `export` | `auction_export` |
| `coverage` | `auction_coverage` |

`serve`는 MCP stdio 서버를 실행합니다. MCP 수집 결과는 요약이며 대량 자료는 `auction_export`로 제공합니다. MCP 응답은 1MiB로 제한됩니다. 검색 페이지를 줄이거나 파일 출력을 사용하세요.

## 검증과 범위

[실제 검증](docs/verification.md) · [데이터 계약](docs/data-contract.md) · [기술 흐름](docs/architecture.md) · [출처·이용 조건](NOTICE.md) · [기여하기](CONTRIBUTING.md)

서울중앙지방법원·2026-10-26~2026-11-30 범위에서 검색 10건, 상세 1건, 두 페이지 20건 저장, 조건 검색 10건을 확인했습니다. 호출은 초기 연결 포함 총 9회였습니다. 이는 전국 법원·모든 상세 조합·전체 수집 완료를 검증한 결과가 아닙니다. 자세한 검증 상태는 `coverage`를 확인하세요.

사진·첨부문서 다운로드, 15B, 자동차·중기, 온비드, 권리분석·투자추천·입찰 자동화는 지원하지 않습니다. 누락값은 추정하지 않습니다. 관계인 이름·연락처와 인증값을 저장하지 않도록 필드를 제한하며, 코드 MIT 라이선스와 법원 원자료의 이용 조건은 별개입니다.

TDQS

B3/5.0

Scored across 7 tools

Disambiguation4/5

Most tools have clearly distinct roles: code lookup, single-page search, case detail, bulk collection, job status, export, and scope metadata. The only mild overlap is between auction_codes and auction_coverage, since both mention supported ranges/scope, but their descriptions still point to different tasks.

Naming Consistency5/5

All tools use a consistent auction_ prefix followed by a snake_case noun or noun phrase. The naming pattern is predictable throughout, with no mixed casing or inconsistent verb styles.

Tool Count5/5

Seven tools is well-scoped for a court auction data server covering lookup, search, detail, collection, status, export, and coverage. Each tool has a distinct practical role without obvious bloat.

Completeness4/5

The surface covers the main lifecycle: discover codes, search listings, fetch case detail, bulk collect, check job status, export results, and inspect coverage. Minor gaps may exist around listing all jobs or cancelling a running collection, but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues