Chapter 3. 바이브코딩으로 공공 MCP 자동 생성하고 에이전트 연결하기
바이브코딩(Vibe Coding)으로 서울시 공공데이터 API를 MCP(Model Context Protocol) 서버로 자동 생성하고, AI 에이전트와 연결하는 프로젝트입니다.
프로젝트 개요
이 프로젝트는 서울시 공공데이터 API를 MCP 서버로 변환하여 Claude와 같은 AI 에이전트가 실시간으로 서울시 공공데이터를 조회할 수 있도록 합니다.
공공데이터 API 예시
서울시에서 제공하는 다양한 공공데이터 중 이 프로젝트에서 다루는 서울시 공공데이터 예시입니다:
- 문화 정보 - 공공도서관 정보 
- 문화행사 정보 
- 문화시설 정보 
- 전시·공연 시설 현황 
 
- 도시 인프라 - 공중화장실 위치정보 
- 주차장 운영정보 
- 공공자전거 
- 버스정류소 위치정보 
- 지하철 역사 정보 
 
프로젝트 구조
.
├── README.md                          # 프로젝트 메인 가이드
├── CLAUDE.md                          # Claude 에이전트 개발 가이드
├── template/                          # Cookiecutter 템플릿
│   └── data-seoul-mcp/               # 서울공공데이터 MCP 템플릿
│       ├── cookiecutter.json         # 템플릿 설정
│       ├── README.md                 # 템플릿 사용 가이드
│       └── {{cookiecutter.project_domain}}-mcp-server/
│           ├── pyproject.toml        # Python 프로젝트 설정
│           ├── data_seoul_mcp/       # MCP 서버 구현
│           │   └── {{cookiecutter.project_domain}}_mcp_server/
│           │       └── server.py     # FastMCP 서버 구현
│           └── tests/                # 테스트 코드
├── culturalevents-mcp-server/        # 생성된 예제 서버
└── docs/                             # API 문서 및 참고자료기술 스택
핵심 기술
- FastMCP 기반 서버 구조 
- Pydantic 설정 관리 
- 비동기 테스트 지원 
- Ruff 린팅 및 포매팅 
- Pyright 타입 체킹 
- GitHub 공개 패턴 준수 
- Apache 2.0 라이선스 적용 
- Changelog 자동 관리 
패턴 준수
AWS Labs MCP 패턴을 따릅니다:
- 패키지명: - data-seoul-mcp.<domain>-mcp-server
- 모듈명: - data_seoul_mcp.<domain>_mcp_server
- 스크립트명: - data-seoul-mcp.<domain>-mcp-server
예시:
- Input: - CulturalEvents
- Package: - data-seoul-mcp.culturalevents-mcp-server
- Module: - data_seoul_mcp.culturalevents_mcp_server
빠른 시작 가이드
사전 요구사항
- Python 3.11+ 
- uv (Python 패키지 관리자) 
- Node.js 18+ (MCP Inspector용) 
1. MCP 서버 생성
Cookiecutter 템플릿으로 새로운 MCP 서버 생성:
uvx cookiecutter template/data-seoul-mcp프롬프트 입력 예시:
author_name [Your Name]: Hong Gildong
author_email [githubusername@users.noreply.github.com]: gildong@users.noreply.github.com
api_name [Seoul Cultural Events]: Seoul Cultural Events
api_name_korean [문화행사정보]: 문화행사정보
api_description [Seoul city cultural events and space information]:
project_domain [CulturalEvents]: CulturalEvents
description [A Seoul Data MCP server for 문화행사정보 (Seoul Cultural Events)]:
instructions [Use this MCP server to search...]:2. 의존성 설치
생성된 디렉토리로 이동하여 의존성 설치:
cd culturalevents-mcp-server
uv sync --all-groups3. 테스트 실행
테스트 실행
uv run pytest --covMCP Inspector로 테스트
npx @modelcontextprotocol/inspector uv --directory . run data_seoul_mcp/culturalevents_mcp_server/server.py4. Claude Desktop 연동
claude_desktop_config.json에 MCP 서버 추가:
{
  "mcpServers": {
    "data-seoul-cultural-events": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/culturalevents-mcp-server",
        "run",
        "data_seoul_mcp/culturalevents_mcp_server/server.py"
      ]
    }
  }
}API 구현 가이드
서울공공데이터 API 연동
server.py에서 서울시 API 연동 구현:
import httpx
from typing import Any
@mcp.tool(name='SearchCulturalEvents')
async def search_cultural_events(
    keyword: str | None = None,
    start_date: str | None = None,
    end_date: str | None = None,
    district: str | None = None,
    genre: str | None = None,
    limit: int = 10,
) -> dict[str, Any]:
    """서울시 문화행사 검색
    Args:
        keyword: 검색어 (행사명, 장소명 등)
        start_date: 시작일자 (YYYYMMDD)
        end_date: 종료일자 (YYYYMMDD)
        district: 자치구명 (예: 강남구, 종로구)
        genre: 장르명 (예: 연극, 뮤지컬, 음악)
        limit: 최대 결과 수
    Returns:
        문화행사 검색 결과
    """
    # TODO: 서울시 공공데이터 API 호출
    api_key = os.getenv('SEOUL_API_KEY')
    base_url = 'http://openapi.seoul.go.kr:8088'
    async with httpx.AsyncClient() as client:
        response = await client.get(
            f'{base_url}/{api_key}/json/culturalEventInfo/{start}/{end}/',
            params={
                'CODENAME': genre,
                'GUNAME': district,
            }
        )
        data = response.json()
    return {
        'status': 'success',
        'total_count': data.get('culturalEventInfo', {}).get('list_total_count', 0),
        'events': data.get('culturalEventInfo', {}).get('row', [])
    }환경 변수 설정
