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.
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
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:
They complement each other. Want DataFrames? Use the Python wrappers. Want agent-ready frames? Use this MCP.
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.Full history → CHANGELOG.md
Practical use cases for Korean-equity retail investors whose broker app isn't enough. Just ask Claude in plain language.
"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.
"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.
"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.
"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.
"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.
All results below are actual values from live DART API calls. Reproducible via scripts/showcase-v0_9_1.mjs (12/12 PASS).
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.
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.
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.
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.
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.
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.
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)
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.
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.
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%)
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.
Prompt: "Samsung 2023 annual report PDF body"
→ get_attachments(rcept_no="20240312000736", mode="extract", index=0)
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 | ❌ | ❌ | ✅ |
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.
$ claude mcp add korean-dart-mcp \
-- python -m otcore.mcp_server <graph>