Skip to main content
Glama
TSchwierz

weather-packing-bot

by TSchwierz

weather-packing-bot

반복적인 3개 도시 여행 경로에 대해 다일 기상 예보와 짐 꾸리기 추천을 포함한 Slack 메시지를 게시하는 예약 봇입니다. 또한 MCP(Model Context Protocol) 서버와 클라이언트 쌍의 작은 참조 구현이기도 합니다. 예보 데이터는 봇 스크립트가 직접 가져오는 대신 독립형 MCP 서버가 제공하고 MCP 클라이언트가 소비합니다.

개요

이 봇은 주간 일정(금요일 15:00 CEST)으로 실행되며, 당일부터 다음 주 월요일 저녁까지의 날씨를 다루는 Slack 메시지를 게시합니다. 예보와 짐 꾸리기 추천은 일정 인식 방식으로 동작합니다. 즉, 해당 기간의 각 날짜에 여행자가 세 도시 중 어느 도시에 있을 것으로 예상되는지를 고려하며, 모든 위치의 날씨를 무차별적으로 표시하지 않습니다.

GitHub Actions (scheduled, Fridays)
        │
        ▼
bot/packing_advisor.py            MCP client
        │  spawns as subprocess, communicates over stdio
        ▼
mcp_server/weather_server.py      MCP server, queries Open-Meteo
        │
        ▼
   Slack incoming webhook

MCP 서버와 클라이언트를 사용하는 이유

서버는 누가, 왜 호출하는지에 대한 지식 없이 날씨 도구를 노출합니다. 이 봇일 수도 있고, IDE 어시스턴트일 수도 있으며, MCP를 지원하는 다른 클라이언트일 수도 있습니다. 클라이언트는 서버의 Python 함수를 직접 임포트하지 않습니다. 런타임에 사용 가능한 도구를 발견하고(session.list_tools()) 프로토콜을 통해 이름으로 호출합니다(session.call_tool(...)). 이러한 분리가 동일한 프로세스에서 함수를 단순히 호출하는 것과 설계를 구분 짓는 요소입니다.

구성 요소

mcp_server/weather_server.py

Open-Meteo API를 래핑하고 네 가지 도구를 노출하는 MCP 서버(mcp 패키지의 MCPServer 클래스 사용)입니다:

도구

설명

list_cities()

구성된 도시 이름을 반환합니다.

get_forecast(city, days=3)

한 도시의 일별 날씨 요약입니다.

get_forecast_all(days=3)

구성된 모든 도시의 일별 날씨 요약입니다.

render_temperature_chart(days=4)

Slack 코드 블록용으로 형식화된 간결한 도시별·일별 텍스트 차트(기온 막대, 날씨 아이콘, 강수량)입니다.

도시는 COORDINATES 딕셔너리에 정의되어 있으며 자유롭게 확장할 수 있습니다.

bot/packing_advisor.py

다음을 수행하는 MCP 클라이언트입니다:

  1. forecast_window()를 통해 예보 기간(현재 날짜부터 다음 주 월요일까지, 포함)을 계산합니다.

  2. weather_server.py를 하위 프로세스로 생성하고, MCP 핸드셰이크를 수행한 후 해당 기간에 대해 get_forecast_allrender_temperature_chart를 호출합니다.

  3. 기간 내 각 날짜를 WEEKLY_ITINERARY(요일을 해당 날짜에 여행자가 있을 것으로 예상되는 도시(들)에 매핑하는 딕셔너리)와 대조하여 관련 위치만 출력에 반영되도록 합니다.

  4. 일치하는 날짜를 recommend_packing()에 전달합니다. 이 함수는 기온 및 강수량 임계값을 사용하는 규칙 기반 함수입니다(외부 AI 호출 없음).

  5. Slack Block Kit 메시지(일별 분석, 짐 목록, 차트)를 구성하고 인커밍 웹훅을 통해 게시합니다.

여행 일정

bot/packing_advisor.pyWEEKLY_ITINERARY는 반복되는 주간 경로를 인코딩합니다:

WEEKLY_ITINERARY = {
    4: [("Nijmegen", "arrival")],       # Friday
    5: [("Nijmegen", "")],              # Saturday
    6: [("Nijmegen", "")],              # Sunday
    0: [("Den Bosch", "day"), ("Kerpen", "evening, back home")],  # Monday
}

월요일은 이동일이므로 두 개의 항목이 있습니다. 일정상 여행자는 낮에는 Den Bosch에 있고 저녁에는 Kerpen으로 돌아옵니다. 이 딕셔너리는 경로가 변경될 경우 수정해야 하는 유일한 곳입니다.

차트

