MyDART
Server Details
Powerful OpenDART API-based Korean corporate disclosure tools for accounting professionals
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Available Tools
16 toolsdownload_documentARead-onlyIdempotentInspect
MyDART MCP의 download_document 도구는 공시 원문을 마크다운으로 읽고 검색합니다(heading·표 구조 보존). 사업보고서 ZIP 안의 감사보고서 선택 포함.
[Purpose]
Full disclosure text; audit analysis (감사의견·KAM): get_audit_report.
비상장 non-filers: the F 감사보고서 rcept IS the route to 재무제표·주석.
HWP·PDF attachments·sibling docs (정관·내부회계 운영실태보고서): get_attachments. XBRL: get_financials(rcept_no).
[Usage]
"이 사업보고서 원문 읽어줘" → rcept_no="20260310002820"
"연결 감사보고서 본문" → documents[].role=consolidated_audit → doc_index
"본문이 잘렸어, 전체로" → truncate_at=2000000
"원문에서 횡령 찾아줘" → find="횡령"
[Response]
role: main_body / separate_audit / consolidated_audit / internal_control
documents[]: metadata only — content ONLY with all_docs=true
[Rules]
A 사업보고서 ZIP holds MULTIPLE docs — 감사의견·KAM·내부회계 live in the 별도(_00760)/연결(_00761) sub-docs, not index 0: check documents[].role first.
find returns 표 단위 발췌 for EVERY doc in the ZIP, not content. 0 matches ≠ absent — 스캔 이미지 표는 get_attachments(mode=images).
If truncated=true, raise truncate_at (compare char_count).
| Name | Required | Description | Default |
|---|---|---|---|
| find | No | Full-text search over EVERY 원문 XML in the ZIP (본문+별도/연결 감사보고서). Returns `find` (표 단위 발췌 bundles + 나머지 매치 위치 locations) INSTEAD of content — 전문을 나르지 않는다. Case-insensitive, 리터럴 매칭(정규식 아님 — `(주)카카오` 를 그대로 넣어도 된다). 0건이면 표기를 자간 띄운 형태(`핵 심 감 사 사 항`)로 한 번 더 찾는다. doc_index 를 함께 주면 그 문서 하나로 좁힌다(범위 밖이면 좁히지 않고 전 문서를 검색하고 notes 로 알린다 — 전문 조회의 index-0 폴백과 다르다: 잘못된 index 로 좁히면 답이 있는데 0건이 나간다). format=markdown 에서만 쓸 수 있다. | |
| format | No | Output format. markdown=DART XML → 마크다운, raw=original XML, text=tags stripped (table structure is lost) | markdown |
| all_docs | No | Convert every 원문 XML in the ZIP and return them as documents[] — the 사업보고서 본문 plus 별도/연결 감사보고서 in one call. | |
| rcept_no | Yes | 14-digit 접수번호 (the rcept_no from search_disclosures). Hyphens and spaces are stripped. | |
| doc_index | No | Selects one 원문 XML inside the ZIP (0-based; 0=본문 when omitted). Use the index from the documents list. The 감사보고서 body is usually index 1~2 (별도/연결). An out-of-range value silently falls back to the main body WITH a note in `notes` — check it. | |
| truncate_at | No | Max text length (the excess is cut). Default 300,000 chars; out-of-range values are clamped to the bound. With all_docs=true the budget is divided across the documents (the per-document share comes back as per_doc_truncate_at). Ignored when find is set (no content is returned). | |
| find_max_bytes | No | 발췌 본문 합계의 UTF-8 **바이트** 상한 (기본 12,000). 문자수가 아니라 바이트인 이유: 한글은 자당 3바이트라 '12,000자' 로 재면 응답이 36,000B 가 된다(실측). 단일 발췌가 이 값을 넘으면 표 행 단위로 잘리고 clipped=true 가 붙는다(제목행·구분행은 보존). | |
| find_max_bundles | No | Max 발췌 bundles (기본 5). 나머지 매치는 locations 로 위치만 나열된다. 바이트 예산(find_max_bytes)이 먼저 차면 이 수에 못 미칠 수 있다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/destructiveHint annotations, the description discloses non-obvious behavior: a ZIP contains multiple documents and audit sub-docs are not index 0, all_docs=true is required for content, find returns excerpts rather than full text, out-of-range doc_index silently falls back, and truncation clamps. These caveats materially affect how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but organized into Purpose/Usage/Response/Rules with dense, front-loaded information. A few statements overlap with schema descriptions, but the structure keeps the length justified for an 8-parameter tool with no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, it provides the response roles, the metadata-only behavior of documents[], the truncation signal, and the find-result semantics including excerpts, locations, byte budgets, and clipped flag. It also covers failure/fallback notes, making the tool callable correctly by an agent without needing to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is strong; the description adds value with query-to-parameter examples, role→doc_index selection, and cross-parameter caveats such as find ignoring truncate_at and all_docs dividing the budget. It does not need to restate schema details because those are already complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a clear verb+resource statement: reads and searches disclosure full text in markdown while preserving headings/tables, and explicitly includes choosing the audit report inside a business-report ZIP. It names sibling tools like get_audit_report, get_attachments, and get_financials so an agent can distinguish this full-text reader from report-specific tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has a dedicated Purpose section routing each alternative: audit opinions/KAM → get_audit_report, HWP/PDF attachments → get_attachments, XBRL → get_financials. Usage examples translate natural-language requests into concrete parameter values, and Rules state when not to rely on this tool (scanned-image tables → get_attachments(mode=images)).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_corp_codeARead-onlyIdempotentInspect
MyDART MCP의 find_corp_code 도구는 회사명·종목코드로 DART 법인 식별자(corp_code)의 후보를 확인합니다.
[Purpose]
IMPORTANT: first call when a company's corp_code is unknown.
Also to disambiguate same-named companies.
ID resolution only — 업종·data location: get_company_profile; disclosure listings: search_disclosures.
[Usage]
"카카오" → corp_code 획득 → 재무제표 조회(get_financials)
"삼성전자" → corp_code 획득 → 임원 현황 조회(get_periodic_report)
"'동양' 들어가는 회사 후보 보여줘" → query="동양", limit=20
"005930이 어느 회사야?" → query="005930"
[Response]
stock_code: 6-digit present = listed (common shares); empty/absent = unlisted.
count = rows returned (capped by
limit), not the total match count. 0 hits addsnotes.
[Rules]
resultsis a similarity-ranked candidate array — do not assume the first item is the answer.corp_code identifies the DART LEGAL ENTITY CODE, not the listing ticker. 우선주/ETF/ETN codes have no mapping (보통주 codes only).
Common names may overflow the default
limit— raise it when candidates look truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max candidates to return (default 10, max 50) | |
| query | Yes | 회사명 (한/영), 6-digit 종목코드, or 8-digit corp_code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that results are similarity-ranked candidates, that the first result is not necessarily correct, that stock_code presence indicates listed common shares, that count is capped by limit and not total matches, and that preferred/ETF/ETN codes have no mapping. This is significant behavioral context that an agent needs for correct interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is well-structured into Purpose, Usage, Response, and Rules sections, and front-loads the most critical usage directive. Each section earns its place, though some content slightly overlaps between Purpose and Rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining key result fields (stock_code, count, notes), the candidate-array nature of results, and caveats around matching and limits. Given the tool's simple input but subtle output semantics, this is complete enough for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds value by clarifying accepted query formats (Korean/English name, 6-digit stock code, 8-digit corp_code) and practical limit behavior ('raise it when candidates look truncated'). This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool resolves DART corp_code candidates from a company name or stock code, and clearly scopes it as ID resolution only. It names sibling tools (get_company_profile, search_disclosures) to distinguish what this tool does not do. This removes any ambiguity about its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says this is the 'first call' when a corp_code is unknown, gives concrete query examples, and tells when to use alternatives such as get_company_profile for company data or search_disclosures for filings. It also advises raising the limit when candidates appear truncated. Usage guidance is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentsARead-onlyIdempotentInspect
MyDART MCP의 get_attachments 도구는 공시의 첨부파일 목록과 형제문서 본문·페이지 이미지를 다룹니다.
[Purpose]
Attachment list + 형제문서 routing; body text = mode=text (뷰어 원문), 구조 보존은 download_document.
자금부정통제 붙임·경영진 운영실태보고서 live here (mode=text; 붙임 = attachment_links[].retrieve).
Scan-only (도장·서명·스캔 서식): mode=images only.
[Usage]
정관·영업보고서 본문 → list 로 dcm_no 확보 → dcm_no, mode="text"
표가 이미지뿐이면 mode="images" (뒷장 image_from, PDF 페이지 pages)
[Response]
format: hwpx/hwp/pdf/docx/doc/xlsx/xls/zip/html/unknown
images: source="viewer" or "pdf" — different field shapes.
[Rules]
supported:false → unsupported_reason·suggestion·note·retrieve·next_step = the fallback route; follow it verbatim.
No bulk sweeps — mass viewer calls bring DART IP bans.
Ladder: text (표 lossless) → empty·링크 껍데기 body → images → download_url. Attachment files are never parsed server-side.
images returns pictures: OCR·판독 is the client's job, 1 image per capped call (image_from).
partial:true ⇒ section_errors[]; markdown is partial — 빈 곳 ≠ 사실 없음.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | list: the attachment list only — nothing is downloaded, so it is the cheap call. text: the document body as 마크다운 via the 뷰어 원문 (XML→HTML) path — it skips PDF conversion, so text and tables are lossless and it is hundreds of times lighter. The primary path for sibling documents (정관·영업보고서·운영보고서 etc.) and the route to take whenever body text is what you want. images: return embedded images (도장·스캔본·차트 and other raster that text cannot capture). With NO filename/index it takes the 뷰어 원본 JPEG route (manifest.source="viewer": originals in document order, per-section eleId); with filename or index it scans THAT attachment PDF instead (source="pdf": decoded PNGs, largest area first, with page numbers; pages narrows it). The two routes return different field shapes. There is no file-parsing mode: an attachment file itself is reached through download_url, never parsed server-side. | list |
| index | No | 0-based index of the attachment to scan, in images mode (filename takes precedence). Like filename it picks the PDF-scan route; omit both to get the 뷰어 임베드 원본 JPEG. | |
| pages | No | Page filter for images mode (1-based, PDF-scan path only). e.g. "3", "1-5", "2,4,7-9". It narrows pages WITHIN the attachment picked by filename/index, so it requires one of them. Unset on a filename/index call = a scan of only that PDF's FIRST 40 pages. At most 2000 pages per call — a wider span is rejected, not silently trimmed. | |
| dcm_no | No | Target 문서번호(dcmNo). Defaults to the 본문 document. One 공시(rcept_no) carries, besides the 본문, sibling documents (감사보고서·내부회계관리제도운영보고서·영업보고서·정관 etc.) each with its own dcmNo; take sibling_documents[].dcm_no from a list result to read that document (list its attachments, or mode=text/images). A sibling's attachments are invisible without it — always list first, then pass sibling_documents[].dcm_no. | |
| filename | No | Exact filename of the attachment to scan, in images mode (no partial-match fallback). Giving it PICKS the PDF-scan route — omit both filename and index to get the document's 뷰어 임베드 원본 JPEG instead. An EXACT match is required; on failure the error lists the available names. | |
| rcept_no | Yes | 14-digit 접수번호 (separators are stripped automatically) | |
| sections | No | Which sections to fetch, in mode="text" — the **sections[] array index** (0-based). NOT the eleId: in these documents eleId runs "1".."8", so eleId happens to equal index+1 and is easy to confuse. e.g. to read the 3rd and 6th entries of sections[], pass [2, 5]. Unset = the previous behavior (the first 24 sections, all fetched). [] = 목차 only — zero body calls, sections[] carries just the titles (md_chars all 0); read them, then call again with the indices you want (2-pass). The pick happens BEFORE the 24-node ceiling, so it reaches sections 25~158 of a 사업보고서 본문 that are otherwise unreachable at any truncate_at. Max 24 picks; out-of-range indices are dropped with a note in `notes` (all-out-of-range is rejected). In this mode every sections[] entry carries its own index — check it against what you asked for (an off-by-one that stays in range otherwise returns a neighbouring section silently). | |
| image_from | No | Start offset in document order for the 뷰어 원본 JPEG route (0-based, default 0). Channels with a response cap fit only ~1 scan page per call, so this is how you reach later pages — e.g. the 자금부정통제 표 is usually the 2nd page of an 운영실태보고서, so image_from=1. The response carries `from` and a note telling you the next offset. PDF-scan route uses pages instead. | |
| max_images | No | Max images returned in images mode (largest area first). Default 12. | |
| truncate_at | No | Max length of the mode=text 마크다운 (default 100,000 chars; out-of-range values are clamped to the bound) | |
| min_dimension | No | In images mode, an image whose shorter side is under this many pixels is treated as decoration (아이콘·괘선) and dropped. Default 24. Lower it to catch small 도장/서명. It filters the PDF-scan path only (source:"pdf") — 뷰어 원본 JPEG images pass through unfiltered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate read-only/idempotent behavior, so the description carries the transparency burden and succeeds. It discloses IP-ban risk, that attachment files are never parsed server-side, that OCR is the client's job, and that partial:true means empty sections are not evidence of absence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Purpose/Usage/Response/Rules headers and front-loaded scope. It is long, but the tool is complex; it earns a 4 rather than 5 because some content overlaps with the already-detailed parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a multi-mode tool with 11 parameters and no output schema, the description covers modes, response formats, fallback behavior, and operational guardrails. The only minor gap is that the exact shape of the list response is not spelled out in one place, though it is inferable from schema and usage examples.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds routing semantics beyond the schema: mode=text for body text, mode=images for scans, dcm_no acquisition from list results, and image_from/pages selection guidance. It stops short of fully re-documenting each parameter because the schema is already exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the tool's scope: '공시의 첨부파일 목록과 형제문서 본문·페이지 이미지를 다룹니다' and immediately distinguishes itself by stating '구조 보존은 download_document'. It clearly identifies the resource, the modes, and how this tool differs from a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'Usage' section with numbered steps: get dcm_no from list, then call with dcm_no and mode='text'; use mode='images' when tables are image-only; and route structure-preservation needs to download_document. It also gives an exclusion warning — 'No bulk sweeps — mass viewer calls bring DART IP bans'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audit_profileARead-onlyIdempotentInspect
MyDART MCP의 get_audit_profile 도구는 감사인·감사의견·업무수행이사에 감사보수·감사투입시간·실사수행내역·외부조회 실시여부 등 외부감사 실시내역을 한 표로 요약해 반환합니다.
[Purpose]
Fact/figure asks: "who audited, at what fee, how was the 실사".
강조사항 comes structured (emphasis); full 의견근거·KAM·강조 text: get_audit_report.
ICFR detail: get_internal_control; 계속기업 quant: get_going_concern.
Company lists (모집단): search_audit_findings.
[Usage]
"삼성전자 2024 감사보수·비감사보수" → corp="삼성전자", year=2024
"재고실사 입회했는지 빠르게만" → corp="…", year=2024, light=true
[Response]
fees
_msuffix = 백만원.opinion domain: 적정/한정/부적정/의견거절.
[Rules]
data_available=false = the filing was not found (e.g. not yet filed) — do NOT read null fields as "confirmed absent".
audit_only=true (F 단독공시, unlisted) → fees are structurally absent (사업보고서 전용), not a defect.
For 연결/별도 split read kam.by_fs_div, not kam.topics (representative fallback).
ALWAYS read applicability.guidance[] — regime notes and next-tool routing.
감사인 교체/연속연수 are NOT returned — call per year and compare auditor.name.
| Name | Required | Description | Default |
|---|---|---|---|
| corp | Yes | 회사명/종목코드/corp_code | |
| year | Yes | 결산 사업연도 (회계연도, fiscal year) — the number you pass IS the 사업연도=회계연도=결산연도. Do NOT subtract it; pass it as-is. Only tools where year is optional auto-select the latest published year when omitted (if year is required in the tool you are calling, it cannot be omitted — confirm the year actually used via the response `year` field).e.g. 'FY2025'·'2025년 재무제표'·'2025 사업보고서'·'2025 회계연도' → all 2025 (결산일 2025-12-31). Convert ONLY when the user explicitly names the 공시(제출)연도, as in '○○년에 공시된 보고서': a 12월 결산법인 files by the end of March of the following year.(e.g. '2026년에 공시된 사업보고서' → 2025). Otherwise the input is ALWAYS on a 사업연도=회계연도=결산연도 basis. Relative expressions ('최근 N개년'·'작년' and the like) count back from the most recent PUBLISHED 사업연도 as of today: a 사업보고서 is filed within about 90 days after 결산 (12월 결산 법인 → March of the following year), so from April the latest is last year, and in Jan~Mar it is the year before last. e.g. if today is 2026-06 the latest is FY2025 → '최근 5개년'=2021~2025 (NOT 2020~2024). Supported floor is FY2015 (the range OpenDART's structured APIs cover) — 2014 and earlier are rejected. A 비12월 결산 (3·6·9월) 법인 may have its latest 사업연도 equal to the calendar year (e.g. a 3월 결산 company from July onward). | |
| light | No | Skip 원문 parsing (structured JSON APIs only — omits 실사, the fs_div split, and fees.headcount, which comes from the 실사 source; fast) | |
| refresh | No | Bypass the cache and re-collect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read profile (readOnlyHint=true, idempotentHint=true). The description adds substantial context beyond that: data_available=false means the filing was not found (null fields must not be read as 'confirmed absent'), audit_only=true (F 단독공시) means fees are structurally absent rather than a defect, the kam.by_fs_div field routing for 연결/별도 splits, the mandate to ALWAYS read applicability.guidance[] for next-tool routing, and the explicit note that 감사인 교체/연속연수 are NOT returned. It also defines response semantics: fees `_m` suffix = 백만원 and the opinion domain (적정/한정/부적정/의견거절). This is exactly the behavioral nuance annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but densely organized into labeled sections ([Purpose], [Usage], [Response], [Rules]) that each carry distinct information — scope routing, call examples, response format, and edge cases. The main purpose is front-loaded in the opening sentence, and the Rules section is terse bullet-style guidance. Every section earns its place; the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema, the description carries the full burden of explaining response interpretation and edge cases, and it succeeds: response format (_m suffix, opinion domain), data-availability semantics (data_available=false), structural absence (audit_only=true), field routing (kam.by_fs_div vs kam.topics), next-tool routing (applicability.guidance[]), and explicitly what is NOT returned (auditor change/consecutive years). Nothing an agent needs to call it correctly and interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself is unusually detailed (especially the year parameter covering fiscal-year vs disclosure-year conversion and relative-date counting). The description adds value above the baseline by mapping natural-language queries to parameter values (corp/year/light usage examples) and by explaining the practical trade-off of light=true (fast, omits 실사). That exceeds the baseline-3 for high coverage but doesn't need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (반환/return), resource (감사 개요/audit profile), and precise scope (감사인·감사의견·업무수행이사·감사보수·감사투입시간·실사수행내역·외부조회 실시여부 summarized in one table). It also names the sibling tools it is not — get_audit_report (full opinion basis, KAM, emphasis text), get_internal_control (ICFR), get_going_concern (going concern quant), search_audit_findings (company lists) — so an agent can differentiate without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage examples map real user queries to parameter values: '"삼성전자 2024 감사보수·비감사보수" → corp="삼성전자", year=2024' and '"재고실사 입회했는지 빠르게만" → corp="…", year=2024, light=true'. Alternatives are named explicitly with routing conditions (full text → get_audit_report, ICFR → get_internal_control, company lists → search_audit_findings). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audit_reportARead-onlyIdempotentInspect
MyDART MCP의 get_audit_report 도구는 감사보고서 본문을 문단 단위로 구조화해 문단별 원문 텍스트를 반환합니다 — 감사의견·감사의견근거·KAM·강조사항·기타사항·계속기업가정불확실성.
[Purpose]
For verbatim 감사보고서 narrative paragraphs. Structured fact summaries (보수·실사 등): get_audit_profile.
ICFR detail and its fit with the 재무제표 감사의견: get_internal_control.
[Usage]
"LG에너지솔루션 2024 KAM 문단 전문" → corp="LG에너지솔루션", year=2024
"삼부토건 FY2024 별도 의견거절 근거 원문" → corp="삼부토건", year=2024, fs_div="OFS"
발견사항만 → sections="summary"; 잘리면 truncate_at 상향
[Response]
sections[].key = KSA700 elements (list in sections arg). opinion: 적정/한정/부적정/의견거절.
fs_label: 연결/별도. source_note = F 단독공시, correction_note = 정정 채택/생략.
[Rules]
kam.count=0 with none_declared: declared "없음" = normal; undeclared = suspect omission.
Unlisted (F 단독공시) legitimately lacks KAM·업무수행이사 (see source_note).
재무제표·주석 FIGURES: download_document.
body_omitted:true = section EXISTS, body not requested (≠ absent) — re-call with sections.
internal_control = verdict only; ICFR 정본은 get_internal_control.
| Name | Required | Description | Default |
|---|---|---|---|
| corp | No | 회사명/종목코드/corp_code (required when rcept_no is absent). corp+year auto-locates the 사업보고서, falling back to the 감사보고서 F 단독공시 for unlisted companies; results on that path are cached | |
| year | No | 결산 사업연도 (회계연도, fiscal year) — the number you pass IS the 사업연도=회계연도=결산연도. Do NOT subtract it; pass it as-is. Only tools where year is optional auto-select the latest published year when omitted (if year is required in the tool you are calling, it cannot be omitted — confirm the year actually used via the response `year` field).e.g. 'FY2025'·'2025년 재무제표'·'2025 사업보고서'·'2025 회계연도' → all 2025 (결산일 2025-12-31). Convert ONLY when the user explicitly names the 공시(제출)연도, as in '○○년에 공시된 보고서': a 12월 결산법인 files by the end of March of the following year.(e.g. '2026년에 공시된 사업보고서' → 2025). Otherwise the input is ALWAYS on a 사업연도=회계연도=결산연도 basis. Relative expressions ('최근 N개년'·'작년' and the like) count back from the most recent PUBLISHED 사업연도 as of today: a 사업보고서 is filed within about 90 days after 결산 (12월 결산 법인 → March of the following year), so from April the latest is last year, and in Jan~Mar it is the year before last. e.g. if today is 2026-06 the latest is FY2025 → '최근 5개년'=2021~2025 (NOT 2020~2024). Supported floor is FY2015 (the range OpenDART's structured APIs cover) — 2014 and earlier are rejected. A 비12월 결산 (3·6·9월) 법인 may have its latest 사업연도 equal to the calendar year (e.g. a 3월 결산 company from July onward). | |
| fs_div | No | both (default — 연결+별도 both)/연결(CFS)/별도(OFS). Aliases consolidated/separate·연결/별도 also accepted. With both, reports[] holds 2 entries — reading only the first drops an axis. | |
| refresh | No | Bypass the cache and re-collect (corp+year path only) | |
| rcept_no | No | 접수번호 given directly (instead of corp/year) — parses that filing live (never cached) and returns resolved/applicability as null. A 감사보고서제출(F) 단독공시 works too. | |
| sections | No | Which section BODIES to include. full (default) = every section. summary = the paragraphs that carry a finding — 의견(opinion)·KAM·강조(emphasis)·기타(other_matter)·계속기업(going_concern), plus 의견근거(basis) ONLY when the opinion is not 적정 (for 적정 that paragraph is boilerplate: p50 575 bytes with almost no variance across 27,067 reports; for 한정/부적정/의견거절 it is the reason itself, 2.5~3.1x longer). Or pass an explicit key array, e.g. ["opinion","kam"]; [] = 목차만. Keys: opinion·basis·going_concern·kam·emphasis·other_matter·other_information·mgmt_resp·auditor_resp·other_reporting. Unselected sections are NOT dropped — they stay as {key, heading, char_count, body_omitted:true} so you can re-request them. The structured fields (opinion·kam.matters titles·emphasis·other_matters·going_concern_mentioned) are ALWAYS returned regardless of this argument. | |
| truncate_at | No | Max length per section body (default 8,000 chars; the excess is cut, out-of-range values are clamped to the bound). On truncated=true check char_count and re-call with a higher value. Applies only to sections whose body is included — see `sections`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false. The description meaningfully adds behavioral context beyond those: it explains the 'body_omitted:true' semantics (section exists but body not requested, not absent), disclosure rules about unlisted F 단독공시 legitimately lacking KAM, and the behavior of 'kam.count=0 with none_declared' (declared 없음 normal vs undeclared suspect). It also reveals cache behavior via refresh and rcept_no annotations, which is beyond the basic annotation hints. A small gap: it doesn't describe pagination or network failure behavior, but the added detail is substantial, so 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a model of structured front-loading: it opens with a one-sentence purpose summary with a bullet list, then uses labeled sections ([Purpose], [Usage], [Response], [Rules]) that each contain dense but relevant information. Every sentence earns its place — e.g., the rules section bundles the most decision-relevant operational caveats (body_omitted, none_declared, internal_control verdict-only) in compact form. There is no padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, 10 section keys, conditional behaviors) and the fact that there is no output schema, the description is remarkably complete. It covers: what the response structure looks like (sections[].key, fs_label, source_note, correction_note), edge-case interpretations (kam.count=0 with none_declared), unlisted-company caveats, the body_omitted contract, and where to route other needs (download_document, get_internal_control). No output schema exists, so the description's response-structure coverage is essential and well done.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3 per rubric. The description adds meaningful semantic value beyond the schema: it maps natural-language intent to parameters ('삼부토건 FY2024 별도 의견거절 근거 원문' → corp='삼부토건', year=2024, fs_div='OFS'), explains the sections argument's selection and body_omitted mechanics, and gives truncate_at usage guidance ('잘리면 truncate_at 상향'). It also clarifies the years semantics in the schema itself. This lifts it above baseline 3, though not to 5 because the schema already carries detailed per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('returns'), a precise resource ('audit report body structured by paragraph'), and explicitly lists the section types ('감사의견·감사의견근거·KAM·강조사항·기타사항·계속기업가정불확실성'). It distinguishes itself from sibling tools by name ('get_audit_profile', 'get_internal_control'), so an agent can identify this tool as the verbatim-paragraph audit report tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed, explicit when-to-use guidance: it contrasts with 'structured fact summaries' (get_audit_profile) and ICFR detail (get_internal_control), gives concrete query-to-parameter examples ('LG에너지솔루션 2024 KAM 문단 전문' → corp='LG에너지솔루션', year=2024), and includes conditional advice such as '발견사항만 → sections="summary"; 잘리면 truncate_at 상향'. This exceeds the bar for usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_profileARead-onlyIdempotentInspect
MyDART MCP의 get_company_profile 도구는 기업개황(업종·대표자·결산월·상장구분)과 데이터 위치(data_location)를 조회합니다.
[Purpose]
Basics + routing check before 재무·감사 calls on unfamiliar (esp. 비상장) companies.
감사인·감사의견·감사보수: get_audit_profile; name ambiguity: find_corp_code.
[Usage]
"카카오는 뭐 하는 회사야?" → corp="카카오"
"교보생명 FY2024 재무는 어디서 봐?" → corp="교보생명", year=2024
"종목코드 068270 기업 개황" → corp="068270"
[Response]
data_location.filing_tier: listed(financials=JSON API) / listed_konex(NOT in structured financial APIs — financials live in 사업보고서 원문) / unlisted_reporting / audit_only(financials+notes live in 감사보고서 F 단독공시 원문) / no_disclosure_found / unknown
company.corp_cls: Y=코스피/K=코스닥/N=코넥스/E=기타(비상장). acc_mt = 결산월.
[Rules]
Route follow-up calls by data_location: audit_only → get_financials returns [013], open f_separate_rcept via download_document instead. listed_konex → empty get_financials is NORMAL, do not retry.
provisional=true (year omitted) is tentative — never conclude 비외감 from no_disclosure_found.
| Name | Required | Description | Default |
|---|---|---|---|
| corp | Yes | 회사명/종목코드/corp_code | |
| year | No | 회계연도 that applicability.data_location (where 재무·감사 data lives) is judged against. Defaults to the latest (marked 잠정). Matters only for 비상장사 — a 상장사 is always 사업보고서(JSON), so it is reported as listed without probing. For non-December closers this year follows the 시작연도 convention shared with the audit tools, while the financial JSON tools (get_financials 등) address the same fiscal period as year+1 — the response's fiscal_year_note spells the mapping out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the provisional-year caveat, that listed_konex can legitimately return empty financial results, and that audit_only data must be fetched via download_document rather than get_financials. It also explains how data_location values map to data sources, which materially affects follow-up behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is organized into Purpose, Usage, Response, and Rules sections with bullet-style entries, making it easy to parse. Every block earns its place: routing rules, taxonomy, and examples are all decision-relevant, and the one-sentence summary is front-loaded before the detailed sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by enumerating the key data_location and corp_cls values and their meanings. It also covers edge cases (year omitted, 비상장 vs 상장, listed_konex empty results) and names the follow-up tools, making the tool safely invocable without external knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters comprehensively (100% coverage), and the description adds value with concrete usage examples and the year-sensitive routing nuance (year matters only for 비상장사). It does not invent new semantics, but it reinforces and contextualizes the schema rather than merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the specific resource (기업개황) and two concrete outputs (basic company profile fields and data_location), using a clear verb (조회). It also explicitly distinguishes itself from get_audit_profile and find_corp_code, so an agent can separate it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [Purpose] section states the intended context ('routing check before 재무·감사 calls on unfamiliar, especially 비상장, companies') and [Rules] gives explicit routing decisions based on data_location, including when not to retry. The three usage examples translate natural language questions into concrete parameter settings, leaving no ambiguity about when and how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_corporate_eventARead-onlyInspect
MyDART MCP의 get_corporate_event 도구는 주요사항보고서 자본·지배구조 이벤트 36종(증자·감자·CB/BW/EB·자기주식·합병/분할 등)과 5%룰·임원 지분공시를 조회합니다.
[Purpose]
"Who raised/cut stakes, when": event_type="holdings" (5%룰 대량보유·임원/주요주주 소유보고).
결정의 후속 발행·합병 조건(공모가·인수인): get_registration_statement.
List skims: search_disclosures; 사업보고서 snapshots (최대주주·주식총수): get_periodic_report.
[Usage]
"카카오 최근 3년 자본 조달 흐름" → corp="카카오", mode="timeline"
"이 회사 CB 발행한 적 있어?" → corp="…", event_type="cb_issuance"
"자사주 취득·처분 2020년부터" → event_type=["treasury_acquisition","treasury_disposal"], start="2020-01-01"
[Response]
date = filing date (rcept_dt); event dates (이사회 결의일 등) are in raw row fields.
지분공시: total_count = all-time cumulative, filtered_count = in-period (DART takes no dates — filtered client-side).
[Rules]
Empty timeline ≠ no events — default set = capital events only (name event_type for more); sections_meta may carry per-endpoint errors.
event_type_counts is pre-truncation (limit cuts timeline only).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End date (YYYY-MM-DD / YYYYMMDD). Defaults to today | |
| corp | Yes | 회사명/종목코드/corp_code | |
| mode | No | single: query one event_type. timeline: query the 자본 관련 events in parallel (25 types by default) and merge them into one date-descending list | single |
| limit | No | Cap on timeline rows returned (default 100, date descending). The excess is cut and flagged via truncated=true, with total_events carrying the real count — a company with frequent 자본거래 yields hundreds over a 3-year window. Narrowing the period is more precise. | |
| start | No | Start date (YYYY-MM-DD / YYYYMMDD). Defaults to 3 years ago — an omitted bound is flagged as period.defaulted:true in the response | |
| event_type | No | 38 selectable events (36 주요사항 + 지분공시 2종) — **a single string OR an array**. A string queries that one event (mode=single); an array queries them in parallel and merges them into one date-descending timeline (mode switches to timeline automatically). When unset in timeline mode, every 자본 관련 event (capital=true) is selected; 소송·부도·회생·해외상장·지분공시 are NOT in that default set, so name them here. Group aliases expand to their members — 'capital' (자본거래 25종, the timeline default) and 'holdings' (지분공시 2종). The legacy key `event_types` is accepted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds significant behavioral context beyond that: date is the filing date while event dates are in raw row fields; holdings counts distinguish all-time cumulative from in-period values; DART accepts no dates and filters client-side; an empty timeline does not mean no events; and event_type_counts is pre-truncation. These are exactly the kind of non-obvious behaviors an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the Purpose/Usage/Response/Rules structure front-loads selection guidance and each section contributes non-redundant caveats. Some content overlaps with the already-detailed schema, and the Korean/English mixing adds length, but the density of operational guidance warrants the size.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by covering response date semantics, holdings count semantics, per-endpoint error indicators, truncation behavior, and default event-type selection. It does not fully enumerate response shapes for all 38 event types, but for a tool of this complexity the critical invocation and interpretation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the event_type parameter description is already very rich, including enums, aliases, automatic mode switching, and array behavior. The description adds practical value through usage examples that show valid parameter combinations, such as event_type arrays with start dates, and it clarifies how defaults behave in timeline mode. This justifies slightly above the baseline 3 for fully-schema-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it queries 주요사항보고서 capital/governance events (36 types) plus 5% rule and executive equity disclosures. It also explicitly names sibling tools for adjacent use cases, such as get_registration_statement and search_disclosures, so an agent can distinguish this tool from alternatives without inferring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Purpose section gives concrete routing rules: for subsequent issuance/merger conditions use get_registration_statement, for list skims use search_disclosures, and for annual report snapshots use get_periodic_report. The Usage section provides three example user intents mapped directly to corp, mode, event_type, and start, making when-to-use guidance explicit rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financialsARead-onlyIdempotentInspect
MyDART MCP의 get_financials 도구는 매출·영업이익·순이익·자산/부채/자본 등 재무수치를 조회합니다 — 재무 질문 대부분은 이걸로 충분합니다.
[Purpose]
재무제표 figures start here. corp+year = LATEST filing (정정 반영); rcept_no = that filing AS FILED (재작성 전후 대조·합산 검증 — 구 get_xbrl).
사업보고서 prose: get_periodic_report; 부실징후(계속기업): get_going_concern.
[Usage]
"삼성전자 2025년 매출·영업이익" → corp="삼성전자", year=2025
"삼성전자와 SK하이닉스 실적 비교" → corp=["삼성전자","SK하이닉스"]
"이 공시본 그대로 전체" → rcept_no="…", sj_div=["BS","IS","CIS","CF","SCE"]
[Response]
Row keys: sj_div, account_nm, thstrm_amount(당기)/frmtrm_*(전기)/ bfefrmtrm_*(전전기)/thstrm_add_amount(누계). Amounts are STRINGS.
full: total_count=pre-filter, count=post-filter. rcept_no adds validations.
[Rules]
Quarterly/half IS·CIS·CF rows: CUMULATIVE = thstrm_add_amount, thstrm_amount = that quarter alone (half-value trap — period_basis explains). BS rows: thstrm_amount only.
Cross-check the periods legend (전기/당기 off-by-one) and year_defaulted.
no_data is routing, not an error — follow next_step (retry is futile).
| Name | Required | Description | Default |
|---|---|---|---|
| corp | No | Company — **a single string OR an array** (회사명·종목코드·corp_code). With scope=summary: 1 (single) or 2+ (multi-company comparison). scope=full takes EXACTLY 1 — give 2 or more and only the first is returned, the rest are dropped (there is no multi-company full-statement API) and the drop is reported in `notes`. Compare several companies with scope=summary. A comma list ("삼성전자,SK하이닉스") or a bare number (259630) is absorbed too; the legacy key `corps` is accepted. Names/codes that fail to resolve are dropped with a note as long as at least one resolves (all-unresolved still errors). Omit when querying one specific filing by rcept_no instead. | |
| year | No | 결산 사업연도 (회계연도). When omitted, the most recently PUBLISHED 사업연도 is selected automatically — this absorbs the validation error that used to occur when the caller left year out for a question that never named a year. Confirm the year actually used via year/year_defaulted in the response. | |
| scope | No | summary (default): 주요계정, 8~10 rows (fast). full: the whole 재무제표 (BS/IS/CF/CIS/SCE), hundreds~1k rows | |
| format | No | REMOVED (구 get_xbrl) — any value is rejected. markdown/markdown_full → items[] replaces them (omit this arg); raw → discontinued. | |
| fs_div | No | With scope=full, selects 연결(CFS)/별도(OFS) (default CFS). The response echoes the basis ACTUALLY used, not the requested one — a CFS→OFS auto-fallback is flagged by fs_div_note. Ignored by scope=summary — summary responses carry no top-level fs_div because consolidation is per-row there. Aliases consolidated/separate·연결/별도 also accepted. | |
| report | No | q1/half/q3/annual | annual |
| sj_div | No | With scope=full, filters 재무제표 종류 (when unset: BS+IS+CIS — a company using the '단일 포괄손익계산서' presentation reports 손익 in CIS only, not IS, so CIS is included by default). BS=재무상태표, IS=손익계산서, CF=현금흐름표, CIS=포괄손익계산서, SCE=자본변동표. To get everything, state ["BS","IS","CF","CIS","SCE"] explicitly. A bare string ("BS") or comma list ("BS,IS") is absorbed into an array. | |
| rcept_no | No | 14-digit 접수번호 — serves that filing AS FILED (구 get_xbrl 흡수). corp+year serves the LATEST version instead; the two can differ after a [기재정정]. **연차(사업보고서) rcept 전용** — 분·반기 XBRL 은 기간 구조(누계·단독)가 달라 corp+report 로 조회하세요(no_data 가 라우팅). Accepts fs_div·sj_div (구 sections 는 sj_div 로 흡수); corp·year·scope must be omitted. Adds 합산 검증(validations) to the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark readOnly=true and idempotent=true, the description adds substantial behavioral context: the LATEST-versus-AS-FILED distinction, cumulatve vs single-quarter semantics, the half-value trap, fs_div auto-fallback, and the fact that no_data is routing not an error. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with Purpose/Usage/Response/Rules sections, and the density of information is justified for an 8-parameter financial tool. It is front-loaded with the most important 'start here' message, though the length slightly exceeds true minimalism.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, 3 enums, no output schema, and several subtle period/consolidation behaviors, the description covers invocation, response meaning, edge cases, and routing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description also enriches every key parameter: corp accepts singe/array/comma-list and explains the multi-company drop; year explains auto-defaulting and year_defaulted; scope explains row counts; rcept_no explains exclusivity and the AS-FILED behavior. This is value well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it 조회계 data for 매출·영업이익·순이익·자산/부채/자본. It also distinguishes itself from sibling tools (get_periodic_report, get_going_concern, legacy get_xbrl), so an agent can tell exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit and actionable: it states that most financial questions are answered here, gives concrete query examples mapping natural language to parameters, and names alternatives for prose reports and going-concern signals. It also clarifies when to use rcept_no vs corp+year and warns about pointless retries on no_data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_going_concernARead-onlyIdempotentInspect
MyDART MCP의 get_going_concern 도구는 계속기업가정 관련 위험을 정량 재무지표와 감사보고서 언급 여부의 교차로 판정합니다.
[Purpose]
계속기업 risk — esp. "figures risky, 감사인 silent" mismatches.
Lists: search_audit_findings; figures: get_financials; 문단 원문: get_audit_report.
[Usage]
"이스타코 2024 계속기업 위험 있어?" → corp="이스타코", year=2024
"별도 기준 정량 점검" → corp="…", year=2024, fs_div="OFS"
[Response]
flags.consecutive_op_loss = NUMBER of 연속 영업손실 years (not a bool); others bool|null.
grade: 판정불가(no data)/양호(0)/주의(1
2)/경계(34)/위험(5+)cross_check.code: both/quant_only/text_only/none/insufficient_data/quant_unavailable/report_unavailable
[Rules]
NEVER read text.going_concern_mentioned null (report not secured = unknown) as false (checked, no mention).
quant_only covers TWO cases — risky figures with no mention confirmed, OR with report not secured; distinguish via going_concern_mentioned (false vs null).
grade "판정불가" is not "양호". flags null = account not secured, not false.
Response fs_div is post-fallback — a CFS request may return OFS.
| Name | Required | Description | Default |
|---|---|---|---|
| corp | Yes | 회사명/종목코드/corp_code | |
| year | Yes | 결산 사업연도 (회계연도, fiscal year) — the number you pass IS the 사업연도=회계연도=결산연도. Do NOT subtract it; pass it as-is. Only tools where year is optional auto-select the latest published year when omitted (if year is required in the tool you are calling, it cannot be omitted — confirm the year actually used via the response `year` field).e.g. 'FY2025'·'2025년 재무제표'·'2025 사업보고서'·'2025 회계연도' → all 2025 (결산일 2025-12-31). Convert ONLY when the user explicitly names the 공시(제출)연도, as in '○○년에 공시된 보고서': a 12월 결산법인 files by the end of March of the following year.(e.g. '2026년에 공시된 사업보고서' → 2025). Otherwise the input is ALWAYS on a 사업연도=회계연도=결산연도 basis. Relative expressions ('최근 N개년'·'작년' and the like) count back from the most recent PUBLISHED 사업연도 as of today: a 사업보고서 is filed within about 90 days after 결산 (12월 결산 법인 → March of the following year), so from April the latest is last year, and in Jan~Mar it is the year before last. e.g. if today is 2026-06 the latest is FY2025 → '최근 5개년'=2021~2025 (NOT 2020~2024). Supported floor is FY2015 (the range OpenDART's structured APIs cover) — 2014 and earlier are rejected. A 비12월 결산 (3·6·9월) 법인 may have its latest 사업연도 equal to the calendar year (e.g. a 3월 결산 company from July onward). | |
| fs_div | No | 연결(CFS)/별도(OFS), default CFS. Falls back to 별도 automatically when 연결 is absent (the response fs_div reports the basis actually used). Aliases consolidated/separate·연결/별도 also accepted. | |
| refresh | No | Bypass the cache and re-collect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint/openWorldHint/idempotentHint/destructiveHint, lowering the bar. The description goes well beyond them: flags.consecutive_op_loss is a NUMBER not a bool, exact grade tiers, cross_check.code enumeration, null-vs-false semantics for going_concern_mentioned, and the post-fallback fs_div behavior. No contradiction with annotations (read-only judgment tool matches readOnlyHint=true; open-world null handling matches openWorldHint).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized with [Purpose], [Usage], [Response], and [Rules] headers, with the purpose front-loaded. It is long, but every section earns its place — the Rules section delivers essential null/boolean and fallback semantics that materially affect correct invocation. Dense yet scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a cross-analysis of financial figures and audit text) and the absence of an output schema, the description documents return semantics thoroughly: flag types, grade tiers, cross_check codes, null handling, and fallback behavior. Nearly everything an agent needs to call it and interpret results is present; only exhaustive flag enumeration is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all four parameters — baseline is 3. The description adds little beyond usage examples mapping natural-language queries to corp/year/fs_div and reiterating the fs_div fallback already stated in the schema. It reinforces usage but does not add meaning the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise purpose: judging going-concern risk via the cross of quantitative financial indicators and audit-report mention. It also explicitly maps sibling tools to their niches (search_audit_findings for lists, get_financials for figures, get_audit_report for paragraph text), so an agent can tell this tool apart without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete example queries with direct parameter mappings ('이스타코 2024 계속기업 위험 있어?' → corp, year; '별도 기준 정량 점검' → fs_div="OFS"). The Purpose section names the alternative tools and their distinct functions, giving explicit routing guidance for when this tool vs. others applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_internal_controlARead-onlyIdempotentInspect
MyDART MCP의 get_internal_control 도구는 '감사인'의 내부회계관리제도(ICFR) 감사/검토 보고서를 조회합니다 — 구분·의견·중요한 취약점 여부.
[Purpose]
ICFR 의견·취약점 vs 재무제표 감사의견; 취약점 lists: search_audit_findings.
자금부정통제·경영진 내부회계관리제도 운영실태보고서: not here → get_attachments (사업보고서 rcept, mode=list→dcm_no→mode=text, scans=images; no rcept: search_disclosures preset='annual_report').
Structured facts: get_audit_profile; full text: get_audit_report.
[Usage]
"카카오페이 2024 내부회계 의견" → corp="카카오페이", year=2024
"연결 기준만" → corp="…", year=2024, fs_div="CFS"
[Response]
opinion domain: 적정/부적정/의견거절 — NO '한정'. 검토(review_or_audit)의 의견거절 = 범위제한에 따른 검토결론 불표명.
[Rules]
reports is an ARRAY — both gives up to 2 entries (연결·별도).
present=false is usually out-of-scope (read the note), not missing data; an empty CFS entry is normal.
Never conflate a review's 의견거절 with an audit's — check review_or_audit.
자금부정통제 (FY2025~ mandatory, FY2024 optional)·시정계획 = 경영진 운영실태보고서 — see management_operation_report.steps (applicable=false = F 단독공시: no report exists).
| Name | Required | Description | Default |
|---|---|---|---|
| corp | Yes | 회사명/종목코드/corp_code | |
| year | Yes | 결산 사업연도 (회계연도, fiscal year) — the number you pass IS the 사업연도=회계연도=결산연도. Do NOT subtract it; pass it as-is. Only tools where year is optional auto-select the latest published year when omitted (if year is required in the tool you are calling, it cannot be omitted — confirm the year actually used via the response `year` field).e.g. 'FY2025'·'2025년 재무제표'·'2025 사업보고서'·'2025 회계연도' → all 2025 (결산일 2025-12-31). Convert ONLY when the user explicitly names the 공시(제출)연도, as in '○○년에 공시된 보고서': a 12월 결산법인 files by the end of March of the following year.(e.g. '2026년에 공시된 사업보고서' → 2025). Otherwise the input is ALWAYS on a 사업연도=회계연도=결산연도 basis. Relative expressions ('최근 N개년'·'작년' and the like) count back from the most recent PUBLISHED 사업연도 as of today: a 사업보고서 is filed within about 90 days after 결산 (12월 결산 법인 → March of the following year), so from April the latest is last year, and in Jan~Mar it is the year before last. e.g. if today is 2026-06 the latest is FY2025 → '최근 5개년'=2021~2025 (NOT 2020~2024). Supported floor is FY2015 (the range OpenDART's structured APIs cover) — 2014 and earlier are rejected. A 비12월 결산 (3·6·9월) 법인 may have its latest 사업연도 equal to the calendar year (e.g. a 3월 결산 company from July onward). | |
| fs_div | No | both (default — 연결+별도 both)/연결(CFS)/별도(OFS). ICFR normally exists for 별도(OFS) only; 연결(CFS) ICFR 감사 applies only to 전기말 별도자산 2조↑ filers from FY2023. 별도(OFS) falls back to a standalone ICFR 공시 when the 감사보고서 embeds none, while 연결(CFS) never falls back. Aliases consolidated/separate·연결/별도 also accepted. | |
| refresh | No | Bypass the cache and re-collect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint/destructiveHint=false, so the safety profile is covered. The description adds substantial behavior beyond that: response opinion domain (적정/부적정/의견거절, explicitly NO '한정'), that a review's 의견거절 means a scope-limited conclusion non-statement, that reports is an ARRAY yielding up to 2 entries, that present=false is usually out-of-scope not missing data, and a warning never to conflate review vs audit 의견거절. Rich behavioral context on top of good annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the [Purpose]/[Usage]/[Response]/[Rules] section headers make a dense document scannable. Every section earns its place for a complex domain. It is long and somewhat dense — the deep reference to management_operation_report.steps and the applicable=false note could be trimmed — but it is organized efficiently rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the domain is complex (연결 vs 별도, review vs audit, 의견거절 vs 한정, present=false, applicable=false). The description carries the full burden of response semantics and does so completely: opinion domain, array behavior, empty-CFS-is-normal, and the review/audit conflation warning. Nothing an agent needs to invoke and interpret the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself is extremely thorough (year's fiscal-year conversion rules and floor, fs_div's CFS/OFS fallback semantics). The description adds marginal value via usage examples (corp/year mapping, fs_div='CFS' for 연결 기준만) but does not substantially expand parameter meaning beyond the schema, which already does the heavy lifting. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence states a specific verb+resource: it queries the 'auditor's' ICFR audit/review reports (구분·의견·중요한 취약점 여부). It explicitly differentiates from siblings, routing 취약점 lists to search_audit_findings, 자금부정통제/운영실태 reports to get_attachments, structured facts to get_audit_profile, and full text to get_audit_report. An agent can tell exactly what this tool is and is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not guidance: 'not here → get_attachments', 'Structured facts: get_audit_profile', 'full text: get_audit_report'. Two concrete usage examples map natural-language queries to parameters (corp='카카오페이', year=2024; '연결 기준만' → fs_div='CFS'). The Rules section adds interpretation guardrails (present=false semantics, review/audit distinction) that dictate correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_periodic_reportARead-onlyIdempotentInspect
MyDART MCP의 get_periodic_report 도구는 사업보고서 세부 섹션 28종을 정형 데이터로 조회합니다 — 한 섹션 또는 여러 섹션 동시.
[Purpose]
Section tables: 배당·자기주식·최대주주·소액주주·임원보수·회계감사인·회사채 미상환 등.
재무제표 figures: get_financials. auditor_opinion is one word — KAM·내부회계·강조사항: get_audit_profile / get_audit_report.
[Usage]
"삼성전자 2025년 배당 내역" → corp="삼성전자", year=2025, report_type="dividends"
"카카오 최대주주가 누구야" → corp="카카오", report_type="shareholders" (year 생략 = 최신)
[Response]
Amounts are STRINGS. Section status: 000 성공 / 013 무자료.
periods legend maps 당기/전기/전전기 → fiscal years — cite 기수 only after reading it.
[Rules]
Non-December closer: quote fiscal_year_note verbatim — one year off vs the audit tools.
ARRAY: per-element status (success·013·error mix); all-013 flips to { mode:"no_data", … }.
Listed [013] ≈ legitimate absence (no 배당·자기주식, no eligible 개인별 보수), not failure.
개인별 보수 2종은 2026-05 서식 개정으로 구판↔V2 이원 — 도구가 자동 라우팅(endpoint· compensation_format 표시). V2 는 1인당 3행(당기·전기·전전기)이라 합계는 fscl_year="당기"만, 주식기준보상 세부는 stk_bsd_cmpn.
| Name | Required | Description | Default |
|---|---|---|---|
| corp | Yes | 회사명/종목코드/corp_code | |
| year | No | 결산 사업연도 (회계연도) — the FISCAL year, NOT the filing year. When omitted, the most recently PUBLISHED year is selected automatically, based on 결산월(acc_mt) and report type. Confirm the year actually used via year/year_defaulted in the response. | |
| report | No | Report type | annual |
| max_items | No | Cap on rows returned per section (default 150). The excess is cut and flagged via truncated=true, and total_count then carries the real row count — this keeps responses from bloating on row-heavy, prose-heavy sections such as 임원현황·타법인출자·채무증권. | |
| report_type | Yes | 28 sections — **a single string OR an array** (an array is collected in parallel and returned as sections[]). Families: 주주 4 (largest_shareholder etc.) / 임직원 3 (executives etc.) / 보수 6 (executive_compensation_* etc.) / 회계감사 3 (auditor_opinion etc.) / 자본 3 (dividends·treasury_stock etc.) / 자금사용 2 (*_fund_use) / 타법인출자 1 / 채무증권 6 (*_unredeemed etc.). See the enum list for exact value names (the name IS the meaning). Group aliases expand to their members too — 'shareholders' (주주 4) and 'executive_compensation' (보수 6). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as readOnly, idempotent, and non-destructive, and the description builds on that rather than repeating it. It adds rich runtime behavior beyond annotations: amounts are strings, status codes 000/013, full-array 013 flips to no_data mode, 013 can be a legitimate absence, fiscal-year alignment can differ for non-December clorders, and V2 routing is automatic for comp sections.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is well organized into Purpose/Usage/Response/Rules and front-loads the main action. It is dense and uses a mixed Korean-English style with some repeated 013 themes, but every section earns its place and the structure makes the complexity navigable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 28-section parameter, lack of output schema, and many caveats, the description is remarkably complete. It covers status handling, no-data modes, fiscal-year mapping, string formatting, array error behavior, and even compensates any auto-routing specifics needed for newer section variants.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even without parameter guidance. The [Usage] examples reinforce parameter selection, but the schema already defines corp, year, report, max_items, and report_type, including group aliases and allowed values; the description does not add substantial new parameter semantics beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: it retrieves 28 business-report detail sections as structured data, either one section or multiple. The [Purpose] section also distinguishes it from get_financials and get_audit_profile/get_audit_report, so it is easy to tell apart from close siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit usage examples mapping user requests to corp, year, and report_type, and explains what happens when year is omitted. It also names alternatives for financial-statements and auditor-opinion detail, giving practical routing guidance instead of leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_registration_statementARead-onlyInspect
MyDART MCP의 get_registration_statement 도구는 증권신고서 주요정보 6종 — 모집·매출 조건, 인수인, 자금 사용목적, 합병·분할 조건을 정형 JSON 으로 조회합니다.
[Purpose]
Filed terms of a 증권신고서: 공모가액·인수인·자금의사용목적·합병비율·주식매수청구권.
Board decision: get_corporate_event / listing scan: search_disclosures(kind="issuance") / narrative (투자위험요소): download_document.
[Usage]
"대한항공 유상증자 조건" → corp="대한항공", statement_type="equity"
[Response]
filings[] = one per 신고서(rcept_no), newest first. sections: general·securities·underwriters·fund_use·sellers·put_right·issued_securities·parties.
date = 접수일 (정정본: 정정 접수일, may fall outside window). Values are raw strings; '-'(해당없음) fields omitted.
[Rules]
Only latest 정정본 is returned once corrected — original terms not included (original rcept: search_disclosures → download_document).
Withdrawn filings are unmarked — confirm via 철회신고서·증권발행실적보고서.
No data ≠ not issued: 사모·일괄신고서·소액공모 out of scope. Per-type status in sections_meta.
fetch_failed/truncated_note types mean "unconfirmed", not "none" — re-query that type.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | 조회 종료일(YYYY-MM-DD / YYYYMMDD). 기본 오늘 | |
| corp | Yes | 회사명/종목코드/corp_code — DS006 은 corp_code 필수라 회사 없는 전수 조회는 불가 | |
| limit | No | 반환할 신고서 건수 상한(rcept_no 단위, 접수일 최신순 — 기본 10). 초과분은 잘리고 truncated=true·total_filings 로 표시된다. 인수인 그룹이 신고서당 수십 행이라 행이 아니라 신고서 단위로 자른다 | |
| start | No | 조회 시작일(YYYY-MM-DD / YYYYMMDD) — **신고서 최초접수일** 기준. 기본값은 데이터 하한인 2015-01-01(전기간)이며 생략 시 period.defaulted:true. 증권신고서는 드문 이벤트라 창을 좁히면 오히려 놓친다 — DS006 은 페이징이 없어 창을 넓혀도 호출 비용이 같다 | |
| statement_type | No | 신고서 종류 — 단일 값 또는 배열, **미지정 시 6종 전부 병렬 조회**(DART 6콜 고정). equity=지분증권(유상증자·IPO) / debt=채무증권(회사채) / depositary=증권예탁증권(DR) / merger=합병 / stock_exchange=주식의포괄적교환·이전 / division=분할. 묶음 별칭 'offering'(공모 3종)·'restructuring'(구조조정 3종)과 한글명(회사채·합병·분할 등)도 수용 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, and the description adds substantial behavioral caveats beyond those: only the latest corrected filing is returned once corrected (originals must be fetched via search_disclosures → download_document), withdrawn filings carry no marker, empty data should not be read as 'not issued', and fetch_failed/truncated_note values mean 'unconfirmed' not 'none'. These are exactly the silent behaviors that would lead wrong conclusions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into named sections (Purpose/Usage/Response/Rules) with the main purpose front-loaded in the first sentence. It is long, but each section earns its place — especially the Rules block, which contains four distinct hard-won operational warnings. It loses one point for a mild redundancy between the opening sentence and [Purpose] restating overlapping terms.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the [Response] section defines the filings[] structure, the nine inner sections, ordering (newest first), date semantics (corrected filings can carry an amended date outside the requested window), and raw string values with '-' fields omitted. Combined with safety disclosures covered by annotations and a schema that documents every parameter, nothing predictable for the agent is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself is unusually detailed (start date = original filing acceptance date, limit cut at filing level not row level, statement_type supports single/enum/array/alias/Korean names). The description adds marginal meaning beyond that: a concrete natural-language usage example ('대한항공 유상증자 조건' → corp='대한항공', statement_type='equity') and the note that widening the date window costs nothing. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair: the tool retrieves 6 types of key information from securities registration statements (모집·매출 조건, 인수인, 자금 사용목적, 합병·분할 조건) as structured JSON. It also differentiates itself from siblings by naming get_corporate_event, search_disclosures(kind="issuance"), and download_document as the tools for adjacent needs, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [Purpose] section explicitly routes three alternative situations: board decision → get_corporate_event, listing scan → search_disclosures(kind="issuance"), narrative/investment-risk → download_document. The [Rules] section adds the other side, stating when results must not be trusted (withdrawn filings unmarked, 사모·일괄신고서·소액공모 out of scope), leaving no ambiguity about when this tool is the right one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usage_statsARead-onlyIdempotentInspect
MyDART MCP의 get_usage_stats 도구는 도구 사용량 집계를 반환합니다 — 어떤 도구가 얼마나 쓰였는지.
[Purpose]
Per-tool call counts·popularity·latency·error rate·cache hits, plus daily trends.
[Usage]
"사용량 통계 보여줘" → {} (default 30 days)
"최근 90일 도구별 순위" → days=90
"전체 기간 누적" → days=0
[Response]
Common: { period, overview:{total_calls, unique_users, error_rate}, by_tool:[{tool, calls, errors, avg_ms, cache_hits, cache_hit_rate, share_pct}], by_day[] }
Operator identity (local stdio, or the HTTP key matching the server operator's) additionally gets by_company·users·viewer — decided by requester identity, NOT selectable by parameter.
[Rules]
public responses have no by_company / per-user detail — do not promise them to general callers.
Local stdio may show total_calls>0 with unique_users=0 (single local user — not a contradiction).
error_rate is a 0~1 decimal; share_pct is a percentage — different units.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing window in days. 0 = the entire retained period. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/destructive annotations, the description discloses critical behavioral nuances: response content depends on requester identity (operator gets extra fields, public callers don't), local stdio may show total_calls>0 with unique_users=0, and error_rate uses a 0-1 decimal while share_pct is a percentage. These are non-obvious but essential for correct interpretation, making the tool much safer to use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear [Purpose], [Usage], [Response], and [Rules] sections, front-loading the core purpose. Though verbose, every section adds necessary detail for a tool with conditional behavior; a slight over-length is justified by complexity, but it could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining response structure, which it does thoroughly: including common fields, conditional operator-specific fields, and important rules about units and edge cases. An agent has everything needed to call the tool and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully explains the 'days' parameter (trailing window, 0=entire period, default 30). The description adds only usage examples, not new semantic meaning. With 100% schema coverage, the description's contribution here is minimal, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns tool usage aggregates ('도구 사용량 집계를 반환합니다') and specifies exactly what metrics are included: per-tool call counts, popularity, latency, error rate, cache hits, and daily trends. This is distinct from sibling tools focused on financial data, audits, or documents, leaving no ambiguity about its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [Usage] section provides three concrete examples mapping natural language requests to parameter values: default 30 days, days=90 for recent trends, and days=0 for all-time cumulative. While it doesn't explicitly contrast with alternatives, no sibling tool serves this purpose, and the examples give clear when-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_valuation_dataARead-onlyIdempotentInspect
MyDART MCP의 get_valuation_data 도구는 가치평가 데이터(시장 시계열·WACC·유사회사)를 kind 로 골라 조회합니다.
[Purpose]
평가기준일 시세·β checks, WACC build-up, peer comps.
Evidence, not adoption — the 평가자 decides; all components overridable.
재무수치: get_financials; 업종(KSIC)·시장구분: get_company_profile.
[Usage]
"에스에프에이 최근 1년 주가" → kind="market", corp="에스에프에이"
"반도체장비 업종 피어 멀티플" → kind="peers", ksic="29271"
[Response]
Units: *_pct = annual %, but mrp·srp·tax_rate = decimals (0.08 = 8%); close = 무수정주가, flt_rt = 등락률 %.
wacc_pct is null when 신용등급 미공시 while 차입 exists — nothing is assumed.
[Rules]
Compute market returns from flt_rt, never by differencing close (breaks at 액면분할·병합).
aggregates n differs per metric (EBITDA often missing) — never quote a mean without n.
peers is a KSIC candidate list the 평가자 curates; too few peers relax the prefix 5→4→3 — prefix_depth_used shows 업종 동질성 dilution.
Cite the response's source·as_of verbatim (조서 정합) — 금투협 시가평가·한공회 가이던스·ECOS·금융위 시세.
ALWAYS read notes[] — 강등·폴백·주의 accumulate there.
| Name | Required | Description | Default |
|---|---|---|---|
| kd | No | [wacc] Kd given directly (annual %, 세전) — overrides credit_rating·kd_tenor | |
| yq | No | [wacc·peers] 평가기준 분기 (e.g. 2026Q2 — lowercase q accepted). Default: latest snapshot | |
| end | No | [market] End date (default: latest 적재일). 구 `to` 도 받는다 | |
| mrp | No | [wacc] MRP override (decimal, e.g. 0.08). Default 0.08 = midpoint of the 한국공인회계사회 가이던스 range (7~9%) | |
| srp | No | [wacc] SRP override (decimal) — bypasses 분위 판정 | |
| corp | No | 회사명·종목코드·corp_code. market=individual 종목 시세 (kind=market requires exactly one of corp | index | rate_series), wacc=REQUIRED (the subject company), peers=target (동업종 auto-selected). The legacy keys `code`/`stock_code` are absorbed into this argument | |
| freq | No | [market] Resampling frequency of the series — daily (default)·weekly (금요일 마감)·monthly (월말). Resampled rows drop flt_rt and carry period_return_pct instead (flt_rt compounded over the bucket, %), so returns still come from that field, never from close deltas | |
| kind | Yes | What to fetch — market=시세·지수·금리 time series / wacc=WACC components + CAPM build-up / peers=동업종(KSIC) peer multiples·무차입β·자본구조. Each kind takes a different argument set; an argument that does not apply is reported as an error naming every argument that kind DOES accept, never silently ignored. An unrecognized key is rejected the same way (additionalProperties:false), so a typo surfaces instead of being dropped. | |
| ksic | No | [peers] KSIC 업종코드 given directly (instead of corp — useful for 비상장 targets). e.g. '26410' | |
| index | No | [market] 시장지수 — kospi·kosdaq (aliases such as KOSPI/코스피 accepted). Mutually exclusive with corp·rate_series | |
| limit | No | [market·peers] Return cap — market default 600 (1~3000), peers default 15 (3~50) | |
| start | No | [market] Start date YYYYMMDD·YYYY-MM-DD (default: one year before `end`). 구 `from` 도 받는다 | |
| exclude | No | [peers] Exclusion rules — spac·reit (default)·loss(LTM 순손실)·financial(KSIC 64~66). A bare string is also accepted | |
| kd_tenor | No | [wacc] Kd(타인자본비용) tenor (default 5y) | |
| rf_tenor | No | [wacc] Rf(무위험이자율) tenor (default 10y) | |
| tax_rate | No | [wacc·peers] 한계법인세율 (default 0.264 = 24%×1.1) | |
| beta_spec | No | [wacc] β spec — 2w=2년 주간 (default, 실무 관행), 5m=5년 월간 | |
| size_band | No | [peers] Multiple range around the target's 시총 (e.g. 10 = 1/10~10x; min 2). Only honoured when corp is given | |
| target_de | No | [wacc] Target 자본구조 D/E (시가). If omitted, the snapshot's 실측 value is used | |
| srp_scheme | No | [wacc] 규모위험 프리미엄(SRP) 분위체계 (default quintile) | |
| rate_series | No | [market] 시장금리 — ktb1y~ktb50y(국고채)·corp_aa_3y·corp_bbb_3y(회사채 3년)·cd91. Mutually exclusive with corp·index | |
| equity_basis | No | [wacc] Definition of E(자기자본 시가) (default outstanding_plus_nci) | |
| include_pref | No | [wacc] Add 우선주 시총 into E (default true) | |
| credit_rating | No | [wacc] 신용등급 used to derive Kd (무보증 공모회사채, 금투협 시가평가 전 등급). Mid-notches are written with 0, NOT bare: AA0·A0·BBB0. If omitted the 정기보고서 공시등급 is picked up automatically; where none is disclosed Kd is left uncomputed rather than assumed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already show readOnlyHont true and destructiveHont false, and the description does not contradict them. It adds substantial behavioral and response semantics: *_pct are annual percentages while mrp·srp·tax_rate are decimals, close is unadjusted price, wacc_pct is null when credit rating is undisclosed, returns must be computed from flt_rt not close deltas, aggregates have varying n, and notes[] accumulate downgrades and fallacks. These are exactly the traits an agent needs beyond annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized under [Purpose], [Usage], [Response], and [Rules] headings, with the core selection mechanism front-loaded. Every section carries operational information; examples are concise and rules are dense but each earns its place for a 24-parameter, multi-kind tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-parameter tool with no output schema, the description covers argument routing, output units, null semantics, aggregation caveats, evidential citation, and note-readding. It stops short of enumerating the full response shape per kind, so an agent must infer some return fields, but the provided units and rules substantially compensate for the missing output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% per-parameter coverage with kind-scoped descriptions, so the baseline is 3. The description adds value beyond the schema by turning natural-language intents into kind/corp/ksic mappings, explaining override semantics, and clarifying output-pfield units and null behavior like wacc_pct. It does not repeat the schema, but it does help select parameter values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: it calls out that valuation data (market time series, WACC, peers) is selected by kind, and immediately differentiates from siblings by saying financials go to get_financials and KSIC/market classification to get_company_profile. This makes the tool's place among 15 siblings clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [Usage] section gives two explicit intent-to-parameter mappings (e.g., '에스에프에이 최근 1년 주가' → kind='market', corp='에스에프에이'), and the [Purpose] section explicitly routes financial figures to get_financials and industry/market classification to get_company_profile. It also tells agents the tool is evidence, not adoption, so they know not to treat outputs as final conclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_audit_findingsARead-onlyIdempotentInspect
MyDART MCP의 search_audit_findings 도구는 회사를 지정하지 않고 감사보고서 조건으로 상장사 목록을 찾습니다.
[Purpose]
List/aggregate: "의견거절 회사"·"내부회계 취약점 목록"·"○○회계법인 감사 회사".
Detail: get_audit_profile/get_internal_control; 원문: get_audit_report.
[Usage]
"FY2024 코스피 의견거절 회사" → year=2024, market="kospi", opinion="disclaimer"
목록·집계만 필요 → fields="brief" (산문 제외·행 1/12)
"24~25년 ICFR 취약점" → year=[2024,2025] (다년 — coverage.years[] 로 연도별 적재 확인)
[Response]
Output market Y=코스피/K=코스닥/N=코넥스; fs_div is KOREAN "연결"/"별도".
[Rules]
READ coverage.note FIRST — empty result over a non-ingested scope = "not seen", never "does not exist".
fs_div=both(default) → ≤2 rows/company: row count ≠ company count (dedupe by corp_code).
breakdown = population baseline in scope(year/market/fs_div) — finding filters ignored, scope ones not; ≠ count.
ICFR undetected:
noteONLY on 연결(CFS) — "legitimately absent (<2조)" vs "expected-audit-but-missing"; 별도(OFS) has expected_type (or expected_type_note).
| Name | Required | Description | Default |
|---|---|---|---|
| kam | No | Whether 핵심감사사항(KAM) are present | |
| year | Yes | 결산 사업연도 (회계연도, fiscal year) — the number you pass IS the 사업연도=회계연도=결산연도. Do NOT subtract it; pass it as-is. Only tools where year is optional auto-select the latest published year when omitted (if year is required in the tool you are calling, it cannot be omitted — confirm the year actually used via the response `year` field).e.g. 'FY2025'·'2025년 재무제표'·'2025 사업보고서'·'2025 회계연도' → all 2025 (결산일 2025-12-31). Convert ONLY when the user explicitly names the 공시(제출)연도, as in '○○년에 공시된 보고서': a 12월 결산법인 files by the end of March of the following year.(e.g. '2026년에 공시된 사업보고서' → 2025). Otherwise the input is ALWAYS on a 사업연도=회계연도=결산연도 basis. Relative expressions ('최근 N개년'·'작년' and the like) count back from the most recent PUBLISHED 사업연도 as of today: a 사업보고서 is filed within about 90 days after 결산 (12월 결산 법인 → March of the following year), so from April the latest is last year, and in Jan~Mar it is the year before last. e.g. if today is 2026-06 the latest is FY2025 → '최근 5개년'=2021~2025 (NOT 2020~2024). Supported floor is FY2015 (the range OpenDART's structured APIs cover) — 2014 and earlier are rejected. A 비12월 결산 (3·6·9월) 법인 may have its latest 사업연도 equal to the calendar year (e.g. a 3월 결산 company from July onward). Accepts a single year OR an array (e.g. [2024, 2025], max 10) for a multi-year query — rows then carry their own bsns_year and `coverage` returns a per-year breakdown (coverage.years[]). | |
| limit | No | Cap on **rows** returned (SQL LIMIT applies to rows, not companies — with the default fs_div=both a company can occupy 2 rows, so the number of distinct companies shown is smaller than this cap). When the list is cut here, truncated=true while count still reports the full row count. To count companies, dedupe companies[] by corp_code — and if truncated=true that count is a floor, not the answer: narrow the scope (market·fs_div·asset_bucket) until truncated=false. | |
| fields | No | Field width of each company row. full(default)=every field, incl. the 본문 산문 (의견근거·강조·기타·계속기업 text, KAM 제목 배열, ICFR 근거·취약점, applicability) — averages ~3,957 bytes/row. brief=list axis only, the same set as the 뷰어 스크리너 표: corp_name·corp_code·stock_code·bsns_year·market·fs_div·auditor·audit_opinion·going_concern·emphasis·other_matter·icfr{type,opinion}·kam_count·rcept_no (~318 bytes/row, 12x smaller — a whole 목록 fits in one response). Use brief for list/count asks and switch to full (or get_audit_report/get_internal_control) once a company is picked. coverage·breakdown·count·truncated are identical in both. | full |
| fs_div | No | 재무제표 구분. CFS=연결, OFS=별도 (aliases consolidated/separate·연결/별도 also accepted). 별도 and 연결 are SEPARATE rows (의견·강조·KAM·ICFR are all held per 별도/연결). both = both (up to 2 rows per company), so row count ≠ company count — dedupe by corp_code when counting companies. | |
| market | No | 시장구분. Default all = every 상장사 (유가 kospi·코스닥 kosdaq·코넥스 konex are all loaded). Uppercase (KOSDAQ) and 한글 (코스닥/유가증권/코넥스/전체) aliases accepted. | |
| auditor | No | Partial match on 감사인명 (e.g. 삼정/한영/안진/삼일) | |
| opinion | No | 감사의견 filter. unqualified=적정, qualified=한정, adverse=부적정, disclaimer=의견거절, modified=변형의견 (everything other than 적정: 한정/부적정/의견거절). 한글 values (적정·의견거절 etc.) also accepted. | |
| emphasis | No | Presence of 강조사항(EoM) | |
| industry | No | 업종 — financial=금융 (KSIC 64~66: 은행·보험·금융지주 etc.), non_financial=비금융. The 주석 XBRL and ICFR 운영의무 thresholds differ between them. 한글 values (금융·비금융) also accepted. | |
| asset_bucket | No | Size bucket by 전기말 자산총액(별도). gte_2tn=2조이상, gte_500bn=5천억이상, gte_100bn=1천억이상, lt_100bn=1천억미만. 한글 values also accepted. | |
| icfr_opinion | No | 내부회계관리제도 의견. adverse=부적정, disclaimer=의견거절 (covers both 감사 의견거절 and 검토 검토결론 불표명 — use icfr_type to tell 감사 from 검토), modified=변형 (everything other than 적정). 한글 values also accepted. | |
| kam_required | No | Whether KAM disclosure was mandatory by 규모·연도·시장 (적용시기 rules). kam=false & kam_required=true & kam_none_declared=false = suspected omission | |
| other_matter | No | Presence of 기타사항(OM) | |
| going_concern | No | 계속기업 불확실성 mentioned in the 감사보고서 | |
| xbrl_required | No | Whether 재무제표 주석 XBRL was mandatory for that year (적용시기 rules). Populated only after the backfill | |
| include_reference | No | Whether to include the 적용시기 참조표 (full phase-in schedule for KAM·ICFR·XBRL 주석·자금부정통제, about 4.8KB). Each company row already carries its own verdict in the applicability field, so set true ONLY when you need the 법령 근거 text behind that verdict. | |
| kam_none_declared | No | Whether the 감사보고서 explicitly declares '보고할 핵심감사사항 없음'. true=declared (kam_count=0 is then normal), false=undeclared or unknown. Combine with kam_count=0 to separate a genuine suspected omission from a declared absence | |
| icfr_material_weakness | No | A 내부회계관리제도 중요한 취약점 exists |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only, idempotent, and non-destructive. The description adds important behavioral rules beyond that: coverage.note must be read first, empty results over non-ingested scopes mean 'not seen' not 'does not exist', fs_div=both produces up to 2 rows per company, and ICFR absence semantics differ between 연결 and 별도. No annotation contradiction is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense and well-structured with Purpose, Usage, Response, and Rules sections. Every section earns its place: examples are actionable, the response conventions prevent misreading output codes, and the rules prevent costly misinterpretations like treating missing coverage as nonexistence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter tool with no output schema, this description is remarkably complete. It covers the tool's role, concrete invocation patterns, response format conventions, coverage caveats, row-count pitfalls, and ICFR-specific edge cases. The schema handles the remaining parameter detail, so nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 19 parameters; the baseline is 3. The description adds genuine value by giving parameter-usage examples, recommending fields='brief' for list/count asks, explaining multi-year arrays via coverage.years[], and clarifying fs_div row implications. It does not need to restate every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it finds listed companies by audit report conditions without a company name. The [Purpose] section names concrete use cases and explicitly routes detail work to get_audit_profile/get_internal_control and raw text to get_audit_report, making sibling differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: list/aggregate queries belong here, while detail and original-text queries belong to named sibling tools. Numbered examples map natural-language requests to concrete parameter values, so an agent knows exactly how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_disclosuresARead-onlyInspect
MyDART MCP의 search_disclosures 도구는 DART 공시 목록에서 접수번호(rcept_no)를 찾습니다 — download_document·get_attachments 진입점.
[Purpose]
사업보고서 섹션 데이터는 get_periodic_report, 동명 회사는 find_corp_code 로 corp_code 확정.
[Usage]
"삼성전자 최근 한 달 공시" → corp="삼성전자", days=30
"작년 유상증자 결정 전부" → preset="rights_offering", start="2025-01-01", end="2025-12-31"
[Response]
corp_cls: Y=코스피, K=코스닥, N=코넥스, E=기타(비상장).
report_nm [기재정정]/[첨부정정]/[첨부추가] prefix = 정정공시.
[Rules]
Always pass corp when a company is named — corp-less searches (page mode too) split into 90-day chunks, batch request budget 60; with corp: 1 request.
Counters nest: total_available ≥ total_fetched ≥ matched ≥ returned; matched > returned = cut by limit, incomplete=true = partial (see incomplete_note). collected_periods = the only ranges queried; counters scope to them, the rest is unchecked, not zero.
early_stopped:true = limit filled, rest unfetched — matched is a lower bound.
Preset batch drops 정정공시; page mode·bare all_pages keep them.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End date (defaults to today) | |
| corp | No | 회사명/종목코드/corp_code. Omit for all companies — but a batch without corp splits the period into 90-day chunks and sweeps every company, spending up to the per-call request budget (default 60, env SEARCH_MAX_REQUESTS) and taking tens of seconds; on reaching it collection is truncated and flagged incomplete=true. With corp the split disappears and the same query finishes in 1 request and a few hundred ms. | |
| days | No | Trailing N days from today instead of start (1~730; out-of-range values are clamped to the bound). When unset, the preset default applies: 사업·감사 460 / 반기 280 / 분기 180 / 수시·일반 90. For windows longer than 730 days use start/end | |
| kind | No | 공시유형: periodic/major/issuance/holdings/audit/other/fund/abs/exchange/ftc | |
| page | No | Page number (page mode — the default when neither preset nor all_pages is set). Row shape differs by mode: page mode items are raw DART list rows, batch mode items a 7-key projection (rcept_no·rcept_dt·corp_name·corp_code·corp_cls·report_nm·flr_nm), so any field outside those 7 is only in page mode. | |
| size | No | Page size (page mode) | |
| limit | No | Cap on rows finally returned in batch mode (preset given or all_pages=true) | |
| start | No | Start date YYYY-MM-DD. When omitted, `days` back from today (and when that is unset, the preset default: 사업·감사 460 / 반기 280 / 분기 180 / 수시·일반 90) — set it explicitly for older filings. (The old parameter name begin is still accepted — unified with start/end in get_corporate_event.) | |
| preset | No | 22 presets: treasury_buy/sell/trust · cb/bw/eb_issue · rights_offering/bonus_issue/capital_reduction · merger/split/stock_exchange · business_transfer/acquisition · large_holding_5pct · annual_report/half_report/quarterly_report · audit_report · correction_all · insolvency · litigation. Setting one applies kind and a keyword filter automatically and collects every page in parallel. | |
| all_pages | No | Collect the whole period in parallel even without a preset (정정공시 included — the same set as page mode). When true, limit applies instead of page/size. | |
| final_only | No | One latest version per event — where a 정정 exists the 구본(원본) is dropped and the latest 정정본 is taken (this does NOT exclude 정정공시 themselves). Use when you need one duplicate-free set. | |
| concurrency | No | Collector workers in batch mode (1~10, default 5). **Effective concurrency is set by a server-wide cap, so raising this usually does NOT make it faster** — to cut latency, set corp (which removes the period split, leaving a single request), narrow the period, or lower limit. The response's dart_requests/cached_chunks report how many DART requests this call spent and how many chunks came from cache — read them when it feels slow. | |
| include_corrections | No | Whether to include 정정공시 ([기재정정] etc.) — preset batch mode ONLY (default false, to avoid double-counting 원본+정정 of the same event; correction_all forces true; ignored when final_only=true since that already removes duplicates). Bare all_pages and page mode ALWAYS include them (raw DART) — for latest-only without duplicates use final_only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and non-destructive, so the description goes beyond them by disclosing batch behavior, 90-day chunking, the request budget of 60, counter nesting semantics, early_stopped implications, and correction-disclosure handling. This is rich behavioral context that materially affects how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly structured with Purpose, Usage, Response, and Rules sections, each earning its place. For a tool with 13 optional parameters and subtle batch-mode behaviors, the density is justified and the most critical operational rules are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the response codes (corp_cls, report_nm correction prefixes) and the exact meaning of counters like total_available, matched, returned, incomplete, and early_stopped. It covers the non-obvious result-interpretation traps an agent would otherwise miss, making the definition complete for correct invocation and result understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents each parameter in detail. The tool description adds usage examples for corp/days/preset/start/end and stresses the corp parameter's performance implications, but it does not substantially define parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise job: find rcept_no in the DART disclosure list and serve as the entry point to download_document/get_attachments. It also distinguishes itself from get_periodic_report and find_corp_code, so an agent can tell it apart from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [Purpose] section explicitly routes business-report section data to get_periodic_report and same-name company resolution to find_corp_code, giving clear when-not-to-use guidance. The [Usage] examples translate natural-language requests into concrete parameter choices, and the [Rules] section adds operational conditions such as always passing corp when a company is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user or an account that owns the GitHub organization, then choose Claim with GitHub.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Search company disclosures and financial statements from the Korean market. Retrieve stock profile…
Korean + US market data for AI agents: DART, Korean prices/screeners, SEC EDGAR, 13F. Free tier.
Korean fact-verification tools for AI agents: business registration, address, DART, apt prices, laws
Korean equities in English: DART filings, activist & foreign-holder classification, KRX news.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered analysis of Korean stock market data and corporate disclosures using official DART and KRX APIs.248ISC
- AlicenseAqualityCmaintenanceProvides tools for discovering, downloading, parsing, and searching Korean DART financial reports, enabling AI assistants to access Open DART data through structured tools.62MIT
- AlicenseAqualityBmaintenanceProvides 15 tools covering OpenDART 83 APIs for disclosures, financials, equity, XBRL, plus insider signals, accounting risk scores, and Buffett-style quality checklists, and converts HWP/PDF attachments to markdown for AI assistants.1532796MIT
- AlicenseNot gradedqualityDmaintenanceAnalyzes corporate financial information using Korea's DART API, supporting financial statements, ratios, news sentiment, and portfolio optimization.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Every tool targets a distinct aspect of the DART disclosure domain: full text, attachments, financial figures, audit facts, audit narrative, ICFR, going concern, company profile, events, periodic report sections, XBRL, valuation, usage stats, and two search entry points. Overlaps are resolved by explicit cross-references and clear purpose statements (e.g., get_audit_profile vs get_audit_report vs get_internal_control). No ambiguity remains.
All 16 tools follow a consistent snake_case verb_noun pattern, with get_ for data retrieval, search_ for list queries, find_ for ID resolution, and download_ for the one document fetch. There is no mixing of camelCase, action words, or stylistic inconsistency. The pattern is immediately predictable.
16 tools is slightly above the typical 3–15 range but fully justified by the breadth of DART (Korea's electronic disclosure system) – covering company lookup, filings, financials, audit reports, internal control, going concern, events, periodic reports, attachments, XBRL, valuation, and usage stats. Each tool address a distinct functional need, and no tool feels redundant or extraneous. The scope is comprehensive yet not bloated.
The tool surface covers the full lifecycle of disclosure data access: finding entities (find_corp_code), locating filings (search_disclosures), retrieving financials (get_financials, get_xbrl), reading full text (download_document), fetching attachments (get_attachments), and drilling into audit-related details (get_audit_profile, get_audit_report, get_internal_control, get_going_concern). Periodic report sections (28 types) and corporate events cover governance and capital changes. No obvious dead ends or missing critical operations for a read-only disclosure access server.