io.github.rubatoyd/kakao-book-mcp
# kakao-book-mcp
<!-- mcp-name: io.github.rubatoyd/kakao-book-mcp -->
[](https://github.com/rubatoyd/kakao-book-mcp/actions/workflows/ci.yml)
[](https://github.com/rubatoyd/kakao-book-mcp/releases/latest)
[](https://github.com/rubatoyd/kakao-book-mcp/releases)
<!-- usage:start -->
> ๐ **์ฌ์ฉ๋ ํต๊ณ** โ ์ต๊ทผ 14์ผ ์กฐํ **0**ํ(์ 0) ยท ํด๋ก **0**ํ(์ 0) ยท ๋ฆด๋ฆฌ์ค ๋ค์ด๋ก๋ **1**๊ฑด
>
> 
>
> <sub>2026-09-19 ์๋ ์ง๊ณ๋จ ยท ์ ์ฒด ์ด๋ ฅ [`docs/usage.csv`](docs/usage.csv). GitHub ํธ๋ํฝ API 14์ผ ์ฐฝ์ ์๊ตฌ ๋ณด์กดํฉ๋๋ค.</sub>
<!-- usage:end -->
**์นด์นด์ค Daum ์ฑ
๊ฒ์(Daum Book Search)** Open API๋ฅผ Claude, Cursor ๋ฑ MCP ํด๋ผ์ด์ธํธ์์ ๋ฐ๋ก ์ฐ๋ **MCP ์๋ฒ + CLI ๋๊ตฌ**.
๋์๋ช
ยท์ ์ยท์ถํ์ฌยทISBN ๊ฒ์, ์์ธ ์์ง ๋ฐ ๊ฐ๊ฒฉ/ํ ์ธ์จ ์ ๋ณด ์์ง, ๋ค์ค ํค์๋ ์ผ๊ด ์์ง ํ `xlsx`ยท`csv`ยท`json`ยท`sqlite` ํ์ผ๋ก ๋ด๋ณด๋
๋๋ค.
> ๐ **์๋งค ํ๋ก์ ํธ**: [kci-openapi-mcp](https://github.com/rubatoyd/KCI_openAPI) (KCI ํ์ ๋
ผ๋ฌธยท์ธ์ฉ์ง์) ยท [scienceON-mcp](https://github.com/rubatoyd/scienceON-mcp) (KISTI ๊ณผํ๊ธฐ์ ๋ฌธํ) ยท [nl-openapi-mcp](https://github.com/rubatoyd/nl-openapi-mcp) (๊ตญ๋ฆฝ์ค์๋์๊ด ๊ตญ๊ฐ์์ง)
---
## ์ฃผ์ ๊ธฐ๋ฅ
1. **๋์ ๊ฒ์ & ISBN ์กฐํ**:
- ์ ๋ชฉ, ์ ์/์ญ์, ์ถํ์ฌ, ISBN ํ๋ ํ๊ฒํ
๊ฒ์
- 10์๋ฆฌ / 13์๋ฆฌ ISBN ์๋ ์ ๊ทํ ๋ฐ ์กฐํ
2. **์กฐ์ฉํ ์ ๋จ(Quiet Truncation) ๋ฐฉ์ง**:
- ์นด์นด์ค ์ฑ
๊ฒ์ API๋ ์ต๋ 50ํ์ด์ง * 50๊ฑด = **2,500๊ฑด**์ ํ์ด์ง ์ํ์ด ์กด์ฌํฉ๋๋ค.
- ์๋ต์ `total_count`, `pageable_count`, `is_end`, `truncated`, `cap_hit`์ ํจ๊ป ์ ๋ฌํ์ฌ ๋ถ๋ถ ์์ง์ ์ ์๋ก ์ค์ธํ์ง ์๋๋ก ์๋ดํฉ๋๋ค.
3. **๋๋ ์์ง & ๋ค์ค ํฌ๋งท Export**:
- ๋ณต์ ๊ฒ์์ด์ ๋ํ ์๋ ํ์ด์ง ๋ฐ ์ค๋ณต ์ ๊ฑฐ(ISBN ๊ธฐ์ค)
- ์ถํ์ฐ๋(`year_from`, `year_to`), ๊ฐ๊ฒฉ(`min_price`, `max_price`), ํ๋งค์ํ(`status`), ๋ณธ๋ฌธ ํค์๋(`contains`) ํด๋ผ์ด์ธํธ ํํฐ๋ง
- `xlsx` (์คํ์ผ ์์ ์ ์ฉ), `csv` (ํ๊ธ Excel ํธํ UTF-8 BOM), `json` (์๋ณธ raw ํฌํจ), `sqlite` ๋์ ์ ์ฅ
4. **๊ต์ก๋ง/์ฌ๋ด๋ง SSL ์ธํฐ์
์
๋์**:
- `truststore` ๋ด์ฅ์ผ๋ก ๋ณ๋ ์ธ์ฆ์ ๋ฑ๋ก ์์ด OS ์ ๋ขฐ ์ ์ฅ์ ์๋ ์ฐ๋
---
## ๋๊ตฌ ๋ชฉ๋ก (MCP Tools)
| ๋๊ตฌ๋ช
| ์ค๋ช
| ์ฃผ์ ์ธ์ |
| :--- | :--- | :--- |
| **`kakao_book_status`** | ์ธ์ฆํค ์ ํจ์ฑ ์ ๊ฒ ๋ฐ ์นด์นด์ค API 1ํ ํ๋ก๋ธ ํธ์ถ | ์์ |
| **`kakao_book_search`** | ํค์๋ ๋์ ๊ฒ์ | `query`, `target` (`title`\|`isbn`\|`publisher`\|`person`), `sort` (`accuracy`\|`latest`), `page`, `size` |
| **`kakao_book_isbn`** | ISBN ์ ์ฉ ์์ธ ์กฐํ (๋ณต์ ISBN ์ง์) | `isbn` (์ผํ ๊ตฌ๋ถ ๊ฐ๋ฅ) |
| **`kakao_book_collect`** | ๋ค์ค ๊ฒ์์ด ๋๋ ์์ง ๋ฐ ํ์ผ ์ ์ฅ | `terms`, `target`, `sort`, `max_records`, `year_from`, `year_to`, `min_price`, `max_price`, `status`, `contains`, `formats`, `out_dir`, `name` |
---
## ์ธ์ฆํค ๋ฐ๊ธ ๋ฐ ์ค์ (1๋ถ ์์, ๋ฌด๋ฃ)
์นด์นด์ค Daum ์ฑ
๊ฒ์ API๋ **๋ฌด๋ฃ์ด๋ฉฐ ๋ณ๋์ ์น์ธ ์ฌ์ฌ ์์ด ์ฆ์ ๋ฐ๊ธ**๋ฉ๋๋ค (์ผ์ผ ๊ธฐ๋ณธ 30,000๊ฑด ์ฟผํฐ ์ ๊ณต).
### 1. REST API ํค ๋ฐ๊ธ ๋ฐฉ๋ฒ
1. [์นด์นด์ค ๋๋ฒจ๋กํผ์ค (developers.kakao.com)](https://developers.kakao.com) ์ ์ ๋ฐ ์นด์นด์ค ๊ณ์ ๋ก๊ทธ์ธ
2. ์๋จ ๋ฉ๋ด์ **[๋ด ์ ํ๋ฆฌ์ผ์ด์
]** โก๏ธ **[์ ํ๋ฆฌ์ผ์ด์
์ถ๊ฐํ๊ธฐ]** ํด๋ฆญ
* *์ฑ ์ด๋ฆ*: ์์ ์
๋ ฅ (์: `kakao-book-mcp`)
* *์ฌ์
์๋ช
*: ์์ ์
๋ ฅ (์: `๊ฐ์ธ` ๋๋ ๋ณธ์ธ ์ด๋ฆ)
3. ์์ฑ๋ ์ฑ ํด๋ฆญ โก๏ธ ์ข์ธก **[์ฑ ํค]** (๋๋ [์ฑ ์ค์ ] > [์์ฝ ์ ๋ณด])์์ **`REST API ํค`** (32์๋ฆฌ 16์ง์) ๋ณต์ฌ
### 2. ํ๊ฒฝ๋ณ ํค ๋ฑ๋ก ๋ฐฉ๋ฒ
๋ณต์ฌํ REST API ํค๋ฅผ ์ฌ์ฉ ํ๊ฒฝ์ ๋ง์ถฐ ์ค์ ํฉ๋๋ค:
| ์ฌ์ฉ ํ๊ฒฝ | ์ค์ ์์น | ์ค์ ๋ฐฉ๋ฒ |
| :--- | :--- | :--- |
| **Claude Desktop (`.mcpb`)** | ํ์ฅ ์ค์น ์ ํ์
์ฐฝ | `.mcpb` ํ์ผ์ Claude Desktop์ ๋๋๊ทธ ์ค ๋๋กญ ํ ๋ํ๋๋ ์
๋ ฅ์ฐฝ์ ํค ๋ถ์ฌ๋ฃ๊ธฐ |
| **Claude Code** | `claude mcp add` | `--env KAKAO_API_KEY=YOUR_REST_API_KEY` ์ต์
์ผ๋ก ์ ๋ฌ |
| **Antigravity / Gemini CLI** | `mcp_config.json` | `env.KAKAO_API_KEY` ํญ๋ชฉ์ ์ค์ |
| **CLI / ํฐ๋ฏธ๋ ์ง์ ์คํ** | OS ํ๊ฒฝ๋ณ์ / `.env` | Windows ํ๊ฒฝ๋ณ์ ๋ฑ๋ก ๋๋ ์์
ํด๋์ `.env` ํ์ผ์ `KAKAO_API_KEY=...` ์์ฑ |
---
## ์ค์น ๋ฐ MCP ๋ฑ๋ก
### 1. Claude Desktop
`%APPDATA%/Claude/claude_desktop_config.json` (Windows) ๋๋ `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):
```json
{
"mcpServers": {
"kakao-book": {
"command": "uvx",
"args": ["--from", "git+https://github.com/rubatoyd/kakao-book-mcp", "kakao-book-mcp"],
"env": {
"KAKAO_API_KEY": "YOUR_KAKAO_REST_API_KEY",
"KAKAO_OS_TRUST": "1"
}
}
}
}
```
### 2. Claude Code
```bash
claude mcp add kakao-book --env KAKAO_API_KEY=YOUR_REST_API_KEY -- uvx --from git+https://github.com/rubatoyd/kakao-book-mcp kakao-book-mcp
```
### 3. Gemini CLI / Antigravity
ํ๋ก์ ํธ ๋ฃจํธ์ `.agents/mcp_config.json` ๋๋ ์ ์ญ `~/.gemini/config/mcp_config.json`:
```json
{
"mcpServers": {
"kakao-book": {
"command": "uvx",
"args": ["--from", "git+https://github.com/rubatoyd/kakao-book-mcp", "kakao-book-mcp"],
"env": {
"KAKAO_API_KEY": "YOUR_KAKAO_REST_API_KEY",
"PYTHONIOENCODING": "utf-8"
}
}
}
}
```
### 4. Cursor / Windsurf / Cline
- **Command**: `uvx`
- **Args**: `["--from", "git+https://github.com/rubatoyd/kakao-book-mcp", "kakao-book-mcp"]`
- **Env**: `KAKAO_API_KEY=...`
---
## CLI ์ฌ์ฉ๋ฒ
```bash
# 1. ์ํ ๋ฐ ์ฐ๊ฒฐ ์ ๊ฒ
uvx --from git+https://github.com/rubatoyd/kakao-book-mcp kbook status
# 2. ๋์ ๊ฒ์
uvx --from git+https://github.com/rubatoyd/kakao-book-mcp kbook search "์ธ๊ณต์ง๋ฅ" --target title --size 5
# 3. ISBN ์กฐํ
uvx --from git+https://github.com/rubatoyd/kakao-book-mcp kbook isbn 9788996991342
# 4. ๋๋ ์์ง ๋ฐ ์์
/CSV/JSON ์ ์ฅ
uvx --from git+https://github.com/rubatoyd/kakao-book-mcp kbook collect --terms "๋ฅ๋ฌ๋" "๋จธ์ ๋ฌ๋" --max 100 --format xlsx csv json --out ./output
```
---
## ๋ก์ปฌ ๊ฐ๋ฐ ๋ฐ ์คํ
ํด๋ผ์ฐ๋ ๋๊ธฐํ(OneDrive ๋ฑ)์์ ์ถฉ๋ ๋ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ์ํ๊ฒฝ์ ํ๋ก์ ํธ ์ธ๋ถ(`C:\Users\rubat\.venvs\kakao-book`)์ ๊ตฌ์ฑ๋์์ต๋๋ค.
```bash
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํจํค์ง ์ค์น
uv venv C:\Users\rubat\.venvs\kakao-book
uv pip install --python C:\Users\rubat\.venvs\kakao-book -e . pytest
# ํ
์คํธ ์คํ
C:\Users\rubat\.venvs\kakao-book\Scripts\pytest.exe
# CLI ์คํ
C:\Users\rubat\.venvs\kakao-book\Scripts\kbook.exe status
```
---
## ๋ผ์ด์ ์ค
MIT License.
TDQS
Scored across 4 tools
The tools are mostly distinct: status checks connectivity, search does general queries, isbn is a specialized lookup by ISBN, and collect is a batch operation. However, search with target='isbn' overlaps with the isbn tool, which could cause confusion about which to use.
All tools follow a consistent kakao_book_<action> snake_case pattern with clear action words (status, search, isbn, collect). The naming is predictable and uniform across the set.
With 4 tools, the server is well-scoped for a book search API wrapper. It covers a health check, basic search, ISBN lookup, and batch collection without unnecessary bloat.
The tool surface covers the core read-only operations for a search API: single search, ISBN lookup, and bulk collection with filters and export. No obvious lifecycle operations are missing since the domain is read-only.