io.github.rubatoyd/kci-openapi-mcp
KCI (Korea Citation Index) literature & citation search via REST Open API + OAI-PMH
Open source Open in the app JSON README (API)
About
KCI (Korea Citation Index) literature & citation search via REST Open API + OAI-PMH
Details
- Kind
- MCP servers
- Topic
- No topic detected
- Publisher
- rubatoyd
- Origin
- official
- Category
- ferramentas
- Transport
- local
- Version
- 0.3.6
- Stars
- 2
- Last push
- 2026-09-05T07:39:01Z
- 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.rubatoyd/kci-openapi-mcp
README
# kci-openapi-mcp
<!-- mcp-name: io.github.rubatoyd/kci-openapi-mcp -->
[](https://github.com/rubatoyd/KCI_openAPI/actions/workflows/ci.yml)
[](https://github.com/rubatoyd/KCI_openAPI/releases/latest)
[](https://github.com/rubatoyd/KCI_openAPI/releases)
<!-- usage:start -->
> ๐ **์ฌ์ฉ๋** โ ์ต๊ทผ 14์ผ ์กฐํ **20**ํ(๊ณ ์ 10) ยท ํด๋ก **215**ํ(๊ณ ์ 97) ยท ๋ฆด๋ฆฌ์ค ์์ฐ ๋์ ๋ค์ด๋ก๋ **270**
>
> 
>
> <sub>2026-09-05 ์๋ ๊ฐฑ์ ยท ์ ์ฒด ์ด๋ ฅ์ [`docs/usage.csv`](docs/usage.csv). GitHub ํธ๋ํฝ ํต๊ณ๋ 14์ผ ์ฐฝ๋ง ์ ๊ณตํ๋ฏ๋ก ์ด ์ ์ฅ์๊ฐ ๋งค์ผ ์ฐ์ด ๋์ ํ๋ค.</sub>
<!-- usage:end -->
ํ๊ตญ์ฐ๊ตฌ์ฌ๋จ(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_API_GUIDE.md) ยท [docs/KCI_OAI_PMH_GUIDE.md](docs/KCI_OAI_PMH_GUIDE.md) ยท ์ค๊ณ: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
## ์ธ์ฆํค ์์ด ๋ฐ๋ก ์จ๋ณด๊ธฐ
REST ๊ฒ์๋ง ์ธ์ฆํค๊ฐ ํ์ํ๊ณ , OAI-PMH ์ํ์ ํค ์์ด ๋์ํ๋ค.
```bash
uvx --from git+https://github.com/rubatoyd/KCI_openAPI kci identify
```
```bash
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`)์๋ง ํ์ํ๋ค.
1. [open.kci.go.kr](https://open.kci.go.kr) ์์ **Open API ์ด์ฉ ์ ์ฒญ**
2. ๋ฐ๊ธ๋ ์ธ์ฆํค ๋ฌธ์์ด 1๊ฐ๋ฅผ ๋ฐ๋๋ค
3. ์๋ ์ค ํ ๊ณณ์ ๋ฃ๋๋ค โ ์ฝ๋๋ ์ปค๋ฐ์๋ ๋ฃ์ง ์๋๋ค
| ์ฌ์ฉ ํ๊ฒฝ | ๋ฃ๋ ๊ณณ |
|---|---|
| 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 ๋ถํ์. [๋ฆด๋ฆฌ์ค](https://github.com/rubatoyd/KCI_openAPI/releases/latest)์์
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`:
```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
```bash
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์์๋ฅผ ๊ฐ ํด๋ผ์ด์ธํธ ์ค์ ์ ์ฎ๊ธฐ๋ฉด ๋๋ค.
```python
from mcp import StdioServerParameters
params = StdioServerParameters(
command="uvx",
args=["--from", "git+https://github.com/rubatoyd/KCI_openAPI", "kci-mcp"],
env={"KCI_API_KEY": "..."}, # ๋น์ฐ๋ฉด OAI ๋ฌด์ธ์ฆ ๋๊ตฌ๋ง
)
```
### ์ ์ก ๋ฐฉ์
```bash
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
```bash
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 ์ฝ๊ด์ ๋ฐ๋ฅธ๋ค.