Skip to main content
Glama

na-openapi-mcp

CI Release Downloads

๐Ÿ“ˆ ์‚ฌ์šฉ๋Ÿ‰ โ€” ์ตœ๊ทผ 14์ผ ์กฐํšŒ 0ํšŒ(๊ณ ์œ  0) ยท ํด๋ก  0ํšŒ(๊ณ ์œ  0) ยท ๋ฆด๋ฆฌ์Šค ์ž์‚ฐ ๋ˆ„์  ๋‹ค์šด๋กœ๋“œ 3

2026-09-07 ์ž๋™ ๊ฐฑ์‹  ยท ์ „์ฒด ์ด๋ ฅ์€ docs/usage.csv. GitHub ํŠธ๋ž˜ํ”ฝ ํ†ต๊ณ„๋Š” 14์ผ ์ฐฝ๋งŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ด ์ €์žฅ์†Œ๊ฐ€ ๋งค์ผ ์ฐ์–ด ๋ˆ„์ ํ•œ๋‹ค.

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

์ž๋งค ํ”„๋กœ์ ํŠธ: nl-openapi-mcp(๊ตญ๋ฆฝ์ค‘์•™๋„์„œ๊ด€ ๋‹จํ–‰๋ณธยทํšŒ์ƒ‰๋ฌธํ—Œ) ยท kci-openapi-mcp(ํ•™์ˆ ๋…ผ๋ฌธยท์ธ์šฉ์ง€์ˆ˜) ยท 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

์ „์ฒด ์นดํƒˆ๋กœ๊ทธ ๊ทœ๋ชจ๊ฐ€ ๋ฐ˜ํ™˜๋จ

๊ฒ€์ƒ‰ํ•ญ๋ชฉ ํ™•์ธ

ํšŒ์ˆ˜ ํ•œ๊ณ„๋Š” 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 ์— ์žˆ์Šต๋‹ˆ๋‹ค.


Related MCP server: KISTI-MCP

์„ค์น˜

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

{
  "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 ์›ํด๋ฆญ

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

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

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 ์—์„œ ๊ตญํšŒ ๊ตญํšŒ๋„์„œ๊ด€_์ž๋ฃŒ๊ฒ€์ƒ‰ ์„œ๋น„์Šค (๋ฐ์ดํ„ฐ์…‹ 15098174) ํ™œ์šฉ์‹ ์ฒญ ํ›„ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ๊ณ„์ • ํŠธ๋ž˜ํ”ฝ์€ 10,000๊ฑด/์ผ ์ž…๋‹ˆ๋‹ค.

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

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

na_detail

์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด ์ƒ์„ธ์ •๋ณด

na_toc

์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด ๋ชฉ์ฐจ

na_fields

๊ฒ€์ƒ‰ํ•ญ๋ชฉยทdbname ์œ ํšจ๊ฐ’ + ์‹ค์ธก ๊ทผ๊ฑฐ(census)

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

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

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

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

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

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


CLI

na status
na fields                          # ๊ฒ€์ƒ‰ํ•ญ๋ชฉยทdbname ์œ ํšจ๊ฐ’ (--json ์œผ๋กœ census ์ „์ฒด)
na search "์ „์ฒด,๊ต์œก๋ถˆํ‰๋“ฑ" --max-records 20
na search "์ €์ž๋ช…,์–‘์—ฐ๋™" --dbname ํ•™์œ„๋…ผ๋ฌธ
na collect --terms "์ „์ฒด,๊ต์œก๋ถˆํ‰๋“ฑ" "์ „์ฒด,๊ต์œก๊ฒฉ์ฐจ" --max-records 2000
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 ยท ํ•™์ˆ ์ง€,์žก์ง€ ยท ์‹ ๋ฌธ ยท ๊ตญ์™ธ๊ธฐ์‚ฌ ยท ๋™์˜์ƒ์ž๋ฃŒ.


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

  • ํšŒ๊ท€ ํ…Œ์ŠคํŠธ 170๊ฑด. CI ๋Š” ํ…Œ์ŠคํŠธ๋ฟ ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์ œ๋กœ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ด…๋‹ˆ๋‹ค โ€” ์‹ ๊ทœ ์˜์กด์„ฑ ํ•ด์„์—์„œ mcp.server.fastmcp ์กด์žฌ ํ™•์ธ, ์‹ค์ œ stdio ํ•ธ๋“œ์…ฐ์ดํฌ, ๋„๊ตฌ 6์ข… ๋…ธ์ถœ, ๋ฌดํ‚ค CLI ๊ธฐ๋™, ๋น„๋ฐ€ ํŒŒ์ผ ๋ฏธ์ถ”์ .

  • API ์‚ฌ์‹ค์€ ์ „๋ถ€ ๋ผ์ด๋ธŒ ์™•๋ณต์œผ๋กœ ํ™•์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌธ์„œยท์ž๋งค ํ”„๋กœ์ ํŠธ์—์„œ ์˜ฎ๊ฒจ ์ ์ง€ ์•Š์Œ). ์ž๋ฃŒ์ข… 13์ข… ํ•„๋“œ census ํ‘œ๋ณธ ์•ฝ 21,000๊ฑด. ์žฌํ˜„: scripts/probe_*.py.

  • ์ƒ์„ธ ๊ทผ๊ฑฐ์™€ ๊ฒ€์ฆ ๋“ฑ๊ธ‰(โœ… ์‹ค์ธก / ๐Ÿ“„ ๋ฌธ์„œ๊ทผ๊ฑฐ / โ“ ๋ฏธ๊ฒ€์ฆ)์€ docs/NA_API_GUIDE.md ์— ์žˆ์Šต๋‹ˆ๋‹ค.


๋ผ์ด์„ ์Šค

MIT

Available Tools

6 tools
na_collectA

[์ˆ˜์ง‘] ๊ฒ€์ƒ‰์–ด๋“ค์„ ๊ฐ๊ฐ ์กฐํšŒํ•ด ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ๋ชจ์œผ๊ณ  ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.

terms: ๊ฒ€์ƒ‰ํ•ญ๋ชฉ,ํ‚ค์›Œ๋“œ ํ˜•์‹์˜ ๊ฒ€์ƒ‰์–ด ๋ชฉ๋ก. ๊ฐ๊ฐ ๊ฐœ๋ณ„ ๊ฒ€์ƒ‰ ํ›„ ํ•ฉ์ง‘ํ•ฉ(OR)์œผ๋กœ ๋ณ‘ํ•ฉํ•œ๋‹ค. ์ด API ์˜ | ๋Š” AND ์ด๋ฏ€๋กœ OR ์€ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์˜ˆ: ["์ „์ฒด,๊ต์œก๋ถˆํ‰๋“ฑ", "์ „์ฒด,๊ต์œก๊ฒฉ์ฐจ", "์ž๋ฃŒ๋ช…,๊ต์œก ํ˜•ํ‰์„ฑ"] search: ๋‹จ์ผ ๊ฒ€์ƒ‰์–ด(terms ๋Œ€์‹ ).

โš ๏ธ year_from/year_to/contains ๋Š” ๋กœ์ปฌ ํ›„์ฒ˜๋ฆฌ๋‹ค โ€” ์ด๋ฏธ ๋ฐ›์€ ๋ ˆ์ฝ”๋“œ์—๋งŒ ๊ฑธ๋ฆฌ๋ฉฐ ํšŒ์ˆ˜ ํ•œ๊ณ„๋ฅผ ํ’€์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ์„œ๋ฒ„์ธก ์—ฐ๋„ ํ•„ํ„ฐ๋Š” ์ƒ์„ธ๊ฒ€์ƒ‰์˜ option ๋ฟ์ด๋ฏ€๋กœ ์—ฐ๋„๋กœ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๋ ค๋ฉด dbname ๊ณผ ํ•จ๊ป˜ option="๋ฐœํ–‰๋…„๋„,2000|๋ฐœํ–‰๋…„๋„,2010" ์„ ์“ธ ๊ฒƒ.

