mcp-dart
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-dartfind recent filings for Samsung Electronics"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AgentLadle MCP DART
English | δΈζ
π¨π³ China A-Share Market β Cloud-hosted MCP for Shanghai & Shenzhen listed companies. Read more | Get API Key
A MCP (Model Context Protocol) server that provides tools for discovering, downloading, parsing, and searching Korean DART financial reports (κΈμ΅κ°λ μ μ μ곡μμμ€ν ).
It enables AI assistants (Claude, Cursor, etc.) to access Korea's Open DART data through 6 structured tools β from resolving a company name to keyword-searching within report pages.
Features
6 MCP tools for DART data: resolve company name, list filings, download+parse, get TOC, read pages, keyword search
Full μ 기곡μ financial report support β A001 μ¬μ λ³΄κ³ μ (annual), A002 λ°κΈ°λ³΄κ³ μ (semi-annual), A003 λΆκΈ°λ³΄κ³ μ (quarterly), each with a dedicated
toc.yamlsection mapping derived from real DART XMLAuto-detecting multi-format parser β structured SECTION-N XML (A/B/D/E types) routes to the section-tree parser (
toc.yamlwhen available, generic tree extraction otherwise); HTML single-page disclosures (I001 μμ곡μ, I002 곡μ 곡μ/μ μ μ€μ ) route to the HTML extraction parser. Format is detected by file content, not hardcoded by type.Professional DART document parsing β direct XML path extraction (
./P,./TABLE) and standard TOC alignment (A001: 123 codes / 110 leaves; A002: 53 codes / 43 leaves; A003: 59 codes / 48 leaves)η« θζ + θε ιι‘΅ pagination model β pages respect DART's standard section tree (precision over fixed 4000-char chunking)
Korean-aware search β substring matching (no
\bword boundaries), character-count TF normalization, morphological-variant hintsThree-tier local cache β ZIP archives, extracted XML, and parsed JSON stored separately under
~/.agentladle/mcp-dart/data/{zip,xml,json}/Idempotent β already-downloaded/parsed filings are automatically skipped
Pure Python, cross-platform (Windows / macOS / Linux)
Related MCP server: MCP OpenDART
Prerequisites
Python 3.10+ β Download Python
uv β Install uv
DART API key (free) β register at https://opendart.fss.or.kr/
Note: After installing uv, restart your terminal and MCP client (e.g. Cherry Studio) to ensure the
uvcommand is recognized.
Quick Start
Add to your MCP client configuration (Claude Desktop, Cursor, etc.):
{
"mcpServers": {
"mcp-dart": {
"command": "uvx",
"args": ["agentladle-mcp-dart"],
"env": {
"DART_API_KEY": "your_dart_api_key_here",
"UV_HTTP_TIMEOUT": "300"
}
}
}
}That's it. uvx will automatically download the package and its dependencies from PyPI β no clone, no manual install, no path configuration.
Slow network? The first
uvxrun downloads many dependencies (includingdart-fss,pandas, etc.). The default 30s timeout may be too short and cause MCPConnection closed. SetUV_HTTP_TIMEOUTto"300"to avoid download timeouts. If it still fails, use the pip install alternative below.
Alternative: .env file
If you prefer not to inject the key via the MCP client env block, copy .env.example to one of:
./.env(per-project override; git-ignored β never commit a real key)~/.agentladle/mcp-dart/.env(user-global default)
and set:
DART_API_KEY=your_dart_api_key_hereThe first existing .env wins; explicit env vars set in the MCP client always override .env. See .env.example for details.
Alternative: pip install
If you prefer managing the environment yourself:
pip install agentladle-mcp-dartThen configure (no need for uvx):
{
"mcpServers": {
"mcp-dart": {
"command": "agentladle-mcp-dart",
"env": { "DART_API_KEY": "your_dart_api_key_here" }
}
}
}Alternative: Run from source (local development)
Clone the repository and run directly:
git clone https://github.com/agentladle/mcp-dart.gitThen configure your MCP client:
{
"mcpServers": {
"mcp-dart": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-dart", "agentladle-mcp-dart"],
"env": { "DART_API_KEY": "your_dart_api_key_here" }
}
}
}Replace /path/to/mcp-dart with the actual path to the cloned repository.
Data Flow
DART OpenAPI Local Files (~/.agentladle/mcp-dart/data/)
ββββββββββββ ββββββββββββββββββββββββββββββββββββββββββ
corp_list (dart-fss) βββ corp_list.csv (CSV cache, ~114k corps)
search_dart_company βββ corp_list.csv lookup (Tool 6: name β stock_code)
β
search_filings API βββ zip/{rcept_no}.zip (Tool 2: download)
β
ZIP extraction βββ xml/{rcept_no}/*.xml (Tool 2: extract)
β
dart_parsers + toc.yaml βββ json/{stock_code}_{rcept_no}.json (Tool 2: parse)
β
Local TF search βββ search results (Tool 5: keyword_search)
TOC (section_tree) βββ section_tree + page ranges (Tool 3: get_report_toc)
Page range read βββ page content (Tool 4: get_report_pages)Tools
# | Tool | Description |
1 |
| List DART filings for a Korean company by stock code (returns |
2 |
| Download a DART filing ZIP and parse it into a section-tree JSON cache |
3 |
| Get the section_tree (TOC) with page ranges β derived from |
4 |
| Read pages by global page number or by |
5 |
| Korean substring full-text search with character-count TF + position boost |
6 |
| Resolve a company name (Korean/English) to |
Tool 1: list_dart_filings
List available DART filings for a Korean listed company.
Parameter | Type | Required | Description |
| string | β | 6-digit Korean stock code, e.g. |
| string | β | Start date |
| string | β | End date |
| string[] | β | DART detail types to filter (default: |
| int | β | Max filings to return (default 20, max 100) |
Returns each filing's rcept_no, rcept_dt, report_nm, corp_code, report_type, and a parseable flag (true for any valid DART type β the parser auto-detects document format at parse time).
Tool 2: download_dart_report
Download and parse a single DART filing. Fuses the SEC flow's download + parse into one step. Idempotent (skips if cached and valid).
Parameter | Type | Required | Description |
| string | β | 14-digit DART receipt number (from |
| string | β | 6-digit stock code for the JSON filename ( |
| string | β | Receipt date |
| string | β | DART detail type, default |
| bool | β | Re-parse even if cached JSON exists |
Tool 3: get_report_toc
Retrieve the complete DART section_tree (Table of Contents) for a parsed report. Built directly from toc.yaml aligned with the parsed XML β page ranges are authoritative, not heuristic.
Parameter | Type | Required | Description |
| string | β | 14-digit DART receipt number |
| string | β | Stock code (improves cache lookup) |
Each node has section_code, title, start_page, end_page, local_pages, matched (bool β whether XML matched this toc entry), and children. Pass any section_code to Tool 4's section_code parameter to read that whole subtree.
Tool 4: get_report_pages
Read full page content by global page range or by section_code.
Parameter | Type | Required | Description |
| string | β | 14-digit DART receipt number |
| int | β | Start page (1-based); default 1; ignored if |
| int | β | Pages to return (default 3, max 10). Ignored when |
| int | β | Inclusive end page (e.g. |
| string | β | DART section code (e.g. |
| string | β | Stock code (cache lookup aid) |
Tool 5: keyword_search
Korean-friendly full-text search. Scoring:
TF = substring count / non-whitespace character count (Korean has no whitespace-delimited words)
Position boost Γ1.2 if first hit is in the top 20% of the page
ALL match mode applies Γ2.0 bonus when every keyword hits
Parameter | Type | Required | Description |
| string | β | 14-digit DART receipt number |
| string[] | β | 1β5 Korean (or ASCII) keywords; pass morphological variants like |
| string | β |
|
| int | β | Max matches (default 5, max 50) |
| string | β | Stock code (cache lookup aid) |
Each match returns page_number, score, keyword_hits, snippet (highlighted with **...**), and the section context (section_code/section_title).
Tool 6: search_dart_company
Resolve a company name (Korean or English) to a stock_code / corp_code. Queries the locally cached corp_list.csv (no network call after first preheat). Use this before list_dart_filings / download_dart_report whenever the user mentions a company by name but does not provide a 6-digit stock_code.
Parameter | Type | Required | Description |
| string | β | Company name (Korean |
| bool | β |
|
| int | β | Max matches (default 20, max 50) |
| bool | β |
|
Each match contains corp_name, corp_eng_name, stock_code, corp_code, modify_date. When multiple matches are returned, pick the correct stock_code and pass it to list_dart_filings.
Configuration
After first run, a default config file is created at ~/.agentladle/mcp-dart/config.yaml:
dart:
api_key: ""
paths:
data_dir: "~/.agentladle/mcp-dart/data"
zip_dir: "~/.agentladle/mcp-dart/data/zip"
xml_dir: "~/.agentladle/mcp-dart/data/xml"
json_dir: "~/.agentladle/mcp-dart/data/json"
parsing:
page_char_limit: 4000
max_pages_per_section: 10 # soft target (precision preserved on overflow)
download:
delay_between_requests: 0.2DART_API_KEY resolution priority (highest to lowest):
Real OS environment variable (
DART_API_KEY=xxx uvx agentladle-mcp-dart).envfile β./.envfirst, then~/.agentladle/mcp-dart/.envdart.api_keyin~/.agentladle/mcp-dart/config.yaml
Data Directory Structure
~/.agentladle/mcp-dart/
βββ .env # Optional user-global API key (git-ignored)
βββ config.yaml # Configuration (auto-created)
βββ data/
βββ corp_list.csv # ~114k Korean companies (CSV cache, dart-fss)
βββ zip/
β βββ {rcept_no}.zip # Original DART archive (retained after download)
βββ xml/
β βββ {rcept_no}/ # Extracted XML per filing
β βββ {rcept_no}.xml # Main DART XML
β βββ {rcept_no}_NNNNN.xml # Optional attachments
βββ json/
βββ {stock_code}_{rcept_no}.json # Parsed section_tree + pages + coverageFile naming convention: {stock_code}_{rcept_no}.json when stock_code is known; {rcept_no}.json when stock_code was omitted at download time. find_json_file also falls back to *_{rcept_no}.json glob and legacy raw/ / xml/ co-located layouts.
Example Usage
The tools follow an EAFP (Easier to Ask for Forgiveness than Permission) approach. AI assistants should attempt to read/search directly and rely on errors to trigger downloads.
Scenario A: File already exists locally (Shortest Path)
User: "Analyze Samsung's latest financial report."
1. keyword_search(rcept_no="<rcept_no>", keywords=["λ§€μΆ", "λ§€μΆμ‘", "μμ
μ΄μ΅"])
β Returns page snippets matching the keywords immediately.Scenario B: File missing (Fallback triggered)
User: "What does LG Energy Solution's latest annual report say about R&D?"
1. keyword_search(rcept_no="<rcept_no>", keywords=["μ°κ΅¬κ°λ°", "R&D"])
β Error: Parsed report not found.
2. list_dart_filings(stock_code="373220", report_types=["A001"])
β Returns the correct rcept_no.
3. download_dart_report(rcept_no="<rcept_no>")
β Downloads ZIP, extracts XMLs, parses to JSON cache.
4. keyword_search(rcept_no="<rcept_no>", keywords=["μ°κ΅¬κ°λ°", "R&D"])
β Now returns hits with section context.Scenario C: Latest ad-hoc disclosure (Samsung earnings guidance / μ μ μ€μ )
User: "Analyze Samsung's latest earnings guidance."
1. list_dart_filings(stock_code="005930", report_types=["I002"], limit=1)
β Returns the latest 곡μ 곡μ (e.g. μ μ μ€μ / provisional earnings).
2. download_dart_report(rcept_no="<rcept_no>", stock_code="005930", report_type="I002")
β Parses the HTML single-page disclosure.
3. keyword_search(rcept_no="<rcept_no>", keywords=["λ§€μΆ", "μμ
μ΄μ΅", "μ€μ "])
β AI summarizes revenue, operating profit, and YoY change.Tech Stack
Component | Choice | Purpose |
MCP Framework |
| MCP server with stdio transport |
API / Download |
| DART auth, corp list, ZIP download |
XML Parsing |
| Core parser engine |
Structured Data |
| corp_list CSV cache (dart-fss dependency) |
TOC / Format Config |
|
|
Search | Python built-in | Character-count TF + position boost |
License
MIT
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/agentladle/mcp-dart'
If you have feedback or need assistance with the MCP directory API, please join our Discord server