kiwoom-mcp-server
ํ๊ตญ์ด ยท English
ํค์์ฆ๊ถ REST API๋ฅผ ์กฐํ ์ ์ฉ(read-only) ์ผ๋ก ๋
ธ์ถํ๋ MCP ์๋ฒ์
๋๋ค.
Claude Desktop / Claude Code์์ ์์ฐ์ด๋ก ๊ตญ๋ด ์ฃผ์ ์์ธยท์ฐจํธยทํธ๊ฐยท์ง์ยท์์ยท์๊ธ๊ณผ
๋ด ๊ณ์ข์ ์๊ณ ยท๋ณด์ ์ข
๋ชฉยท๊ฑฐ๋๋ด์ญ์ ์กฐํํ ์ ์๊ณ , ISA ๊ณ์ข๋ผ๋ฉด ๋น๊ณผ์ธ ํ๋
๋๋น ์์ตํต์ฐ ํํฉ๊น์ง ๊ณ์ฐํด ์ค๋๋ค.
โ ๏ธ ๋ณด์ ๊ฒฝ๊ณ
- ์ด ์๋ฒ๋ ๋ก์ปฌ์์๋ง ์คํํ๊ณ ์ ๋ ์ธ๋ถ ๋คํธ์ํฌ์ ๋
ธ์ถํ์ง ๋ง์ธ์.
.env์ AppKey/AppSecret์ ์ค๊ณ์ข ์กฐํ ๊ถํ์
๋๋ค. ์ ๋ ์ปค๋ฐํ์ง ๋ง์ธ์
(.gitignore์ ์ด๋ฏธ ๋ฑ๋ก๋์ด ์์ต๋๋ค).
- ์ฃผ๋ฌธ(๋งค์/๋งค๋/์ ์ /์ทจ์) ๊ธฐ๋ฅ์ ์ค๊ณ์ ์ ์ธ๋์ด ์์ต๋๋ค. ์ด ์๋ฒ๊ฐ ๊ณ์ข๋ฅผ
๋ณ๊ฒฝํ๋ ์ผ์ ์์ต๋๋ค.
์์ฅ ๋ฐ์ดํฐ (๊ณ์ข์ ๋ฌด๊ด, ์ฑํค๋ง ์์ผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ):
| Tool | ์ค๋ช
| ํค์ TR |
|---|
search_stock | ์ข
๋ชฉ๋ช
โ์ฝ๋ ๊ฒ์ (์ฝ์คํผ/์ฝ์ค๋ฅ, ETF/ETN ํฌํจ) + ํฌ์์ ์ ํ์ | ka10099 |
get_stock_price | ํ์ฌ๊ฐ/๋ฑ๋ฝ๋ฅ /๊ฑฐ๋๋/๊ธฐ๋ณธ์งํ + ์
์ข
ยท์์ฅ์ผยทํฌ์์ ์ | ka10001, ka10099 |
get_stock_chart | ์ผ/์ฃผ/์/๋
/๋ถ/ํฑ๋ด ์บ๋ค ์ฐจํธ (์์ ์ฃผ๊ฐ ๋ฐ์) | ka10079~83, ka10094 |
get_orderbook | 10๋จ๊ณ ๋งค๋/๋งค์ ํธ๊ฐยท์๋ | ka10004 |
get_market_index | ์ฝ์คํผ/์ฝ์ค๋ฅ ์ข
ํฉยท์
์ข
์ง์ | ka20003 |
get_sector_price | ์
์ข
์ง์ ํ์ฌ๊ฐ ์์ธ (๋ฑ๋ฝ ๊ตฌ์ฑยท52์ฃผ ๊ณ ์ ยท์๊ฐ๋๋ณ ์ถ์ด) | ka20001 |
get_sector_stocks | ์
์ข
๊ตฌ์ฑ ์ข
๋ชฉ ์์ธ (ํ์ฌ๊ฐยท๋ฑ๋ฝ๋ฅ ยท๊ฑฐ๋๋ยท๊ณ ์ ๊ฐ) | ka20002 |
get_ranking | ์์น๋ฅ /ํ๋ฝ๋ฅ /๊ฑฐ๋๋/๊ฑฐ๋๋๊ธ ์์ | ka10027/30/32 |
get_market_movers | ์ ๊ณ ๊ฐ/์ ์ ๊ฐ/์ํ๊ฐ/ํํ๊ฐ/๊ธ๋ฑ/๊ธ๋ฝ ํน์ด ์ข
๋ชฉ | ka10016/17/19 |
get_vi_stocks | ๋น์ผ VI(๋ณ๋์ฑ์ํ์ฅ์น) ๋ฐ๋ ์ข
๋ชฉ (๋ฐ๋๊ฐยท๊ดด๋ฆฌ์จยท์๊ฐ) | ka10054 |
get_investor_trend | ๊ฐ์ธ/์ธ๊ตญ์ธ/๊ธฐ๊ด ์๋งค์ ๋ํฅ (๊ธฐ๊ฐ ํฉ๊ณ + ์ผ๋ณ) | ka10059, ka10061 |
get_broker_activity | ์ข
๋ชฉ๋ณ ๊ฑฐ๋์(์ฆ๊ถ์ฌ) ๋งค์/๋งค๋ ์์ 5 | ka10002 |
get_etf_info | ETF ์ถ์ ์ง์ยท๊ณผ์ธ์ ํยท์์ธยทNAV/๊ดด๋ฆฌ์จ | ka40002, ka10001, ka40009 |
get_etf_returns | ETF ๊ธฐ๊ฐ๋ณ(1์ฃผ/1๊ฐ์/6๊ฐ์/1๋
) ์์ต๋ฅ vs ๋์์ง์ | ka40001 |
get_short_selling | ์ข
๋ชฉ๋ณ ์ผ์๋ณ ๊ณต๋งค๋ ์ถ์ด (๊ณต๋งค๋๋ยท๋น์คยทํ๊ท ๊ฐ) | ka10014 |
get_stock_lending | ๋์ฐจ๊ฑฐ๋ ์ถ์ด (์ฒด๊ฒฐยท์ํยท์ฆ๊ฐยท์๊ณ ) โ ์ข
๋ชฉ๋ณ ๋๋ ์์ฅ ์ ์ฒด | ka10068, ka20068 |
get_foreign_holding | ์ข
๋ชฉ๋ณ ์ธ๊ตญ์ธ ๋ณด์ ์ถ์ด (๋ณด์ ์ฃผ์์ยท๋ณด์ ๋น์คยทํ๋์์ง๋ฅ ) | ka10008 |
get_program_trading | ๋น์ผ ํ๋ก๊ทธ๋จ ๋งค๋งค ์๋งค์/์๋งค๋ ์์ (์ฝ์คํผ/์ฝ์ค๋ฅ) | ka90003 |
๊ด์ฌ์ข
๋ชฉ (์์
๋ฌธ 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 | ์์๊ธ + ์ดํ๊ฐ๊ธ์ก/์ดํ๊ฐ์์ต/์ถ์ ์ํ์์ฐ | kt00001, kt00018 |
get_account_holdings | ๋ณด์ ์ข
๋ชฉ๋ณ ์๋/ํ๊ท ๋จ๊ฐ/ํ์ฌ๊ฐ/ํ๊ฐ์์ต | kt00018 |
get_transactions | ๊ธฐ๊ฐ๋ณ ๊ฑฐ๋๋ด์ญ (์ฒด๊ฒฐ์ผยท๋จ๊ฐยท์ ์ฐ๊ธ์ก) | kt00015 |
get_pending_orders | ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ (์ฃผ๋ฌธ๋ฒํธยท๊ตฌ๋ถยท์ํยท์ฃผ๋ฌธ/๋ฏธ์ฒด๊ฒฐ์๋ยท์ฃผ๋ฌธ๊ฐ๊ฒฉ) | ka10075 |
get_trading_journal | ๋น์ผ๋งค๋งค์ผ์ง (์ข
๋ชฉ๋ณ ๋งค์/๋งค๋ ํ๊ท ๊ฐยท์๋ยท์คํ์์ต, ์ด์์ต) | ka10170 |
calc_isa_tax_status | ISA ์์ตํต์ฐ ์์ด์ต์ ๋น๊ณผ์ธ ํ๋ ๋๋น ํํฉ (ํ์ + ์ ๋๋งค๋ ์๋๋ฆฌ์ค) | kt00015, ka10074, kt00018 |
๊ทธ ์ธ ping(์ฐ๊ฒฐ ํ์ธ, ์ฑํค ๋ถํ์). ๋ชจ๋ ์๋ต์ [๋ชจ์ํฌ์]/[์ค์ ํฌ์] ์ ๋์ด๋ก
์ด๋ ์๋ฒ๊ฐ ๋ตํ๋์ง ํ์ํฉ๋๋ค. search_stock ์ฒซ ํธ์ถ์ ์ข
๋ชฉ ๋ง์คํฐ(~4,300์ข
๋ชฉ)๋ฅผ
๋ด๋ ค๋ฐ์ ๋ช ์ด ๊ฑธ๋ฆฌ๋ฉฐ ์ดํ 12์๊ฐ ์บ์๋ฉ๋๋ค.
calc_isa_tax_status ์ฌ์ฉ ๋ฉ๋ชจ
- ์ง๊ณ ์์์ผ:
.env์ ISA_OPENED_ON(๊ณ์ข ๊ฐ์ค์ผ)์ด ๊ธฐ๋ณธ๊ฐ, ํธ์ถ ์ from_date๋ก ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ.
- ๋ฐฐ๋นยท๋ถ๋ฐฐ๊ธ์ด ๊ฑฐ๋๋ด์ญ์์ ์๋ ๊ฐ์ง๋์ง ์์ผ๋ฉด
dividends_received ์ธ์๋ก ์๋ ์
๋ ฅ.
- ์ข
๋ชฉ ๊ณผ์ธ์ ํ(๊ณผ์ธ๋์ vs ๊ตญ๋ด์ฃผ์ํ)์ ์ข
๋ชฉ๋ช
๊ธฐ๋ฐ ์๋ ๋ถ๋ฅ์ด๋ฉฐ, ํ๋ฆฐ ๊ฒฝ์ฐ
overrides: [{stock_code, tax_type}]๋ก ์์ . ๊ฒฐ๊ณผ๋ ์ฐธ๊ณ ์ฉ โ ์ค์ ๊ณผ์ธ๋ ์ฆ๊ถ์ฌ ์ ์ฐ ๊ธฐ์ค.
์๊ตฌ ์ฌํญ
- Node.js 20.12 ์ด์ (
process.loadEnvFile ์ฌ์ฉ)
- ํค์์ฆ๊ถ REST API ์ฑํค โ ํค์ Open API ํฌํธ์์
์ฑ ๋ฑ๋ก ํ ๋ฐ๊ธ
- ๋ชจ์ํฌ์(VIRTUAL)์ ์ค์ ํฌ์(REAL)๋ ๊ฐ๊ฐ ๋ณ๋๋ก ๋ฐ๊ธ๋ฐ์ ์ฑํค๋ฅผ ์ฌ์ฉํ๋ฉฐ,
๋ฐ๊ธ๋ฐ์ ํค ์ข
๋ฅ์
KIWOOM_MODE๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค.
- ๊ณ์ข๋ ์ฑํค์ ๊ท์๋๋ฏ๋ก ๊ณ์ข๋ฒํธ ์
๋ ฅ์ ํ์ ์์ต๋๋ค.
์ค์น
npm์ ๋ฐฐํฌ๋์ด ์์ผ๋ฏ๋ก ํด๋ก ์์ด npx๋ก ๋ฐ๋ก ์คํํ ์ ์์ต๋๋ค โ ์๋
"Claude Desktop ์ฐ๊ฒฐ" / "Claude Code ์ฐ๊ฒฐ"์ npx ์ค์ ์ ๊ทธ๋๋ก ์ฐ๋ฉด ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ
์ฑํค๋ .env ํ์ผ ๋์ ํด๋ผ์ด์ธํธ ์ค์ ์ env ๋ธ๋ก์ผ๋ก ์ ๋ฌํฉ๋๋ค(์์ ๋ ๊ฐ
์ฐ๊ฒฐ ์น์
์ฐธ๊ณ ).
์์ค์์ ์ง์ ๋น๋ํ๊ฑฐ๋ ์ฝ๋๋ฅผ ์์ ํ๋ ค๋ฉด:
git clone <์ด ์ ์ฅ์ URL>
cd kiwoom-mcp-server
npm install
cp .env.example .env
npm run build
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 โ ์๊ฒฉ ์ฐ๊ฒฐ ์ฐธ์กฐ |
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 ๋ชจ๋ ๊ธฐ๋ ํ์ฉ (๋น๊ถ์ฅ โ ์๋ ๋ณด์ ์ฃผ์ ์ฐธ์กฐ) |
๊ธฐ๋ณธ๊ฐ์ ์ผ๋ฐ(๋น-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 ๋ธ๋ก์ผ๋ก ์ ๋ฌ:
{
"mcpServers": {
"kiwoom": {
"command": "npx",
"args": ["-y", "kiwoom-mcp-server"],
"env": {
"KIWOOM_APP_KEY": "โฆ",
"KIWOOM_APP_SECRET": "โฆ",
"KIWOOM_MODE": "REAL"
}
}
}
}
์์ค ๋น๋ โ dist/index.js ์ง์ ์คํ. ์ฑํค๋ ํ๋ก์ ํธ ๋ฃจํธ .env ์ฌ์ฉ:
{
"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 ํ๋๊ทธ๋ก ์ ๋ฌ:
claude mcp add kiwoom \
-e KIWOOM_APP_KEY=โฆ -e KIWOOM_APP_SECRET=โฆ -e KIWOOM_MODE=REAL \
-- npx -y kiwoom-mcp-server
์์ค ๋น๋ โ ํ๋ก์ ํธ ๋ฃจํธ .env ์ฌ์ฉ:
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 ๋ชจ๋๋ก ๋์ธ ์ ์์ต๋๋ค:
MCP_AUTH_TOKEN="$(openssl rand -hex 32)" npx -y kiwoom-mcp-server --http --port 8000
- ์ธ์ฆ์ด ๊ธฐ๋ณธ ํ์์
๋๋ค.
MCP_AUTH_TOKEN์ด ์์ผ๋ฉด ๊ธฐ๋์ ๊ฑฐ๋ถํฉ๋๋ค โ ๋ชจ๋ /mcp
์์ฒญ์ Authorization: Bearer <ํ ํฐ> ํค๋๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ธ์ฆ ์์ด ์ด๋ ค๋ฉด
--no-auth๋ฅผ ๋ช
์ํด์ผ ํ๋ฉฐ, ๊ณ์ข ์กฐํ ๋๊ตฌ๊ฐ ๊ทธ๋๋ก ๋
ธ์ถ๋๋ฏ๋ก ์ ๋ขฐํ ์ ์๋
๋คํธ์ํฌ๋ ๋ชจ์ํฌ์(KIWOOM_MODE=VIRTUAL)์์๋ง ์ฌ์ฉํ์ธ์.
- ๊ธฐ๋ณธ ๋ฐ์ธ๋๋
127.0.0.1์
๋๋ค โ ํฐ๋์ ์์ ๋๋ ๊ตฌ์ฑ์ ์ ์ ํฉ๋๋ค. ์ปจํ
์ด๋/์๋ฒ์
์ง์ ๋
ธ์ถํ๋ ค๋ฉด --host 0.0.0.0์ ๋ช
์ํ์ธ์.
- ๊ณต๊ฐ HTTPS URL์ Cloudflare Tunnel ๋ฑ์ผ๋ก ๋ง๋ญ๋๋ค:
cloudflared tunnel --url http://localhost:8000 (์์ URL โ ์์ ์ด์์ named tunnel ๊ถ์ฅ).
- 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 ์ฐ๊ฒฐ)์ ์ธ์ ์์ด ์คํํ๋ฉด ๊ทธ๋๋ก์
๋๋ค.
๋์ ํ์ธ
MCP ํด๋ผ์ด์ธํธ ์์ด stdio๋ก ์ง์ ํ์ธํ ์ ์์ต๋๋ค:
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 ์ ์ฐ) ๋งค๋งค๊ฐ ์์ผ๋ฉด ์ ์์
๋๋ค |
๊ฐ๋ฐ
npm run dev
npm run typecheck
npm test
npm run build
๊ตฌ์กฐ: src/kiwoom/(์ธ์ฆยทHTTPยทTR ๊ณ์ธต) โ src/tools/(MCP tool, ํฌ๋งทํฐ ๋ถ๋ฆฌ) โ
src/isa/(๊ณผ์ธ์ ํ ๋ถ๋ฅยท์คํ์์ต ์ฌ๊ตฌ์ฑยท์์ตํต์ฐ). ์์ธ ๊ท์น๊ณผ ๊ฒ์ฆ๋ API
๊ณ์ฝ์ CLAUDE.md ์ฐธ๊ณ .
๋ผ์ด์ ์ค
MIT