JunctionX Korea 2026 Β· λ§μ΄ν¬λ‘μννΈ μ½λ¦¬μ νΈλ (κ²½μλΆλ νμ ν΄κ²°)
κ²½μλΆλ νμΌ λμ 곡곡λ°μ΄ν°λ₯Ό μ κ·νΒ·κ²°ν©ν΄, AIκ° μ¦μ νΈμΆν μ μλ νμ€ MCP μλ²(Layer 1) λ° μ€μκ° νμ λμ보λ(Layer 2)λ‘ μ 곡νλ μ€ν μ루μ μ λλ€.
- π μΉ λμ보λ (Vercel): https://hosu-dashboard.vercel.app
- βοΈ λ°±μλ API & Remote MCP (Railway): https://hosu-backend-production.up.railway.app
- π‘ Remote MCP SSE Endpoint:
https://hosu-backend-production.up.railway.app/sse
HOSU/
βββ 1_data_infrastructure/ # [Layer 1] 곡곡λ°μ΄ν° μ κ·ν & MCP μλ² μΈνλΌ
β βββ data/ # μ κ·ν SQLite DB (hosu.db) λ° μμ² CSV (6μ’
)
β βββ pipeline/ # λ°μ΄ν° μ κ·ν λ° μ€μ½μ΄λ§ λ°°μΉ (build.py, schema.sql)
β βββ mcp_server/ # AI μ°λ νμ€ FastMCP μλ² (server.py, weather.py)
β
βββ 2_regional_service/ # [Layer 2] κ²½λΆ νμΌTF νμ ν΄κ²° μλΉμ€
β βββ app.py # Flask REST API λ°±μλ
β βββ briefing.py # AI μν© λΈλ¦¬ν μμ±
β βββ frontend/ # Vite + React 18 SPA λμ보λ
β βββ static/ # React λΉλ κ²°κ³Όλ¬Ό
β
βββ asgi.py # ν΅ν© ASGI μλ² (Flask API + Remote MCP SSE)
βββ Dockerfile # Railway ν΄λΌμ°λ λ°°ν¬μ© Docker μ€μ
βββ requirements.txt # μ 체 Python μμ‘΄μ± λͺ©λ‘
βββ README.md
pip install -r requirements.txtpython 1_data_infrastructure/pipeline/build.py # 곡곡λ°μ΄ν° μ κ·ν -> data/hosu.db
pytest 1_data_infrastructure/pipeline/test_build.py # μ€μ½μ΄λ§ νκ· ν
μ€νΈ# ν΅ν© μλ² (Flask REST + Remote MCP SSE)
uvicorn asgi:app --port 5050 --reload
# λλ React νλ‘ νΈμλ κ°λ° μλ²
cd 2_regional_service/frontend && npm run devClaude Desktop μ€μ (claude_desktop_config.json)μ μλ ν μ€λ§ μΆκ°νλ©΄ μ¦μ μ¬μ© κ°λ₯ν©λλ€:
{
"mcpServers": {
"hosu-heat-risk": {
"url": "https://hosu-backend-production.up.railway.app/sse"
}
}
}{
"mcpServers": {
"hosu-heat-risk": {
"command": "python",
"args": [
"/μ λκ²½λ‘/HOSU/1_data_infrastructure/mcp_server/server.py"
],
"env": {
"PYTHONPATH": "/μ λκ²½λ‘/HOSU/1_data_infrastructure:/μ λκ²½λ‘/HOSU/1_data_infrastructure/mcp_server"
}
}
}
}| Tool | μ€λͺ |
|---|---|
get_heat_risk_score(region) |
νΉμ μλ©΄λμ μ’ ν© νμΌ μνλ μ μ λ° μ°μΆ κ·Όκ±° λ°ν |
get_current_weather(region) |
νΉμ μ§μμ μ€μκ° κΈ°μ μ€μΈ‘μΉ(κΈ°μ¨Β·μ΅λ·체κ°μ¨λΒ·μνλ¨κ³) μ‘°ν |
list_high_priority_regions(top_n, level) |
μ€λ μ°μ λμμ΄ νμν μν μ§μ TOP N μΆμΆ |
check_shelter_accessibility(region) |
λ보 5λΆκΆ(400m) λ΄ λ¬΄λμμΌν° μ κ·Όμ± λ° μ¬κ°μ§λ νλ³ |
find_shelter_blind_spots(level) |
κ΄λ΄ μΌν°κ° λΆμ‘±ν μ·¨μ½μ§μ λͺ©λ‘ μΆμΆ |
get_region_shelters(region, limit) |
κ΄λ΄ λ±λ‘λ 무λμμΌν° μμΉ, μμ©μΈμ, λλ°©κΈ°κΈ° μ€ν λͺ©λ‘ |
explain_risk_calculation(region) |
μνλ μ°μΆ 곡μ(κ³ λ ΉμΈκ΅¬Β·μΌν°μ κ·Όμ±Β·μ¨μ΄μ§νμ΄λ ₯Β·μ€μκ°κΈ°μ¨) λ° κ°μ€μΉ μ€λͺ |