Skip to main content
Glama

na-openapi-mcp

CI Release Downloads

📈 사용량 — 최근 14일 조회 2회(고유 2) · 클론 151회(고유 97) · 릴리스 자산 누적 다운로드 37

일별 클론·조회 추이

2026-09-22 자동 갱신 · 전체 이력은 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

전체 카탈로그 규모가 반환됨

검색항목 확인

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 에 있습니다.


Related MCP server: scienceon-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. 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

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 에 있습니다.


라이선스

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.

  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

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    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.
    11 npm
    90
    MIT
  • 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
    1
    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
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables searching the Kakao Daum Book Search API by title, author, publisher, or ISBN, retrieving detailed bibliographic and pricing metadata, and exporting results to xlsx, csv, json, or sqlite through MCP or CLI.
    4
    1
    MIT