render_temperature_chart는 이미지가 아닌 일반 텍스트 고정폭 차트를 생성합니다. 이는 의도적인 제약입니다. Slack 인커밍 웹훅은 텍스트 또는 Block Kit JSON만 게시할 수 있으며 바이너리 파일을 업로드할 수 없습니다. 실제 이미지를 게시하려면 Slack 봇 토큰(files:write 범위가 있는 설치된 Slack 앱)과 웹훅 대신 Slack의 files.upload Web API 호출이 필요합니다. 이는 실행 가능한 확장이지만 추가 자격 증명을 관리해야 합니다. 현재 구현은 그러한 요구 사항을 완전히 피합니다.

설정

사전 요구 사항

  • 인커밍 웹훅 URL이 있는 Slack 앱.

  • 코드를 호스팅하고 예약 워크플로를 실행할 GitHub 저장소.

로컬 실행

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env   # fill in SLACK_WEBHOOK_URL
export $(grep -v '^#' .env | xargs)
python bot/packing_advisor.py

SIMULATE_DATE(.env.example 참조)를 ISO 날짜로 설정하면 실제 금요일을 기다리지 않고 일정/예보 기간 로직을 테스트할 수 있습니다.

MCP 서버는 단독으로도 검사할 수 있습니다:

pip install "mcp[cli]"
mcp dev mcp_server/weather_server.py

이렇게 하면 브라우저에서 MCP Inspector가 열리며, 도구 스키마를 보고 get_forecast 또는 render_temperature_chart와 같은 도구를 직접 호출하는 데 유용합니다.

GitHub 저장소 구성

  • SLACK_WEBHOOK_URL을 저장소 비밀( Settings → Secrets and variables → Actions → Secrets)으로 추가합니다.

  • 다른 저장소 구성은 필요하지 않습니다. 일정은 저장소 변수가 아닌 코드에 정의되어 있습니다.

일정

.github/workflows/weekly-forecast.ymlcron: "0 13 * * 5"를 통해 매주 금요일 13:00 UTC(15:00 CEST)에 실행됩니다. GitHub Actions의 Cron 일정은 일광 절약 시간을 관찰하지 않으므로 CET(겨울) 기간에는 15:00 대신 14:00 현지 시간에 실행됩니다. 이 차이가 중요하다면 cron 표현식을 계절에 따라 조정할 수 있습니다. 워크플로는 선택적 simulate_date 입력이 있는 수동 트리거(workflow_dispatch)도 지원하므로 일정에 의존하기 전에 테스트하는 데 유용합니다.

알려진 제한 사항 및 가능한 확장

  • Slack 메시지에는 위에서 설명한 이유로 이미지 대신 텍스트 기반 차트가 포함됩니다. matplotlib을 통한 PNG 차트와 Slack 봇 토큰 및 files.upload를 결합하는 것은 가능한 후속 작업입니다.

  • recommend_packing()은 규칙 기반입니다. 이를 LLM(예: Anthropic API) 호출로 대체하면 더 자연스러운 언어 출력이 가능합니다. MCP 도구 결과는 일반 딕셔너리이므로 이러한 호출에 직접 전달할 수 있습니다.

  • 일정은 고정된 주간 패턴입니다. 캘린더 통합 소스(예: 캘린더에서 실제 여행 날짜 읽기)를 사용하면 반복되는 주간 경로를 넘어 일반화할 수 있습니다.

원본 자료에 대한 참고 사항

원래 초안 서버 스크립트에는 이 구현을 개발하는 동안 수정된 몇 가지 문제가 있었습니다:

  • 사용되지 않고 존재하지 않는 httpx2 임포트.

  • get_params()가 매개변수 딕셔너리를 만들었지만 반환하지 않았습니다.

  • Open-Meteo 클라이언트가 if __name__ == "__main__" 내부에서만 생성되어 모듈 범위에서 이를 참조하는 도구 함수에서 사용할 수 없었습니다.

  • process_responsedict_keys 객체를 인덱스로 사용하여 list에 할당을 시도했는데, 이는 유효하지 않습니다.

  • 도구 함수가 pandas DataFrame 객체와 numpy 스칼라 유형을 반환했는데, 이는 JSON 직렬화가 불가능합니다. MCP 도구 결과는 JSON으로 전송되므로 직렬화 가능해야 합니다.

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Open-Meteo MCP — weather forecast + historical reanalysis + sister APIs

  • MCP server exposing the Backtest360 engine API as tools for AI agents.

  • OpenWeather MCP — wraps the OpenWeatherMap API (openweathermap.org)

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TSchwierz/AutomationsAndMCPs'

If you have feedback or need assistance with the MCP directory API, please join our Discord server