공공 데이터를 활용한 "여행지 검색" MCP 서버 개발 실습

소개

2주차 오프라인 모임에서 실습했던 MCP 서버 개발 내용을 복습하고자, 개인적으로 간단하게 "여행지 검색 MCP" 프로젝트를 진행하게 되었습니다. 단순히 따라 하기보다는, 공공 데이터를 연동해 실제 쓸 수 있는 형태로 만들어보자는 목표를 세우고 시작했어요.

처음엔 자신 있었지만, 다시 구현해보니 모임 때 이해했다고 생각했던 부분들이 예상보다 잘 되지 않더라구요. 그래서 이번 기회에 확실히 내 것으로 만들고자 했습니다 💪

진행 방법

사용 도구 및 기술 스택

  • Python SDK

  • Windsurf

  • Claude Desktop

  • 공공 데이터 포털 (여행지 정보 데이터)

구현 흐름

  • MCP 기본 구조는 오프라인 실습 자료를 참고했어요.

    • 관련 Tool 설치

      • node.js 설치

      • Python 설치

      • uv 설치 (Python 개발 환경 관리 도구)

      • 필수 라이브러리 설치 (uv add fastmcp)

    • 데이터 파일 다운로드

      • 오프라인 실습에서는 캐릭터 데이터(csv) 를 참조하여 요청한 캐릭터의 설명을 반환하는 MCP 서버(get_character_info)를 개발하는 것이었어요.

      • 저는 공공 데이터(한국농어촌공사_계절테마여행세부코스정보**)** csv 파일을 데이터로 사용하여 Python 코드로 여행지 정보를 조회하는 MCP 서버를 개발하는 것을 실습해 보기로 했습니다.

        한국농어촌공사_계절테마여행세부코스정보_20250428.csv” 파일을 다운로드 받습니다.

        한국 웹 사이트 목록의 스크린 샷
    • Windsurf 에서 프로젝트 연결 및 가상 환경 활성화

      • 생성한 프로젝트 디렉토리를 연다.(프로젝트 파일은 오프라인 강의에서 생성했던 것을 활용)

      • 한국농어촌공사_계절테마여행세부코스정보_20250428.csv” 파일의 파일명을 “tour_spot_info_20250428.csv” 로 수정하고 프로젝트 data 디렉토리에 넣었습니다.

        탐험가의 스크린 샷
      • main.py 파일 수정

        from fastmcp import FastMCP
        mcp = FastMCP("My MCP Server")
        @mcp.tool()
        def echo_tool(message: str) -> str:
            """Echo a message as a tool"""
            return f"Tool echo: {message}"
        
        ---(중략)---
        
        @mcp.tool()
        def get_tour_spot_info(region: str) -> str:
            """
            Get detailed information about a tourist spot from a CSV file.
            
            This function searches for a tourist spot by region in the tourist spot information database
            stored in 'data/tour_spot_info_20250428.csv'. If found, it returns the tourist spot's information.
            
            Args:
                region (str): The region of the tourist spot to search for
                
            Returns:
                str: Tourist spot information if found, an error message otherwise
            
            Raises:
                FileNotFoundError: Handled internally if the CSV file doesn't exist
            """
        
            import csv
            
            try:
                import os
                
                # Get the directory of the current script
                current_dir = os.path.dirname(os.path.abspath(__file__))
                # Build the path to the CSV file
                csv_path = os.path.join(current_dir, 'data', 'tour_spot_info_20250428.csv')
                
                with open(csv_path, 'r', encoding='utf-8') as file:
                    reader = csv.DictReader(file)
                    for row in reader:
                        if region in row.get('주소', ''):
                            results = []
                            
                            for row in reader:
                                if region in row.get('주소', ''):
                                    result = '### ' + row.get('여행지명', 'No information available') + '\\n'
                                    result += '#### ' + row.get('주소', '') + '\\n'
                                    result += '##### ' + row.get('설명', '') + '\\n'
                                    result += '![travel spot image](data:image/jpeg;base64,' + row.get('사진파일', '') + ')\\n'
        
                                    results.append(result)
        
                            return results
                return f"Tour spot '{region}' not found"
            except FileNotFoundError:
                return "Error: Tour spot data file not found"
        
        if __name__ == "__main__":
            # Initialize and run the server
            mcp.run(transport='stdio')
      • 터미널을 열고 Python 가상 환경 활성화 (Mac)

        source .venv/bin/activate
    • MCP 서버 실행

      (make_mcp_server) user@mycomputer make_mcp_server % fastmcp dev main.py
      Starting MCP inspector...
      Proxy server listening on port 6277
      MCP Inspector is up and running at http://127.0.0.1:6274
    • 웹브라우저에서 확인

      • http://127.0.0.1:6274 접속 후 Tools > List Tools > get_tour_spot_info 선택

      • 우측 입력 영역(region) 에 지역명을 넣고 “Run Tool” 클릭

        어두운 배경이있는 웹 사이트의 스크린 샷
        • 검색 결과

    • Claude Desktop 에 Tool 추가

      • 기존 dev 환경 종료

        Ctrl + c
      • MCP 설치

        (make_mcp_server) user@mycomputer make_mcp_server % fastmcp install main.py
        INFO     Added server 'My MCP Server' to Claude config
        INFO     Successfully installed My MCP Server in Claude app
    • Tool 테스트

      • Claude Desktop 앱을 실행(이미 실행되고 있다면 종료 후 재시작)하고 다음 프롬프트를 입력하고 요청한다.

        get_tour_spot_info 툴을 사용해서 '대전' 지역을 검색해줘.

시행착오

  • Claude를 활용한 바이브 코딩 중 코드가 엉뚱하게 생성되는 경우가 많았고, 이를 보완하려면 직접 디버깅과 로직 재설계가 필요했습니다.

  • MCP 서버 개발이 처음엔 막연했지만, 여러 번 시도하며 점점 구조와 흐름이 보이기 시작했어요.

결과와 배운 점

  • 단순히 예제를 “이해했다”고 착각했던 부분을 직접 부딪히며 실제로 구현하고 깨달음으로 이어짐

  • AI 도구는 훌륭한 보조이지만, 기본 개념이 없으면 오히려 혼란을 줄 수 있다는 것을 체감

  • 무엇보다, 사례를 눈으로만 보는 것과 직접 구현해보는 것의 학습 깊이는 확연히 다르다는 걸 강하게 느꼈습니다 ✨

도움 받은 글


📝 여러분도 뭔가 이해했다고 느껴질 때, 꼭 직접 만들어보세요! 배움의 밀도가 완전히 달라집니다 😄

1
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요