kci-openapi-mcp
๐ ์ฌ์ฉ๋ โ ์ต๊ทผ 14์ผ ์กฐํ 11ํ(๊ณ ์ 4) ยท ํด๋ก 159ํ(๊ณ ์ 84) ยท ๋ฆด๋ฆฌ์ค ์์ฐ ๋์ ๋ค์ด๋ก๋ 143
2026-08-12 ์๋ ๊ฐฑ์ ยท ์ ์ฒด ์ด๋ ฅ์
docs/usage.csv. GitHub ํธ๋ํฝ ํต๊ณ๋ 14์ผ ์ฐฝ๋ง ์ ๊ณตํ๋ฏ๋ก ์ด ์ ์ฅ์๊ฐ ๋งค์ผ ์ฐ์ด ๋์ ํ๋ค.
ํ๊ตญ์ฐ๊ตฌ์ฌ๋จ(NRF) KCI(Korea Citation Index) ๋ฌธํยท์ธ์ฉ์ง์ ๊ฒ์ยท์์ง MCP ์๋ฒ + CLI. REST Open API(ํค์๋ ๊ฒ์)์ OAI-PMH(๋ฌด์ธ์ฆ ๋๋ ์ํ)๋ฅผ ํจ๊ป ๋ค๋ฃฌ๋ค.
๊ธฐ๋ฅ
- ๋ ผ๋ฌธ ๊ฒ์ยท์์ธ โ ์์ง ยท ๊ตญ๋ฌธ/์๋ฌธ ์ด๋ก ยท ํค์๋ ยท ์ ์/์์
- ์ฐธ๊ณ ๋ฌธํ ์์ง โ ์ํ ํ
์คํธ + ํผ์ธ์ฉ ๋
ผ๋ฌธ์ KCI ID(
arti_id) โ ์ธ์ฉ ๋คํธ์ํฌ ๊ตฌ์ฑ - ์ ๋ ์ธ์ฉ์ง์ โ ์ฐ๋๋ณ IF ยท ๋ฑ์ฌ์ด๋ ฅ
- OAI-PMH ๋๋ ์ํ โ ์ธ์ฆํค ์์ด ์ธํธ + ๋ ์ง๋ฒ์ ์ ์ ์์ง
- ๋ด๋ณด๋ด๊ธฐ โ xlsx ยท csv ยท json ยท sqlite
๋ ์ธํฐํ์ด์ค
| REST Open API | OAI-PMH | |
|---|---|---|
| ์๋ํฌ์ธํธ | โฆ/po/openapi/openApiSearch.kci | โฆ/oai/request |
| ์ธ์ฆ | KCI_API_KEY ํ์ | ๋ถํ์ |
| ์ง์ | ํค์๋ ๊ฒ์(title ํ์) | ์ธํธ + ๋ ์ง๋ฒ์ ์ํ |
| ์ธ์ฉ์ง์ยท์ฐธ๊ณ ๋ฌธํ | โ | โ |
๊ท๊ฒฉ: docs/KCI_API_GUIDE.md ยท docs/KCI_OAI_PMH_GUIDE.md ยท ์ค๊ณ: docs/ARCHITECTURE.md
์ธ์ฆํค ์์ด ๋ฐ๋ก ์จ๋ณด๊ธฐ
REST ๊ฒ์๋ง ์ธ์ฆํค๊ฐ ํ์ํ๊ณ , OAI-PMH ์ํ์ ํค ์์ด ๋์ํ๋ค.
uvx --from git+https://github.com/rubatoyd/KCI_openAPI kci identify
uvx --from git+https://github.com/rubatoyd/KCI_openAPI kci harvest --set ARTI --from 2024-01-01 --until 2024-03-31 --contains ํ๋ถ๋ชจ --max 200
MCP ๋ก ๋ถ์๋ค๋ฉด kci_status โ kci_harvest ์์ผ๋ก ๋ฐ๋ก ์ธ ์ ์๋ค. ํค๊ฐ ์์ผ๋ฉด REST ๋๊ตฌ๋
์ค๋ฅ ๋์ OAI ๋์์ ์๋ดํ๋ค.
์ธ์ฆํค ๋ฐ๊ธ
REST ๋๊ตฌ(kci_search ยท kci_detail ยท kci_references ยท kci_journal_citation)์๋ง ํ์ํ๋ค.
- open.kci.go.kr ์์ Open API ์ด์ฉ ์ ์ฒญ
- ๋ฐ๊ธ๋ ์ธ์ฆํค ๋ฌธ์์ด 1๊ฐ๋ฅผ ๋ฐ๋๋ค
- ์๋ ์ค ํ ๊ณณ์ ๋ฃ๋๋ค โ ์ฝ๋๋ ์ปค๋ฐ์๋ ๋ฃ์ง ์๋๋ค
| ์ฌ์ฉ ํ๊ฒฝ | ๋ฃ๋ ๊ณณ |
|---|---|
| Claude Code | .claude/settings.local.json ์ env (gitignore ๋์) |
| Claude Desktop | claude_desktop_config.json ์ env โ ํ๋ฌธ ์ธ๋ผ์ธ(${VAR} ํ์ฅ ์ ๋จ) |
.mcpb ์ค์น | ์ค์น ์ฐฝ์ ์ ๋ ฅ๋ |
| CLI / ๋ก์ปฌ ๊ฐ๋ฐ | .env(gitignore) ๋๋ OS ์ฌ์ฉ์ ํ๊ฒฝ๋ณ์ |
AES ์ํธํยทํ ํฐ ๋ฐ๊ธยท๊ณต์ธ IP ๋ฑ๋ก์ ๋ถํ์ํ๋ค. ํ๋ฌธ key ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ๋๋ก ํธ์ถํ๋ค.
์ค์น
Claude Desktop
์์ฒด์๊ฒฐ .mcpb(๊ถ์ฅ) โ Pythonยทuv ๋ถํ์. ๋ฆด๋ฆฌ์ค์์
OS์ ๋ง๋ ํ์ผ์ ๋ฐ์ ๋๋ธํด๋ฆญ(๋๋ Settings โ Extensions โ Install) โ KCI_API_KEY ์
๋ ฅ(์ ํ).
| ์์ฐ | ํน์ง |
|---|---|
kci-openapi-mcp-win-x64.mcpb / โฆ-macos-arm64.mcpb / โฆ-linux-x64.mcpb | ์์ฒด์๊ฒฐ โ ์ฌ์ ์ค์น๋ฌผ ์์ |
kci-openapi-mcp.mcpb | ๊ฒฝ๋. ์คํ์ uv ํ์ |
์๋ config โ %APPDATA%/Claude/claude_desktop_config.json:
{ "mcpServers": { "kci": {
"command": "uvx",
"args": ["--from", "git+https://github.com/rubatoyd/KCI_openAPI", "kci-mcp"],
"env": { "KCI_API_KEY": "<๋ฐ๊ธํค ๋๋ ๋น์>", "KCI_OS_TRUST": "1" }
} } }
Claude Code
claude mcp add kci --env KCI_API_KEY=$KCI_API_KEY -- uvx --from git+https://github.com/rubatoyd/KCI_openAPI kci-mcp
ํ๋ก์ ํธ ๋ฃจํธ์ .mcp.json ๋ ์๋ ์ธ์๋๋ค.
๋ค๋ฅธ MCP ํด๋ผ์ด์ธํธ
ํ์ค stdio MCP ์๋ฒ์ด๋ฏ๋ก MCP ๋ฅผ ์ง์ํ๋ ์์ด์ ํธ๋ฉด ๊ทธ๋๋ก ๋ถ๋๋ค โ Cursor ยท Windsurf ยท Cline ยท
Zed ยท VS Code Copilot(agent mode) ยท OpenAI Agents SDK ยท ์์ฒด ํด๋ผ์ด์ธํธ ๋ฑ. ์ command/args/env
3์์๋ฅผ ๊ฐ ํด๋ผ์ด์ธํธ ์ค์ ์ ์ฎ๊ธฐ๋ฉด ๋๋ค.
from mcp import StdioServerParameters
params = StdioServerParameters(
command="uvx",
args=["--from", "git+https://github.com/rubatoyd/KCI_openAPI", "kci-mcp"],
env={"KCI_API_KEY": "..."}, # ๋น์ฐ๋ฉด OAI ๋ฌด์ธ์ฆ ๋๊ตฌ๋ง
)
์ ์ก ๋ฐฉ์
kci-mcp # stdio (๊ธฐ๋ณธ)
kci-mcp --transport streamable-http # http://127.0.0.1:8000/mcp
kci-mcp --transport sse --port 9000 # http://127.0.0.1:9000/sse
ํ๊ฒฝ๋ณ์: KCI_MCP_TRANSPORT ยท KCI_MCP_HOST ยท KCI_MCP_PORT.
MCP ๋๊ตฌ
| ๋๊ตฌ | ํ๋ ์ผ |
|---|---|
kci_status | ์ฐ๊ฒฐ ์ ๊ฒ โ OAI Identify + ์ธ์ฆํค ๋ณด์ ์ฌ๋ถ |
kci_search | ๋
ผ๋ฌธ ๊ฒ์ โ title ํ์ + author/journal/keyword/abstract/doi/๋ฐํ์ฐ์/institution ํํฐ, ์ ๋ ฌ |
kci_detail | Control Number(ARTโฆ)๋ก ์์ธ โ ํค์๋ยทISSNยท์ ์์์ยท์ฐธ๊ณ ๋ฌธํ์ ์ ์ผํ ์ถ์ฒ |
kci_references | ์ ๋ชฉ ๊ฒ์์ด์ ๋งค์นญ๋ ๋ ผ๋ฌธ๋ค์ ์ฐธ๊ณ ๋ฌธํ ์ํ |
kci_journal_citation | ์ ๋ ์ธ์ฉ์ง์ โ ์ฐ๋ ๋ชฉ๋ก / journal_id ์์ธ(๋ฑ์ฌ์ด๋ ฅยท์ฐ๋๋ณ IF) |
kci_harvest | OAI-PMH ๋ฌด์ธ์ฆ ๋๋ ์ํ โ ์ธํธ + ๋ ์ง๋ฒ์, contains ๋ก์ปฌ ํํฐ |
kci_collect | ๋ผ์ฐํฐ โ ํค ์ ๋ฌดยท์์ฒญ ์ฑ๊ฒฉ์ผ๋ก RESTโOAI ์๋ ์ ํ ํ ํ์ผ ์ ์ฅ |
์์๋ ์ ํ
articleSearch ๋ ํค์๋ยทISSNยทUCI ๋ฅผ ์๋ต์ ์ฃ์ง ์๋๋ค. keyword= ๋ก ๊ฒ์์ ๋์ง๋ง ๊ฒฐ๊ณผ์๋
์๋ค. ๊ฒ์ ๊ฒฐ๊ณผ์ ๋น keywords ๋ 'ํค์๋ ์๋ ๋
ผ๋ฌธ'์ด ์๋๋ค โ ํ์ํ๋ฉด kci_detail ๋ก ๊ฑด๋ณ ๋ณด๊ฐํ๋ค.
kci_collect ์ REST ๊ฒฝ๋ก๋ ์ ๋ชฉ์ถ โช ํค์๋์ถ์ด๋ค. ๊ฐ ๊ฒ์์ด๋ฅผ ๋ ์ถ์ผ๋ก ์กฐํํด ํฉ์งํฉ์ ๋ง๋ ๋ค.
๊ฒฐ๊ณผ๋ '์ ๋ชฉ๊ฒ์ ๊ฒฐ๊ณผ'๊ฐ ์๋๋ฏ๋ก ์ฝํผ์ค ๊ฒฝ๊ณ๋ฅผ ๊ธฐ์ ํ ๋ ๋ช
์ํด์ผ ํ๋ค. meta.axes ์ ์ถ๋ณ total ์ด ๋ด๊ธด๋ค.
์ฐธ๊ณ ๋ฌธํ์ arti_id ๋ KCI ๋ฑ์ฌ๋ถ์๋ง ๋ถ๋๋ค. ๋จํ๋ณธยท๋ณด๊ณ ์ยทํด์ธ๋ฌธํ์ ๋น ๋ฌธ์์ด์ด๋ค.
์ธ์ฉ ๋คํธ์ํฌ๋ ์ด ID ๊ฐ ์๋ ํญ๋ชฉ์ผ๋ก๋ง ๊ตฌ์ฑํ ์ ์๋ค(references_linked_count ๋ก ํ์ธ).
referenceSearch ๋ ํ์ด์ง ํ๋ผ๋ฏธํฐ๊ฐ ์์ด 1ํ 100๊ฑด์ด ์ํ์ด๋ค. ๋ถ์กฑํ ์ด์ ๊ฐ ๋์ด๊ณ ์ฒ๋ฐฉ์ด
์ ๋ฐ๋์ด๋ฏ๋ก ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ํ์ธํด์ผ ํ๋ค.
| ์ํฉ | ์ฒ๋ฐฉ |
|---|---|
total > 100 โ API ๊ฐ ๋ ์ค ์ ์๋ค | sort_dir ๋ฅผ ๋ค์ง์ด(ascโdesc) ๋ฐ๋์ชฝ์ ๋ฐ์ ํฉ์งํฉ |
total โค 100 ์ธ๋ฐ rows ๋ก ์๋ ธ๋ค | rows ๋ฅผ total ์ด์์ผ๋ก ์ฌ๋ฆฐ๋ค (์ ๋ ฌ ๋ฐ์ ์ ๊ฐ์ ๋ ์ฝ๋๋ง ๋ค์ ์จ๋ค) |
KCI ๊ฐ ๋ณด๊ณ ํ๋ total ์ ์ค์ ๋ก ๋ฐ์ ์ ์๋ ๊ฑด์๋ณด๋ค ํด ์ ์๋ค. ๊ทธ๋์ ๋ ์ํฉ์ ๋ค๋ฅธ
ํ๋๊ทธ๋ก ๊ตฌ๋ถํ๋ค.
| ํ๋๊ทธ | ๋ป | ๋์ฒ |
|---|---|---|
truncated | max_records ์ํ์ ๊ฑธ๋ ธ๋ค | ์ํ์ ์ฌ๋ ค ์ฌ์์งํ๋ฉด ๋์ด๋๋ค |
total_mismatch | ๋๊น์ง ํ์ด์งํ๋๋ฐ total ์ ๋ชป ๋ฏธ์ณค๋ค | ์ํ์ ์ฌ๋ ค๋ ๋์ง ์๋๋ค. ํ์๋์ ํ์ ์์น๋ก ์ด๋ค |
๋ค์ค ํ์ด์ง ์ง์๋ ํธ์ถ๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ฏธ์ธํ๊ฒ ๋ฌ๋ผ์ง๋ค. ๋จ์ผ ํ์ด์ง ์ง์๋ ์์ ์ ์ด๋ค.
total ์ ๋ชป ๋ฏธ์น๊ณ ์ํ๋ ์๋๋ฉด ํ ๋ฒ ๋ ํ์ด ํฉ์งํฉ์ ์ทจํ๋ค(meta.sweeps ๊ฐ 1๋ณด๋ค ํฌ๋ฉด ๋ณด์ ๋ ๊ฒ,
์์ง ์ ์ฒด๋ meta.sweeps_total).
๋ณด์ ์ด ๊ฑธ๋ฆฐ ์ถ์ ์ ์ฒด๋ฅผ ์ฌํ์ด์งํ๋ฏ๋ก ๊ทธ๋งํผ ์์ฒญ์ด ๋์ด๋๋ค. ๋๊ท๋ชจ ์์ง์์ ๋ถ๋ด๋๋ฉด
kci_collect ์ retry_incomplete=0 ์ผ๋ก ๋๋ค โ ๋์ ๊ฒฐ์์ด ๋จ๊ณ total_mismatch ๋ก๋ง ํ์๋๋ค.
์ถ๋ ฅ ํ์ผ๋ช
์ ์ ๊ทํ๋๋ค. name ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ฒ์์ด๊ฐ ๊ทธ๋๋ก ํ์ผ๋ช
์ด ๋๋ฏ๋ก,
๊ฒฝ๋ก ๊ตฌ๋ถ์ยท..ยท์๋ ๊ธ์ง๋ฌธ์๋ ์ ๊ฑฐ๋๊ณ ๊ฒฐ๊ณผ๋ ํญ์ out_dir ์์๋ง ์ ์ฅ๋๋ค.
ํ๊ธ ํ์ผ๋ช
์ ๊ทธ๋๋ก ๋ณด์กด๋๋ค.
์ ๋ ฌ ์ธ์๋ ์ ์ก ์ ์ ๊ฒ์ฆํ๋ค. sort_by ๋ title/author/pubiYr, sort_dir ์ asc/desc.
ํ์ฉ๊ฐ ๋ฐ์ด๋ฉด ์ค๋ฅ๋ฅผ ๋๋ ค์ค๋ค.
Claude ์ฑ ์์์ ๊ฒ์ํด ์ค์นํ ์๋ ์๋ค. ๊ณต์ MCP ๋ ์ง์คํธ๋ฆฌ ๋ฑ์ฌ์ Claude Desktop ์ธ์ฑ ์ปค๋ฅํฐ ๋๋ ํฐ๋ฆฌ๋ ๋ณ๊ฐ์ด๊ณ ์๋ ๋๊ธฐํ๋์ง ์๋๋ค. ์ ์ค์น ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ด๋ค.
๋๊ตฌ ์ค๋ช ์ด ํ๊ตญ์ด๋ค. ํ๊ตญ์ด๋ฅผ ๋ค๋ฃจ๋ ๋ชจ๋ธ์ด์ด์ผ ๋๊ตฌ ์ ํ์ด ์ ํํ๋ค.
mcp SDK ๋ 1.x ๋ก ๊ณ ์ ๋๋ค(mcp>=1.2.0,<2). 2.0 ์์ mcp.server.fastmcp ๊ฐ ์ ๊ฑฐ๋์ด
์ํ์ด ์์ผ๋ฉด ๊ธฐ๋์ ์คํจํ๋ค.
CLI
kci identify # OAI ๋ฌด์ธ์ฆ โ ํค ์์ด ์ฆ์
kci harvest --set ARTI --from 2024-01-01 --until 2024-12-31 --contains ํ๋ถ๋ชจ --max 500
kci search --title ๊ฒฝ๊ณ์ ์ง๋ฅ --rows 20 # REST(์ธ์ฆํค ํ์)
kci collect --config config/borderline_slow.yaml
๋ก์ปฌ ๊ฐ๋ฐ์ uv sync. ํด๋ผ์ฐ๋ ๋๊ธฐํ ํด๋(OneDrive ๋ฑ)๋ผ๋ฉด venv ๋ฅผ ํด๋ ๋ฐ์ ๋๊ธฐ๋ฅผ ๊ถํ๋ค
(UV_PROJECT_ENVIRONMENT).
๋คํธ์ํฌ
- KCI ๋ฐฉํ๋ฒฝ์ User-Agent ํํฐ๋ฅผ ๊ฑด๋ค.
curl๊ธฐ๋ณธ UA ๋ ์ฐจ๋จ ์๋ดํ์ด์ง๋ฅผ ๋ฐ๋๋ค. ๋ณธ ์๋ฒ๋requests๋ก ํธ์ถํ๋ฏ๋ก ์ ์ ๋์ํ๋ค. - ๊ต์ก๋งยท์ฌ๋ด๋ง SSL ์ธํฐ์
์
ํ๊ฒฝ์์๋
truststore๋ก OS ์ ๋ขฐ์ ์ฅ์๋ฅผ ์ฌ์ฉํด ํต๊ณผํ๋ค (TLS ๊ฒ์ฆ์ ๋์ง ์๋๋ค). ๋นํ์ฑ์KCI_OS_TRUST=0. - HTTP ์ ์ก์๋ ์ธ์ฆ์ด ์๋ค. ๊ธฐ๋ณธ ๋ฐ์ธ๋๋ ๋ฃจํ๋ฐฑ(
127.0.0.1)์ด๋ค.--host 0.0.0.0์ผ๋ก ์ธ๋ถ์ ์ด๋ฉด ์ธ์ฆํค๋ฅผ ๊ฐ์ง ์๋ฒ๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ฏ๋ก ์ ๋ขฐ๋ ๋ง์์๋ง ์ด๋ค.
๋ผ์ด์ ์ค
MIT. ๋ณธ ํ๋ก์ ํธ๋ ํ๊ตญ์ฐ๊ตฌ์ฌ๋จ์ ๋น๊ณต์ ํด๋ผ์ด์ธํธ์ด๋ฉฐ ์ ํด ๊ด๊ณ๊ฐ ์๋ค. KCI ๋ฐ์ดํฐ ์ด์ฉ์ KCI ์ฝ๊ด์ ๋ฐ๋ฅธ๋ค.