Travel Briefing MCP
README.md
# Travel Briefing (트래블 브리핑)
PlayMCP에 등록하기 위한 **해외여행 준비 MCP 서버**. 일본을 중심으로 중국·대만·동남아 6개국까지 비자·환율·안전경보·시즌·관광지·맞춤 일정과 국가별 문화·현지 생활 팁을 제공한다.
**대회**: AGENTIC PLAYER 10 (본선 유저 투표: 2026-08-31 ~ 09-28)
## MCP 제공 정보
지원 국가: 일본(JP), 중국(CN), 대만(TW), 베트남(VN), 태국(TH), 필리핀(PH), 싱가포르(SG), 말레이시아(MY), 인도네시아(ID).
- **출발 전 준비**: 비자, 전압/플러그, 시차, 통화, 긴급번호, 대사관 연락처
- **현지 문화·생활 팁**: 국가별 예절, 소지품, 교통, 결제, 음식·물, 날씨 대응 요령
- **현재 안전 상황**: 외교부 여행경보 단계와 발효일
- **환율**: 한국수출입은행 매매기준율
- **항공 시즌 가이드**: 성수기/비수기 판정과 스카이스캐너 비교 링크
- **관광지 큐레이션**: 8개 도시(도쿄·오사카·교토·후쿠오카·삿포로·오키나와·히로시마·나라) × 5개 카테고리(문화·먹거리·자연·쇼핑·온천)
- **D-day 체크리스트**: 위 정보를 종합한 단톡방 붙여넣기용 카드
- **맞춤 일정 추천**: 일정·예산·인원·목적과 정제된 여행 후기 기반 추천
## 아키텍처 원칙
**얇은 서버**: 추론은 호스트 LLM(Kakao Tools)이 담당하고, 이 서버는 결정론적 조회·계산·렌더링만 처리한다. 서버 내부에서 LLM을 돌리지 않아 운영 비용이 낮다.
**데이터 변동성 3계층 관리**:
| 변동성 | 처리 방식 | 대상 |
|---|---|---|
| 거의 불변 | 국가별 JSON에서 인메모리 로드 | 전압, 시차, 통화, 긴급번호, 공항코드, 시즌규칙, 문화·생활 팁 |
| 가끔 바뀜 | GitHub Raw JSON, 24시간 주기 갱신 | 대사관 연락처, 관광지 큐레이션 |
| 자주 바뀜 | 외부 API + TTL 캐시 | 비자(13h), 여행경보(1h), 환율(24h), 블로그 검색(7h) |
## MCP 도구 7개
| 도구 | 역할 |
|---|---|
| `get_trip_briefing` | 비자·전압·시차·통화·긴급번호·대사관·상세 현지 팁 (비자는 MOFA 동적, 실패 시 정적 폴백) |
| `get_current_status` | 외교부 여행경보 단계·발효일과 간결한 현지 행동 요령 |
| `get_exchange_rate` | 원화 매매기준율 |
| `get_flight_season_guide` | 시즌 판정과 스카이스캐너 비교 링크 |
| `get_destinations` | 도시·카테고리별 관광지 큐레이션 |
| `compose_checklist` | 위 도구들을 종합한 D-day 체크리스트 카드 |
| `recommend_itinerary` | 일정·예산·목적별 맞춤 여행 추천 |
## 프로젝트 구조
```
travel-briefing-mcp/
├── README.md # 이 파일
├── travel_briefing_mcp.py # MCP 서버 본체
├── tb_config.py # 설정·국가 데이터 로더
├── tb_api.py # 외부 API·TTL 캐시
├── tb_helpers.py # 쿼리·마크다운 렌더러
├── tb_scheduler.py # 캐시 워밍 스케줄러
├── destinations_jp.json # 일본 관광지 큐레이션 데이터
├── embassies.json # 대사관 연락처 스냅샷
├── config/ # API·TTL·어휘 설정
├── data/ # 9개국 정적 데이터
├── test_playmcp_compliance.py # 등록 가이드 자동 검증
├── pyproject.toml / uv.lock # Python 의존성
├── Dockerfile # 배포 이미지
├── .env.example # 환경변수 템플릿
├── .gitignore
└── .claude/
└── rules/
├── playmcp-guide.md # PlayMCP 등록 가이드 요약
├── mcp-schema.md # 외부 API 스키마와 응답 매핑
└── curation.md # 큐레이션 데이터 편집 규칙
```
## 시작하기
### 1. 환경 준비
```bash
git clone <repo-url>
cd travel-briefing-mcp
uv sync --frozen
cp .env.example .env
```
### 2. API 키 발급
다음 API 키를 `.env`에 설정한다. 키가 없거나 외부 API가 실패하면 가능한 범위에서 정적 정보 또는 안내 문구로 폴백한다.
- 외교부 (공공데이터포털): 입국허가요건 + 여행경보 (인증키 공유)
- 한국수출입은행: 환율
- 네이버 검색 API: 맞춤 일정의 여행 후기 검색
발급받은 키를 `.env` 에 채운다.
### 3. 로컬 실행
```bash
uv run python travel_briefing_mcp.py
```
`http://127.0.0.1:8000/mcp`에서 stateless Streamable HTTP 서버가 기동된다. stdio와 SSE 전송은 제공하지 않는다.
### 4. MCP Inspector 검증
배포 전 PlayMCP 가이드 준수 여부를 검증한다.
먼저 서버를 실행한 뒤 다른 터미널에서 `npx @modelcontextprotocol/inspector`를 실행한다. Inspector에서 Transport를 `Streamable HTTP`, URL을 `http://127.0.0.1:8000/mcp`로 지정하고 `Initialize`와 `List Tools`를 확인한다.
저장소에 포함된 자동 점검도 실행한다.
```bash
uv run python -m unittest -v test_playmcp_compliance.py
```
## 개발 규칙
프로젝트에 코드를 추가·수정할 때는 아래를 준수한다.
- 서버명·툴명에 "kakao" 를 어떤 형태로도 넣지 않는다 (등록 반려 사유)
- 툴 개수는 7개를 유지한다 (가이드 권장 3~10 범위)
- 툴 `annotations` 5종(`title`, `readOnlyHint`, `destructiveHint`, `openWorldHint`, `idempotentHint`)을 전부 지정한다
- 툴 description 은 영문으로 작성하고 "Travel Briefing(트래블 브리핑)" 을 병기한다
- 응답은 정제된 마크다운으로 반환하고, 외부 API raw JSON 을 그대로 돌려주지 않는다
- 외부 API 호출은 반드시 TTL 캐시를 통한다 (p99 3,000ms 요건)
- 서버 내부에서 LLM 을 실행하지 않는다
- 응답에 광고 유도를 넣지 않는다
세부 규칙은 `.claude/rules/` 의 개별 파일을 참조한다.
## 배포
카카오 클라우드에 컨테이너로 배포하며, 공개 HTTPS 도메인이 필요하다.
환경변수는 `.env` 파일 대신 **카카오 클라우드의 환경변수/시크릿 매니저**로 주입한다. Docker 이미지에 `.env` 를 포함시키지 않는다.
배포 후 PlayMCP 개발자 콘솔에서 등록하고 심사를 받는다.
## 라이선스와 데이터 출처
- 외교부 여행경보/입국허가요건: 공공저작물 출처표시 (제1유형)
- 한국수출입은행 환율: 이용허락범위 제한 없음
- 관광지 큐레이션·국가별 문화 및 생활 팁: 프로젝트 자체 편찬 (외교부·각국 정부/관광청 안내 교차 검토, 수정·기여 환영)
## 로드맵
- **v1**: 일본 중심 여행 준비, 도구 6개
- **v2** (현재): 중국·대만·동남아 확장과 맞춤 일정 추천, 도구 7개
- **v3**: 환율 30일 추이, 도시별 이벤트 정보
## 기여
관광지 큐레이션 수정·추가는 대상 국가의 `curation/destinations_{국가코드}.json` 을 편집해 PR 을 올린다. 일본 파일은 외부 JSON 갱신 주기에 따라 반영되며, 그 외 국가의 번들 큐레이션은 재배포 시 반영된다.
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues