Skip to main content
Glama
kiwoom-mcp-server

kiwoom-mcp-server

by ChunSam
README.md
# kiwoom-mcp-server

**ํ•œ๊ตญ์–ด** ยท [English](README.en.md)

> ๐Ÿ›‘ **์œ ์ง€๋ณด์ˆ˜ ์ค‘๋‹จ (2026-11-02)**
>
> ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋” ์ด์ƒ ์œ ์ง€๋ณด์ˆ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์€ **v0.52.6**์ด๋ฉฐ, ์ดํ›„ ๊ธฐ๋Šฅ
> ์ถ”๊ฐ€ยท๋ฒ„๊ทธ ์ˆ˜์ •ยท์˜์กด์„ฑ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค์›€ REST API ์ชฝ ๋ณ€๊ฒฝ์œผ๋กœ ์ผ๋ถ€
> tool์ด ์˜ˆ๊ณ  ์—†์ด ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์† ์“ฐ๋ ค๋ฉด ์ €์žฅ์†Œ๋ฅผ forkํ•ด ์ง์ ‘ ๊ด€๋ฆฌํ•ด ์ฃผ์„ธ์š”
> (MIT ๋ผ์ด์„ ์Šค).

ํ‚ค์›€์ฆ๊ถŒ REST API๋ฅผ **์กฐํšŒ ์ „์šฉ(read-only)** ์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
Claude Desktop / Claude Code์—์„œ ์ž์—ฐ์–ด๋กœ ๊ตญ๋‚ด ์ฃผ์‹ ์‹œ์„ธยท์ฐจํŠธยทํ˜ธ๊ฐ€ยท์ง€์ˆ˜ยท์ˆœ์œ„ยท์ˆ˜๊ธ‰๊ณผ
๋‚ด ๊ณ„์ขŒ์˜ ์ž”๊ณ ยท๋ณด์œ  ์ข…๋ชฉยท๊ฑฐ๋ž˜๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ณ , ISA ๊ณ„์ขŒ๋ผ๋ฉด ๋น„๊ณผ์„ธ ํ•œ๋„
๋Œ€๋น„ ์†์ตํ†ต์‚ฐ ํ˜„ํ™ฉ๊นŒ์ง€ ๊ณ„์‚ฐํ•ด ์ค๋‹ˆ๋‹ค.

> โš ๏ธ **๋ณด์•ˆ ๊ฒฝ๊ณ **
>
> - ๊ธฐ๋ณธ ์‹คํ–‰์€ **๋กœ์ปฌ stdio**์ž…๋‹ˆ๋‹ค. ์›๊ฒฉ์—์„œ ์จ์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ธ์ฆ์ด ๋‚ด์žฅ๋œ
>   HTTP ๋ชจ๋“œ([์›๊ฒฉ ์—ฐ๊ฒฐ](#์›๊ฒฉ-์—ฐ๊ฒฐ-http-๋ชจ๋“œ--claudeai-์›น๋ชจ๋ฐ”์ผ) ์ฐธ์กฐ)๋กœ๋งŒ ๋…ธ์ถœํ•˜๊ณ ,
>   ์ธ์ฆ ์—†๋Š” ์ƒํƒœ(`--no-auth`)๋กœ๋Š” ์ ˆ๋Œ€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์— ์—ด์ง€ ๋งˆ์„ธ์š”.
> - `.env`์˜ AppKey/AppSecret์€ ์‹ค๊ณ„์ขŒ ์กฐํšŒ ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”
>   (`.gitignore`์— ์ด๋ฏธ ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค).
> - ์ฃผ๋ฌธ(๋งค์ˆ˜/๋งค๋„/์ •์ •/์ทจ์†Œ) ๊ธฐ๋Šฅ์€ ์„ค๊ณ„์ƒ ์ œ์™ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๊ฐ€ ๊ณ„์ขŒ๋ฅผ
>   ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค.

## ์ œ๊ณต Tool

**์‹œ์žฅ ๋ฐ์ดํ„ฐ** (๊ณ„์ขŒ์™€ ๋ฌด๊ด€, ์•ฑํ‚ค๋งŒ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ):

| Tool | ์„ค๋ช… | ํ‚ค์›€ TR |
|---|---|---|
| `search_stock` | ์ข…๋ชฉ๋ช…โ†’์ฝ”๋“œ ๊ฒ€์ƒ‰ (์ฝ”์Šคํ”ผ/์ฝ”์Šค๋‹ฅ, ETF/ETN ํฌํ•จ) + ํˆฌ์ž์œ ์˜ ํ‘œ์‹œ | ka10099 |
| `get_stock_price` | ํ˜„์žฌ๊ฐ€/๋“ฑ๋ฝ๋ฅ /๊ฑฐ๋ž˜๋Ÿ‰/๊ธฐ๋ณธ์ง€ํ‘œ + ์—…์ข…ยท์ƒ์žฅ์ผยทํˆฌ์ž์œ ์˜ | ka10001, ka10099 |
| `get_stock_quotes` | ์—ฌ๋Ÿฌ ์ข…๋ชฉ(์ตœ๋Œ€ 30๊ฐœ) ์ผ๊ด„ ์‹œ์„ธ โ€” ํ˜„์žฌ๊ฐ€ยท๋“ฑ๋ฝ๋ฅ ยท๊ฑฐ๋ž˜๋Ÿ‰ยท๊ฑฐ๋ž˜๋Œ€๊ธˆยท์‹œ๊ฐ€์ด์•ก | ka10095, ka10099 |
| `get_stock_chart` | ์ผ/์ฃผ/์›”/๋…„/๋ถ„/ํ‹ฑ๋ด‰ ์บ”๋“ค ์ฐจํŠธ (์ˆ˜์ •์ฃผ๊ฐ€ ๋ฐ˜์˜) | ka10079~83, ka10094 |
| `get_daily_trading` | ์ผ๋ณ„ ๊ฑฐ๋ž˜ยท์ˆ˜๊ธ‰ โ€” ์ข…๊ฐ€ยท๊ฑฐ๋ž˜๋Œ€๊ธˆ + ๊ฐœ์ธ/๊ธฐ๊ด€/์™ธ๊ตญ์ธ ์ˆœ๋งค์ˆ˜ยทํ”„๋กœ๊ทธ๋žจยท์‹ ์šฉ๋น„์œจ, ๋˜๋Š” ์žฅ์ „/์žฅ์ค‘/์žฅํ›„ ๊ฑฐ๋ž˜ ๋ถ„ํฌ | ka10086, ka10015 |
| `get_orderbook` | 10๋‹จ๊ณ„ ๋งค๋„/๋งค์ˆ˜ ํ˜ธ๊ฐ€ยท์ž”๋Ÿ‰ (ํ†ตํ•ฉ ๊ธฐ์ค€) | ka10007 |
| `get_orderbook_rank` | ์‹œ์žฅ ์ „์ฒด ํ˜ธ๊ฐ€์ž”๋Ÿ‰ ์ƒ์œ„ / ์ž”๋Ÿ‰ ๊ธ‰์ฆ / ์ž”๋Ÿ‰๋น„์œจ ๊ธ‰์ฆ (์ •๊ทœ์žฅ ์ค‘) | ka10020~22 |
| `get_market_index` | ์ฝ”์Šคํ”ผ/์ฝ”์Šค๋‹ฅ ์ข…ํ•ฉยท์—…์ข… ์ง€์ˆ˜ | ka20003 |
| `get_sector_price` | ์—…์ข… ์ง€์ˆ˜ ํ˜„์žฌ๊ฐ€ ์ƒ์„ธ (๋“ฑ๋ฝ ๊ตฌ์„ฑยท52์ฃผ ๊ณ ์ €ยท์‹œ๊ฐ„๋Œ€๋ณ„ ์ถ”์ด) | ka20001 |
| `get_sector_stocks` | ์—…์ข… ๊ตฌ์„ฑ ์ข…๋ชฉ ์‹œ์„ธ (ํ˜„์žฌ๊ฐ€ยท๋“ฑ๋ฝ๋ฅ ยท๊ฑฐ๋ž˜๋Ÿ‰ยท๊ณ ์ €๊ฐ€) | ka20002 |
| `get_sector_chart` | ์—…์ข… ์ง€์ˆ˜ ์ผ/์ฃผ/์›”/๋…„/๋ถ„/ํ‹ฑ๋ด‰ ์บ”๋“ค ์ฐจํŠธ | ka20004~08, ka20019 |
| `get_sector_flow` | ์—…์ข…๋ณ„ ํˆฌ์ž์ž ์ˆœ๋งค์ˆ˜ โ€” ์‹œ์žฅ ์ „์ฒด ์—…์ข…์˜ ๊ฐœ์ธ/์™ธ๊ตญ์ธ/๊ธฐ๊ด€๊ณ„ + ์ฆ๊ถŒยทํˆฌ์‹ ยท์—ฐ๊ธฐ๊ธˆยท์‚ฌ๋ชจ | ka10051 |
| `get_ranking` | ์ƒ์Šน๋ฅ /ํ•˜๋ฝ๋ฅ /๊ฑฐ๋ž˜๋Ÿ‰/๊ฑฐ๋ž˜๋Œ€๊ธˆ ์ƒ์œ„ + ์‹œ๊ฐ€๋Œ€๋น„ ๋“ฑ๋ฝ๋ฅ (์ฒด๊ฒฐ๊ฐ•๋„ ํฌํ•จ) + ์‹ ์šฉ๋น„์œจ ์ƒ์œ„ | ka10027/30/32, ka10028, ka10033 |
| `get_equal_net_trade` | ๊ธฐ๊ด€ยท์™ธ๊ตญ์ธ์ด **๋™์‹œ์—** ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœ๋งค๋งคํ•œ ์ข…๋ชฉ + ์ฃผ์ฒด๋ณ„ ์ถ”์ • ํ‰๊ท ๋‹จ๊ฐ€ | ka10062 |
| `get_valuation_rank` | PERยทPBRยทROE ๊ณ ์ € ์ˆœ์œ„ (์‹œ์žฅ ์ „์ฒด ๋ฐธ๋ฅ˜์—์ด์…˜ ์Šคํฌ๋ฆฌ๋‹) | ka10026 |
| `get_supply_concentration` | ๋งค๋ฌผ๋Œ€์ง‘์ค‘ ์ข…๋ชฉ โ€” ํŠน์ • ๊ฐ€๊ฒฉ๋Œ€์— ๊ฑฐ๋ž˜๊ฐ€ ๋ชฐ๋ฆฐ ์ข…๋ชฉ๊ณผ ๊ทธ ๊ตฌ๊ฐ„ | ka10025 |
| `get_market_movers` | ์‹ ๊ณ ๊ฐ€/์‹ ์ €๊ฐ€/์ƒํ•œ๊ฐ€/ํ•˜ํ•œ๊ฐ€/๊ธ‰๋“ฑ/๊ธ‰๋ฝ/๊ฑฐ๋ž˜๋Ÿ‰๊ธ‰์ฆ/๊ฑฐ๋ž˜๋Ÿ‰๊ฐฑ์‹ (์ง์ „ N์ผ ์ตœ๋Œ€ ๋ŒํŒŒ) ํŠน์ด ์ข…๋ชฉ | ka10016/17/19/23/24 |
| `get_vi_stocks` | ๋‹น์ผ VI(๋ณ€๋™์„ฑ์™„ํ™”์žฅ์น˜) ๋ฐœ๋™ ์ข…๋ชฉ (๋ฐœ๋™๊ฐ€ยท๊ดด๋ฆฌ์œจยท์‹œ๊ฐ) | ka10054 |
| `get_expected_execution` | ๋™์‹œํ˜ธ๊ฐ€ ์˜ˆ์ƒ์ฒด๊ฒฐ ์ˆœ์œ„ (๊ฐœ์žฅ ์ „ 08:30~09:00 / ๋งˆ๊ฐ ์ „ 15:20~15:30) | ka10029 |
| `get_investor_trend` | ๊ฐœ์ธ/์™ธ๊ตญ์ธ/๊ธฐ๊ด€ ์ˆœ๋งค์ˆ˜ ๋™ํ–ฅ (๊ธฐ๊ฐ„ ํ•ฉ๊ณ„ + ์ผ๋ณ„) | ka10059, ka10061 |
| `get_institution_trend` | ๊ธฐ๊ด€ยท์™ธ๊ตญ์ธ **์ถ”์ •ํ‰๊ท ๋‹จ๊ฐ€** + ์ผ๋ณ„ยท๊ธฐ๊ฐ„๋ˆ„์  ์ˆœ๋งค์ˆ˜ | ka10045 |
| `get_investor_rank` | ์™ธ๊ตญ์ธยท๊ธฐ๊ด€ ์ˆœ๋งค๋งค ์ƒ์œ„ ์ข…๋ชฉ / N์ผ ์—ฐ์† ์ˆœ๋งค์ˆ˜ ํ˜„ํ™ฉ | ka90009, ka10131 |
| `get_net_buy_rank` | ํˆฌ์ž์ž 12์ฃผ์ฒด(๊ฐœ์ธยท์™ธ๊ตญ์ธยท๊ธฐ๊ด€๊ณ„ยท๊ธˆ์œตํˆฌ์žยท๋ณดํ—˜ยทํˆฌ์‹ ยท์€ํ–‰ยท์—ฐ๊ธฐ๊ธˆ๋“ฑยท์‚ฌ๋ชจํŽ€๋“œยท๊ธฐํƒ€๊ธˆ์œตยท๊ตญ๊ฐ€ยท๊ธฐํƒ€๋ฒ•์ธ)๋ณ„ ์ˆœ๋งค์ˆ˜ ์ƒ์œ„ ์ข…๋ชฉ โ€” ์ง์ „ ์™„๋ฃŒ ๊ฑฐ๋ž˜์ผ ๊ธฐ์ค€ | ka10066 |
| `get_foreign_intraday` | ์žฅ์ค‘ ์ฃผ์ฒด๋ณ„ ์ˆœ๋งค์ˆ˜/์ˆœ๋งค๋„ ์ƒ์œ„ ์ข…๋ชฉ โ€” ์™ธ๊ตญ์ธยท๊ธฐ๊ด€๊ณ„ยท๋ณดํ—˜ยทํˆฌ์‹ ยท์—ฐ๊ธฐ๊ธˆ๋“ฑยท๊ธฐํƒ€๋ฒ•์ธ (์‹ค์‹œ๊ฐ„ ์ž ์ •์น˜) | ka10063, ka10065 |
| `get_broker_activity` | ์ข…๋ชฉ๋ณ„ ๊ฑฐ๋ž˜์›(์ฆ๊ถŒ์‚ฌ) ๋งค์ˆ˜/๋งค๋„ ์ƒ์œ„ 5 + ์™ธ๊ตญ๊ณ„ ์ฐฝ๊ตฌ ํ‘œ์‹œ, ์ „ ๊ฑฐ๋ž˜์› 50๊ฐœ์‚ฌ ๋ˆ„์  ์ˆœ์œ„(`view=broker_rank`), ๋‹น์ผ ์ƒ์œ„์—์„œ ์ดํƒˆํ•œ ์ฐฝ๊ตฌ(`view=dropout`), ๋˜๋Š” ์‹œ์žฅ ์ „์ฒด ์™ธ๊ตญ๊ณ„ ์ฐฝ๊ตฌ ์ˆœ๋งค๋งค ์ƒ์œ„ | ka10002, ka10102, ka10037, ka10038, ka10053 |
| `get_etf_info` | ETF ์ถ”์ ์ง€์ˆ˜ยท๊ณผ์„ธ์œ ํ˜•ยท์‹œ์„ธยทNAV/๊ดด๋ฆฌ์œจ | ka40002, ka10001, ka40009 |
| `get_etf_returns` | ETF ๊ธฐ๊ฐ„๋ณ„ ์ˆ˜์ต๋ฅ  vs ๋น„๊ต์ง€์ˆ˜(์ง์ ‘ ๊ณ ๋ฅด๋Š” ๊ตญ๋‚ด ์ง€์ˆ˜ โ€” ์ถ”์ ์ง€์ˆ˜์™€ ์ž๋™์œผ๋กœ ๋งž์ถฐ์ง€์ง€ ์•Š์Œ) + ์ผ๋ณ„ NAVยท๊ดด๋ฆฌ์œจยท์ถ”์ ์˜ค์ฐจ ์ถ”์ด, ์ผ์ž๋ณ„ ์™ธ๊ตญ์ธยท๊ธฐ๊ด€ ์ˆœ๋งค์ˆ˜ | ka40001, ka40003, ka40008 |
| `get_etf_rank` | ์ƒ์žฅ ETF ์ „ ์ข…๋ชฉ ์Šคํฌ๋ฆฌ๋„ˆ โ€” ๊ดด๋ฆฌ์œจ(๊ณ ํ‰๊ฐ€/์ €ํ‰๊ฐ€)ยท๋“ฑ๋ฝ๋ฅ ยท๊ฑฐ๋ž˜๋Ÿ‰ยท์ถ”์ ์˜ค์ฐจ ์ •๋ ฌ + ๊ณผ์„ธ์œ ํ˜•ยท์šด์šฉ์‚ฌยท์ถ”์ ์ง€์ˆ˜ ํ•„ํ„ฐ | ka40004 |
| `get_short_selling` | ์ข…๋ชฉ๋ณ„ ์ผ์ž๋ณ„ ๊ณต๋งค๋„ ์ถ”์ด (๊ณต๋งค๋„๋Ÿ‰ยท๋น„์ค‘ยทํ‰๊ท ๊ฐ€) | ka10014 |
| `get_stock_lending` | ๋Œ€์ฐจ๊ฑฐ๋ž˜ ์ถ”์ด (์ฒด๊ฒฐยท์ƒํ™˜ยท์ฆ๊ฐยท์ž”๊ณ ) โ€” ์ข…๋ชฉ๋ณ„/์‹œ์žฅ ์ „์ฒด + ๋Œ€์ฐจ์ž”๊ณ  ์ƒ์œ„ ์ข…๋ชฉ ์ˆœ์œ„ | ka10068, ka20068, ka90012 |
| `get_credit_trend` | ์‹ ์šฉ์œต์žยท๋Œ€์ฃผ ์ž”๊ณ  ์ถ”์ด (์‹ ๊ทœยท์ƒํ™˜ยท์ž”๊ณ ยท๊ณต์—ฌ์œจยท์ž”๊ณ ์œจ) | ka10013 |
| `get_foreign_holding` | ์™ธ๊ตญ์ธ ๋ณด์œ (ํ•œ๋„) ๋™ํ–ฅ โ€” ์ข…๋ชฉ๋ณ„ ์ถ”์ด, ๋˜๋Š” ์‹œ์žฅ ์ „์ฒด ์ˆœ์œ„(ํ•œ๋„์†Œ์ง„์œจ ์ฆ๊ฐ€ / ๊ธฐ๊ฐ„ ๋ˆ„์  ์ˆœ๋งค๋งค / 3์ผ ์—ฐ์† ์ˆœ๋งค๋งค) | ka10008, ka10036, ka10034, ka10035 |
| `get_program_trading` | ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค ์ƒ์œ„(๋‹น์ผยท๋‚ ์งœ ์ง€์ •) + ์ถ”์ด (์ผ์ž๋ณ„/์‹œ๊ฐ„๋Œ€๋ณ„/์ข…๋ชฉ๋ณ„, ์ฝ”์Šคํ”ผ/์ฝ”์Šค๋‹ฅ) + ์ข…๋ชฉ ์‹œ๊ฐ„๋Œ€๋ณ„ยท์ฐจ์ต๊ฑฐ๋ž˜ ์ž”๊ณ  | ka90003, ka90004, ka90010, ka90005, ka90013, ka90008, ka90006 |
| `get_after_hours` | ์‹œ๊ฐ„์™ธ ๋‹จ์ผ๊ฐ€ (16:00~18:00) โ€” ์ข…๋ชฉ๋ณ„ 5๋‹จ ํ˜ธ๊ฐ€ยท์‹œ์„ธ ๋˜๋Š” ๋“ฑ๋ฝ๋ฅ  ์ˆœ์œ„ | ka10087, ka10098 |
| `get_execution_strength` | ์ฒด๊ฒฐ๊ฐ•๋„ ์ถ”์ด (๋งค์ˆ˜รท๋งค๋„ ์ฒด๊ฒฐ๋Ÿ‰ร—100, 100์ด ๊ท ํ˜•) โ€” ์ผ๋ณ„ 60๊ฑฐ๋ž˜์ผ / ์‹œ๊ฐ„๋ณ„ 60๋ถ„ | ka10046, ka10047 |
| `get_gold_price` | KRX ๊ธˆํ˜„๋ฌผ ์‹œ์„ธ (๊ธˆ 1Kg / ๋ฏธ๋‹ˆ๊ธˆ 100g) โ€” ์ผ๋ณ„์ถ”์ด + ๊ธฐ๊ด€ยท๊ฐœ์ธ ์ˆœ๋งค์ˆ˜, ๋˜๋Š” ๋‹น์ผ ํ‹ฑ ์ฒด๊ฒฐ | ka50012, ka50010 |

**๊ด€์‹ฌ์ข…๋ชฉ** (์˜์›…๋ฌธ HTS์— ์ €์žฅํ•œ ๊ด€์‹ฌ ๊ทธ๋ฃน, ์ฝ๊ธฐ ์ „์šฉ):

| Tool | ์„ค๋ช… | ํ‚ค์›€ TR |
|---|---|---|
| `get_watchlist_groups` | HTS ๊ด€์‹ฌ์ข…๋ชฉ ๊ทธ๋ฃน ๋ชฉ๋ก (๊ทธ๋ฃน์ฝ”๋“œ+๊ทธ๋ฃน๋ช…) | ka01300 |
| `get_watchlist` | ๊ทธ๋ฃน ๋‚ด ์ข…๋ชฉ ๋ชฉ๋ก (์ข…๋ชฉ๋ช…ยท์ „์ผ์ข…๊ฐ€ยท์‹œ์žฅยทํˆฌ์ž์œ ์˜ ๋ณด๊ฐ•) | ka01301, ka10099 |

> ํ‚ค์›€ REST API์—๋Š” ๊ด€์‹ฌ์ข…๋ชฉ **ํŽธ์ง‘(์ถ”๊ฐ€/์‚ญ์ œ)** TR์ด ์—†์–ด ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

**ํ…Œ๋งˆ**:

| Tool | ์„ค๋ช… | ํ‚ค์›€ TR |
|---|---|---|
| `get_theme_groups` | ํ…Œ๋งˆ ๊ทธ๋ฃน ๋ชฉ๋ก (๋“ฑ๋ฝ๋ฅ ยท์ข…๋ชฉ์ˆ˜ยท๊ธฐ๊ฐ„์ˆ˜์ต๋ฅ ยท์ฃผ์š”์ข…๋ชฉ; ์ข…๋ชฉ๋ณ„ ํŽธ์ž… ํ…Œ๋งˆ ๊ฒ€์ƒ‰) | ka90001 |
| `get_theme_stocks` | ํŠน์ • ํ…Œ๋งˆ์˜ ๊ตฌ์„ฑ์ข…๋ชฉ๊ณผ ์‹œ์„ธ (ํ˜„์žฌ๊ฐ€ยท๋“ฑ๋ฝ๋ฅ ยท๊ฑฐ๋ž˜๋Ÿ‰ยท๊ธฐ๊ฐ„์ˆ˜์ต๋ฅ ) | ka90002 |

**๊ณ„์ขŒ** (์•ฑํ‚ค์— ๊ท€์†๋œ ๊ณ„์ขŒ ๊ธฐ์ค€):

| Tool | ์„ค๋ช… | ํ‚ค์›€ TR |
|---|---|---|
| `get_account_balance` | ์˜ˆ์ˆ˜๊ธˆ + ์ดํ‰๊ฐ€๊ธˆ์•ก/์ดํ‰๊ฐ€์†์ต/์ถ”์ •์˜ˆํƒ์ž์‚ฐ + ๋‹น์ผ/๋‹น์›”/๋ˆ„์  ์†์ต, `view=settlement`์€ ์ต์ผ ๊ฒฐ์ œ ์˜ˆ์ • ๊ฑด๋ณ„ ๋ช…์„ธ | kt00001, kt00018, kt00004, kt00008 |
| `get_account_holdings` | ๋ณด์œ  ์ข…๋ชฉ๋ณ„ ์ˆ˜๋Ÿ‰/ํ‰๊ท ๋‹จ๊ฐ€/ํ˜„์žฌ๊ฐ€/ํ‰๊ฐ€์†์ต | kt00018 |
| `get_account_today` | ๊ณ„์ขŒ ๋‹น์ผ ํ˜„ํ™ฉ โ€” ๋งค๋งค๋Œ€๊ธˆยท์ˆ˜์ˆ˜๋ฃŒยท์„ธ๊ธˆยท์ž…์ถœ๊ธˆ + D+2 ์ถ”์ • (์‹ค์ „ ์ „์šฉ) | kt00017 |
| `get_account_trend` | ์ผ๋ณ„ ์ถ”์ •์˜ˆํƒ์ž์‚ฐ ์ถ”์ด + ๊ธฐ๊ฐ„ ์ˆ˜์ต๋ฅ /ํ‰๊ฐ€์†์ต/์ž…์ถœ๊ธˆ ์š”์•ฝ (๊ธฐ๋ณธ 30์ผ, ๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›) | kt00002, kt00016 |
| `get_transactions` | ๊ธฐ๊ฐ„๋ณ„ ๊ฑฐ๋ž˜๋‚ด์—ญ (์ฒด๊ฒฐ์ผยท๋‹จ๊ฐ€ยท์ •์‚ฐ๊ธˆ์•ก, ๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›) | kt00015 |
| `get_pending_orders` | ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ (์ฃผ๋ฌธ๋ฒˆํ˜ธยท๊ตฌ๋ถ„ยท์ƒํƒœยท์ฃผ๋ฌธ/๋ฏธ์ฒด๊ฒฐ์ˆ˜๋Ÿ‰ยท์ฃผ๋ฌธ๊ฐ€๊ฒฉ) | ka10075 |
| `get_order_executions` | ์ฒด๊ฒฐ ๋‚ด์—ญ (์ฃผ๋ฌธ๋ฒˆํ˜ธยท๊ตฌ๋ถ„ยท์ƒํƒœยท์ฃผ๋ฌธ/์ฒด๊ฒฐ ์ˆ˜๋Ÿ‰ยท๊ฐ€๊ฒฉยท์ˆ˜์ˆ˜๋ฃŒ+์„ธ๊ธˆ, side/์ข…๋ชฉ/์ฃผ๋ฌธ๋ฒˆํ˜ธ ํ•„ํ„ฐ) | ka10076 |
| `get_trading_journal` | ๋‹น์ผ๋งค๋งค์ผ์ง€ (์ข…๋ชฉ๋ณ„ ๋งค์ˆ˜/๋งค๋„ ํ‰๊ท ๊ฐ€ยท์ˆ˜๋Ÿ‰ยท์‹คํ˜„์†์ต, ์ด์†์ต) | ka10170 |
| `calc_isa_tax_status` | ISA ์†์ตํ†ต์‚ฐ ์ˆœ์ด์ต์˜ ๋น„๊ณผ์„ธ ํ•œ๋„ ๋Œ€๋น„ ํ˜„ํ™ฉ (ํ™•์ • + ์ „๋Ÿ‰๋งค๋„ ์‹œ๋‚˜๋ฆฌ์˜ค, kt00015 ์˜์กด์ด๋ผ ๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›) | kt00015, ka10074, kt00018 |

๊ทธ ์™ธ `ping`(์—ฐ๊ฒฐ ํ™•์ธ, ์•ฑํ‚ค ๋ถˆํ•„์š”). ๋ชจ๋“  ์‘๋‹ต์€ `[๋ชจ์˜ํˆฌ์ž]`/`[์‹ค์ „ํˆฌ์ž]` ์ ‘๋‘์–ด๋กœ
์–ด๋А ์„œ๋ฒ„๊ฐ€ ๋‹ตํ–ˆ๋Š”์ง€ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. `search_stock` ์ฒซ ํ˜ธ์ถœ์€ ์ข…๋ชฉ ๋งˆ์Šคํ„ฐ(~4,300์ข…๋ชฉ)๋ฅผ
๋‚ด๋ ค๋ฐ›์•„ ๋ช‡ ์ดˆ ๊ฑธ๋ฆฌ๋ฉฐ ์ดํ›„ 12์‹œ๊ฐ„ ์บ์‹œ๋ฉ๋‹ˆ๋‹ค.

### ๊ฑฐ๋ž˜์†Œ ๊ธฐ์ค€ โ€” KRX + ๋„ฅ์ŠคํŠธ๋ ˆ์ด๋“œ(NXT) ํ†ตํ•ฉ

v0.31.0๋ถ€ํ„ฐ ์‹œ์„ธยท๋žญํ‚น tool์€ **ํ†ตํ•ฉ(SOR) ๊ธฐ์ค€**์œผ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. KRX์™€ ๋„ฅ์ŠคํŠธ๋ ˆ์ด๋“œ(NXT)
์ฒด๊ฒฐ์„ ํ•ฉ์‚ฐํ•œ ๊ฐ’์ด๋ฉฐ, NXT ๊ฑฐ๋ž˜๊ฐ€๋Šฅ ์ข…๋ชฉ(์•ฝ 606๊ฐœ, ๋Œ€ํ˜•์ฃผ ๋‹ค์ˆ˜)์€ KRX๋งŒ ๋ณผ ๋•Œ๋ณด๋‹ค ๊ฑฐ๋ž˜๋Ÿ‰์ด
ํฌ๊ฒŒ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค โ€” ์‚ผ์„ฑ์ „์ž ์‹ค์ธก(2026-08-03 ์ •๊ทœ์žฅ) KRX 19.2M / NXT 15.5M / **ํ†ตํ•ฉ 34.7M**.
KRX๋งŒ ํ‘œ์‹œํ•˜๋Š” HTSยทํฌํ„ธ ํ™”๋ฉด๊ณผ ์ˆซ์ž๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋Œ€๊ฐœ ์ด ์ฐจ์ด์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋Š” **`get_after_hours`(์‹œ๊ฐ„์™ธ ๋‹จ์ผ๊ฐ€)** ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค โ€” ํ†ตํ•ฉ ์กฐํšŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ NXT ๊ฑฐ๋ž˜๊ฐ€๋Šฅ
์ข…๋ชฉ์€ ์• ์ดˆ์— ์ด TR์—์„œ ์กฐํšŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. **๊ฑฐ๋ž˜์›(`get_broker_activity`)์€ v0.47.0์—์„œ ํ†ตํ•ฉ์œผ๋กœ
๋„˜์–ด์™”์Šต๋‹ˆ๋‹ค** โ€” ๊ทธ์ „๊นŒ์ง€ KRX ๊ฐ’์„ ๋‚ด๋ณด๋‚ด ์ƒ์œ„ 5์˜ ์ˆœ์œ„๊ฐ€ ์‹ค์ œ์™€ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค(์‚ผ์„ฑ์ „์ž ๋งค์ˆ˜ 1์œ„๊ฐ€
KRX ๊ธฐ์ค€ KB์ฆ๊ถŒ / ํ†ตํ•ฉ ๊ธฐ์ค€ ๋ฏธ๋ž˜์—์…‹). ํ˜ธ๊ฐ€๋Š” v0.37.0์—์„œ ํ†ตํ•ฉ์œผ๋กœ ๋„˜์–ด์™”์Šต๋‹ˆ๋‹ค โ€”
ka10004 ๋Œ€์‹  ka10007(์‹œ์„ธํ‘œ์„ฑ์ •๋ณด)์„ ์“ฐ๋ฉฐ, ์‚ผ์„ฑ์ „์ž ์‹ค์ธก(2026-08-04 ์ •๊ทœ์žฅ) ๋งค์ˆ˜1 ์ž”๋Ÿ‰์ด
KRX 18,421 / NXT 17,081 / **ํ†ตํ•ฉ 36,319**์ด์—ˆ์Šต๋‹ˆ๋‹ค.

### `calc_isa_tax_status` ์‚ฌ์šฉ ๋ฉ”๋ชจ

- ์ง‘๊ณ„ ์‹œ์ž‘์ผ: `.env`์˜ `ISA_OPENED_ON`(๊ณ„์ขŒ ๊ฐœ์„ค์ผ)์ด ๊ธฐ๋ณธ๊ฐ’, ํ˜ธ์ถœ ์‹œ `from_date`๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ.
- ๋ฐฐ๋‹นยท๋ถ„๋ฐฐ๊ธˆ์ด ๊ฑฐ๋ž˜๋‚ด์—ญ์—์„œ ์ž๋™ ๊ฐ์ง€๋˜์ง€ ์•Š์œผ๋ฉด `dividends_received` ์ธ์ž๋กœ ์ˆ˜๋™ ์ž…๋ ฅ.
- ์ข…๋ชฉ ๊ณผ์„ธ์œ ํ˜•(๊ณผ์„ธ๋Œ€์ƒ vs ๊ตญ๋‚ด์ฃผ์‹ํ˜•)์€ ์ž๋™ ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค โ€” **ETF๋Š” ํ‚ค์›€์ด ์ฃผ๋Š”
  `etftxon_type`(ka40002)์œผ๋กœ ํ™•์ •**ํ•˜๊ณ (์กฐํšŒ ์‹คํŒจ ์‹œ ์ข…๋ชฉ๋ช… ํœด๋ฆฌ์Šคํ‹ฑ์œผ๋กœ ํด๋ฐฑ), ๊ฐœ๋ณ„์ฃผ์‹ ๋“ฑ
  ๊ทธ ๋ฐ–์—๋Š” ์ข…๋ชฉ๋ช… ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๊ฒฝ์šฐ `overrides: [{stock_code, tax_type}]`๋กœ
  ์ˆ˜์ •. ๊ฒฐ๊ณผ๋Š” ์ฐธ๊ณ ์šฉ โ€” ์‹ค์ œ ๊ณผ์„ธ๋Š” ์ฆ๊ถŒ์‚ฌ ์ •์‚ฐ ๊ธฐ์ค€.

## ์š”๊ตฌ ์‚ฌํ•ญ

- **Node.js 22 ์ด์ƒ** โ€” Node 20์ด 2026-04-30์— EOL์ด ๋˜๋ฉด์„œ ๋ฐ”๋‹ฅ์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค
  (`process.loadEnvFile`์€ 20.12๋ถ€ํ„ฐ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ตœ์†Œ์น˜๋Š” ๊ทธ๋ณด๋‹ค ๋‚ฎ์Šต๋‹ˆ๋‹ค)
- ํ‚ค์›€์ฆ๊ถŒ REST API ์•ฑํ‚ค โ€” [ํ‚ค์›€ Open API ํฌํ„ธ](https://openapi.kiwoom.com)์—์„œ
  ์•ฑ ๋“ฑ๋ก ํ›„ ๋ฐœ๊ธ‰
  - ๋ชจ์˜ํˆฌ์ž(VIRTUAL)์™€ ์‹ค์ „ํˆฌ์ž(REAL)๋Š” **๊ฐ๊ฐ ๋ณ„๋„๋กœ ๋ฐœ๊ธ‰๋ฐ›์€ ์•ฑํ‚ค**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ,
    ๋ฐœ๊ธ‰๋ฐ›์€ ํ‚ค ์ข…๋ฅ˜์™€ `KIWOOM_MODE`๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  - ๊ณ„์ขŒ๋Š” ์•ฑํ‚ค์— ๊ท€์†๋˜๋ฏ€๋กœ ๊ณ„์ขŒ๋ฒˆํ˜ธ ์ž…๋ ฅ์€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

## ์„ค์น˜

npm์— ๋ฐฐํฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ **ํด๋ก  ์—†์ด `npx`๋กœ ๋ฐ”๋กœ ์‹คํ–‰**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ์•„๋ž˜
"Claude Desktop ์—ฐ๊ฒฐ" / "Claude Code ์—ฐ๊ฒฐ"์˜ npx ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ
์•ฑํ‚ค๋Š” `.env` ํŒŒ์ผ ๋Œ€์‹  **ํด๋ผ์ด์–ธํŠธ ์„ค์ •์˜ `env` ๋ธ”๋ก**์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค(์˜ˆ์ œ๋Š” ๊ฐ
์—ฐ๊ฒฐ ์„น์…˜ ์ฐธ๊ณ ).

์†Œ์Šค์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด:

```sh
git clone <์ด ์ €์žฅ์†Œ URL>   # ๋˜๋Š” ์†Œ์Šค ๋ณต์‚ฌ
cd kiwoom-mcp-server
npm install
cp .env.example .env        # ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•ด ๊ฐ’ ์ž…๋ ฅ
npm run build               # dist/ ์ƒ์„ฑ
npm test                    # ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (๋„คํŠธ์›Œํฌ ๋ถˆํ•„์š”)
```

## ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (`.env`)

| ๋ณ€์ˆ˜ | ํ•„์ˆ˜ | ์„ค๋ช… |
|---|---|---|
| `KIWOOM_APP_KEY` | โœ… | ํ‚ค์›€ REST API ์•ฑํ‚ค |
| `KIWOOM_APP_SECRET` | โœ… | ํ‚ค์›€ REST API ์•ฑ ์‹œํฌ๋ฆฟ |
| `KIWOOM_MODE` | | `VIRTUAL`(๋ชจ์˜ํˆฌ์ž, ๊ธฐ๋ณธ๊ฐ’) ๋˜๋Š” `REAL`(์‹ค์ „ํˆฌ์ž) |
| `ISA_ENABLED` | | `true`๋ฉด `calc_isa_tax_status` tool ํ™œ์„ฑํ™”. ๊ธฐ๋ณธ๊ฐ’ `false`(์ผ๋ฐ˜ ๊ณ„์ขŒ ๊ธฐ์ค€) |
| `ISA_TYPE` | | `GENERAL`(์ผ๋ฐ˜ํ˜•, ํ•œ๋„ 200๋งŒ์›, ๊ธฐ๋ณธ๊ฐ’) ๋˜๋Š” `SEOMIN`(์„œ๋ฏผํ˜•/๋†์–ด๋ฏผํ˜•, 400๋งŒ์›). `ISA_ENABLED=true`์ผ ๋•Œ๋งŒ ์‚ฌ์šฉ |
| `ISA_OPENED_ON` | | ISA ๊ณ„์ขŒ ๊ฐœ์„ค์ผ `yyyy-MM-dd` โ€” `calc_isa_tax_status` ์ง‘๊ณ„ ์‹œ์ž‘์ผ ๊ธฐ๋ณธ๊ฐ’. `ISA_ENABLED=true`์ผ ๋•Œ๋งŒ ์‚ฌ์šฉ |
| `MCP_TRANSPORT` | | `stdio`(๊ธฐ๋ณธ๊ฐ’) ๋˜๋Š” `http` โ€” [์›๊ฒฉ ์—ฐ๊ฒฐ](#์›๊ฒฉ-์—ฐ๊ฒฐ-http-๋ชจ๋“œ--claudeai-์›น๋ชจ๋ฐ”์ผ) ์ฐธ์กฐ |
| `MCP_AUTH_TOKEN` | HTTP ๋ชจ๋“œ โœ… | HTTP ๋ชจ๋“œ์—์„œ ๋ชจ๋“  `/mcp` ์š”์ฒญ์ด ์ œ์‹œํ•ด์•ผ ํ•˜๋Š” Bearer ํ† ํฐ |
| `MCP_HTTP_PORT` | | HTTP ๋ชจ๋“œ ํฌํŠธ (๊ธฐ๋ณธ๊ฐ’ `8000`) |
| `MCP_HTTP_HOST` | | HTTP ๋ชจ๋“œ ๋ฐ”์ธ๋“œ ์ฃผ์†Œ (๊ธฐ๋ณธ๊ฐ’ `127.0.0.1`) |
| `MCP_HTTP_NO_AUTH` | | `true`๋ฉด ์ธ์ฆ ์—†์ด HTTP ๋ชจ๋“œ ๊ธฐ๋™ ํ—ˆ์šฉ (๋น„๊ถŒ์žฅ โ€” ์•„๋ž˜ ๋ณด์•ˆ ์ฃผ์˜ ์ฐธ์กฐ) |
| `MCP_PUBLIC_URL` | | HTTP ๋ชจ๋“œ์—์„œ ์™ธ๋ถ€์— ๊ด‘๊ณ ํ•  ๊ธฐ์ค€ URL (์˜ˆ: `https://kiwoom.example.com`). ๋ฏธ์„ค์ • ์‹œ ์š”์ฒญ์˜ `Host` + `X-Forwarded-Proto`๋กœ ์ถ”๋ก  โ€” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ๊ทธ ํ—ค๋”๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค |

๊ธฐ๋ณธ๊ฐ’์€ **์ผ๋ฐ˜(๋น„-ISA) ๊ณ„์ขŒ ๊ธฐ์ค€**์ž…๋‹ˆ๋‹ค โ€” ๋ณ„๋„ ์„ค์ •์ด ์—†์œผ๋ฉด ์‹œ์žฅยท๊ณ„์ขŒ ์กฐํšŒ tool๋งŒ
๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ISA ๊ณ„์ขŒ๋ฅผ ์—ฐ๊ฒฐํ•ด ๋น„๊ณผ์„ธ ํ•œ๋„ tool์„ ์“ฐ๋ ค๋ฉด `ISA_ENABLED=true`๋กœ ์ผœ๊ณ 
`ISA_TYPE`/`ISA_OPENED_ON`์„ ์ฑ„์šฐ์„ธ์š”. ๋„๋ฉด `calc_isa_tax_status`๊ฐ€ ๋“ฑ๋ก๋˜์ง€ ์•Š๊ณ 
๋‚˜๋จธ์ง€ tool์€ ๋ชจ๋‘ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

`.env`๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ๋จผ์ € ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— (Claude Desktop์ฒ˜๋Ÿผ) ์ž„์˜์˜ ์ž‘์—…
๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹คํ–‰๋ผ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

## Claude Desktop ์—ฐ๊ฒฐ

์„ค์ • ํŒŒ์ผ ์œ„์น˜:

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

**npx (๋ฐฐํฌํŒ) โ€” ํด๋ก  ์—†์ด ์‹คํ–‰. ์•ฑํ‚ค๋Š” `env` ๋ธ”๋ก์œผ๋กœ ์ „๋‹ฌ:**

```json
{
  "mcpServers": {
    "kiwoom": {
      "command": "npx",
      "args": ["-y", "kiwoom-mcp-server"],
      "env": {
        "KIWOOM_APP_KEY": "โ€ฆ",
        "KIWOOM_APP_SECRET": "โ€ฆ",
        "KIWOOM_MODE": "REAL"
      }
    }
  }
}
```

**์†Œ์Šค ๋นŒ๋“œ โ€” `dist/index.js` ์ง์ ‘ ์‹คํ–‰. ์•ฑํ‚ค๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ `.env` ์‚ฌ์šฉ:**

```json
{
  "mcpServers": {
    "kiwoom": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/์ ˆ๋Œ€/๊ฒฝ๋กœ/kiwoom-mcp-server/dist/index.js"]
    }
  }
}
```

> **`command`์—๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ**๋ฅผ ์“ฐ๋Š” ํŽธ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค (`which node`,
> `which npx`๋กœ ํ™•์ธ). GUI ์•ฑ์€ ์…ธ PATH๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ `"node"`/`"npx"`๋ผ๊ณ ๋งŒ
> ์“ฐ๋ฉด ์„œ๋ฒ„๊ฐ€ ์กฐ์šฉํžˆ ๋œจ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๊ฐ€์žฅ ํ”ํ•œ ์‹คํŒจ ์›์ธ์ž…๋‹ˆ๋‹ค.

์ €์žฅ ํ›„ Claude Desktop์„ ์™„์ „ํžˆ ์ข…๋ฃŒ(macOS๋Š” โŒ˜Q)ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด tool์ด
๋ณด์ž…๋‹ˆ๋‹ค. `npm run build`๋กœ **๋‹ค์‹œ ๋นŒ๋“œํ•œ ๋’ค์—๋„ ์™„์ „ ์ข…๋ฃŒ ํ›„ ์žฌ์‹คํ–‰**ํ•ด์•ผ
๋ณ€๊ฒฝ์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

## Claude Code ์—ฐ๊ฒฐ

npx (๋ฐฐํฌํŒ) โ€” ์•ฑํ‚ค๋Š” `-e` ํ”Œ๋ž˜๊ทธ๋กœ ์ „๋‹ฌ:

```sh
claude mcp add kiwoom \
  -e KIWOOM_APP_KEY=โ€ฆ -e KIWOOM_APP_SECRET=โ€ฆ -e KIWOOM_MODE=REAL \
  -- npx -y kiwoom-mcp-server
```

์†Œ์Šค ๋นŒ๋“œ โ€” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ `.env` ์‚ฌ์šฉ:

```sh
claude mcp add kiwoom -- node /์ ˆ๋Œ€/๊ฒฝ๋กœ/kiwoom-mcp-server/dist/index.js
```

## ์›๊ฒฉ ์—ฐ๊ฒฐ (HTTP ๋ชจ๋“œ) โ€” claude.ai ์›น/๋ชจ๋ฐ”์ผ

claude.ai(์›น/๋ชจ๋ฐ”์ผ)์˜ **์ปค์Šคํ…€ ์ปค๋„ฅํ„ฐ**๋Š” ๋กœ์ปฌ stdio ์„œ๋ฒ„์— ์ง์ ‘ ๋ถ™์„ ์ˆ˜ ์—†๊ณ , ๊ณต๊ฐœ
HTTPS๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ **Streamable HTTP** MCP ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. `--http` ํ”Œ๋ž˜๊ทธ(๋˜๋Š”
`MCP_TRANSPORT=http`)๋กœ ์ด ์„œ๋ฒ„๋ฅผ HTTP ๋ชจ๋“œ๋กœ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

```sh
MCP_AUTH_TOKEN="$(openssl rand -hex 32)" npx -y kiwoom-mcp-server --http --port 8000
# ์—”๋“œํฌ์ธํŠธ: http://127.0.0.1:8000/mcp ยท ํ—ฌ์Šค์ฒดํฌ: /healthz
```

- **์ธ์ฆ์ด ๊ธฐ๋ณธ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.** `MCP_AUTH_TOKEN`์ด ์—†์œผ๋ฉด ๊ธฐ๋™์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค โ€” ๋ชจ๋“  `/mcp`
  ์š”์ฒญ์— `Authorization: Bearer <ํ† ํฐ>` ํ—ค๋”๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์—†์ด ์—ด๋ ค๋ฉด
  `--no-auth`๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•˜๋ฉฐ, ๊ณ„์ขŒ ์กฐํšŒ ๋„๊ตฌ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜๋ฏ€๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”
  ๋„คํŠธ์›Œํฌ๋‚˜ ๋ชจ์˜ํˆฌ์ž(`KIWOOM_MODE=VIRTUAL`)์—์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
- ๊ธฐ๋ณธ ๋ฐ”์ธ๋“œ๋Š” `127.0.0.1`์ž…๋‹ˆ๋‹ค โ€” ํ„ฐ๋„์„ ์•ž์— ๋‘๋Š” ๊ตฌ์„ฑ์„ ์ „์ œํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ/์„œ๋ฒ„์—
  ์ง์ ‘ ๋…ธ์ถœํ•˜๋ ค๋ฉด `--host 0.0.0.0`์„ ๋ช…์‹œํ•˜์„ธ์š”.
- ๊ณต๊ฐœ HTTPS URL์€ [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) ๋“ฑ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค:
  `cloudflared tunnel --url http://localhost:8000` (์ž„์‹œ URL โ€” ์ƒ์‹œ ์šด์˜์€ named tunnel ๊ถŒ์žฅ).
- **OAuth ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์‹ค๋ฆฌ๋Š” ์ฃผ์†Œ๋Š” ์š”์ฒญ์˜ `Host`์™€ `X-Forwarded-Proto`์—์„œ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.**
  Cloudflare Tunnel์ฒ˜๋Ÿผ ๊ทธ ํ—ค๋”๋ฅผ ๋ถ™์—ฌ ์ฃผ๋Š” ํ”„๋ก์‹œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ๋˜์ง€๋งŒ, ์ง์ ‘ ์„ธ์šด
  nginx/Caddy๊ฐ€ `X-Forwarded-Proto`๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด issuer๊ฐ€ `http://`๋กœ ๊ด‘๊ณ ๋˜์–ด
  claude.ai๊ฐ€ ์—ฐ๊ฒฐ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ `MCP_PUBLIC_URL=https://<๋„๋ฉ”์ธ>`์œผ๋กœ ๊ณ ์ •ํ•˜์„ธ์š”.
- claude.ai ๋“ฑ๋ก: **Settings โ†’ Connectors โ†’ Add custom connector**์—
  `https://<๋„๋ฉ”์ธ>/mcp`๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค (๊ณ ๊ธ‰ ์„ค์ •์˜ OAuth ํ•„๋“œ๋Š” ๋น„์›Œ๋‘ก๋‹ˆ๋‹ค). ์—ฐ๊ฒฐ ์‹œ
  ๋ธŒ๋ผ์šฐ์ €์— **์Šน์ธ ํŽ˜์ด์ง€**๊ฐ€ ๋œจ๊ณ , `MCP_AUTH_TOKEN` ๊ฐ’์„ ์ ‘์† ์•”ํ˜ธ๋กœ ์ž…๋ ฅํ•˜๋ฉด
  ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค โ€” ์„œ๋ฒ„๊ฐ€ MCP ์ธ์ฆ ์ŠคํŽ™(OAuth 2.0 + PKCE, ๋™์  ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก)์„ ๋‚ด์žฅํ•˜๊ณ 
  ์žˆ์–ด ๋ณ„๋„ ํ—ค๋” ์„ค์ •์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋“ฑ๋กํ•œ ์ปค๋„ฅํ„ฐ๋Š” ์›น/๋ชจ๋ฐ”์ผ/๋ฐ์Šคํฌํ†ฑ์—์„œ ๊ณต์šฉ์ž…๋‹ˆ๋‹ค.
  ํ—ค๋”๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ(์˜ˆ: Claude Code `--header`)๋Š” ๊ธฐ์กด์ฒ˜๋Ÿผ
  `Authorization: Bearer <MCP_AUTH_TOKEN>` ์ •์  ํ—ค๋”๋กœ๋„ ์ ‘์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  OAuth ํ† ํฐ์€ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ `.oauth-state.json`(0600)์— ์ €์žฅ๋˜์–ด ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•ด๋„
  ์—ฐ๊ฒฐ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
- โš ๏ธ **ํ‚ค์›€ API ํ˜ธ์ถœ์€ ์ด ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณณ์—์„œ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.** REAL ๋ชจ๋“œ๋Š” ํ‚ค์›€ ์ง€์ •๋‹จ๋ง๊ธฐ
  ์ธ์ฆ(8050)์ด IP์— ๋ฌถ์ด๋ฏ€๋กœ, ๋“ฑ๋ก๋œ IP๊ฐ€ ์•„๋‹Œ ๊ณณ(ํด๋ผ์šฐ๋“œ ๋“ฑ)์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ธ์ฆ ์˜ค๋ฅ˜๊ฐ€
  ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ๋…ธ์ถœ์€ ๋ชจ์˜ํˆฌ์ž๋กœ ๋จผ์ € ๊ฒ€์ฆํ•˜์„ธ์š”.

๊ธฐ์กด stdio ๋™์ž‘(Claude Desktop/Code ์—ฐ๊ฒฐ)์€ ์ธ์ž ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค โ€” ๋‹จ, `.env`๋‚˜
ํ™˜๊ฒฝ๋ณ€์ˆ˜์— `MCP_TRANSPORT=http`๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. `.env`๋Š” ์ „์†ก ๋ฐฉ์‹์„ ๊ณ ๋ฅด๊ธฐ ์ „์— ์ฝํžˆ๋ฏ€๋กœ
์ธ์ž ์—†์ด ์‹คํ–‰ํ•ด๋„ HTTP ๊ฒฝ๋กœ๋ฅผ ํƒ€๊ณ , `MCP_AUTH_TOKEN`์ด ์—†์œผ๋ฉด ์•„์˜ˆ ๊ธฐ๋™์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
`MCP_TRANSPORT` ๊ฐ’๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ stdio๋กœ ๊ฐ•์ œํ•˜๋ ค๋ฉด **`--stdio`**๋ฅผ ๋„˜๊ธฐ์„ธ์š”.

## ๋™์ž‘ ํ™•์ธ

MCP ํด๋ผ์ด์–ธํŠธ ์—†์ด stdio๋กœ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

```sh
printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"ping","arguments":{}}}' \
  | node dist/index.js
```

`ping`์€ `.env` ์—†์ด๋„ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์‹œ์„ธยท๊ณ„์ขŒ tool์€ ์•ฑํ‚ค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

## ๋ฌธ์ œ ํ•ด๊ฒฐ

| ์ฆ์ƒ | ํ™•์ธํ•  ๊ฒƒ |
|---|---|
| Desktop์— tool์ด ์•ˆ ๋ณด์ž„ | `command`๊ฐ€ node **์ ˆ๋Œ€ ๊ฒฝ๋กœ**์ธ์ง€, `npm run build`๋ฅผ ํ–ˆ๋Š”์ง€, Desktop์„ ์™„์ „ ์ข…๋ฃŒ ํ›„ ์žฌ์‹คํ–‰ํ–ˆ๋Š”์ง€ |
| `ํ™˜๊ฒฝ์„ค์ •์ด ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค` | `.env`๊ฐ€ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์žˆ๋Š”์ง€, ํ•„์ˆ˜ ๋ณ€์ˆ˜๊ฐ€ ์ฑ„์›Œ์กŒ๋Š”์ง€ |
| `ํ‚ค์›€ ์ธ์ฆ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค` | ์•ฑํ‚ค ์ข…๋ฅ˜(๋ชจ์˜/์‹ค์ „)์™€ `KIWOOM_MODE`๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€, ํฌํ„ธ์—์„œ ์•ฑ์ด ํ™œ์„ฑ ์ƒํƒœ์ธ์ง€ |
| `์š”์ฒญ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค` | ํ‚ค์›€ ๋ ˆ์ดํŠธ๋ฆฌ๋ฐ‹(TR๋‹น ์•ฝ 1์ดˆ 1ํšŒ). ์„œ๋ฒ„๊ฐ€ ์ž๋™ ์žฌ์‹œ๋„ํ•œ ๋’ค์—๋„ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ์ด๋‹ˆ ์ž ์‹œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ |
| ์˜ˆ์ˆ˜๊ธˆ๊ณผ D+2 ์ถ”์ •์˜ˆ์ˆ˜๊ธˆ์ด ๋‹ค๋ฆ„ | ๋ฏธ๊ฒฐ์ œ(D+2 ์ •์‚ฐ) ๋งค๋งค๊ฐ€ ์žˆ์œผ๋ฉด ์ •์ƒ์ž…๋‹ˆ๋‹ค |

## ๊ฐœ๋ฐœ

```sh
npm run dev         # tsx๋กœ ์†Œ์Šค ์ง์ ‘ ์‹คํ–‰
npm run check       # ๋ฒ„์ „ 5๊ณณ ๋™๊ธฐํ™” ยท ์นด์šดํŠธ ยท README 2์ข… tool ๋ฌธ์„œํ™” ยท server.ts ๋“ฑ๋ก ๋ˆ„๋ฝ
npm run check:write # ์œ„ ์นด์šดํŠธ๋ฅผ ์‹ค์ œ ๊ฐ’์œผ๋กœ ๊ณ ์ณ ์”€ (๋ฒ„์ „์€ ์•ˆ ๊ฑด๋“œ๋ฆผ)
npm run typecheck   # tsc --noEmit -p tsconfig.test.json (src + tests)
npm test            # vitest
npm run build       # tsc โ†’ dist/
```

๋„ค ๊ฐ€์ง€ ๋ชจ๋‘ CI(`.github/workflows/ci.yml`, Node 22ยท24)์—์„œ ๋Œ๊ณ , ๊ฑฐ๊ธฐ์—
`npm audit --omit=dev --audit-level=high`๊ฐ€ ํ•œ ๋‹จ๊ณ„ ๋” ๋ถ™์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์ฒดํฌ๊ฐ€
`tsconfig.test.json`์„ ์“ฐ๋Š” ์ด์œ ๋Š” ๋นŒ๋“œ์šฉ `tsconfig.json`์˜ `rootDir`๊ฐ€ `src`๋ผ
ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ๊ธฐ ๋„ฃ์œผ๋ฉด `dist/` ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค โ€” ๋นŒ๋“œ๋Š” ๊ทธ๋Œ€๋กœ
`tsconfig.json`์„ ์”๋‹ˆ๋‹ค.

๊ตฌ์กฐ: `src/kiwoom/`(์ธ์ฆยทHTTPยทTR ๊ณ„์ธต) โ†’ `src/tools/`(MCP tool, ํฌ๋งทํ„ฐ ๋ถ„๋ฆฌ) โ†’
`src/isa/`(๊ณผ์„ธ์œ ํ˜• ๋ถ„๋ฅ˜ยท์‹คํ˜„์†์ต ์žฌ๊ตฌ์„ฑยท์†์ตํ†ต์‚ฐ). ์ƒ์„ธ ๊ทœ์น™๊ณผ ๊ฒ€์ฆ๋œ API
๊ณ„์•ฝ์€ `CLAUDE.md` ์ฐธ๊ณ .

## ๋ผ์ด์„ ์Šค

[MIT](LICENSE)

TDQS

A3.9/5.0

Scored across 49 tools

Disambiguation4/5

Tools are generally well-separated by resource (account, stock, order, market, sector, theme, ETF, gold) and specific action (holdings, trend, today, balance, transactions, pending orders, executions, etc.). Some potential confusion exists among the many market data tools (e.g., get_daily_trading vs get_investor_trend vs get_execution_strength) but descriptions explicitly cross-reference each other to clarify boundaries.

Naming Consistency3/5

Naming follows a mixed but mostly readable convention: 'get_' plus noun_qualifier (e.g., get_account_holdings, get_stock_quotes, get_orderbook_rank). Some inconsistency: get_ping vs ping, and get_account_today vs get_account_balance (vs get_account_trend) โ€” the pattern is not uniform. Also 'get_trading_journal' vs 'get_transactions' are semantically distinguishable but naming doesn't strongly hint at the difference.

Tool Count2/5

49 tools is far above the typical well-scoped range of 3-15, and even above the generous 16-25 heavy range. However, the server covers a broad domain (Korean stock market, accounts, orders, market data, ETF, gold) and each tool maps to specific Kywoom API TR codes, so the count is justified by the domain's complexity, but it still feels overwhelming for an agent to select from.

Completeness4/5

The tool surface is extensive: account queries (mostly read-only, no order placement), market data with many screening tools, and special asset classes (ETF, gold, derivatives). Major gaps: there is no tool to place or cancel orders (despite pending orders being viewable), and no options or futures. Also, some account tools are not available in simulation mode. However, for a read-heavy analysis server, the coverage is strong.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues