Skip to main content
Glama
README.md
# na-openapi-mcp

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

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

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

**๊ตญํšŒ๋„์„œ๊ด€(National Assembly Library of Korea) ์ž๋ฃŒ๊ฒ€์ƒ‰** OpenAPI ๋ฅผ Claude ๋“ฑ MCP
ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ”๋กœ ์“ฐ๋Š” ์„œ๋ฒ„ + CLI. ๋„์„œยทํ•™์œ„๋…ผ๋ฌธยท๊ตญ๋‚ด์™ธ ๊ธฐ์‚ฌยท๊ตญํšŒํšŒ์˜๋กยท์˜์•ˆ์ •๋ณด ๋“ฑ
**21์ข… DB** ๋ฅผ ๊ฒ€์ƒ‰ยท์ˆ˜์ง‘ํ•˜๊ณ  xlsx/csv/json/sqlite ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ž๋งค ํ”„๋กœ์ ํŠธ: [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)(KISTI ๋ฌธํ—Œ)

---

## ์ด ๋„๊ตฌ๊ฐ€ ํŠน๋ณ„ํžˆ ์‹ ๊ฒฝ ์“ฐ๋Š” ๊ฒƒ

### โ‘  ๋ฏธ์ง€์› ๊ฒ€์ƒ‰ํ•ญ๋ชฉ์ด **์˜ค๋ฅ˜ ๋Œ€์‹  ์ „์ฒด ์นดํƒˆ๋กœ๊ทธ**๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค

์ด API ์ตœ๋Œ€์˜ ํ•จ์ •์ž…๋‹ˆ๋‹ค. ํ†ตํ•ฉ๊ฒ€์ƒ‰์€ ๊ฒ€์ƒ‰ํ•ญ๋ชฉ ์ด๋ฆ„์„ ๋ชจ๋ฅด๋ฉด **๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์ƒ‰์–ด๋ฅผ
ํ†ต์งธ๋กœ ๋ฌด์‹œ**ํ•ฉ๋‹ˆ๋‹ค.

```
์ €์ž,์˜ค์šฑํ™˜      โ†’  total=76          โ† ์ •์ƒ
์ €์ž๋ช…,์˜ค์šฑํ™˜    โ†’  total=13,097,591  โ† ์ „์ฒด DB. ์˜ค๋ฅ˜๋„ ๊ฒฝ๊ณ ๋„ ์—†๋‹ค
```

`์ €์ž๋ช…` ์€ **์ƒ์„ธ๊ฒ€์ƒ‰์—์„œ๋Š” ์œ ํšจํ•œ ์ด๋ฆ„**์ด๋ผ ์˜คํƒ€๊ฐ€ ์•„๋‹ˆ๋ผ ํ—ท๊ฐˆ๋ ค์„œ ์“ฐ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Œ€๋กœ ๋‘๋ฉด 1,300๋งŒ ๊ฑด์„ '๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ'๋กœ ์˜ค์ธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
โ†’ ์ด ์„œ๋ฒ„๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ **ํ˜ธ์ถœ ์ „์— ๊ฑฐ๋ถ€**ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

| ๊ฒ€์ƒ‰ํ•ญ๋ชฉ | `์˜ค์šฑํ™˜` ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ |
|---|---:|
| `์ „์ฒด` ยท `๊ธฐ๋ณธ๊ฒ€์ƒ‰` ยท `์ž๋ฃŒ๋ช…` ยท `์ €์ž` ยท `ํ‚ค์›Œ๋“œ` | 105 ยท 88 ยท 4 ยท 76 ยท 7 |
| `์ €์ž๋ช…` ยท `ISBN` ยท `๋ฐœํ–‰๋…„๋„` ยท ์˜คํƒ€ | **๊ฐ 13,097,591 (์ „์ฒด DB)** |

### โ‘ก ์กฐ์šฉํ•œ ์ ˆ๋‹จ ๋ฐฉ์ง€

