na-openapi-mcp
# na-openapi-mcp
<!-- mcp-name: io.github.rubatoyd/na-openapi-mcp -->
[](https://github.com/rubatoyd/na-openapi-mcp/actions/workflows/ci.yml)
[](https://github.com/rubatoyd/na-openapi-mcp/releases/latest)
[](https://github.com/rubatoyd/na-openapi-mcp/releases)
<!-- usage:start -->
> ๐ **์ฌ์ฉ๋** โ ์ต๊ทผ 14์ผ ์กฐํ **1**ํ(๊ณ ์ 1) ยท ํด๋ก **99**ํ(๊ณ ์ 63) ยท ๋ฆด๋ฆฌ์ค ์์ฐ ๋์ ๋ค์ด๋ก๋ **44**
>
> 
>
> <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
Scored across 6 tools
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.
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.
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.
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.