formats: xlsx/csv/json/sqlite (๊ธฐ๋ณธ 3์ข…). save=false ๋ฉด ์ €์žฅ ์—†์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ. out_dir ๋ฏธ์ง€์ • ์‹œ ํ™ˆ์˜ na-output/.

๋ฐ˜ํ™˜ ๋ฉ”ํƒ€์˜ cap_hit_terms ๋Š” ํšŒ์ˆ˜ ํ•œ๊ณ„(99,000๊ฑด)์— ๊ฑธ๋ฆฐ ๊ฒ€์ƒ‰์–ด๋ฅผ, incomplete_terms ๋Š” ์žฌ์‹œ๋„ ํ›„์—๋„ ์‹คํŒจํ•œ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋Š” ๊ฒ€์ƒ‰์–ด๋ฅผ ์ง€๋ชฉํ•œ๋‹ค โ€” ๋‘˜ ๋‹ค ์ „์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋œป์ด๋‹ค.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
saveNo
termsNo
dbnameNo
optionNo
searchNo
formatsNo
out_dirNo
year_toNo
containsNo
page_sizeNo
year_fromNo
max_recordsNo
extra_paramsNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description adds rich behavioral context: it writes files to disk (formats, save=false preview mode, out_dir default), discloses the '|' means AND operator quirk, exposes the 99,000-record retrieval limit, and explains that cap_hit_terms/incomplete_terms in return metadata signal incomplete data. This complements the openWorldHint annotation with concrete completeness caveats โ€” exactly the context structured fields cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense and well-sectioned: purpose first, then terms semantics, the warning block (marked with โš ๏ธ), formatting/output defaults, and return metadata. Every sentence carries operational value given the 14-parameter surface and zero schema coverage; it could be slightly tightened, but the structure earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema and no parameter descriptions, it covers the critical operational aspects: aggregation semantics, parameter defaults, the local-vs-server filtering pitfall, and the meaning of return metadata fields. Minor gaps remain for name, page_size, max_records, and extra_params, which are left undocumented at 0% coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description carries the full burden and succeeds: it defines the terms format with an example list, the search single-term alternative, formats allowed values (xlsx/csv/json/sqlite), save=false preview behavior, out_dir default (home na-output/), and the option='๋ฐœํ–‰๋…„๋„,2000|๋ฐœํ–‰๋…„๋„,2010' syntax for server-side filtering. Roughly 10 of 14 parameters receive meaningful semantic detail beyond their bare names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '[์ˆ˜์ง‘]' and states it queries each search term, aggregates them as a union, and saves to file. This specific verb+resource clearly differentiates it from siblings like na_search, na_detail, and na_status. The union (OR) semantics plus a concrete example make its function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use `terms` for multiple searches merged by union, `search` for a single term instead of terms, and it explains the OR-vs-AND operator quirk with an example. It also warns when NOT to rely on year_from/year_to (local post-processing only) and directs users to `option` with `dbname` for server-side year filtering. However, it never names sibling tools as alternatives (e.g., when to prefer na_search), so exclusions remain implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

na_detailA
Read-only

[์ƒ์„ธ์ •๋ณด] ์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด์˜ ์„œ์ง€์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค.

controlno: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ œ์–ด๋ฒˆํ˜ธ (์˜ˆ: MONO12026000012887, KINX2026037525).

๐Ÿ”ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ(na_search ์˜ raw)์™€ ํ•„๋“œ ์ง‘ํ•ฉยท๊ฐ’์ด ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค โ€” โœ… ์‹ค์ธก (์ผ๋ฐ˜๋„์„œ 19 ยท ํ•™์œ„๋…ผ๋ฌธ 18 ยท ๊ตญ๋‚ด๊ธฐ์‚ฌ 13 ยท ๊ณ ์„œ 19 ยท ์›น์ž๋ฃŒ 17๊ฐœ ์ „๋ถ€ ์ƒ์„ธ์ „์šฉ ํ•„๋“œ 0). ์ฆ‰ ์ด๋ฏธ ๊ฒ€์ƒ‰ํ•œ ์ž๋ฃŒ๋ผ๋ฉด ์ด ๋„๊ตฌ๋ฅผ ๋ถ€๋ฅผ ์ด์œ ๊ฐ€ ์—†๋‹ค. ์ฟผํ„ฐ(10,000๊ฑด/์ผ)๋งŒ ์“ด๋‹ค. ์“ธ ์ž๋ฆฌ๋Š” ์ œ์–ด๋ฒˆํ˜ธ๋งŒ ์•„๋Š” ์ž๋ฃŒ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋‹ค. ๋ชฉ์ฐจ ๋ณธ๋ฌธ์ด ํ•„์š”ํ•˜๋ฉด na_toc ๋ฅผ ์“ธ ๊ฒƒ (๊ทธ์ชฝ์€ ๊ฒ€์ƒ‰์— ์—†๋Š” ๋‚ด์šฉ์„ ์‹ค์ œ๋กœ ์ค€๋‹ค).

โš ๏ธ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ œ์–ด๋ฒˆํ˜ธ๋„ ERR04 ๋กœ ์‘๋‹ตํ•œ๋‹ค(์‹ค์ธก) โ€” ์ „์šฉ '์ž๋ฃŒ ์—†์Œ' ์ฝ”๋“œ๊ฐ€ ์—†์–ด ์ผ์‹œ ์˜ค๋ฅ˜์™€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹คํŒจํ•˜๋ฉด ์ œ์–ด๋ฒˆํ˜ธ๋ถ€ํ„ฐ ํ™•์ธํ•  ๊ฒƒ. โš ๏ธ ๋ณ„๋„ ํ™œ์šฉ์‹ ์ฒญ ๋Œ€์ƒ์ด๋‹ค(data.go.kr 15098175). ์ž๋ฃŒ๊ฒ€์ƒ‰ ํ‚ค๋งŒ์œผ๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

ParametersJSON Schema
NameRequiredDescriptionDefault
controlnoYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, it discloses measured operational traits: the returned field set is identical to na_search (redundancy), each call consumes daily quota (10,000/day), nonexistent control numbers still return ERR04 making them indistinguishable from transient errors, and access requires a separate data.go.kr application. This is exactly the class of behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although longer than typical descriptions, every sentence earns its place: purpose is front-loaded, the critical redundancy caveat follows immediately, then error and auth warnings. Structured formatting (bold, emoji markers, bullet separations) makes the dense content scannable, and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only lookup with no output schema and minimal annotations, the description is complete: purpose, parameter origin, output equivalence (which doubles as return-value documentation since fields mirror na_search), error semantics, quota impact, and access prerequisites are all covered. The empirical field-count breakdown per document type reinforces the redundancy claim without leaving gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates: it defines controlno as the control number taken from na_search results and supplies two concrete format examples (MONO12026000012887, KINX2026037525). This gives the agent both the provenance and the shape of the only parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb and resource: '์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด์˜ ์„œ์ง€์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค' (retrieves bibliographic information for one control number). It further distinguishes from siblings by asserting the field set is empirically identical to na_search's raw output, while na_toc is named as the tool that returns genuinely new content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is exemplary on this dimension: explicit when-to-use ('์“ธ ์ž๋ฆฌ๋Š” ์ œ์–ด๋ฒˆํ˜ธ๋งŒ ์•„๋Š” ์ž๋ฃŒ๋ฅผ ์กฐํšŒํ•  ๋•Œ'), explicit when-not-to-use ('์ด๋ฏธ ๊ฒ€์ƒ‰ํ•œ ์ž๋ฃŒ๋ผ๋ฉด ์ด ๋„๊ตฌ๋ฅผ ๋ถ€๋ฅผ ์ด์œ ๊ฐ€ ์—†๋‹ค'), and a named alternative for a specific need (na_toc for table-of-contents text). No inference is required from the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

na_fieldsA
Read-only