๋ฐ›์€ ๊ฒƒ์ด ์ „๋ถ€์ธ์ง€, ์ž˜๋ฆฐ ๊ฒƒ์ธ์ง€๋ฅผ **ํ•ญ์ƒ ๋ฉ”ํƒ€๋กœ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.**

| ์‹ ํ˜ธ | ๋œป | ์ฒ˜๋ฐฉ |
|---|---|---|
| `truncated` | `max_records` ์—์„œ ๋ฉˆ์ถค | ์˜ฌ๋ฆฌ๋ฉด ํ•ด๊ฒฐ |
| `cap_hit` | `total` > ํšŒ์ˆ˜ ํ•œ๊ณ„ โ€” **API ๊ฐ€ ๋” ์•ˆ ์คŒ** | ๊ฒ€์ƒ‰์‹์„ ์ชผ๊ฐœ์•ผ ํ•จ |
| `early_stop_note` | ์ƒˆ ๋ ˆ์ฝ”๋“œ 0์œผ๋กœ ์กฐ๊ธฐ ์ข…๋ฃŒ | ์ค‘๋ณต ์‘๋‹ตยท์„œ๋ฒ„ ์ด์ƒ ๊ฐ€๋Šฅ |
| `stopped_early_note` | ์˜ˆ์‚ฐ ์†Œ์ง„์œผ๋กœ **์กฐํšŒ์กฐ์ฐจ ๋ชป ํ•œ** ๊ฒ€์ƒ‰์–ด | `max_records` ์ƒํ–ฅ |
| `zero_yield_warning` | ์ˆ˜๋ฝ๋˜์ง€๋งŒ **ํ•ญ์ƒ 0๊ฑด**์ธ ๊ฒ€์ƒ‰ํ•ญ๋ชฉ | ๋‹ค๋ฅธ ํ•ญ๋ชฉ ์‚ฌ์šฉ |
| `option_ignored_warning` | ์—ฐ๋„ ํ•„ํ„ฐ๊ฐ€ **๋ฌด์‹œ๋จ**(ํ†ตํ•ฉ๊ฒ€์ƒ‰) | `dbname` ํ•จ๊ป˜ ์ง€์ • |
| `ignored_search_warning` | ์ „์ฒด ์นดํƒˆ๋กœ๊ทธ ๊ทœ๋ชจ๊ฐ€ ๋ฐ˜ํ™˜๋จ | ๊ฒ€์ƒ‰ํ•ญ๋ชฉ ํ™•์ธ |
| `toc_enrich_truncated_note` | ๋ชฉ์ฐจ ํ›„๋ณด ์ค‘ **์ผ๋ถ€๋งŒ** ๋ณด๊ฐ•๋จ | `toc_max` ์ƒํ–ฅ |
| `toc_enrich_incomplete_note` | ๋ชฉ์ฐจ **์กฐํšŒ ์‹คํŒจ** ๊ฑด์ด ์žˆ์Œ | ์ƒํ–ฅ์€ ๋ฌด์˜๋ฏธ โ€” ์ œ์–ด๋ฒˆํ˜ธ ํ™•์ธ |
| `toc_enrich_aborted_note` | ์ฟผํ„ฐยทํ‚ค ๋ฌธ์ œ๋กœ ๋ณด๊ฐ• **์ค‘๋‹จ** | ์ƒํ–ฅ์€ ์˜คํžˆ๋ ค ์•…ํ™” โ€” `na_status` |

**ํšŒ์ˆ˜ ํ•œ๊ณ„๋Š” `pageno ์ตœ๋Œ€ 99 ร— page_size`** ์ž…๋‹ˆ๋‹ค(์‹ค์ธก). ๊ธฐ๋ณธ๊ฐ’(1000)์ด๋ฉด 99,000๊ฑด์ด๊ณ ,
`page_size` ๋ฅผ ๋‚ฎ์ถ”๋ฉด ํ•œ๊ณ„๋„ ํ•จ๊ป˜ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค โ€” ์ด ์„œ๋ฒ„๋Š” ๊ทธ๊ฒƒ๊นŒ์ง€ ๋ฐ˜์˜ํ•ด ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

