DART (Korea Financial Information) MCP server providing Korean financial data and corporate information
OpenDart MCP provides 8 tools for querying Korean financial data via the DART API. The implementation demonstrates solid structural organization with clear tool registration in fastmcp, but falls short of production-grade quality in several critical dimensions: (1) All parameter descriptions are present and reasonable, meeting the baseline of 100% param coverage. (2) Tool descriptions are substantive (avg 150 chars), exceeding the baseline minimum. (3) However, input schemas are either implicit in function signatures or lack explicit JSON Schema documentation, the source does not show formal schema objects with type/description pairs beyond function annotations. (4) Several tools lack error handling guidance beyond implicit 'returns dict' patterns, violating pattern:recovery-guide. (5) Descriptions use Korean language extensively, which is culturally appropriate but does not follow LLM-optimized English baseline (50-200 chars, action-oriented). (6) The 'get_financial_statement' tool description explicitly instructs the LLM on output formatting ('숫자 단위를 1억 2천만원과 알아보기 쉽게 정리해주세요'), which is a tool-facing instruction, not a tool definition, this pollutes the schema with operational hints that belong in system prompts.
회사명을 이용하여 기업의 고유 코드를 조회합니다. 회사를 조회 할 때는, LIKE 문을 사용하므로 이를 고려해서 입력해주세요
특정 기업의 정기 재무 공시 목록을 조회합니다.
기업의 주요 부채 관련 정보 (회사채, 기업어음, 조건부자본증권, 신종자본증권, 단기사채 미상환 잔액 및 채무증권 발행실적)를 통합하여 조회합니다.
DART API를 통해 특정 기업의 재무제표를 조회합니다. 조회 결과는 (1) 숫자 단위를 1억 2천만원과 알아보기 쉽게 정리해주세요. (2) 조회 결과는 항상 상세하게 설명을 해주세요.
기업의 주요 투자 관련 정보 (타법인 출자현황, 사모자금 사용내역, 공모자금 사용내역)를 통합하여 조회합니다.
기업의 주요 인적 자원 관련 정보 (직원 현황, 임원 현황, 이사·감사 전체 보수현황, 미등기임원 보수현황, 사외이사 및 그 변동현황, 개인별 보수지급 금액(상위 5명))를 통합하여 조회합니다.
Input schemas not formally documented in JSON Schema format. Tool definitions use Python function annotations (type hints), but source code does not show explicit JSON Schema objects with 'type', 'properties', 'required' fields. fastmcp auto-generates schemas from function signatures, but documentation is not visible in the source provided.
Output schemas not documented. Tools return 'dict[str, Any]' or 'list[dict[str, Any]]' with no field definitions. LLMs cannot plan downstream calls or extract specific fields without knowing the response structure (e.g., what keys does 'get_debt_information_summary_details' return?).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 51 | - | v1 |
기업의 주요 주식 관련 정보 (최대주주 현황, 최대주주 변동현황, 소액주주 현황, 배당에 관한 사항, 증자(감자) 현황, 자기주식 취득 및 처분현황)를 통합하여 조회합니다.
오늘 날짜를 조회합니다.
Tool descriptions mix operational instructions with definitions. 'get_financial_statement' includes '(1) 숫자 단위를 1억 2천만원과 알아보기 쉽게 정리해주세요. (2) 조회 결과는 항상 상세하게 설명을 해주세요.' These are output formatting directives, not tool purpose statements. Tool definitions should describe WHAT the tool does, not HOW the LLM should format its response. This pollutes schema and confuses LLM reasoning.
No error handling or recovery guidance. Tools return untyped dicts with no indication of success/failure conditions, error messages, or next-step guidance. For example, 'find_company_by_name' returns 'List[Dict[str, Any]]', what if the company is not found? Does it return an empty list or an error? LLM has no recovery path.
Descriptions use Korean language exclusively, making them inaccessible to English-language LLMs and violating baseline conventions. While culturally appropriate, production MCP servers should provide English descriptions (or bilingual) for interoperability. Example: 'get_today' description is '오늘 날짜를 조회합니다.', should be 'Get today's date' or similar.
Parameter 'k' in 'find_company_by_name' lacks range constraints. Description states 'default is 10' but no min/max bounds are documented. What happens if k=10000? Does it scale? Timeout? Without numeric bounds, LLMs may pass absurd values.
Date format documentation is present but inconsistent. 'get_company_financial_statement_list' specifies YYYYMMDD but description states '(2024년이라면 2025년 6월까지 조회)' in Korean, adding locale-specific constraint that is not in English. Internationalization is unclear.
No pagination support evident for tools returning lists. 'get_company_financial_statement_list' and 'get_financial_statement' return 'list[dict[str, Any]]' with no page/offset/limit parameters or total count indication. Large results could exhaust LLM context window.
Corporate code parameter ('corp_code') is a required opaque 8-character string across multiple tools (get_company_financial_statement_list, get_financial_statement, etc.). However, the only tool to retrieve a corp_code is 'find_company_by_name'. If that lookup fails or returns nothing, the agent has no recovery path. Consider: (1) making corp_code optional and auto-resolving via company name, or (2) documenting the required lookup chain explicitly.