MCPcopy Index your code
hub / github.com/chrisryugj/korean-dart-mcp

github.com/chrisryugj/korean-dart-mcp @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
178 symbols 429 edges 37 files 18 documented · 10% updated 27d ago★ 75
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Korean DART MCP

83 OpenDART APIs packed into 15 MCP tools. Disclosure search, financial statements, shareholder structure, XBRL, analyst frames (insider signals, governance risk scoring, Buffett-grade quality checklists), and HWP/PDF attachment-to-markdown conversion — all usable directly from any AI assistant.

npm version MCP 1.27 License: MIT

MCP server + CLI wrapping OpenDART (Financial Supervisory Service's public disclosure platform — Korea's equivalent of the SEC's EDGAR). Works with Claude Desktop, Cursor, Windsurf, Claude Code, and any MCP-compatible client.

Sister project: korean-law-mcp (Korean statute database, 41 APIs → 15 tools).

한국어 문서 → README.md


Why this exists

Korea has ~3,000 listed companies whose filings, financials, ownership data, and XBRL flow through DART (Data Analysis, Retrieval and Transfer System). Two mature Python wrappers — OpenDartReader (438⭐) and dart-fss (364⭐) — already map the 83 raw endpoints for pandas users.

This project targets a different layer:

  • For pandas users — OpenDartReader / dart-fss. Analysts wrangle DataFrames directly.
  • For LLM-native users — this project. Raw tables get refined into the angles an expert actually uses (Buffett checklists, insider trade cluster signals, governance risk scores, capital-event timelines, markdown full-text) so an AI agent can build a narrative on first pass.

They complement each other. Want DataFrames? Use the Python wrappers. Want agent-ready frames? Use this MCP.


v0.9 — What's new

  • get_xbrl format="markdown_full" — full presentation/calculation linkbase parsing: every account with hierarchy + calculation-linkbase validation. BS 50+ / IS 15+ / CF 10+ rows vs v0.8's 50-tag whitelist. Handles industry-specific taxonomies (financial holdings DX prefix, insurance) automatically. 6MB XBRL → ~30-60KB markdown.
  • search_disclosures auto-split — no corp_code + range >90 days auto-chunks into 90-day windows (works around OpenDART's "3-month limit for market-wide queries"). Cap: 40 chunks (~10 years).
  • summary_text field on insider_signal and disclosure_anomaly — one-line Korean summaries for quick context before raw tables.
  • Security hardening (v0.9.1) — ZIP slip / ZIP bomb guards via shared helper, HTTPS viewer scraping, chunk cap, presentation-recursion depth guard, XBRL parse-warning exposure.

Full history → CHANGELOG.md


💡 For retail investors — 5 things you can actually do

Practical use cases for Korean-equity retail investors whose broker app isn't enough. Just ask Claude in plain language.

1. "Is management buying with their own money on my holdings?"

"Samsung Electronics — insider buy/sell activity over the last 12 months"

insider_signal aggregates reports into cluster signals. Live result: 2,429 buys vs 43 sells → strong_buy_cluster. A 24:1 buying dominance by executives. Impossible to spot manually from DART's filing-by-filing view.

2. "Any accounting skeletons in this company?"

"Kakao — 3-year accounting/governance risk score"

disclosure_anomaly returns a 0-100 score + verdict (clean/watch/warning/red_flag). Live: Kakao 40/100 warning — amendment ratio 32.8% exceeds the 20% threshold. Automated flag detection no retail investor does by hand.

3. "I don't want to read a 300-page annual report"

"Summarize the 'Risk Factors' and 'Business Overview' sections from Samsung's 2023 annual report"

get_attachments(mode="extract") converts 2.2MB PDFs into 920k-char markdown in 3.7 seconds. Claude reads and summarizes section-by-section. You get primary-source reading without paying for analyst reports.

4. "Who filed what today?"

"All listed companies that filed treasury stock purchase decisions in the last 30 days"
"Convertible/exchangeable bond issuance filings, last 7 days"
"M&A / spin-off decisions in the last 30 days"

search_disclosures(preset=...) covers 22 presets. Treasury buys = bullish signal / CB/BW issuance = dilution warning. Live: 59 treasury-buy filings in 30 days. Batch views brokerage apps miss entirely.

5. "Which of these is more solid, A or B?"

"Compare Samsung, SK Hynix, LG Electronics on 5-year ROE / debt / growth"

buffett_quality_snapshot(corps=[...]) auto-ranks across 5 metrics. Live (see Scenario 1 above): SK Hynix passes 3/4 checklist; Samsung dominates debt stability. Pick stocks by numbers instead of vibes.


Who this fits

  • Intermediate retail investors holding 5-20 stocks, reviewing disclosures quarterly/semi-annually
  • People who want primary-source disclosures instead of journalist-filtered news
  • Investors frustrated by the limits of Naver Finance / HTS app data
  • DIY analysts who'd rather not pay for brokerage research

Who this is overkill for

  • Day traders on charts — no chart / real-time price here
  • KOSPI ETF buy-and-holders — no need for single-stock analysis
  • Quants running DataFrames in Excel/Python — use OpenDartReader or dart-fss instead (pandas-native)

Honest barriers to entry

  • Claude Desktop / Cursor install + OpenDART key provisioning (~10 min, free, 20k requests/day)
  • Terms like ROE / CAGR / debt-to-equity are assumed
  • Claude Pro subscription $20/month (large-PDF summarization benefits from a plan with a bigger context window)
  • This is a research assistant. Investment decisions are yours.

Real scenarios — live API results

All results below are actual values from live DART API calls. Reproducible via scripts/showcase-v0_9_1.mjs (12/12 PASS).

1. Buffett-style 5-year quality comparison + auto-ranking

Prompt: "Compare Samsung, SK Hynix, LG Electronics on 5-year quality metrics"

buffett_quality_snapshot(corps=["삼성전자","SK하이닉스","LG전자"], years=5)

Company Avg ROE Latest D/E Revenue CAGR Net Income CAGR Checklist
Samsung 10.39% 29.94% 4.51% 3.17% 1/4
SK Hynix 12.86% 45.95% 22.6% 45.37% 3/4
LG Electronics 5.37% 140.33% 4.81% -3.63% 0/4

Auto-generated rankings (5 metrics): ROE → SK Hynix > Samsung > LG · Debt stability → Samsung > SK Hynix > LG · Net Income CAGR → SK Hynix > Samsung > LG · ROE stability (stddev ↓) → LG > Samsung > SK Hynix.

2. Is management buying with their own money? (insider_signal)

Prompt: "Samsung insider buy/sell cluster analysis, last 12 months"

insider_signal(corp="삼성전자", start="2025-04-18", end="2026-04-18")

Samsung Electronics: 2,473 reports (buy 2,429 / sell 43).
1,047 distinct buyers vs 40 sellers. Net +2,302,375 shares.
→ strong_buy_cluster signal.
Peak cluster: 2026Q1 (985 buyers / 18 sellers).

Buffett's "is management buying with their own money?" quantified in one call. 24:1 buying dominance recently.

3. Accounting/governance risk score (disclosure_anomaly)

Prompt: "Kakao last 3 years — accounting risk"

disclosure_anomaly(corp="카카오")

Kakao (2023-04 ~ 2026-04): ⚠️ WARNING, score 40/100
- Amendment filings 167/509 (32.8%)  ← over 20% threshold, +30 pts
- Capital stress filings: 5           ← +10 pts
- verdict: warning

Four axes (amendments / auditor churn / non-clean opinion / capital stress) → 0-100 with per-flag evidence. LLM just writes the story.

4. XBRL all-accounts + calculation validation (v0.9)

Prompt: "Samsung 2023 annual — full financial statements"

get_xbrl(rcept_no="20240312000736", format="markdown_full")

Periods: current 2023-12-31 / prior 2022-12-31 / prior-prior 2021-12-31
Account rows: BS 52 · IS 18 · CF 12 (vs 17/13/7 in whitelist mode — 3× more)
Markdown size: 8,905 chars (6MB XBRL → 99.85% reduction)
Calc validation: ✅ all balanced (0 violations)
Taxonomy: 10 presentation roles · 8 calculation roles
Elapsed: 615ms

Calc validation is the killer — summation-item relations in the calculation linkbase catch reporting errors on the spot.

5. Industry-specific taxonomy (financial holdings)

Prompt: "Shinhan Financial Group latest annual — full financials"

search_disclosures to resolve rcept_no → get_xbrl(format="markdown_full")

Shinhan 2025 annual (rcept_no=20260318000826)
BS 44 rows · IS 49 rows
3 calc-validation violations (financial-industry-specific items)
→ DX-prefix (financial holding) taxonomy handled without code changes

dart-fss downloads XBRL zips but auto-handling of the financial DX prefix isn't documented there.

6. All treasury-stock purchase decisions, last 30 days

Prompt: "All listed firms that filed treasury stock purchase decisions in the last 30 days"

search_disclosures(preset="treasury_buy", days=30, limit=500)

Matched: 59 filings / 8 pages in parallel (17.5s)

Latest 5:
  2026-04-17 Tiplax — treasury stock trust contract termination
  2026-04-17 M2N — treasury stock purchase decision
  2026-04-17 PS Electronics — treasury stock trust termination
  2026-04-15 Asia — treasury stock trust termination
  2026-04-15 Asia Cement — treasury stock trust termination

22 presets auto-assemble the pblntf_ty + report_nm regex — the LLM doesn't have to memorize DART codes.

7. Market-wide 180-day query (auto-split, v0.9)

Prompt: "All annual reports filed in the last 6 months, market-wide"

search_disclosures(preset="annual_report", days=180)

Auto-split: 3 chunks (bypassing DART's "3-month limit for market-wide queries")
Fetched 6,000 → matched 2,625 annual reports (10.3s)

8. Capital-event timeline (Kakao, 3 years)

Prompt: "All Kakao capital events over the last 3 years"

get_corporate_event(corp="카카오", mode="timeline", start="2023-04-18", end="2026-04-18")

Event type Count
Treasury stock disposal 14
Capital reduction 3
Merger 2
CB issuance 1
EB issuance 1
Total 21

36 event enums fetched in parallel → merged by date.

9. Unified ownership filings (5%-rule + executive stake)

Prompt: "Samsung 3-year ownership changes"

get_major_holdings(corp="삼성전자")

majorstock (5%-rule): 41 filings — latest: Samsung C&T 19.70% (2026-04-17)
elestock (executive/major holder): 200 of 2,615 returned (latest first)

One call, two endpoints merged — Python wrappers need two calls + pandas merge.

10. Single-company Buffett checklist with evidence

Prompt: "Samsung 6-year Buffett checklist"

buffett_quality_snapshot(corps=["삼성전자"], years=6)

Samsung 2020-2025:
- ROE avg 10.26% (min 4.26 / max 15.69 / stddev 3.58)
- D/E latest 29.94% / avg 31.11%
- Revenue CAGR 7.09% · Net income CAGR 11.35%

Checklist 3/4:
  ❌ consistent_high_roe (all years ROE ≥ 15%)
  ✅ low_debt            (latest D/E ≤ 100%)
  ✅ growing_revenue     (revenue CAGR ≥ 5%)
  ✅ growing_earnings    (net income CAGR ≥ 5%)

11. Filing full text as markdown

Prompt: "Samsung latest treasury-stock decision — full text"

search_disclosures(preset="treasury_buy")download_document(format="markdown")

Original: 2026-03-18 Treasury stock purchase decision
XML 32,618 chars → markdown 2,272 chars (93% reduction)
Headings and tables preserved.

12. Annual-report attachment → markdown

Prompt: "Samsung 2023 annual report PDF body"

get_attachments(rcept_no="20240312000736", mode="extract", index=0)

  • 2.2MB PDF → 921,998 chars of markdown in 3.7s. LLM can search "Risk Factors" directly.
  • kordoc engine (HWP/HWPX/PDF/DOCX/XLSX) — neither OpenDartReader, dart-fss, nor any of the 6 existing DART MCP servers offers this.

How this compares to existing DART tooling

Ecosystem survey (as of 2026-04-18):

Feature OpenDartReader (438⭐, Python) dart-fss (364⭐, Python) hypn4/opendart-fss-mcp (85 tools) RealYoungk/opendart-mcp (83 tools) korean-dart-mcp (15 tools)
MCP-native
Node.js/TypeScript (npm) (only one)
1:1 endpoint coverage most filings+financials all 85 all 83 compressed 83→15 via enums
Company name auto-resolve partial partial ✅ (typo/consonant) ✅ (SQLite FTS preload)
XBRL presentation/calculation linkbase ZIP only ZIP+taxonomy ZIP only auto markdown + calc validation
HWP/PDF attachment → markdown (only one, kordoc)
insider_signal cluster (only one)
disclosure_anomaly 0-100 score (only one)
buffett_quality_snapshot checklist (only one)
90-day auto-split · parallel paging
ZIP slip/bomb hardening n/a n/a

Positioning

Python wrappers (OpenDartReader, dart-fss) are for quants/backtesters using DataFrames in Jupyter. The 6 existing Python DART MCPs hand DART's raw JSON to LLMs verbatim. This project is the only LLM-native Node.js MCP in Korea's DART ecosystem — 83 APIs compressed to 15 enum-based tools, with XBRL full parsing, HWP/PDF-to-markdown, and insider/anomaly/Buffett analyst frames built in.

Honest limitations

  • 1:1 endpoint coverage is wider on hypn4 (85 tools) and RealYoungk (83 tools) — if you need a rare endpoint directly, those are better choices. This project c

Extension points exported contracts — how you extend this code

ClientConfig (Interface)
(no doc)
src/setup.ts
DartListResp (Interface)
(no doc)
src/tools/get-shareholders.ts
SafeUnzipOptions (Interface)
(no doc)
src/utils/safe-zip.ts
CorpRecord (Interface)
(no doc)
src/lib/corp-code.ts
ServerOptions (Interface)
(no doc)
src/server/mcp-server.ts
Preset (Interface)
(no doc)
src/tools/search-disclosures.ts
ZipEntryResult (Interface)
(no doc)
src/utils/safe-zip.ts
CorpCodeResolverOptions (Interface)
(no doc)
src/lib/corp-code.ts

Core symbols most depended-on inside this repo

abort
called by 18
src/utils/safe-zip.ts
defineTool
called by 15
src/tools/_helpers.ts
section
called by 12
scripts/showcase-v0_9_1.mjs
run
called by 12
scripts/showcase-v0_9_1.mjs
resolveCorp
called by 11
src/tools/_helpers.ts
init
called by 11
src/lib/corp-code.ts
check
called by 11
scripts/smoke-v0_7_1.mjs
normalizeDate
called by 10
src/tools/_helpers.ts

Shape

Function 117
Interface 43
Method 14
Class 4

Languages

TypeScript100%

Modules by API surface

src/lib/xbrl-parser.ts36 symbols
src/lib/corp-code.ts18 symbols
src/setup.ts16 symbols
src/tools/buffett-quality-snapshot.ts12 symbols
src/tools/get-attachments.ts10 symbols
src/lib/dart-xml.ts10 symbols
src/tools/search-disclosures.ts9 symbols
src/utils/safe-zip.ts8 symbols
src/lib/dart-client.ts8 symbols
src/tools/insider-signal.ts6 symbols
src/tools/disclosure-anomaly.ts6 symbols
src/tools/_helpers.ts5 symbols

For agents

$ claude mcp add korean-dart-mcp \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page