MCP Claude Test

ShaynePark·2025년 4월 24일
1

최근 클럽 활동 중 MCP(Model Context Protocol) 에 대해 설명을 듣게 되었고, 유튜브 자료를 참고해 직접 테스트를 진행하며 공부해보았다.

참고 영상 ▶ https://youtu.be/cxOoV2guNQQ


1. Claude 설치

MCP를 Claude와 연동하기 위해 Claude를 먼저 설치해야 했다.

  • claude.ai 접속 → Windows 버전 다운로드 및 설치 진행


2. MCP 공식 사이트 접속

  • Google 검색: modelcontextprotocol.io
  • 사이트 내 경로: Get Started > Introduction > Get started > For Server Developers

3. Python 환경 준비

  • MCP는 Python으로 실행되므로 Python 설치 필요
  • 주의: Python 3.10 이상 필요 (나는 3.12.6 버전 사용)

4. MCP SDK 설치

공식 문서에 따라 Python MCP SDK를 설치한다.

  • 설치 도중 파란 밑줄이 된 uv 항목을 발견
    • uv는 pip보다 빠른 패키지 매니저라는 설명
    • 설치 명령어를 복사하여 cmd에서 실행




문제 발생:

  • 백신(V3)이 설치 파일을 삭제
  • 실시간 검사 비활성화 후 설치 진행, 설치 완료 후 실시간 검사 다시 활성화


5. 가상 환경 구성 및 MCP 도구 설치

  • uv로 가상환경 접속
  • mcp 패키지 설치
  • 가상환경에서 테스트를 진행할 weather.py 파일 생성
    • PowerShell의 new-item 대신 CMD에서 echo. > weather.py 명령어 사용







6. 코드 작성 및 테스트

weather.py 예시 코드

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("weather")

# (중략) NWS API 요청 함수 및 알림/예보 함수 정의

if __name__ == "__main__":
    mcp.run(transport='stdio')

파이썬 전체 코드

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP server
mcp = FastMCP("weather")

# Constants
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

async def make_nws_request(url: str) -> dict[str, Any] | None:
    """Make a request to the NWS API with proper error handling."""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/geo+json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

def format_alert(feature: dict) -> str:
    """Format an alert feature into a readable string."""
    props = feature["properties"]
    return f"""
Event: {props.get('event', 'Unknown')}
Area: {props.get('areaDesc', 'Unknown')}
Severity: {props.get('severity', 'Unknown')}
Description: {props.get('description', 'No description available')}
Instructions: {props.get('instruction', 'No specific instructions provided')}
"""

@mcp.tool()
async def get_alerts(state: str) -> str:
    """Get weather alerts for a US state.

    Args:
        state: Two-letter US state code (e.g. CA, NY)
    """
    url = f"{NWS_API_BASE}/alerts/active/area/{state}"
    data = await make_nws_request(url)

    if not data or "features" not in data:
        return "Unable to fetch alerts or no alerts found."

    if not data["features"]:
        return "No active alerts for this state."

    alerts = [format_alert(feature) for feature in data["features"]]
    return "\n---\n".join(alerts)

@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
    """Get weather forecast for a location.

    Args:
        latitude: Latitude of the location
        longitude: Longitude of the location
    """
    # First get the forecast grid endpoint
    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
    points_data = await make_nws_request(points_url)

    if not points_data:
        return "Unable to fetch forecast data for this location."

    # Get the forecast URL from the points response
    forecast_url = points_data["properties"]["forecast"]
    forecast_data = await make_nws_request(forecast_url)

    if not forecast_data:
        return "Unable to fetch detailed forecast."

    # Format the periods into a readable forecast
    periods = forecast_data["properties"]["periods"]
    forecasts = []
    for period in periods[:5]:  # Only show next 5 periods
        forecast = f"""
{period['name']}:
Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""
        forecasts.append(forecast)

    return "\n---\n".join(forecasts)

if __name__ == "__main__":
    # Initialize and run the server
    mcp.run(transport='stdio')
  • VS Code를 사용하여 코드 작성 및 실행
  • uv run 명령어로 MCP 서버 실행

7. Claude와 연동 설정

  1. Claude 실행 > 좌측 상단 ☰ 메뉴 > 파일 > 설정 > 개발자 > 설정 편집
  2. claude_desktop_config.json 파일 열기
  3. 경로를 본인의 테스트 디렉토리로 수정
  4. 저장 후 Claude 재실행 (완전히 종료 후 재시작 필수)





8. 테스트 결과

  • Claude에서 “LA 날씨 알려줘” 등의 프롬프트 입력
  • MCP가 정상 작동하며 JSON 형식의 상세 날씨 정보를 출력함

* 번외: MCP 미적용 시 결과

  • 동일한 프롬프트를 입력했을 때, Claude는 웹에서 추론하거나 간단 응답만 제공
  • MCP 도구가 작동될 경우, 외부 API까지 직접 호출하여 정확하고 실시간 정보 제공 가능

이 글은 MCP 테스트 활동 경험을 기반으로 작성되었습니다.

0개의 댓글