### โ‘ข ๊ณต์‹ ๋ฌธ์„œ์™€ ์‹ค์ œ๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์„ ์‹ค์ธก์œผ๋กœ ํ™•์ •ํ–ˆ์Šต๋‹ˆ๋‹ค

๋ฌธ์„œ(.hwp/.docx)๋งŒ ๋ณด๊ณ  ๋งŒ๋“ค๋ฉด **์กฐ์šฉํžˆ ๊นจ์ง€๋Š”** ์ง€์ ๋“ค์ž…๋‹ˆ๋‹ค.

| ํ•ญ๋ชฉ | ๊ณต์‹ ๋ฌธ์„œ | โœ… ์‹ค์ œ |
|---|---|---|
| ๋ ˆ์ฝ”๋“œ ํƒœ๊ทธ | `<record>` | **`<recode>`** โ€” ๋ฌธ์„œ๋Œ€๋กœ๋ฉด ์ „๊ฑด 0๊ฐœ ํšŒ์ˆ˜ + `total` ์€ ์ •์ƒ |
| `<item>` ์ž์‹ ์ˆœ์„œ | value โ†’ name | **name โ†’ value** |
| ์ œ์–ด๋ฒˆํ˜ธ ํ•„๋“œ๋ช… | `controlno` | **`์ œ์–ด๋ฒˆํ˜ธ`** |
| `displaylines` ์ƒํ•œ | 100 | **1000** |
| ์ธ์ฆํ‚ค | (์–ธ๊ธ‰ ์—†์Œ) | **Encoding ๊ฐ’์„ URL ์— ์ง์ ‘ ๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•จ |
| ํ•˜์ด๋ผ์ดํŠธ ๋งˆํฌ์—… | (์–ธ๊ธ‰ ์—†์Œ) | ๋งค์นญ ํ•„๋“œ์— `<font color="red">` ์‚ฝ์ž… |

์ „์ฒด ๋Œ€์กฐํ‘œ์™€ ๊ทผ๊ฑฐ๋Š” [`docs/NA_API_GUIDE.md`](docs/NA_API_GUIDE.md) ์— ์žˆ์Šต๋‹ˆ๋‹ค.

---

## ์„ค์น˜

### 1) Claude Code / Claude Desktop (uvx โ€” ๊ถŒ์žฅ)

```json
{
  "mcpServers": {
    "na": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "git+https://github.com/rubatoyd/na-openapi-mcp", "na-mcp"],
      "env": { "NA_API_KEY": "๋ฐœ๊ธ‰๋ฐ›์€_์ธ์ฆํ‚ค" }
    }
  }
}
```

### 2) Claude Desktop `.mcpb` ์›ํด๋ฆญ

