kiwoom-mcp-server
# 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
Scored across 49 tools
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 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.
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.
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.