๊ฒ€์ƒ‰ํ•ญ๋ชฉยทdbname ๋“ฑ ์ด API ์—์„œ ์‹ค์ œ๋กœ ํ†ตํ•˜๋Š” ๊ฐ’ ๋ชฉ๋ก๊ณผ ์‹ค์ธก ๊ทผ๊ฑฐ.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds valuable context that the values are 'actually accepted' and backed by 'measured evidence,' indicating empirical verification rather than mere documentation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the core value proposition: a list of working values plus the empirical basis. It contains no filler and does not repeat information already present in annotations or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only metadata tool, the description adequately conveys what the tool returns and why it is reliable. The lack of a response format is acceptable given the tool's simplicity and supporting annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema trivially covers all parameters and the description need not add parameter-level semantics. The baseline of 4 applies because there are no parameters to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as a reference list of values actually accepted by the API, with examples like search items and dbname, making its purpose as a metadata/inspection tool clear. It lacks an explicit verb and does not contrast with sibling tools, but the resource and intent are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used to discover which field values and dbnames are valid for this API, which is a natural prerequisite for search/detail calls. However, it does not explicitly state when to use this tool over alternatives or provide any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

na_statusA
Read-only

์—ฐ๊ฒฐ ์ ๊ฒ€ โ€” ์ธ์ฆํ‚ค ๋ณด์œ  ์—ฌ๋ถ€ + ์ž๋ฃŒ๊ฒ€์ƒ‰ API ์‹ค์ œ ์™•๋ณต 1ํšŒ.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is known. The description adds useful behavioral context: it discloses that the tool performs an actual network round trip and verifies authentication-key possession. This goes beyond the annotations, though it stops short of explaining failure modes or side effects like potential latency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that conveys the core purpose and key behavioral nuance without any filler. Every token earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter health check this is mostly adequate: the agent knows what is checked and that a network call occurs. However, there is no output schema and the description does not indicate what the response looks like or how to interpret the result, leaving a notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the empty schema fully covers all parameters. The description does not need to explain parameter meanings; the baseline of 4 applies because no parameter ambiguity exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action โ€” 'connection check' โ€” with concrete scope: whether an authentication key is held and one actual round trip to the data-search API. This clearly distinguishes it from sibling data-retrieval tools like na_search or na_detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage as a connectivity/health check before other API calls, but it does not explicitly state when to use it versus alternatives, nor does it mention any exclusions. The purpose is clear enough to infer the context, but no direct guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

na_tocA
Read-only

[๋ชฉ์ฐจ] ์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด์˜ ๋ชฉ์ฐจ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค.

controlno: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ œ์–ด๋ฒˆํ˜ธ.

โš ๏ธ ์›๋ฌธ์€ HTML ์ด ์ด์Šค์ผ€์ดํ”„๋˜์–ด ์˜ค๋ฏ€๋กœ ์ด ๋„๊ตฌ๊ฐ€ ํƒœ๊ทธ๋ฅผ ํ’€์–ด ์ค„๋ฐ”๊ฟˆ ํ…์ŠคํŠธ๋กœ ์ •๋ฆฌํ•œ๋‹ค. ์‹ค์ œ ์ฃผ๋ ฅ ๊ตฌ๋ถ„์ž๋Š” <p> ๋‹ค(์‹ค์ธก 10/10) โ€” ๊ณ„์ธต์€ ํ–‰ ์•ž ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ํ‘œํ˜„๋˜๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•ด ๋Œ๋ ค์ค€๋‹ค. โš ๏ธ ๋ชฉ์ฐจ๊ฐ€ ์—†๋Š” ์ž๋ฃŒ๋„ ์ •์ƒ์ด๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋ชฉ์ฐจ ํ•„๋“œ๊ฐ€ 'Y' ์ธ ์ž๋ฃŒ๋งŒ ๋ถ€๋ฅด๋ฉด ํ—›ํ˜ธ์ถœ๊ณผ ์ฟผํ„ฐ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค(๊ฐœ๋ฐœ๊ณ„์ • 10,000๊ฑด/์ผ).

๐Ÿ”ด ๋‹ค์Œ ์ž๋ฃŒ์ข…์€ ๋ชฉ์ฐจ ๊ฐ€ ์ „๊ฑด 'N' ์ด๋ผ ์ด ๋„๊ตฌ๋ฅผ ๋ถ€๋ฅผ ์ด์œ ๊ฐ€ ์•„์˜ˆ ์—†๋‹ค(census ์‹ค์ธก): E-BOOK ยท ํ•™์ˆ ์ง€,์žก์ง€ ยท ์‹ ๋ฌธ ยท ๊ตญ์™ธ๊ธฐ์‚ฌ ยท ๋™์˜์ƒ์ž๋ฃŒ. ๐Ÿ”ด ๋ชฉ์ฐจ์ •๋ณด์—†์Œ ์„ผํ‹ฐ๋„ โ€” ํ”Œ๋ž˜๊ทธ๊ฐ€ 'Y' ์ธ๋ฐ ๋ณธ๋ฌธ์ด ๊ทธ ๋ง์˜ ๋ฐ˜๋ณต์ธ ์ž๋ฃŒ๊ฐ€ ์žˆ๋‹ค (๊ณ ์„œ์—์„œ ํ‘œ๋ณธ 5/5). ์ตœ๋Œ€ 792์ž๋ผ ๊ธธ์ด ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋ฏ€๋กœ ์ด ๋„๊ตฌ๊ฐ€ ๊ฑธ๋Ÿฌ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋Œ๋ ค์ฃผ๊ณ , ์›๋ฌธ์€ envelope.toc_sentinel ์— ๋‚จ๊ธด๋‹ค.

ParametersJSON Schema
NameRequiredDescriptionDefault
controlnoYes

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavior beyond the annotations: it explains that the raw HTML is escaped, that the tool unescapes and converts it to newline text, that the main delimiter is '<p>', and that hierarchy is preserved via line indentation. It also documents the no-TOC case as normal. The readOnlyHint/openWorldHint annotations are consistent and this context enriches them significantly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, then parameter meaning, then usage warnings presented as clear bullet-like lines. Every sentence earns its place, but the ambiguous phrase '๋‹ค์Œ ์ž๋ฃŒ์ข…์€' promises a list of excluded material types that is not actually enumerated, slightly weakening the structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description covers the input source, output transformation, empty-result behavior, and quota-aware usage guidance. The main gap is the unspecified list of material types that all have TOC='N', which leaves part of the exclusion advice incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining that 'controlno' is the control number from search results ('๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ œ์–ด๋ฒˆํ˜ธ'). This adds meaningful sourcing context beyond the bare schema. It does not include example formats, but with a single string parameter this is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it retrieves table-of-contents information for one control number ('์ œ์–ด๋ฒˆํ˜ธ 1๊ฑด์˜ ๋ชฉ์ฐจ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค'). The [๋ชฉ์ฐจ] prefix and the scope make the purpose unambiguous, though it does not explicitly differentiate itself from sibling tools like na_detail or na_fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear selection criteria: call this tool only when the search result's '๋ชฉ์ฐจ' field is 'Y', and warns that records without TOC are normal. It also notes that certain material types have all 'N' values and should not be called. It does not name alternative tools, so it stops short of full when-to-use-versus-alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.1
    • First observedna_collect
    • First observedna_detail
    • First observedna_fields
    • First observedna_search
    • First observedna_status
    • First observedna_toc

TDQS

A4.4/5.0
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
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to access real-time legislative data from the Korean National Assembly including members, bills, votes, and schedules through 276 Open APIs. Supports dual transport modes (stdio/HTTP), configurable Lite/Full tool profiles, and in-memory caching for efficient querying.
    17
    89
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Integrates with KISTI's ScienceON, NTIS, and DataON APIs to search and retrieve scientific papers, patents, reports, national R\&D projects, and research data.
    15
    Creative Commons Attribution Non Commercial 4.0 International
  • A
    license
    A
    quality
    A
    maintenance
    Enables searching and collecting academic literature metadata from KISTI ScienceOn via Claude or CLI, supporting various document types and export formats.
    5
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Search and harvest Korean academic literature and book bibliography metadata from the National Library of Korea Seoji OpenAPI via MCP or CLI.
    3
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rubatoyd/na-openapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server