Skip to main content
Glama
rubatoyd

io.github.rubatoyd/kosis-openapi-mcp

by rubatoyd
README.md
# kosis-openapi-mcp

<!-- mcp-name: io.github.rubatoyd/kosis-openapi-mcp -->

[![CI](https://github.com/rubatoyd/kosis-openapi-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/rubatoyd/kosis-openapi-mcp/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/rubatoyd/kosis-openapi-mcp)](https://github.com/rubatoyd/kosis-openapi-mcp/releases/latest)
[![Downloads](https://img.shields.io/github/downloads/rubatoyd/kosis-openapi-mcp/total?label=downloads)](https://github.com/rubatoyd/kosis-openapi-mcp/releases)

<!-- usage:start -->
> ๐Ÿ“ˆ **์‚ฌ์šฉ๋Ÿ‰** โ€” ์ตœ๊ทผ 14์ผ ์กฐํšŒ **0**ํšŒ(๊ณ ์œ  0) ยท ํด๋ก  **0**ํšŒ(๊ณ ์œ  0) ยท ๋ฆด๋ฆฌ์Šค ์ž์‚ฐ ๋ˆ„์  ๋‹ค์šด๋กœ๋“œ **15**
>
> ![์ผ๋ณ„ ํด๋ก ยท์กฐํšŒ ์ถ”์ด](docs/usage.svg)
>
> <sub>2026-09-12 ์ž๋™ ๊ฐฑ์‹  ยท ์ „์ฒด ์ด๋ ฅ์€ [`docs/usage.csv`](docs/usage.csv). GitHub ํŠธ๋ž˜ํ”ฝ ํ†ต๊ณ„๋Š” 14์ผ ์ฐฝ๋งŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ด ์ €์žฅ์†Œ๊ฐ€ ๋งค์ผ ์ฐ์–ด ๋ˆ„์ ํ•œ๋‹ค.</sub>
<!-- usage:end -->

**KOSIS(๊ตญ๊ฐ€ํ†ต๊ณ„ํฌํ„ธ) ๊ณต์œ ์„œ๋น„์Šค OpenAPI** ๋ฅผ ๊ฒ€์ƒ‰ยท์ˆ˜์ง‘ํ•˜๋Š” MCP ์„œ๋ฒ„ + CLI.

ํ†ต๊ณ„ํ‘œ๋ฅผ ์ฐพ๊ณ , ํ•ญ๋ชฉยท๋ถ„๋ฅ˜ยท์ฃผ๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ˆ˜์น˜๋ฅผ ๋ฐ›์•„ xlsxยทcsvยทjsonยทsqlite ๋กœ
๋‚ด๋ณด๋‚ธ๋‹ค. **4๋งŒ ์…€ ์ œํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ๊ธฐ๊ฐ„์„ ์•Œ์•„์„œ ์ชผ๊ฐœ** ์ „์ˆ˜๋ฅผ ํšŒ์ˆ˜ํ•œ๋‹ค.

์ž๋งค ์ €์žฅ์†Œ: [law-openapi-mcp](https://github.com/rubatoyd/law-openapi-mcp)(๋ฒ•์ œ์ฒ˜) ยท
[na-openapi-mcp](https://github.com/rubatoyd/na-openapi-mcp)(๊ตญํšŒ๋„์„œ๊ด€) ยท
[nl-openapi-mcp](https://github.com/rubatoyd/nl-openapi-mcp)(๊ตญ๋ฆฝ์ค‘์•™๋„์„œ๊ด€) ยท
[kci-openapi-mcp](https://github.com/rubatoyd/KCI_openAPI) ยท [scienceON-mcp](https://github.com/rubatoyd/scienceON-mcp)

---

## ๋ฌด์—‡์„ ๋Œ๋ ค์ฃผ๋‚˜

**ํ†ต๊ณ„ ๊ทธ ์ž์ฒด๋‹ค.** ํ‘œ์˜ ๋ฉ”ํƒ€(์ž‘์„ฑ๊ธฐ๊ด€ยท์กฐ์‚ฌ๋ช…ยท์ˆ˜๋ก๊ธฐ๊ฐ„ยท์ฃผ๊ธฐ)์™€ ์ˆ˜์น˜(์‹œ์  ร— ๋ถ„๋ฅ˜ ร—
ํ•ญ๋ชฉ โ†’ ๊ฐ’)๋ฅผ ๋„๋ฉ”์ธ ๊ทธ๋Œ€๋กœ ์ค€๋‹ค.

์„œ์ง€ยท์ธ์šฉ ํ˜•์‹์€ **๋ถ€๊ฐ€ ๊ธฐ๋Šฅ**(`kosis_citation`)์œผ๋กœ ๋”ฐ๋กœ ๋‘์—ˆ๋‹ค. ์„œ์ง€๊ด€๋ฆฌ ๋„๊ตฌ๋กœ
๋„˜๊ธธ ๋•Œ๋งŒ ์“ฐ๋ฉด ๋˜๊ณ , ๊ทธ ๋„๊ตฌ๊ฐ€ ์•„๋Š” ์œ ํ˜• ๋ชฉ๋ก์ด ํ†ต๊ณ„ ์‘๋‹ต์˜ ๋ชจ์–‘์„ ๋ฐ”๊พธ์ง€๋Š” ์•Š๋Š”๋‹ค.

## ์ค€๋น„๋ฌผ

์ธ์ฆํ‚ค ํ•˜๋‚˜. [kosis.kr](https://kosis.kr) ํšŒ์›๊ฐ€์ž… ํ›„ ๊ณต์œ ์„œ๋น„์Šค ํ™œ์šฉ์‹ ์ฒญ(์ž๋™ ์Šน์ธ).

```bash
cp .env.example .env    # KOSIS_API_KEY=... ๋ฅผ ์ฑ„์šด๋‹ค
```

> ๐Ÿ”ด **๋ฐœ๊ธ‰๋œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์œผ์„ธ์š”.** base64 ์ฒ˜๋Ÿผ ๋ณด์—ฌ๋„(๋์ด `=`) ๋””์ฝ”๋“œํ•˜๋ฉด
> `err 11`(์œ ํšจํ•˜์ง€ ์•Š์€ ์ธ์ฆํ‚ค)์ด ๋‚ฉ๋‹ˆ๋‹ค.

## ์„ค์น˜ยท์‹คํ–‰

```bash
uv sync
uv run kosis status
uv run kosis search ์‚ฌ๊ต์œก๋น„
uv run kosis meta --org 101 --tbl DT_1PE201 --kind ITM     # ํ•ญ๋ชฉ ID ํ™•์ธ
uv run kosis data --org 101 --tbl DT_1PE201 --prd Y --start 2020 --end 2025
uv run kosis collect --org 101 --tbl DT_1B040A3 --prd M --start 202101 --end 202512
# ๋ถ„๋ฅ˜์ถ•์ด ์—ฌ๋Ÿฟ์ธ ํ‘œ๋„ ๊ทธ๋Œ€๋กœ โ€” ์ถ• ๊ฐœ์ˆ˜๋Š” ์•Œ์•„์„œ ๋งž์ถ˜๋‹ค(์‚ฐ์—… ร— ๊ทœ๋ชจ)
uv run kosis data --org 118 --tbl DT_118N_MON051 --prd H --start 202401 --end 202401
# ์ฃผ์š”์ง€ํ‘œ(ํ†ต๊ณ„ํ‘œ์™€ ๋‹ค๋ฅธ ๊ณ„์—ด) โ€” ํ‘œ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๊ฐ’๊นŒ์ง€ ๋ฐ”๋กœ
uv run kosis indicator ์ถœ์‚ฐ์œจ
uv run kosis indicator-data --id 13 --start 2020 --end 2025
```

MCP ๋“ฑ๋ก:

```json
{
  "mcpServers": {
    "kosis": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "git+https://github.com/rubatoyd/kosis-openapi-mcp", "kosis-mcp"],
      "env": { "KOSIS_API_KEY": "๋ฐœ๊ธ‰๋ฐ›์€_๊ฐ’_๊ทธ๋Œ€๋กœ" }
    }
  }
}
```

> PyPI ์— ์˜ฌ๋ฆฐ ํŒจํ‚ค์ง€๊ฐ€ ์•„์ง ์—†์–ด **์ €์žฅ์†Œ์—์„œ ๋ฐ”๋กœ** ๋ฐ›์•„ ์“ด๋‹ค(์ž๋งค ์ €์žฅ์†Œ์™€ ๊ฐ™์€ ๋ฐฉ์‹).
> `main` ์˜ HEAD ๋ฅผ ์“ฐ๋ฏ€๋กœ ๋‹ค์Œ ๊ธฐ๋™์— ์ตœ์‹ ์ด ๋ฐ˜์˜๋œ๋‹ค.

## MCP ๋„๊ตฌ

| ๋„๊ตฌ | ํ•˜๋Š” ์ผ |
|------|---------|
| `kosis_status` | ์ธ์ฆํ‚ค ๋ณด์œ  ์—ฌ๋ถ€ + ์‹ค์ œ ์™•๋ณต 1ํšŒ |
| `kosis_guide` | ์„œ๋น„์Šค๋ทฐยท์ฃผ๊ธฐยท๋ฉ”ํƒ€ ์ข…๋ฅ˜ยท์˜ค๋ฅ˜์ฝ”๋“œยทํ•œ๊ณ„ยทํ•จ์ • |
| `kosis_search` | ํ†ต๊ณ„ํ‘œ ์ฐพ๊ธฐ(ํ†ตํ•ฉ๊ฒ€์ƒ‰) |
| `kosis_list` | ํ†ต๊ณ„๋ชฉ๋ก ํŠธ๋ฆฌ ํ•œ ๋‹จ๊ณ„(์ฃผ์ œ๋ณ„ยท๊ธฐ๊ด€๋ณ„ โ€ฆ) |
| `kosis_meta` | ํ‘œ์˜ ํ•ญ๋ชฉ(ITM)ยท๋ถ„๋ฅ˜(NCD)ยท์ฃผ๊ธฐ(PRD)ยท์ถœ์ฒ˜ ๋“ฑ |
| `kosis_explain` | ํ†ต๊ณ„์„ค๋ช…(์กฐ์‚ฌ๊ฐœ์š”) |
| `kosis_data` | ์ˆ˜์น˜ โ€” **4๋งŒ ์…€ ์ดˆ๊ณผ ์‹œ ๊ธฐ๊ฐ„ ์ž๋™ ๋ถ„ํ• ** |
| `kosis_citation` | ํ‘œ๋ฅผ ์„œ์ง€ ์นธ์œผ๋กœ ํˆฌ์˜(๋ถ€๊ฐ€ ๊ธฐ๋Šฅ) |
| `kosis_collect` | ์ˆ˜์น˜๋ฅผ xlsx/csv/json/sqlite ๋กœ ์ €์žฅ |
| `kosis_indicator_search` | **์ฃผ์š”์ง€ํ‘œ** ์ฐพ๊ธฐ(ํ†ต๊ณ„ํ‘œ์™€ ๋‹ค๋ฅธ ๊ณ„์—ด) โ€” ํŽ˜์ด์ง• ์ „์ˆ˜ ํšŒ์ˆ˜ |
| `kosis_indicator_data` | ์ฃผ์š”์ง€ํ‘œ์˜ ์‹œ์ ๋ณ„ ์ˆ˜์น˜ โ€” **์„œ๋ฒ„๊ฐ€ ์•ˆ ๊ฑฐ๋ฅด๋Š” ์‹œ์ ์„ ๋Œ€์‹  ๊ฑฐ๋ฅธ๋‹ค** |

## ์•Œ์•„ ๋‘˜ ๊ฒƒ (์ „๋ถ€ ์‹ค์ธก)

172์ชฝ์งœ๋ฆฌ ๊ณต์‹ ๊ฐœ๋ฐœ๊ฐ€์ด๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ๋„ **๊ฐ€์žฅ ์ค‘์š”ํ•œ ์…‹์ด ๊ทธ ์•ˆ์— ์—†๊ฑฐ๋‚˜ ํ‹€๋ฆฌ๋‹ค**:

- ๐Ÿ”ด **`jsonVD=Y` ๊ฐ€ ์—†์œผ๋ฉด JSON ์ด ์•„๋‹ˆ๋‹ค** โ€” ํ‚ค์— ๋”ฐ์˜ดํ‘œ๊ฐ€ ์—†๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด
  ๋ฆฌํ„ฐ๋Ÿด์ด ์˜จ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ฐ€์ด๋“œ์˜ ์ž…๋ ฅ ๋ณ€์ˆ˜ ํ‘œ์— **์—†๊ณ ** JSP ์˜ˆ์ œ ์•ˆ์—๋งŒ ์žˆ๋‹ค.
- ๐Ÿ”ด **ํ†ต๊ณ„์ž๋ฃŒ๋ฅผ `orgId`/`tblId` ๋กœ ๋ถ€๋ฅด๋ ค๋ฉด `/openapi/Param/statisticsParameterData.do`**
  ๋ฅผ ์จ์•ผ ํ•œ๋‹ค. ๊ฐ€์ด๋“œ๊ฐ€ ํ‘œ๋ฅผ ์‹ค์–ด ๋‘” `statisticsData.do` ๋กœ ๋ณด๋‚ด๋ฉด **ํ•ญ์ƒ err 20**.
- ๐Ÿ”ด **์ธ์ฆํ‚ค๋ฅผ ๋””์ฝ”๋“œํ•˜์ง€ ๋ง ๊ฒƒ.**

๊ทธ ๋ฐ–์—:

- ๐Ÿ”ด **๋ถ„๋ฅ˜์ถ•(`objL`) ๊ฐœ์ˆ˜๊ฐ€ ํ‘œ์˜ ์ถ• ์ˆ˜์™€ ์ •ํ™•ํžˆ ๋งž์•„์•ผ ํ•œ๋‹ค** โ€” ๋ชจ์ž๋ผ๋ฉด `err 20 (objL)`,
  ๋„˜์น˜๋ฉด `err 21`. ๊ทธ๋Ÿฐ๋ฐ ์ถ• ๊ฐœ์ˆ˜๋ฅผ ์•Œ๋ ค ์ฃผ๋Š” ๋ฉ”ํƒ€ ์„œ๋น„์Šค๊ฐ€ **์—†๋‹ค**(`NCD` ๋Š” ๋ถ„๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ
  ์‹ ๊ทœ์ˆ˜๋ก ์‹œ์ ์ด๊ณ  `OBJ`ยท`CLS` ๋Š” `err 30`). `kosis_data` ๊ฐ€ ์ถ•์„ ํ•˜๋‚˜์”ฉ ๋Š˜๋ ค ๋งž์ถ”๋ฏ€๋กœ
  **๋‹ค์ถ• ํ‘œ(์˜ˆ: ์‚ฐ์—… ร— ๊ทœ๋ชจ)๋„ ๊ทธ๋ƒฅ ๋ถ€๋ฅด๋ฉด ๋œ๋‹ค** โ€” ํ™•์ •๋œ ์ถ•์€ `meta.obj_levels` ์— ์‹ค๋ฆฐ๋‹ค.
- **๋ชจ๋“  ์‹คํŒจ๊ฐ€ HTTP 200 ์ด๋‹ค.** ์„ฑ๊ณต์€ ๋ฐฐ์—ด, ์‹คํŒจ๋Š” `{err, errMsg}` ๊ฐ์ฒด.
  `Content-Type` ์€ ๋‘˜ ๋‹ค `text/html` ์ด๋ผ ๋ฏฟ์„ ์ˆ˜ ์—†๋‹ค.
- **`err 30`(๊ฒฐ๊ณผ ์—†์Œ)์€ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋‹ค** โ€” 0๊ฑด๊ณผ ์‹คํŒจ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๋ณด๊ณ ํ•œ๋‹ค.
- **์š”์ฒญ๋‹น 4๋งŒ ์…€**(err 31) ยท **๋ถ„๋‹น 200๊ฑด**(err 40).
- **ํŽ˜์ด์ง•์ด ์—†๋‹ค** โ€” ํ†ตํ•ฉ๊ฒ€์ƒ‰ยท๋ชฉ๋กยทํ†ต๊ณ„์ž๋ฃŒ๋Š” ์„œ๋ฒ„๊ฐ€ ์ค€ ๋งŒํผ์ด ์ „๋ถ€๋‹ค(์กฐ์šฉํžˆ ์ž๋ฅด์ง€ ์•Š๊ณ  ์•Œ๋ฆฐ๋‹ค).
  ๋‹จ **ํ†ต๊ณ„์ฃผ์š”์ง€ํ‘œ ๊ณ„์—ด๋งŒ ์˜ˆ์™ธ**๋กœ `pageNo`ยท`numOfRows` ๋ฅผ ๋ฐ›๊ณ  ์•ˆ ์ฃผ๋ฉด 10๊ฑด์—์„œ ์ž˜๋ฆฐ๋‹ค โ€”
  `kosis_indicator_*` ๊ฐ€ ๋๊นŒ์ง€ ๋„˜๊ฒจ ์ „์ˆ˜๋ฅผ ํšŒ์ˆ˜ํ•œ๋‹ค([docs](docs/KOSIS_API_GUIDE.md) ยง7).
- ๐Ÿ”ด **์ฃผ์š”์ง€ํ‘œ ๊ณ„์—ด์€ ์‹œ์  ๋ฒ”์œ„๋ฅผ ๊ฑฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋“œ ์Šค์œ„์น˜์ผ ๋ฟ ๊ฐ’์€ ๋ฌด์‹œ๋œ๋‹ค).
  `kosis_indicator_data` ๊ฐ€ ์ „ ๊ตฌ๊ฐ„์„ ๋ฐ›์•„ ์ง์ ‘ ๊ฑฐ๋ฅด๊ณ  `meta.server_filtered=false` ๋กœ ์•Œ๋ฆฐ๋‹ค.
- `parentListId` ๋Š” ํ•„์ˆ˜๋ผ๊ณ  ์ ํ˜€ ์žˆ์ง€๋งŒ **์ƒ๋žตํ•˜๋ฉด ์ตœ์ƒ์œ„**๊ฐ€ ์˜จ๋‹ค.

์ž์„ธํ•œ ๊ทผ๊ฑฐ์™€ ์žฌํ˜„ ๋ฐฉ๋ฒ•์€ [docs/KOSIS_API_GUIDE.md](docs/KOSIS_API_GUIDE.md).

## ๋ผ์ด์„ ์Šค

MIT

TDQS

A4/5.0

Scored across 11 tools

Disambiguation5/5

Each tool has a single clear role: table search vs indicator search, table data vs indicator data, metadata vs survey explanation, data retrieval vs file export. The detailed descriptions explicitly distinguish the similar indicator/table families, so an agent can reliably choose between them.

Naming Consistency4/5

All tools share the kosis_ prefix and snake_case, and the search/data pairs are parallel (kosis_search/kosis_indicator_search, kosis_data/kosis_indicator_data). However, the second part mixes bare verbs (search, list, explain, collect) with bare nouns (meta, data, citation, guide), so it is not a strict verb_noun convention.

Tool Count5/5

11 tools is well within the ideal range and each one earns its place: status/guide for orientation, search/explain/list/meta/data for the table workflow, indicator_search/indicator_data for the indicator workflow, plus collect and citation for output and scholarship.

Completeness5/5

For a read-only statistical data API, the surface is complete: users can discover tables by search or tree, read survey descriptions and table metadata, fetch full table data with automatic axis/period handling, access major indicators, export to files, and generate citations. No obvious dead ends or missing core operations remain.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive