Back to the catalog

io.github.rubato103/nl-openapi-mcp

National Library of Korea Seoji OpenAPI search via REST API and local metadata harvesting

Open source Open in the app JSON README (API)

About

National Library of Korea Seoji OpenAPI search via REST API and local metadata harvesting

Details

Kind
MCP servers
Topic
Developer tools
Publisher
rubato103
Origin
official
Category
ferramentas
Transport
local
Version
0.1.0
Last push
2026-09-05T07:44:00Z
Repository state
ativo
Language
Python
License
MIT
Added
2026-08-29 04:01:19
Updated
2026-08-29 04:01:19
Origin id
io.github.rubato103/nl-openapi-mcp

README

# nl-openapi-mcp

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

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

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

**๊ตญ๋ฆฝ์ค‘์•™๋„์„œ๊ด€ ์†Œ์žฅ์ž๋ฃŒ ๊ฒ€์ƒ‰** OpenAPI ๋ฅผ Claude ๋“ฑ MCP ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ”๋กœ ์“ฐ๋Š” ์„œ๋ฒ„ + CLI.
๋‹จํ–‰๋ณธยท์˜จ๋ผ์ธ์ž๋ฃŒ์˜ ์„œ์ง€, KDC ๋ถ„๋ฅ˜, ์ฒญ๊ตฌ๊ธฐํ˜ธ, ์›๋ฌธ ์ œ๊ณต ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ƒ‰ยท์ˆ˜์ง‘ํ•˜๊ณ 
xlsx/csv/json/sqlite ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ž๋งค ํ”„๋กœ์ ํŠธ: [kci-openapi-mcp](https://github.com/rubatoyd/KCI_openAPI)(ํ•™์ˆ ๋…ผ๋ฌธยท์ธ์šฉ์ง€์ˆ˜) ยท
[scienceON-mcp](https://github.com/rubatoyd/scienceON-mcp)(KISTI ๋ฌธํ—Œ)

---

## ์ด ๋„๊ตฌ๊ฐ€ ํŠน๋ณ„ํžˆ ์‹ ๊ฒฝ ์“ฐ๋Š” ๊ฒƒ โ€” ์กฐ์šฉํ•œ ์ ˆ๋‹จ ๋ฐฉ์ง€

๊ตญ๋ฆฝ์ค‘์•™๋„์„œ๊ด€ ๊ฒ€์ƒ‰ API ๋Š” **ํ•œ ๊ฒ€์ƒ‰์‹๋‹น 500๊ฑด๊นŒ์ง€๋งŒ** ๋Œ๋ ค์ค๋‹ˆ๋‹ค(๊ณต์‹ ์˜ค๋ฅ˜์ฝ”๋“œ `012 DATA LIMIT 500`).
๊ทธ๋Ÿฐ๋ฐ `total` ์€ ๊ทธ๋ณด๋‹ค ํฐ ๊ฐ’์„ ํƒœ์—ฐํžˆ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

```
๊ต์œก๋ณต์ง€: total=1,856  โ†’  ์‹ค์ œ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฑด 500๊ฑด
```

**์ด ์‚ฌ์‹ค์„ ๋ชจ๋ฅด๋ฉด ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ์ „์ˆ˜๋กœ ์˜ค์ธ**ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์‘๋‹ต์—
`total`ยท`truncated`ยท`cap_hit` ์„ ํ•จ๊ป˜ ์‹ฃ๊ณ , ์ƒํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ์ฒ˜๋ฐฉ๊นŒ์ง€ ๋ฌธ์žฅ์œผ๋กœ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

| ์‹ ํ˜ธ | ๋œป | ์ฒ˜๋ฐฉ |
|---|---|---|
| `truncated` | ์ด๋ฒˆ ํ˜ธ์ถœ์ด `total` ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ›์Œ | ๋Œ€๊ฐœ `max_records` ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ํ•ด๊ฒฐ |
| `cap_hit` | `total` > 500 โ€” **API ๊ฐ€ ๋” ์•ˆ ์คŒ** | `max_records` ๋กœ๋Š” ๋ถˆ๊ฐ€ (์•„๋ž˜ ์ฐธ์กฐ) |
| `meta.cap_hit_terms` | ์ƒํ•œ์— ๊ฑธ๋ฆฐ ๊ฒ€์ƒ‰์–ด ๋ชฉ๋ก | ๊ทธ ๊ฒ€์ƒ‰์–ด๋งŒ ์„ธ๋ถ„ํ™” |

### ์ƒํ•œ์„ ๋„˜๊ฒจ ๋ชจ์œผ๋Š” ๋ฐฉ๋ฒ• โ€” ํ•จ๊ป˜ ์“ฐ๋ฉด **์ „์ˆ˜ ์ˆ˜์ง‘์ด ๋ฉ๋‹ˆ๋‹ค**

`๊ต์œก๋ณต์ง€`/`๋„์„œ`(1,856๊ฑด) ๋ผ์ด๋ธŒ ์‹ค์ธก:

| ์„ค์ • | ํšŒ์ˆ˜ | ๋น„์œจ | ์š”์ฒญ |
|---|---:|---:|---:|
| ์šฐํšŒ ์—†์Œ | 500 | 27% | 1 |
| `sort_depth=3` | 1,746 | 94% | 7 |
| **`auto_partition=True` + `sort_depth=1`** | **1,854** | **100%** | 24 |

**`sort_depth` ๊ฐ€ ๋น„์šฉ ๋Œ€๋น„ ํšจ๊ณผ๊ฐ€ ์••๋„์ ์ž…๋‹ˆ๋‹ค** โ€” ๊ฐ™์€ ๊ฒ€์ƒ‰์‹์„ ์ •๋ ฌ ์ˆœ์„œ๋งŒ ๋ฐ”๊ฟ” ๋‹ค์‹œ ํ›‘๋Š”๋ฐ,
`asc` ์™€ `desc` ์˜ ๊ต์ง‘ํ•ฉ์ด **0๊ฑด**์ด๋ผ ์ •๋ ฌ์ถ• ํ•˜๋‚˜๊ฐ€ ์ƒํ•œ์„ ์‚ฌ์‹ค์ƒ 2๋ฐฐ๋กœ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.
๋ถ„ํ• (`auto_partition`)๊ณผ **์ง๊ต**ํ•˜๋ฏ€๋กœ ํ•จ๊ป˜ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


**โ‘  `auto_partition=True` โ€” ์„œ๋ฒ„์ธก ์ถ•์œผ๋กœ ์žฌ๊ท€ ๋ถ„ํ• **

์‘๋‹ต ํ•„๋“œ๋ช…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ์ถ• 3๊ฐœ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค:
`category` โ†’ `manageName`(๋‘˜ ๋‹ค ์™„์ „๋ถ„ํ• ) โ†’ `licYn`. ์ƒํ•œ์— ๊ฑธ๋ฆฐ ์กฐ๊ฐ๋งŒ ๋‹ค์Œ ์ถ•์œผ๋กœ ๋” ์ชผ๊ฐœ๊ณ ,
**๋ถ€๋ชจ ์กฐ๊ฐ๋„ ํ•ฉ์ง‘ํ•ฉ์— ๋„ฃ์–ด** ๋ถˆ์™„์ „ํ•œ ์ถ•์„ ์จ๋„ ์†ํ•ด๊ฐ€ ๋‚˜์ง€ ์•Š๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

`๊ต์œก๋ณต์ง€`(์ „์ฒด 7,028๊ฑด) ์‹ค์ธก:

| ๊นŠ์ด | ์ถ• | ํšŒ์ˆ˜ | ๋น„์œจ | ์š”์ฒญ |
|---:|---|---:|---:|---:|
| โ€” | ๋ถ„ํ•  ์—†์Œ | 500 | 7% | 1 |
| 1 | `category` | 2,134 | 30% | 13 |
| 2 | `+manageName` (๊ธฐ๋ณธ) | 3,265 | 46% | 25 |
| 3 | `+licYn` | **4,722** | **67%** | 60 |

`partition_depth`(1~3)๋กœ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. โš ๏ธ ์ „์ˆ˜๋Š” ์•„๋‹ˆ๋ฉฐ โ€” ๊นŠ์ด 3์—์„œ๋„ 33%๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค โ€”
๋ชป ๋ฐ›์€ ๊ฑด์ˆ˜๋Š” `meta.axes[].partition.unreachable` ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

**โ‘ก `exact=True` โ€” ํฐ๋”ฐ์˜ดํ‘œ ๊ตฌ๋ฌธ๊ฒ€์ƒ‰ (โš ๏ธ ๋„“๊ฒŒ ๋ชจ์„ ๋•Œ๋Š” ์“ฐ์ง€ ๋งˆ์„ธ์š”)**

`total` ์ž์ฒด๊ฐ€ ์ค„์–ด๋“ค์–ด(๊ต์œก๋ถˆํ‰๋“ฑ 63 โ†’ 28) ์ƒํ•œ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ
**์žฌํ˜„์œจ ์†์‹ค์ด ํฝ๋‹ˆ๋‹ค** โ€” ์‹ค์ธก ํ‰๊ท  47%, ์ตœ์•… 84%(๊ต์œกํ˜•ํ‰์„ฑ 31 โ†’ 5๊ฑด). ๊ตฌ๋ฌธ๊ฒ€์ƒ‰์€ ํ† ํฐ
์ธ์ ‘์„ ์š”๊ตฌํ•˜๋Š”๋ฐ ํ•œ๊ตญ์–ด ๋ณตํ•ฉ์–ด๋Š” ํ‘œ์ œ์—์„œ ์กฐ์‚ฌยท์ˆ˜์‹์–ด๋กœ ๊ฐˆ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค
(`๊ต์œก์˜ ํ˜•ํ‰์„ฑ`, `์ดˆ์ค‘๋“ฑ๊ต์œก์˜ ํ˜•ํ‰์„ฑ๊ณผ`). ๋ฒ„๋ ค์ง„ ๊ฒƒ์˜ 76%๊ฐ€ ๊ด€๋ จ ๋ฌธํ—Œ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

โ†’ **์ฝ”ํผ์Šค ์ˆ˜์ง‘์€ ๊ธฐ๋ณธ ๊ฒ€์ƒ‰ + `contains` ํ›„์ฒ˜๋ฆฌ**, `exact` ๋Š” ์ „์ฒด ํ‘œ์ œ๋ฅผ ์•„๋Š” ํŠน์ • ์ž๋ฃŒ ์กฐํšŒ์šฉ.

> โš ๏ธ `year_from`/`contains` ๋Š” **์ด๋ฏธ ๋ฐ›์€ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ›„์ฒ˜๋ฆฌ**๋ผ ์ƒํ•œ์„ ํ’€์–ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
> ์„œ๋ฒ„์ธก ์—ฐ๋„ ๋ฒ”์œ„ ํ•„ํ„ฐ๋Š” ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(11๊ฐœ ํ›„๋ณด ๋ฌด์‹œ).

> ๐Ÿ”ด **์ •์ •(2026-08-12)** โ€” ์ด์ „ ํŒ์—์„œ "์ •๋ ฌ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์ ์—ˆ์œผ๋‚˜ **ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.**
> `sort=ipub_year&order=asc|desc` ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค โ†’ `sort_depth` ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(์œ„ ํ‘œ).
> `detailSearch=true`+`f1/v1/and1` ๋กœ **ํ•„๋“œ ๊ฐ„ AND/OR/NOT** ๋„ ๋ฉ๋‹ˆ๋‹ค(`AND+NOT=๋ถ€๋ชจ` ๊ฒ€์‚ฐ ํ†ต๊ณผ) โ€”
> ์ด์ชฝ์€ ์•„์ง ๋ฏธ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ โ†’ [docs/NL_API_GUIDE.md ยง1-4-bยทยง1-6ยทยง3-3](docs/NL_API_GUIDE.md)

---

## ์„ค์น˜

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

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

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

[Releases](https://github.com/rubatoyd/nl-openapi-mcp/releases) ์—์„œ ๋‚ด๋ ค๋ฐ›์•„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Pythonยทuv ๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ์ด๋ฉด OS๋ณ„ **์ž์ฒด์™„๊ฒฐ ๋ฒˆ๋“ค**(`-win-x64` / `-macos-arm64` / `-linux-x64`)์„ ์“ฐ์„ธ์š”.

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

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

> ํด๋ผ์šฐ๋“œ ๋™๊ธฐํ™” ํด๋”(OneDrive ๋“ฑ)์—์„œ ์ž‘์—…ํ•œ๋‹ค๋ฉด venv ๋ฅผ **ํด๋” ๋ฐ–**์— ๋‘์„ธ์š”:
> `UV_PROJECT_ENVIRONMENT=~/.venvs/nl-openapi-mcp`

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

ํ‘œ์ค€ stdio MCP ์„œ๋ฒ„์ด๋ฏ€๋กœ MCP ๋ฅผ ์ง€์›ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฉด ๊ทธ๋Œ€๋กœ ๋ถ™์Šต๋‹ˆ๋‹ค โ€” Cursor ยท Windsurf ยท
Cline ยท Zed ยท VS Code Copilot(agent mode) ยท OpenAI Agents SDK ยท ์ž์ฒด ํด๋ผ์ด์–ธํŠธ ๋“ฑ.
์œ„ `command`/`args`/`env` 3์š”์†Œ๋ฅผ ๊ฐ ํด๋ผ์ด์–ธํŠธ ์„ค์ •์— ์˜ฎ๊ธฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

#### ์ „์†ก ๋ฐฉ์‹ โ€” stdio(๊ธฐ๋ณธ) ยท SSE ยท Streamable HTTP

๋กœ์ปฌ ์„œ๋ธŒํ”„๋กœ์„ธ์Šค๋ฟ ์•„๋‹ˆ๋ผ **HTTP ๋กœ๋„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.** ์›๊ฒฉ ํ˜ธ์ŠคํŒ…์ด๋‚˜ stdio ๋ฅผ ๋ชป ์“ฐ๋Š”
ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

```bash
nl-mcp                                # stdio (๊ธฐ๋ณธ)
nl-mcp --transport streamable-http    # http://127.0.0.1:8000/mcp
nl-mcp --transport sse --port 9000    # http://127.0.0.1:9000/sse
```

ํ™˜๊ฒฝ๋ณ€์ˆ˜: `NL_MCP_TRANSPORT` ยท `NL_MCP_HOST` ยท `NL_MCP_PORT`.

> โš ๏ธ **HTTP ์ „์†ก์—๋Š” ์ธ์ฆ์ด ์—†์Šต๋‹ˆ๋‹ค.** ๊ธฐ๋ณธ ๋ฐ”์ธ๋“œ๋Š” ๋ฃจํ”„๋ฐฑ(`127.0.0.1`)์ด๋ผ ๊ฐ™์€ PC ์—์„œ๋งŒ
> ์ ‘๊ทผ๋ฉ๋‹ˆ๋‹ค. `--host 0.0.0.0` ์œผ๋กœ ์™ธ๋ถ€์— ์—ด๋ฉด **์ธ์ฆํ‚ค๋ฅผ ํ’ˆ์€ ์„œ๋ฒ„๋ฅผ ๊ทธ๋Œ€๋กœ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ**๊ณผ
> ๊ฐ™์Šต๋‹ˆ๋‹ค โ€” ์‹ ๋ขฐ๋œ ๋ง์—์„œ๋งŒ ์“ฐ์„ธ์š”. ์„œ๋ฒ„๋„ ๊ธฐ๋™ ์‹œ ๊ฒฝ๊ณ ๋ฅผ ์ฐ์Šต๋‹ˆ๋‹ค.

> **Claude ์•ฑ ์•ˆ์—์„œ ๊ฒ€์ƒ‰ํ•ด ์„ค์น˜ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.** ๊ณต์‹ MCP ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ์žฌ์™€ Claude Desktop
> ์ธ์•ฑ ์ปค๋„ฅํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ๋ณ„๊ฐœ์ด๊ณ  ์ž๋™ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„ ์„ค์น˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์“ฐ์„ธ์š”.

---

## ์ธ์ฆํ‚ค

[www.nl.go.kr](https://www.nl.go.kr) ์˜คํ”ˆAPI ์‹ ์ฒญ์œผ๋กœ ๋ฐœ๊ธ‰๋ฐ›์•„ `NL_API_KEY` ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
ํ† ํฐ ๋ฐœ๊ธ‰ยทAES ์•”ํ˜ธํ™”ยท๊ณต์ธIP ๋“ฑ๋ก์ด **ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค**(ํ‰๋ฌธ key ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ).

```bash
cp .env.example .env   # NL_API_KEY ๋ฅผ ์ฑ„์›Œ ๋„ฃ์œผ์„ธ์š” (.env ๋Š” gitignore ๋ฉ๋‹ˆ๋‹ค)
```

| ํ™˜๊ฒฝ๋ณ€์ˆ˜ | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
|---|---|---|
| `NL_API_KEY` | (ํ•„์ˆ˜) | ๊ตญ๋ฆฝ์ค‘์•™๋„์„œ๊ด€ ์˜คํ”ˆAPI ์ธ์ฆํ‚ค |
| `NL_OS_TRUST` | `1` | ๊ต์œก๋งยท์‚ฌ๋‚ด๋ง SSL ์ธํ„ฐ์…‰์…˜ ๋Œ€์‘(OS ์‹ ๋ขฐ์ €์žฅ์†Œ ์‚ฌ์šฉ). `0` ์ด๋ฉด ๋น„ํ™œ์„ฑ |

> ํ•™๊ตยท๊ต์œก์ฒญยท์‚ฌ๋‚ด๋ง์€ ์ž์ฒด์„œ๋ช… ๋ฃจํŠธ CA๋กœ TLS๋ฅผ ๊ฐ€๋กœ์ฑ•๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” **๊ฒ€์ฆ์„ ๋„์ง€ ์•Š๊ณ **
> `truststore` ๋กœ OS ์‹ ๋ขฐ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

---

## MCP ๋„๊ตฌ

| ๋„๊ตฌ | ์„ค๋ช… |
|---|---|
| `nl_status` | ์ธ์ฆํ‚ค ์œ ํšจ์„ฑ + API ์‹ค์ œ ์™•๋ณต 1ํšŒ ์ ๊ฒ€ |
| `nl_search` | ์†Œ์žฅ์ž๋ฃŒ ๊ฒ€์ƒ‰ (`total`ยท`truncated`ยท`cap_hit` ๋™๋ฐ˜) |
| `nl_collect` | ๊ฒ€์ƒ‰์–ด **ํ•ฉ์ง‘ํ•ฉ** ์ˆ˜์ง‘ โ†’ ํŒŒ์ผ ์ €์žฅ. `save=false` ๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ |

### ์˜ˆ์‹œ

> "๊ตญ๋ฆฝ์ค‘์•™๋„์„œ๊ด€์—์„œ '๊ต์œก๋ถˆํ‰๋“ฑ', '๊ต์œก๊ฒฉ์ฐจ', 'ํ•™๋ ฅ๊ฒฉ์ฐจ' ๊ด€๋ จ ๋‹จํ–‰๋ณธ์„ ๋ชจ์•„์„œ xlsx๋กœ ์ €์žฅํ•ด์ค˜"

`nl_collect` ๊ฐ€ ์„ธ ๊ฒ€์ƒ‰์–ด๋ฅผ ๊ฐ๊ฐ ์กฐํšŒํ•ด `id` ๊ธฐ์ค€์œผ๋กœ ํ•ฉ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ์ƒํ•œ์— ๊ฑธ๋ฆฐ ๊ฒ€์ƒ‰์–ด๊ฐ€
์žˆ์œผ๋ฉด `meta.cap_hit_terms` ๋กœ ์ง€๋ชฉํ•ฉ๋‹ˆ๋‹ค.

> **์ถœ๋ ฅ ํŒŒ์ผ๋ช…์€ ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค.** `name` ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒ€์ƒ‰์–ด๊ฐ€ ๊ทธ๋Œ€๋กœ ํŒŒ์ผ๋ช…์ด ๋˜๋ฏ€๋กœ,
> ๊ฒฝ๋กœ ๊ตฌ๋ถ„์žยท`..`ยท์œˆ๋„ ๊ธˆ์ง€๋ฌธ์ž๋Š” ์ œ๊ฑฐ๋˜๊ณ  ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ `out_dir` ์•ˆ์—๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
> ํ•œ๊ธ€ ํŒŒ์ผ๋ช…์€ ๊ทธ๋Œ€๋กœ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

---

## CLI

```bash
nl status
nl search ๊ต์œก๋ถˆํ‰๋“ฑ --category ๋„์„œ --rows 20
nl collect --terms ๊ต์œก๋ถˆํ‰๋“ฑ ๊ต์œก๊ฒฉ์ฐจ ํ•™๋ ฅ๊ฒฉ์ฐจ --category ๋„์„œ --format xlsx json

# 500 ์ƒํ•œ์„ ๋„˜๊ฒจ ๋ชจ์œผ๊ธฐ โ€” ์ •๋ ฌ ๋’ค์ง‘๊ธฐ๊ฐ€ ๊ฐ€์žฅ ๊ฐ’์‹ธ๋‹ค (7์š”์ฒญ์— 94%)
nl collect --kwd ๊ต์œก๋ณต์ง€ --category ๋„์„œ --sort-depth 3 --format xlsx

# ๋ถ„ํ• ๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด ์ „์ˆ˜ ์ˆ˜์ง‘ (์‹ค์ธก 100%)
nl collect --kwd ๊ต์œก๋ณต์ง€ --category ๋„์„œ --auto-partition --sort-depth 1 --format xlsx
```

---

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

์ •๊ทœํ™” 25๊ฐœ ์ปฌ๋Ÿผ + ์›๋ณธ 24๊ฐœ ํ•„๋“œ(`raw`) ๋ณด์กด. ์ „์ฒด ํ‘œ์™€ ๊ฒฐ์ธก๋ฅ ์€
[docs/NL_API_GUIDE.md ยง2](docs/NL_API_GUIDE.md) ์ฐธ์กฐ.

**์ฃผ์˜ํ•  ํ•„๋“œ 2๊ฐ€์ง€** โ€” ์ด๋ฆ„์ด `โ€ฆYn` ์ด์ง€๋งŒ **๋ถˆ๋ฆฌ์–ธ์ด ์•„๋‹™๋‹ˆ๋‹ค**:

- `docYn` โ†’ `doc_type`: `NL_VIEWER` ยท `LD_VIEWER` ยท `FILE` ยท `LINK` ยท `N`
- `licYn` โ†’ `lic_code`: `L` ยท `F` ยท `S` ยท `D` ยท `N` ยท `Y`

์›๋ฌธ ๋ณด์œ  ํŒ์ •์€ `Holding.has_fulltext()` ๋ฅผ ์“ฐ์„ธ์š”(`"N"`ยท๋นˆ๊ฐ’๋งŒ ๊ฑฐ์ง“).

---

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

- โœ… ์‘๋‹ต ์Šคํ‚ค๋งˆ 24๊ฐœ ํ•„๋“œ โ€” **์‹ค์‘๋‹ต 1,124๊ฑด** ์ „์ˆ˜ ์ง‘๊ณ„๋กœ ํ™•์ •
- โœ… 500๊ฑด ์ƒํ•œ โ€” ๊ณต์‹ ์˜ค๋ฅ˜์ฝ”๋“œ + ์‹ค์ œ ์ˆ˜์ง‘ ๋กœ๊ทธ + ์˜คํ”„์…‹ ๊ธฐ์ค€๊นŒ์ง€ ์‹ค์ธก
- โœ… **ํ˜ธ์ถœ ๊ทœ๊ฒฉ ๋ผ์ด๋ธŒ ์ „์ˆ˜ ๊ฒ€์ฆ** โ€” `srchTarget` ์ง€์›/ํด๋ฐฑ, `category` 12์ข…, `sort` ์ƒ‰์ธ ํ•„๋“œ๋ช…,
  `ipub_year` ์—ฐ๋„ ํ•„ํ„ฐ, f-์Šฌ๋กฏ ๋ถˆ๋ฆฌ์–ธ, ์˜ค๋ฅ˜ ๋ด‰ํˆฌ, 0๊ฑด ์‘๋‹ต ํ˜•ํƒœ. `scripts/probe_api.py` ๋กœ ์žฌํ˜„ ๊ฐ€๋Šฅ
- โœ… ์˜คํ”„๋ผ์ธ ํšŒ๊ท€ **186๊ฑด** ยท MCP stdio ํ•ธ๋“œ์…ฐ์ดํฌ ยท CI ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์Šค๋ชจํฌ ยท
  ์ž์ฒด์™„๊ฒฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํด๋ฆฐ ํ™˜๊ฒฝ ๊ฒ€์ฆ
- โš ๏ธ ์„œ๋ฒ„์ธก **์—ฐ๋„ ๋ฒ”์œ„**(from~to) ํ•„ํ„ฐ๋งŒ ๋ฏธํ™•์ธ โ€” ๋‹จ์ผ ์—ฐ๋„(`ipub_year`)๋Š” ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค

---

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

MIT

More