[๋ฆด๋ฆฌ์Šค](https://github.com/rubatoyd/na-openapi-mcp/releases/latest)์—์„œ ๋‚ด๋ ค๋ฐ›์•„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ๋Ÿ‰๋ณธ(`na-openapi-mcp.mcpb`, uvx ๊ฒฝ์œ )๊ณผ **Pythonยทuv ์—†์ด ๋„๋Š” ์ž์ฒด์™„๊ฒฐ๋ณธ**
(win-x64 ยท macos-arm64 ยท linux-x64)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

### 3) ๋กœ์ปฌ ๊ฐœ๋ฐœ

```bash
git clone https://github.com/rubatoyd/na-openapi-mcp
cd na-openapi-mcp
uv sync --all-groups
uv run pytest -q
uv run na status
```

### 4) ๋‹ค๋ฅธ MCP ํด๋ผ์ด์–ธํŠธ

stdio ์ „์†ก์ด ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. HTTP ๊ฐ€ ํ•„์š”ํ•˜๋ฉด
`na-mcp --transport streamable-http --host 127.0.0.1 --port 9126`
(ํ™˜๊ฒฝ๋ณ€์ˆ˜ `NA_MCP_TRANSPORT`ยท`NA_MCP_HOST`ยท`NA_MCP_PORT` ๋„ ์ง€์›).

---

## ์ธ์ฆํ‚ค

๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ [data.go.kr](https://www.data.go.kr) ์—์„œ **๊ตญํšŒ ๊ตญํšŒ๋„์„œ๊ด€_์ž๋ฃŒ๊ฒ€์ƒ‰ ์„œ๋น„์Šค**
(๋ฐ์ดํ„ฐ์…‹ `15098174`) ํ™œ์šฉ์‹ ์ฒญ ํ›„ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ๊ณ„์ • ํŠธ๋ž˜ํ”ฝ์€ **10,000๊ฑด/์ผ** ์ž…๋‹ˆ๋‹ค.

`na_detail`ยท`na_toc` ๋ฅผ ์“ฐ๋ ค๋ฉด **์ƒ์„ธ์ •๋ณด์กฐํšŒ ์„œ๋น„์Šค**(`15098175`)๋„ ํ•จ๊ป˜ ์‹ ์ฒญํ•˜์„ธ์š” โ€”
์ธ์ฆํ‚ค๋Š” ๊ณ„์ • ๋‹จ์œ„๋ผ ๊ฐ™์€ ํ‚ค๊ฐ€ ๊ทธ๋Œ€๋กœ ํ†ตํ•ฉ๋‹ˆ๋‹ค.

```bash
NA_API_KEY=๋ฐœ๊ธ‰๋ฐ›์€_ํ‚ค          # Decoding(์›๋ฌธ) ๊ถŒ์žฅ
NA_API_KEY_ENCODED=            # Encoding ๊ฐ’๋งŒ ์žˆ์œผ๋ฉด ์ด์ชฝ์—
NA_OS_TRUST=1                  # ๊ต์œก๋งยท์‚ฌ๋‚ด๋ง SSL ์ธํ„ฐ์…‰์…˜ ๋Œ€์‘(๊ธฐ๋ณธ 1)
```

> ๐Ÿ”‘ data.go.kr ์€ ์ธ์ฆํ‚ค๋ฅผ **Encoding / Decoding ๋‘ ๋ฒŒ**๋กœ ์ค๋‹ˆ๋‹ค. ์ด API ๋Š” **Encoding
> ๊ฐ’์„ URL ์— ์ง์ ‘ ๊ฒฐํ•ฉ**ํ•ด์•ผ ํ•˜๋Š”๋ฐ(์‹ค์ธก), ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ `params=` ๋กœ ๋„˜๊ธฐ๋ฉด `%2B` ๊ฐ€
> `%252B` ๋กœ ์ด์ค‘ ์ธ์ฝ”๋”ฉ๋˜์–ด **์กฐ์šฉํžˆ ์ธ์ฆ ์‹คํŒจ**ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋А ์ชฝ์„ ๋„ฃ๋“  ์ฝ”๋“œ๊ฐ€ ์•Œ์•„์„œ
> ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

---

## MCP ๋„๊ตฌ

| ๋„๊ตฌ | ํ•˜๋Š” ์ผ |
|---|---|
| `na_status` | ์ธ์ฆํ‚ค ๋ณด์œ  ์—ฌ๋ถ€ + ์‹ค์ œ ์™•๋ณต 1ํšŒ |
| `na_search` | ์ž๋ฃŒ๊ฒ€์ƒ‰. ์ ˆ๋‹จ ์‹ ํ˜ธ๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ |
| `na_collect` | ๊ฒ€์ƒ‰์–ด **ํ•ฉ์ง‘ํ•ฉ** ์ˆ˜์ง‘ โ†’ xlsx/csv/json/sqlite. `toc_max` ๋กœ ๋ชฉ์ฐจ ๋ณธ๋ฌธ ๋ณด๊ฐ•(๊ธฐ๋ณธ ๋”) |
| `na_detail` | ์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด ์ƒ์„ธ์ •๋ณด |
| `na_toc` | ์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด ๋ชฉ์ฐจ |
| `na_fields` | ๊ฒ€์ƒ‰ํ•ญ๋ชฉยทdbname ์œ ํšจ๊ฐ’ + ์‹ค์ธก ๊ทผ๊ฑฐ(census) |

### ๊ฒ€์ƒ‰์–ด ํ˜•์‹

**`๊ฒ€์ƒ‰ํ•ญ๋ชฉ,ํ‚ค์›Œ๋“œ`** ์ž…๋‹ˆ๋‹ค. `|` ๋กœ ์ด์œผ๋ฉด **AND** ๋กœ ๋ฌถ์ž…๋‹ˆ๋‹ค.

```
์ „์ฒด,๊ต์œก๋ถˆํ‰๋“ฑ
์ „์ฒด,๊ต์œก|์ž๋ฃŒ๋ช…,๋ถˆํ‰๋“ฑ          โ† AND
```

OR(ํ•ฉ์ง‘ํ•ฉ)์€ API ์— ๋ฌธ๋ฒ•์ด ์—†์–ด `na_collect(terms=[โ€ฆ])` ๊ฐ€ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

**ํ†ตํ•ฉ๊ฒ€์ƒ‰ ๊ฒ€์ƒ‰ํ•ญ๋ชฉ(7์ข…)**: `๊ธฐ๋ณธ๊ฒ€์ƒ‰` `์ „์ฒด` `์ž๋ฃŒ๋ช…` `์ €์ž` `๋ฐœํ–‰์ž` `ํ‚ค์›Œ๋“œ` `์ฒญ๊ตฌ๊ธฐํ˜ธ`

`dbname` ์„ ์ง€์ •ํ•˜๋ฉด **์ƒ์„ธ๊ฒ€์ƒ‰**์œผ๋กœ ์ „ํ™˜๋˜๋ฉฐ ๊ฒ€์ƒ‰ํ•ญ๋ชฉ ์–ดํœ˜๊ฐ€ DB๋งˆ๋‹ค ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค
(ํ•™์œ„๋…ผ๋ฌธ=`๋…ผ๋ฌธ๋ช…`ยท`์ง€๋„๊ต์ˆ˜`, ๊ตญ๋‚ด๊ธฐ์‚ฌ=`๊ธฐ์‚ฌ๋ช…`, ํ•™์ˆ ์ง€ยท์‹ ๋ฌธ=`์ˆ˜๋ก์ง€๋ช…/์‹ ๋ฌธ๋ช…` ํ•œ ๋ฉ์–ด๋ฆฌ).
์ •ํ™•ํ•œ ๋ชฉ๋ก์€ `na_fields` ๋กœ ํ™•์ธํ•˜์„ธ์š”.

---

## CLI

```bash
na status
na fields                          # ๊ฒ€์ƒ‰ํ•ญ๋ชฉยทdbname ์œ ํšจ๊ฐ’ (--json ์œผ๋กœ census ์ „์ฒด)
na search "์ „์ฒด,๊ต์œก๋ถˆํ‰๋“ฑ" --max-records 20
na search "์ €์ž๋ช…,์–‘์—ฐ๋™" --dbname ํ•™์œ„๋…ผ๋ฌธ
na collect --terms "์ „์ฒด,๊ต์œก๋ถˆํ‰๋“ฑ" "์ „์ฒด,๊ต์œก๊ฒฉ์ฐจ" --max-records 2000

# ๋ชฉ์ฐจ ๋ณธ๋ฌธ๊นŒ์ง€ ๋ถ™์ด๊ธฐ โ€” ๊ฑด๋‹น 1ํšŒ๋ฅผ ๋” ์”๋‹ˆ๋‹ค(๊ธฐ๋ณธ ๊บผ์ ธ ์žˆ์Œ). ๋ณธ๋ฌธ์€ jsonยทsqlite ์—๋งŒ.
na collect --search "์ž๋ฃŒ๋ช…,๊ต์œก๋ถˆํ‰๋“ฑ" --dbname ์ผ๋ฐ˜๋„์„œ --toc-max 300 --formats json xlsx
na detail MONO12026000012887
na toc    MONO12026000012887

# ์—ฐ๋„ ๋ฒ”์œ„๋Š” ์ƒ์„ธ๊ฒ€์ƒ‰์˜ option ์œผ๋กœ๋งŒ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค(ํ†ตํ•ฉ๊ฒ€์ƒ‰์—์„œ๋Š” ๋ฌด์‹œ๋จ)
na search "์ž๋ฃŒ๋ช…,๊ต์œก" --dbname ์ผ๋ฐ˜๋„์„œ --option "๋ฐœํ–‰๋…„๋„,2000|๋ฐœํ–‰๋…„๋„,2010"
```

---

## ์‘๋‹ต ํ•„๋“œ

๋ ˆ์ฝ”๋“œ๋Š” **๊ณ ์ • ์Šคํ‚ค๋งˆ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.** `<item><name>ยท<value>` ์Œ์ด๊ณ  ์ด๋ฆ„ ์ง‘ํ•ฉ์ด
์ž๋ฃŒ์ข…๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค โ€” ํ‘œ์ œ ํ•„๋“œ๋งŒ ํ•ด๋„ `์ž๋ฃŒ๋ช…`(๋„์„œ) / `๋…ผ๋ฌธ๋ช…`(ํ•™์œ„๋…ผ๋ฌธ) /
`๊ธฐ์‚ฌ๋ช…`(๊ธฐ์‚ฌ) / `์ˆ˜๋ก์ง€๋ช…/์‹ ๋ฌธ๋ช…`(ํ•™์ˆ ์ง€ยท์‹ ๋ฌธ) / `์ €๋„๋ช…`(์ „์ž์ €๋„) / `์•ˆ๊ฑด`(ํšŒ์˜๋ก) /
`์˜์•ˆ๋ช…`(์˜์•ˆ์ •๋ณด) / `๋ฒˆ์—ญ๋ฒ•๋ น๋ช…` / `ํ‘œ๊ทธ๋ฆผ๋ช…` ์œผ๋กœ ๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค.

์•Œ๋ ค์ง„ ์ด๋ฆ„์€ ๊ณตํ†ต ์ปฌ๋Ÿผ์œผ๋กœ ์ •๊ทœํ™”ํ•˜๊ณ  **์›๋ณธ์€ `raw` ์— ๊ทธ๋Œ€๋กœ ๋ณด์กด**ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ๊ฐ’๋“ค(์ „๋ถ€ ์‹ค์ธก):

- **์•ˆ๋‚ด๋ฌธ์ด ๊ฐ’ ์ž๋ฆฌ์— ์˜ต๋‹ˆ๋‹ค** โ€” E-BOOK ์˜ `DDC` ๋Š” 99.95% ๊ฐ€ `์ „์žํ˜•ํƒœ๋กœ๋งŒ ์—ด๋žŒ ๊ฐ€๋Šฅํ•จ`
  ์ž…๋‹ˆ๋‹ค. ์ •๊ทœํ™” ํ•„๋“œ๋Š” ๋น„์šฐ๊ณ  `placeholder_fields` ์— ์ด๋ฆ„์„ ๋‚จ๊น๋‹ˆ๋‹ค(์›๋ฌธ์€ `raw` ์—).
- **์—ฐ๋„๊ฐ€ 4์ž๋ฆฌ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** โ€” `201u`(MARC ๋ถˆํ™•์ • ์—ฐ๋„), ๋นˆ๊ฐ’, `0`.
- **`์ดˆ๋ก์œ ๋ฌด=Y` ์—ฌ๋„ ์ดˆ๋ก ๋ณธ๋ฌธ์„ ๋ฐ›์„ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.** ์„œ์ˆ ํ˜• ํ…์ŠคํŠธ๋Š”
  ๊ตญํšŒ์˜์•ˆ์ •๋ณด(`์ œ์•ˆ์ด์œ  ๋ฐ ์ฃผ์š”๋‚ด์šฉ`)ยท๊ตญํšŒํšŒ์˜๋ก(`๋‚ด์šฉ`)์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
- **๋ชฉ์ฐจ๊ฐ€ ์ „๊ฑด ์—†๋Š” ์ž๋ฃŒ์ข…**: E-BOOK ยท ํ•™์ˆ ์ง€,์žก์ง€ ยท ์‹ ๋ฌธ ยท ๊ตญ์™ธ๊ธฐ์‚ฌ ยท ๋™์˜์ƒ์ž๋ฃŒ.

### ๋ชฉ์ฐจ ๋ณด๊ฐ•(`toc_max`)์„ ์ผฐ์„ ๋•Œ

๋ชฉ์ฐจ๊ฐ€ ์•ˆ ๋ถ™๋Š” ์ด์œ ๊ฐ€ ๋‹ค์„ฏ์ด๊ณ  **์ฒ˜๋ฐฉ์ด ์ „๋ถ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.** ๊ฐ™์€ ๋นˆ์นธ์œผ๋กœ ์„ž์œผ๋ฉด "์ด ์ž๋ฃŒ์—๋Š”
๋ชฉ์ฐจ๊ฐ€ ์—†๋‹ค"๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๋ก ์ด ๋‚˜์˜ค๋ฏ€๋กœ, `toc_status` ์ปฌ๋Ÿผ์ด ์‚ฌ์œ ๋ฅผ ํ–‰ ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

| `toc_status` | ๋œป | ์ฒ˜๋ฐฉ |
|---|---|---|
| `ok` | ๋ณธ๋ฌธ ํ™•๋ณด | โ€” |
| `skipped` | `๋ชฉ์ฐจ` ํ”Œ๋ž˜๊ทธ๊ฐ€ `Y` ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ œ์–ด๋ฒˆํ˜ธ ์—†์Œ โ€” **ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ** | โ€” (์ฟผํ„ฐ๋ฅผ ์“ฐ์ง€ ์•Š์Œ) |
| `empty` | ์ •์ƒ ์‘๋‹ต์ธ๋ฐ ๋ณธ๋ฌธ์ด ์—†์Œ โ†’ **ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฑฐ์ง“์ด์—ˆ๋‹ค** | โ€” |
| `sentinel` | ๋ณธ๋ฌธ์ด `๋ชฉ์ฐจ์ •๋ณด์—†์Œ` ๋ฐ˜๋ณต | โ€” |
| `failed` | ์กฐํšŒ ์‹คํŒจ | `na_toc` ๋กœ ๋‹จ๊ฑด ์žฌ์กฐํšŒ |
| `not_attempted` | ์˜ˆ์‚ฐ ์†Œ์ง„ยท์ค‘๋‹จ์œผ๋กœ ๋ชป ๋ถ€๋ฆ„ | `toc_max` ์ƒํ–ฅ |

`has_toc='Y'` ์ธ๋ฐ `toc_status='empty'` ์ธ ํ–‰์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์‹ ํ˜ธ๋ผ ๋‘ ์ปฌ๋Ÿผ์„ ๋‚˜๋ž€ํžˆ ๋‘ก๋‹ˆ๋‹ค.
**๋ณธ๋ฌธ(`toc_text`)์€ jsonยทsqlite ์—๋งŒ** ์‹ค๋ฆฝ๋‹ˆ๋‹ค โ€” ์ˆ˜์ฒœ ์ž๋ผ xlsx ์…€ ์ƒํ•œ(32,767)์— ๊ฑธ๋ฆฌ๊ณ 
csv ๋ฅผ ๋น„๋Œ€ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

---

## ๊ฒ€์ฆ ์ƒํƒœ

- **ํšŒ๊ท€ ํ…Œ์ŠคํŠธ 209๊ฑด.** ํŒŒ์„œยท์ˆ˜์ง‘๊ธฐ๋ฟ ์•„๋‹ˆ๋ผ **์ธก์ • ๋„๊ตฌ ์ž์ฒด**๋„ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค
  (`tests/test_probe_instrumentation.py`) โ€” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๊ฐ€ ํƒ์นจ์˜ ์ถœ๋ ฅ์ด๋ผ, ํƒ์นจ์ด ์กฐ์šฉํžˆ
  ํ‹€๋ฆฌ๋ฉด ๊ทธ ์˜ค๋ฅ˜๊ฐ€ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. CI ๋Š” ํ…Œ์ŠคํŠธ๋ฟ ์•„๋‹ˆ๋ผ **ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์ œ๋กœ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€**๋ฅผ
  ๋ด…๋‹ˆ๋‹ค โ€” ์‹ ๊ทœ ์˜์กด์„ฑ ํ•ด์„์—์„œ `mcp.server.fastmcp` ์กด์žฌ ํ™•์ธ, ์‹ค์ œ stdio ํ•ธ๋“œ์…ฐ์ดํฌ,
  ๋„๊ตฌ 6์ข… ๋…ธ์ถœ, ๋ฌดํ‚ค CLI ๊ธฐ๋™, ๋น„๋ฐ€ ํŒŒ์ผ ๋ฏธ์ถ”์ .
- **API ์‚ฌ์‹ค์€ ์ „๋ถ€ ๋ผ์ด๋ธŒ ์™•๋ณต์œผ๋กœ ํ™•์ •**ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌธ์„œยท์ž๋งค ํ”„๋กœ์ ํŠธ์—์„œ ์˜ฎ๊ฒจ ์ ์ง€ ์•Š์Œ).
  ์ž๋ฃŒ์ข… 13์ข… ํ•„๋“œ census ํ‘œ๋ณธ ์•ฝ 21,000๊ฑด. ์žฌํ˜„: `scripts/probe_*.py`.
- ์ƒ์„ธ ๊ทผ๊ฑฐ์™€ ๊ฒ€์ฆ ๋“ฑ๊ธ‰(โœ… ์‹ค์ธก / ๐Ÿ“„ ๋ฌธ์„œ๊ทผ๊ฑฐ / โ“ ๋ฏธ๊ฒ€์ฆ)์€
  [`docs/NA_API_GUIDE.md`](docs/NA_API_GUIDE.md) ์— ์žˆ์Šต๋‹ˆ๋‹ค.

---

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

MIT

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct operation: health check, search, single-record detail, union collection/export, table of contents, and field validation. Even where na_search and na_collect both query, the descriptions clearly separate raw querying from OR aggregation and saving results.

Naming Consistency4/5

All tools share the na_ prefix and use clear lowercase names, which makes the set feel coherent. However, the pattern mixes verbs (search, collect) with nouns/abbreviations (status, detail, toc, fields), so it is not perfectly uniform.

Tool Count5/5

Six tools is a well-scoped size for this read-only library search API. Each tool earns its place by covering a distinct capability without unnecessary duplication.

Completeness5/5

The surface covers the main workflows: checking access, searching, retrieving item-level detail, harvesting OR-combined results, getting TOC data, and discovering valid field/dbname values. There are no obvious dead ends for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive