关于 kiwoom-mcp-server
kiwoom-mcp-server 是只读 MCP 服务,用于查询韩国股市数据和 Kiwoom 账户信息。它提供丰富的市场与账户工具,包括 ISA 税务状态计算,但不支持修改订单。
主要功能
- 01韩国股票行情与图表
- 02市场排名与投资者资金流
- 03ETF、卖空与借贷数据
- 04只读账户及交易查询
- 05ISA 税务状态计算
适用场景
- 01查看韩国股价与市场趋势
- 02检查持仓、余额和交易记录
- 03分析投资者资金流或卖空活动
- 04估算 ISA 收益与免税额度的关系
MCP 相关
它将 Kiwoom Securities REST API 的市场和账户查询功能作为 MCP 工具提供。支持本地 stdio 和经过身份验证的 HTTP 连接;有意排除交易订单操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y kiwoom-mcp-serverKIWOOM_APP_KEY密钥Kiwoom REST API app key (issued at openapi.kiwoom.com; VIRTUAL and REAL need separate keys)KIWOOM_APP_SECRET密钥Kiwoom REST API app secretKIWOOM_MODEVIRTUAL (모의투자, mock trading) or REAL (실전투자, live account)ISA_ENABLEDOpt-in switch for the ISA tax-allowance tool (set true together with ISA_TYPE / ISA_OPENED_ON)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
49收录的工具列表 · 更新于 3 周前
此工具无需参数。
详细介绍
kiwoom-mcp-server
한국어 · English
키움증권 REST API를 조회 전용(read-only) 으로 노출하는 MCP 서버입니다. Claude Desktop / Claude Code에서 자연어로 국내 주식 시세·차트·호가·지수·순위·수급과 내 계좌의 잔고·보유 종목·거래내역을 조회할 수 있고, ISA 계좌라면 비과세 한도 대비 손익통산 현황까지 계산해 줍니다.
⚠️ 보안 경고
- 기본 실행은 로컬 stdio입니다. 원격에서 써야 한다면 반드시 인증이 내장된 HTTP 모드(원격 연결 참조)로만 노출하고, 인증 없는 상태(
--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 | 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 포털에서
앱 등록 후 발급
- 모의투자(VIRTUAL)와 실전투자(REAL)는 각각 별도로 발급받은 앱키를 사용하며,
발급받은 키 종류와
KIWOOM_MODE가 일치해야 합니다. - 계좌는 앱키에 귀속되므로 계좌번호 입력은 필요 없습니다.
- 모의투자(VIRTUAL)와 실전투자(REAL)는 각각 별도로 발급받은 앱키를 사용하며,
발급받은 키 종류와
설치
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 # dist/ 생성
npm test # 단위 테스트 (네트워크 불필요)
环境变量(.env)
| 变量 | 必填 | 说明 |
|---|---|---|
KIWOOM_APP_KEY | ✅ | Kiwoom REST API 应用密钥 |
KIWOOM_APP_SECRET | ✅ | Kiwoom REST API 应用密钥密文 |
KIWOOM_MODE | VIRTUAL(模拟投资,默认值)或 REAL(实盘投资) | |
ISA_ENABLED | 为 true 时启用 calc_isa_tax_status 工具。默认值为 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 模式(不建议 — 参见下方安全提示) | |
MCP_PUBLIC_URL | HTTP 模式下对外公布的基础 URL(例如:https://kiwoom.example.com)。未设置时,根据请求的 Host 和 X-Forwarded-Proto 推断 — 如果反向代理未添加这些标头,则必须明确设置 |
默认按普通(非 ISA)账户处理 — 若无其他配置,仅会公开市场和账户查询工具。若要连接 ISA 账户并使用免税额度工具,请设置 ISA_ENABLED=true,并填写 ISA_TYPE/ISA_OPENED_ON。关闭后,calc_isa_tax_status 不会注册,其余工具均照常运行。
由于会先在项目根目录查找 .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 应用不会继承 Shell 的 PATH,因此如果只写"node"/"npx", 服务可能无法启动,且不会显示任何提示 — 这是最常见的失败原因。
保存后,彻底退出 Claude Desktop(macOS 上按 ⌘Q)并重新启动,即可看到工具。运行 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
# 엔드포인트: 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。 - 使用 Cloudflare Tunnel 等方式创建公开 HTTPS URL:
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)中,重启服务后仍可保持连接。 - ⚠️ **Kiwoom API 调用从运行此服务的设备发出。**REAL 模式的 Kiwoom 指定终端认证(8050)与 IP 绑定,因此在非注册 IP 的位置(例如云端)运行时可能出现认证错误。请先使用模拟投资验证远程开放。
原有的 stdio 行为(连接 Claude Desktop/Code)在不带参数运行时保持不变 — 但如果 .env 或环境变量中设置了 MCP_TRANSPORT=http,则例外。由于会在选择传输方式之前读取 .env,即使不带参数运行,也会使用 HTTP 路径;若未设置 MCP_AUTH_TOKEN,服务会直接拒绝启动。无论 MCP_TRANSPORT 的值如何,若要强制使用 stdio,请传入 --stdio。
验证运行
无需 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
无需 .env,ping 也能响应。行情和账户工具需要应用密钥。
문제 해결
| 증상 | 확인할 것 |
|---|---|
| Desktop에 tool이 안 보임 | command가 node 절대 경로인지, npm run build를 했는지, Desktop을 완전 종료 후 재실행했는지 |
환경설정이 없거나 잘못되었습니다 | .env가 프로젝트 루트에 있는지, 필수 변수가 채워졌는지 |
키움 인증에 실패했습니다 | 앱키 종류(모의/실전)와 KIWOOM_MODE가 일치하는지, 포털에서 앱이 활성 상태인지 |
요청 한도를 초과했습니다 | 키움 레이트리밋(TR당 약 1초 1회). 서버가 자동 재시도한 뒤에도 초과한 경우이니 잠시 후 다시 시도 |
| 예수금과 D+2 추정예수금이 다름 | 미결제(D+2 정산) 매매가 있으면 정상입니다 |
개발
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 참고.
라이선스
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。