.env 파일 생성:
SEOUL_API_KEY=your_api_key_here템플릿 기능
주요 기능
- FastMCP 기반 서버 구조 
- Pydantic 설정 관리 
- 비동기 테스트 지원 
- Ruff 린팅 및 포매팅 
- Pyright 타입 체킹 
- GitHub 공개 패턴 준수 
- Apache 2.0 라이선스 적용 
- Changelog 자동 관리 
패턴 준수
AWS Labs MCP 패턴을 따릅니다:
- 패키지명: - data-seoul-mcp.<domain>-mcp-server
- 모듈명: - data_seoul_mcp.<domain>_mcp_server
- 스크립트명: - data-seoul-mcp.<domain>-mcp-server
예시:
- Input: - CulturalEvents
- Package: - data-seoul-mcp.culturalevents-mcp-server
- Module: - data_seoul_mcp.culturalevents_mcp_server
사용 예시
Claude Desktop에서 사용
사용자: 이번 주말 강남에서 열리는 뮤지컬 공연 있어?
Claude: 서울시 문화행사 정보를 검색하겠습니다.
[SearchCulturalEvents 도구 호출]
keyword: 뮤지컬
district: 강남구
start_date: 20250118
end_date: 20250119
결과:
1. 지킬앤 하이드 - 샤롯데씨어터
   - 일시: 2025-01-18 19:30
   - 장소: 샤롯데씨어터
   - 위치: 송파구 올림픽로 240 롯데월드타워 5층 강남구
2. 맘마미아 더뮤지컬 - 블루스퀘어
   - 일시: 2025-01-19 20:00
   - 장소: 블루스퀘어
   - 위치: 용산구 이태원로 294 블루스퀘어 3층 강남구학습로드맵
1. 준비 단계
- API 키 발급 
- 인프라 환경 설정 
- 도구(Tool) 이해 
2. 구현 단계
- Cookiecutter로 템플릿 생성 
- API 명세서와 구현 
- MCP 도구 구현 
- 기능 확장하기 
3. 테스트 단계
- 단위 테스트 작성 
- MCP Inspector 테스트 
- Claude Desktop 연동 테스트 
4. 배포 단계
- 문서화 
- GitHub 리포지토리 
- Smithery 배포 (선택사항) 
참고 자료
공식 문서
관련 오픈소스 템플릿
라이선스
Apache-2.0
기여 가이드
- Fork the repository 
- Create your feature branch ( - git checkout -b feature/AmazingFeature)
- Commit your changes ( - git commit -m 'Add some AmazingFeature')
- Push to the branch ( - git push origin feature/AmazingFeature)
- Open a Pull Request 
문의
프로젝트 관련 문의사항은 Issue를 통해 남겨주세요.
Last updated