FarmSubsidy Korea MCP
README.md
# ๐พ FarmSubsidy Korea (๋์
๋ณด์กฐ๊ธ ์๋ฆฌ๋ฏธ) MCP
ํ๊ตญ์ **๋์
๊ด๋ จ ๋ณด์กฐ๊ธยท์ง์๊ธ ๊ณต๊ณ ๋ฅผ ์ ๋ถ ์์ค ์ฌ๋ฌ ๊ณณ์์ ํตํฉ(aggregation)** ํด์ ์ ๊ณตํ๋ MCP ์๋ฒ์
๋๋ค.
์นด์นด์ค **PlayMCP โ AGENTIC PLAYER 10 ๊ณต๋ชจ์ ** ์ถํ์.
- ์ ์์ค/์ ์์์ /๋ง๊ฐ์๋ฐ ๊ณต๊ณ ๋ฅผ ํค์๋ยท์ง์ญยท์ํ๋ก ๊ฒ์
- ์ ์ ๋ง๊ฐ์ผยท์์์ผ์ **ํก์บ๋ฆฐ๋ MCP(CreateEvent)์ ๋ฐ๋ก ๋๊ธธ ์ ์๋ ์ผ์ ๋ฐ์ดํฐ**๋ก ๋ณํ โ ์๋ฆผ/์ผ์ ๋ฑ๋ก ์๋๋ฆฌ์ค
- Streamable HTTP(stateless), MCP ์คํ 2025-03-26+ ์ค์, PlayMCP ์ฌ์ฌ ์๊ฑด(annotations 5์ข
, TextContent/Markdown, 24KB ์ ํ, ์๋ต์๋) ๋ฐ์
## ๋ฐ์ดํฐ ์์ค
| ์์ค | ๋ฐฉ์ | ์ธ์ฆํค | ๋ด์ฉ |
|---|---|---|---|
| ๋์
e์ง (nongupez.go.kr) | REST/JSON | ๋ถํ์ | ๋์ํ๋ถ ๋๋ฆผ์ฌ์
ํตํฉ ํฌํธ โ ์ฐ๋๋ณ ์ ์ฒด ์ฌ์
, ์ ์๊ธฐ๊ฐยท์จ๋ผ์ธ์ ์ฒญ ์ฌ๋ถ (ํ๋ชจ๋์ ์๋ณธ ์์ค) |
| ๋ณด์กฐ๊ธ24 (ํ์๋ถ ๊ณต๊ณต์๋น์ค API) | REST/JSON | `GOV24_API_KEY` (data.go.kr, ์๋์น์ธ) | ์ค์๋ถ์ฒ+์ง์์ฒด ๊ณต๊ณต์๋น์ค(ํํ) โ ์ง์๋์/๋ด์ฉ/์ ์ฒญ๊ธฐํ ๊ตฌ์กฐํ ๋ฐ์ดํฐ |
| ๊ธฐ์
๋ง๋น (bizinfo.go.kr) | REST/JSON | `BIZINFO_API_KEY` (์ฆ์๋ฐ๊ธ) | ์ ์ฒญ๊ธฐ๊ฐ์ด ๋ช
ํํ ์ง์์ฌ์
๊ณต๊ณ ์คํธ๋ฆผ |
| ๋๋ฆผ์ถ์ฐ์ํ๋ถ ๊ณต์งยท๊ณต๊ณ RSS | RSS | ๋ถํ์ | ๋ถ์ฒ ๊ณต๊ณ ์๋ฌธ ์ค์๊ฐ |
์์ง์ ์๋ฒ ๊ธฐ๋ ์ 1ํ + 10๋ถ ์ฃผ๊ธฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ํํ๊ณ , tool ํธ์ถ์ ํญ์ ๋ฉ๋ชจ๋ฆฌ ์บ์์์ ์ฆ์ ์๋ตํฉ๋๋ค(PlayMCP ์๋ต์๋ ๊ธฐ์ค: ํ๊ท 100ms, p99 3s). ์ผ๋ถ ์์ค ์ฅ์ ์ ๋๋จธ์ง ์์ค๋ก ๊ณ์ ์๋น์คํฉ๋๋ค.
## ์ ๊ณต ๋๊ตฌ (6์ข
, ์ ๋ถ ์ฝ๊ธฐ ์ ์ฉ)
| Tool | ์ค๋ช
|
|---|---|
| `search_farm_subsidies` | ํค์๋/์ง์ญ/์ ์์ํ ํตํฉ ๊ฒ์ (D-day ํฌํจ) |
| `get_subsidy_detail` | ID๋ก ์์ธ ์กฐํ (์ง์๋์ยท๋ด์ฉยท์ ์ฒญ ๋งํฌ) |
| `get_closing_soon_subsidies` | N์ผ ์ด๋ด ๋ง๊ฐ ์๋ฐ ๊ณต๊ณ (๋ง๊ฐ์ผ์) |
| `get_upcoming_subsidies` | ์ ์ ์์ ๊ณต๊ณ (์์์ผ์) |
| `get_daily_briefing` | ์ ๊ท(3์ผ)/๋ง๊ฐ์๋ฐ(7์ผ)/์ ์์์ ๋ฐ์ผ๋ฆฌ ๋ธ๋ฆฌํ |
| `build_calendar_events` | ๋ง๊ฐ์ผยท์์์ผ โ ํก์บ๋ฆฐ๋ CreateEvent ํธํ ์ผ์ ํ์ด๋ก๋ ์์ฑ (๋ฏธ๋ฆฌ์๋ฆผ 1์ผ/7์ผ ์ ) |
**ํก์บ๋ฆฐ๋ ์ฐ๋ ์๋๋ฆฌ์ค**: ์ฌ์ฉ์๊ฐ "์ค๋งํธํ ๋ณด์กฐ๊ธ ๋ง๊ฐ์ผ ์บ๋ฆฐ๋์ ๋ฑ๋กํด์ค"๋ผ๊ณ ํ๋ฉด, ์์ด์ ํธ๊ฐ โ `search_farm_subsidies` โ โก `build_calendar_events` โ โข ํก์บ๋ฆฐ๋ MCP์ `CreateEvent`๋ฅผ ์์๋๋ก ํธ์ถํ๋ MCP ์ฒด์ด๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
## API ํค ๋ฐ๊ธ (๋ ๋ค ์ฆ์ ๋ฐ๊ธ, ๋ฌด๋ฃ)
1. **๋ณด์กฐ๊ธ24**: [data.go.kr 15113968](https://www.data.go.kr/data/15113968/openapi.do) โ ๋ก๊ทธ์ธ โ "ํ์ฉ์ ์ฒญ" (์๋์น์ธ) โ ๋ง์ดํ์ด์ง์์ **์ผ๋ฐ ์ธ์ฆํค(Decoding)** ๋ณต์ฌ โ `GOV24_API_KEY`
2. **๊ธฐ์
๋ง๋น**: [API ์์ธ ํ์ด์ง](https://www.bizinfo.go.kr/apiDetail.do?id=bizinfoApi) ํ๋จ ํผ์์ ์ ๋ณด ์
๋ ฅ ํ ๋ฑ๋ก โ ํ๋ฉด/์ด๋ฉ์ผ๋ก ์ธ์ฆํค ์๋ น โ `BIZINFO_API_KEY`
```
cp .env.example .env # ํค ์
๋ ฅ
```
ํค๊ฐ ์์ด๋ ์๋ฒ๋ ๋จ๊ณ ๋์ํ๋ถ RSS ์์ค๋ง์ผ๋ก ๋์ํฉ๋๋ค(ํด๋น ์์ค๋ ์ ์๊ธฐ๊ฐ ์ ๋ณด๊ฐ ์ ํ์ ).
## ๋ก์ปฌ ์คํ
```bash
npm install
npm run build
npm start # http://localhost:8080/mcp (POST), /healthz
npm test # ๋ณ๋ ํฐ๋ฏธ๋์์ ์ค๋ชจํฌ ํ
์คํธ (6๊ฐ ๋๊ตฌ ํธ์ถ ๊ฒ์ฆ)
```
## ๋ฐฐํฌ โ ์นด์นด์คํด๋ผ์ฐ๋ "PlayMCP in KC"
๊ณต๋ชจ์ ์์ ์ **PlayMCP in KC(์ปจํ
์ด๋ ๋ฐฐํฌ ์๋น์ค) ์ฌ์ฉ์ด ํ์**์
๋๋ค. ์์ ์ ์ ๊ธฐ๊ฐ(6/15~7/14)์๋ง ์๋ฒ ๋ฐ๊ธ ๊ฐ๋ฅ, ๊ณ์ ๋น 2๋.
### ๋ฐฉ๋ฒ A. Git ์์ค ๋น๋ (๊ถ์ฅ โ ๊ฐ์ฅ ๊ฐ๋จ)
1. ์ด ํ๋ก์ ํธ๋ฅผ GitHub ์ ์ฅ์์ push (Dockerfile ํฌํจ๋์ด ์์)
2. PlayMCP in KC ์ฝ์์์ Git URL + ๋ธ๋์น ์
๋ ฅ (private๋ฉด PAT ์
๋ ฅ)
3. Status๊ฐ `Active`๊ฐ ๋๋ฉด **Endpoint URL** ๋ฐ๊ธ
### ๋ฐฉ๋ฒ B. ์ปจํ
์ด๋ ์ด๋ฏธ์ง ๋ฑ๋ก
```bash
docker build --platform linux/amd64 -t <dockerํ๋ธID>/farm-subsidy-mcp:0.1.0 . # ๋ฐ๋์ linux/amd64
docker push <dockerํ๋ธID>/farm-subsidy-mcp:0.1.0
```
์ฝ์์์ ํธ์คํธ(docker.io)/์ด๋ฏธ์ง๋ช
/ํ๊ทธ ์
๋ ฅ.
> ํ๊ฒฝ๋ณ์(`GOV24_API_KEY`, `BIZINFO_API_KEY`)๋ ๋ฐฐํฌ ์ฝ์์ ํ๊ฒฝ๋ณ์ ์ค์ ์ ์
๋ ฅํ์ธ์.
## PlayMCP ๋ฑ๋ก ์ ์ฐจ
1. [playmcp.kakao.com/console](https://playmcp.kakao.com/console) โ "์๋ก์ด MCP ์๋ฒ ๋ฑ๋ก"
2. Endpoint URL ์
๋ ฅ (`https://<๋ฐ๊ธ๋๋ฉ์ธ>/mcp`) โ **"์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ"** ๋ก tool ๋ชฉ๋ก fetch ํ์ธ
3. MCP ์๋ณ์ยท๋ํ ์์(starter messages)ยท๋ํ ์ด๋ฏธ์ง ์
๋ ฅ โ **์์ ๋ฑ๋ก**์ผ๋ก ์ค์ ๋ํ ํ
์คํธ
4. **"๋ฑ๋ก ๋ฐ ์ฌ์ฌ ์์ฒญ"** โ ์น์ธ ํ "๋์๊ฒ๋ง ๊ณต๊ฐ" โ **"์ ์ฒด ๊ณต๊ฐ"๋ก ๋ฐ๋์ ์ ํ**
5. ๊ณต๋ชจ์ ํ์ด์ง ํ๋จ ๋ฒํผ์ผ๋ก **์์ ์ฐธ์ฌ ์ ์** (1ํ๋ง ๊ฐ๋ฅ)
### ์ฌ์ฌ ์ผ์ ์ฃผ์
- ์ฌ์ฌ๋ ์์
์ผ ์ต๋ 7์ผ (ํ๊ท 1~2์ผ). **7/7๊น์ง ์ฌ์ฌ ์์ฒญํ๋ฉด 7/10๊น์ง ์ฌ์ฌ ์๋ฃ ๋ณด์ฅ** โ ๋ง๊ฐ(7/14) ์ง์ ์์ฒญ์ ์ํ.
### ๋ฑ๋ก ์ ์
๋ ฅ ์ถ์ฒ๊ฐ
- **๋ํ ์์**: "์ด๋ฒ ์ฃผ์ ๋ง๊ฐ๋๋ ๋์
๋ณด์กฐ๊ธ ์๋ ค์ค" / "์ ๋ถ ์ค๋งํธํ ์ง์์ฌ์
์ฐพ์์ค" / "์ฒญ๋
๋ ๋ณด์กฐ๊ธ ๋ง๊ฐ์ผ ํก์บ๋ฆฐ๋์ ๋ฑ๋กํด์ค" / "์ค๋์ ๋์
๋ณด์กฐ๊ธ ๋ธ๋ฆฌํ"
## ์ํคํ
์ฒ
```
src/
index.ts Express + Streamable HTTP (stateless, POST /mcp, GET /healthz)
server.ts MCP ๋๊ตฌ 6์ข
์ ์ (annotations, Markdown ์๋ต, 24KB ์บก)
aggregate.ts ๋ฉํฐ์์ค ์์งยท์ค๋ณต์ ๊ฑฐยท์ ๋ ฌ + ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ฐฑ์ (10๋ถ) + stale-while-revalidate
sources/
nongupez.ts ๋์
e์ง ์ฌ์
๊ฒ์ API (์ธ์ฆ ๋ถํ์, JSON POST)
gov24.ts ๋ณด์กฐ๊ธ24 API (์๋ฒ์ธก ๋ถ์ผํํฐ โ ์คํจ ์ ํด๋ผ์ด์ธํธ ํํฐ ํด๋ฐฑ)
bizinfo.ts ๊ธฐ์
๋ง๋น API (๋์
ํค์๋ ํํฐ)
mafra.ts ๋์ํ๋ถ RSS (์์กด์ฑ ์๋ XML ํ์ฑ)
keywords.ts ๋์
ํ๋ณ ํค์๋/๊ธฐ๊ด ์ฌ์
util.ts ๋ ์ง ์ ๊ทํยท๊ธฐ๊ฐ ํ์ฑยท์ํ ๊ณ์ฐยทHTML ์ ๊ฑฐยทTTL ์บ์
test/smoke.ts MCP ํด๋ผ์ด์ธํธ ์ค๋ชจํฌ ํ
์คํธ
```
This server cannot be deployed
Maintenance
ActivityActive
ResponsivenessNo issues