koreafilings-mcp
This server is a Korean corporate filings API that lets agents freely discover companies and filings, then pay per-call (via x402/USDC) for AI-generated English summaries of DART disclosures.
find_company – Free search for KRX-listed companies by Korean/English name or ticker (e.g., "삼성전자", "Samsung Electronics", "005930") to resolve a ticker.
list_recent_filings – Free browse of recent DART filings market-wide, returning metadata only (receipt numbers, tickers) so you can decide what to pay for.
get_pricing – Free call showing the x402 wallet, network, USDC contract, and per-endpoint prices.
get_recent_filings – Paid (0.005 USDC × limit) fetch of AI English summaries for a specific KRX ticker, with on-chain settlement tx hash.
get_disclosure_summary – Paid (0.005 USDC) fetch of a single AI summary for a known 14-digit DART receipt number.
Summaries include English summary text, importance score, event type, sector/ticker tags, and actionable audience.
Supports agent workflows: resolve company → fetch paid summaries; all payments settle on Base mainnet via x402.
Korea Filings
An HTTP API that turns Korean corporate disclosures (DART · 전자공시) into machine-ready English. The filing feed is free — browse the market or watch a single ticker and get English company names, English filing types, importance scores and links to the DART original, with no wallet, no API key and no signup. Paid calls buy the explanation: an AI summary of what a specific filing actually says, 0.005 USDC over Base via x402. Built for autonomous AI agents and indie agent builders who need diverse data sources and prefer pay-per-call to subscriptions.
Korean financial data is the surface we ship today, but the value propositions that drive adoption are pay-per-call instead of monthly contracts and standard x402 instead of bespoke auth — the same shape would apply to any other public-records API. No API key, no signup, no procurement loop.
Live: https://koreafilings.com · API at
https://api.koreafilings.com · interactive docs at
/swagger-ui.
What it does
Raw DART data is free, but it's in Korean and structured for human filings clerks, not LLMs. Korea Filings turns every disclosure into a structured, cached, English-summarised JSON payload — agents resolve a Korean company by name for free, then fetch a batch of summaries for that ticker in one paid x402 call. The summary is built from the filing body itself (not just the title), so quantitative events come back with the actual amounts, dilution percentages, counterparty names, and effective dates extracted from the Korean source. Two examples — a light governance event and a quantitative capital-raise:
{
"rcptNo": "20260424900874",
"summaryEn": "Global SM's stock trading was suspended at 09:00 KST on April 24, 2026, pending an updated electronic registration tied to a planned 1-for-2 stock consolidation. The suspension follows a board resolution dated April 21; trading resumes April 26 once the registration completes. Existing shareholders' record positions are unaffected.",
"importanceScore": 8,
"eventType": "TRADING_SUSPENSION",
"sectorTags": ["Capital Goods"],
"tickerTags": ["095440"],
"actionableFor": ["traders"],
"generatedAt": "2026-04-24T08:47:51Z"
}A quantitative event — Samsung Electronics dividend decision, returned verbatim from a live Base mainnet paid call (settled on-chain):
{
"rcptNo": "20260430800106",
"summaryEn": "Samsung Electronics decided on a quarterly cash dividend of KRW 372 per common share and KRW 372 per preferred share, totaling KRW 2,453,315,636,604. The dividend yield is 0.2% for common shares and 0.3% for preferred shares. The record date is March 31, 2026, with payment scheduled for May 29, 2026.",
"importanceScore": 7,
"eventType": "DIVIDEND_DECISION",
"sectorTags": ["Technology Hardware & Equipment"],
"tickerTags": ["005930"],
"actionableFor": ["traders", "long_term_investors"],
"generatedAt": "2026-05-06T07:29:45.911215Z"
}The cache is the moat — the first agent to request a disclosure pays
the LLM cost; every subsequent agent for the same rcpt_no hits a
near-zero-cost DB lookup and still pays the same flat 0.005 USDC per
summary. Batch by-ticker calls hit the same cache row-for-row, so a
five-summary call is five cache lookups against one transferred
USDC payment. Margins compound as adoption grows.
Related MCP server: DART 공시 브리핑 MCP 서버
How to use it
Pick whichever surface fits your stack. All three speak the same x402
flow under the hood; the wallet that signs the PAYMENT-SIGNATURE header is
the identity. No API keys. No signup.
TypeScript SDK
npm install koreafilingsimport { KoreaFilings } from 'koreafilings';
const client = new KoreaFilings({
privateKey: process.env.PAYER_PRIVATE_KEY as `0x${string}`,
network: 'base',
});
// 1. Free — Korean / English company name → six-digit KRX ticker
const matches = await client.findCompany('Samsung Electronics');
const ticker = matches[0]!.ticker; // "005930"
// 2. Paid — 0.005 × limit USDC, settled via x402 in one round-trip
const filings = await client.getRecentFilings(ticker, 5);
for (const f of filings) {
console.log(`[${f.importanceScore}/10] ${f.eventType}: ${f.summaryEn}`);
}
console.log('paid:', client.lastSettlement?.transaction);Sources for TypeScript / JavaScript callers — works in Node 18+, the
browser, Cloudflare Workers, and Vercel Functions. Full SDK docs in
sdk/typescript/README.md.
Python SDK
pip install koreafilingsfrom koreafilings import Client
with Client(private_key="0x...", network="base") as client:
# 1. Free name → ticker resolution
matches = client.find_company("Samsung Electronics")
ticker = matches[0].ticker # "005930"
# 2. Paid batch summary fetch (0.005 × limit USDC)
filings = client.get_recent_filings(ticker, limit=5)
for f in filings:
print(f"[{f.importance_score}/10] {f.event_type}: {f.summary_en}")
print("paid:", client.last_settlement.tx_hash)MCP server (Claude Desktop, Cursor, Continue, …)
uv tool install koreafilings-mcpIn your MCP client's config:
{
"mcpServers": {
"koreafilings": {
"command": "uv",
"args": ["tool", "run", "koreafilings-mcp"],
"env": {
"KOREAFILINGS_PRIVATE_KEY": "0x...",
"KOREAFILINGS_NETWORK": "base"
}
}
}
}Five tools become available — three free for discovery, two paid:
find_company(query)— free; trigram fuzzy search of 3,961 KRX-listed companies by Korean name, English name, or ticker.list_recent_filings(limit)— free; market-wide recent DART feed (metadata only — let the agent decide what to pay for).get_pricing()— free; live wallet, network, USDC contract, per-endpoint price.get_recent_filings(ticker, limit)— paid 0.005 × limit USDC; batch AI summaries for one ticker, with the on-chain settlement transaction hash.get_disclosure_summary(rcpt_no)— paid 0.005 USDC; single AI summary for a known receipt number.
The natural agent flow is find_company → get_recent_filings:
one free call to resolve a name to a ticker, one paid call to fetch
summaries for that ticker.
curl / direct HTTP
# 1) Resolve a company name to a ticker. Free, no wallet needed.
curl 'https://api.koreafilings.com/v1/companies?q=Samsung+Electronics&limit=1'
# HTTP/2 200
# { "matches": [{ "ticker": "005930", "nameKr": "삼성전자",
# "nameEn": "SAMSUNG ELECTRONICS CO.,LTD.",
# "market": "KOSPI", ... }] }
# 2) Probe the paid endpoint without payment — server tells you the
# exact USDC amount it wants for `limit=N` summaries.
curl -i 'https://api.koreafilings.com/v1/disclosures/by-ticker?ticker=005930&limit=3'
# HTTP/2 402
# payment-required: <base64 PaymentRequired payload, amount = 15000>
# { "x402Version": 2, "accepts": [{ "scheme": "exact",
# "amount": "15000", "asset": "USDC", "payTo": "0x8467…",
# ... }], ... }
# 3) Sign an EIP-3009 TransferWithAuthorization for one of the entries
# in `accepts`, base64-encode the signed PaymentPayload, and resend
# with the PAYMENT-SIGNATURE header (x402 v2 transport spec).
# See testclient/payer.py for a ~150-line reference implementation.
curl -H "PAYMENT-SIGNATURE: $SIGNED" \
'https://api.koreafilings.com/v1/disclosures/by-ticker?ticker=005930&limit=3'
# HTTP/2 200
# payment-response: <base64 SettlementResponse with tx hash>
# {
# "ticker": "005930",
# "chargedFor": 3, # what the agent paid for (`limit`)
# "delivered": 3, # how many summaries were actually returned
# "count": 3, # alias of `delivered` for older clients
# "summaries": [ { "rcptNo": "...", "summaryEn": "...", ... }, … ]
# }
# `chargedFor` and `delivered` diverge when a ticker has fewer recent
# filings than `limit` or when one of those filings does not yet have
# an AI summary in cache.The flat 0.005 USDC /v1/disclosures/summary?rcptNo=… endpoint is
still there for callers that already have a 14-digit receipt number
— same x402 flow, just amount = 5000 and a single-summary body.
Pricing
Per call, in USDC on Base. Free endpoints (/v1/companies,
/v1/companies/{ticker}, /v1/disclosures/recent) carry no payment
challenge so an agent can browse before paying.
Endpoint | Method | Price (USDC) |
| GET | 0.005 × N |
| GET | 0.005 |
Per-result pricing on the by-ticker endpoint is declared dynamically
in the 402 challenge — for limit=N, the server signs 0.005 × N
USDC into accepts[0].amount so the caller sees the exact charge
before authorising the wallet. The flat-rate single-summary endpoint
stays at 0.005 USDC and is the right shape when a caller already has
a 14-digit receipt number from somewhere else.
The full machine-readable pricing descriptor (current wallet, network,
USDC contract, every paid endpoint) lives at
/v1/pricing; agent-driven
discovery is at
/.well-known/x402.
The same paid-action surface is also exposed in Agent Web Protocol
(AWP) shape at
/.well-known/agent.json,
and a plain-English overview for AI agents lives at
/llms.txt.
Live on Base mainnet via the Coinbase CDP facilitator. Every paid
call settles a real transferWithAuthorization on-chain in a single
hop; the merchant wallet, network, and USDC contract address are all
self-describing through /v1/pricing and /.well-known/x402 so an
agent can verify the destination before signing.
Architecture
Three logical subsystems share one Spring Boot application:
Ingestion — schedules a 30-second poll against the DART Open API, deduplicates by
rcpt_no, persists raw metadata to Postgres, enqueues a summarisation job.Summarisation — consumes summarisation jobs, classifies complexity, routes to Gemini 2.5 Flash-Lite (with Resilience4j rate-limiting + circuit-breaking + retries), persists English summary + ticker / sector tags + audit row to
llm_audit.Paid API — Spring MVC controller behind an
X402PaywallInterceptor. Every request: readPAYMENT-SIGNATURE(or the legacyX-PAYMENTalias for 0.2.x clients), verify the signature with the facilitator, check Redis for replay, settle on a 200 response, and attachPAYMENT-RESPONSEcarrying the on-chain tx hash via aResponseBodyAdvice. If/settlethrows or rejects, the body is rewritten to the x402 v2 settle-failure shape (HTTP 402 with the failure SettlementResponse base64-encoded intoPAYMENT-RESPONSEand an empty body) so a facilitator outage cannot leak paid data unpaid. The interceptor short-circuits for handler methods without@X402Paywall, so/v1/pricing,/.well-known/x402, and the OpenAPI document stay unauthenticated.
The 402 challenge follows the
x402 v2 transport spec:
the PAYMENT-REQUIRED header carries the base64-encoded
PaymentRequired payload (with the bazaar
extension declaring an input/output schema for AI-agent
discoverability), while the body keeps a v1-compatible JSON copy so
older clients keep working.
Stack: Java 21, Spring Boot 3.4, PostgreSQL 16, Redis 7, Docker
Compose, Cloudflare Tunnel, Cloudflare Workers. See
docs/ARCHITECTURE.md for deeper notes.
Repository layout
.
├── src/ # Spring Boot application source
├── sdk/python/ # `koreafilings` Python SDK (PyPI)
├── sdk/typescript/ # `koreafilings` TypeScript SDK (npm)
├── mcp/ # `koreafilings-mcp` MCP server (PyPI)
├── landing/ # Marketing landing page (Cloudflare Workers)
├── testclient/ # Reference Python x402 client (testnet payer)
├── docs/
│ ├── ARCHITECTURE.md # System design
│ ├── PRD.md # Product requirements
│ ├── ROADMAP.md # Six-week launch plan
│ └── STATUS.md # Operator handoff notes
├── Dockerfile # Multi-stage prod build (eclipse-temurin:21)
├── docker-compose.yml # postgres + redis + app + cloudflared
└── build.gradle.kts # Gradle (Kotlin DSL)Local development
git clone https://github.com/OldTemple91/korea-filings-api.git
cd korea-filings-api
cp .env.example .env
# Fill in:
# POSTGRES_PASSWORD (any strong password)
# DART_API_KEY (free, register at https://opendart.fss.or.kr/)
# GEMINI_API_KEY (free tier, https://aistudio.google.com/apikey)
# X402_RECIPIENT_ADDRESS (your receiving wallet — only the address)
docker compose up -d postgres redis
./gradlew bootRunTo exercise a real x402 payment against a local instance, copy
testclient/.env.testclient.example to testclient/.env.testclient,
fill in a wallet's private key (a fresh burner wallet funded with a
dollar or two of Base mainnet USDC is the safe pattern), and run
python testclient/payer.py. For local development against the public
testnet facilitator, point X402_FACILITATOR_URL at
https://www.x402.org/facilitator and use Base Sepolia parameters in
your .env.
Status
Live on Base mainnet with verified on-chain settlement. MVP feature set:
DART real-time ingestion (30-second poll)
Gemini 2.5 Flash-Lite summarisation with importance scoring + sector / ticker tagging
x402 v2 paywall with
bazaarextension for agent-discoverable invocationDiscovery via
/.well-known/x402OpenAPI 3 spec at
/v3/api-docs+ interactive Swagger UIPython SDK (
koreafilings0.3.4) and MCP server (koreafilings-mcp0.3.1) on PyPIFree name → ticker resolution (
find_company) + free recent feed (list_recent_filings) so agents can browse before payingPer-result paid batch endpoint (
/v1/disclosures/by-ticker?ticker=…&limit=N) with 0.005 × N USDC declared dynamically in the 402Indexed by x402scan
Production deploy on a Linux VPS via Cloudflare Tunnel
Coinbase CDP facilitator (Ed25519 JWT auth) for mainnet settlement
Roadmap items in flight:
POST
/v1/disclosures/filter(sector + event-type query)SSE
/v1/disclosures/stream(real-time push)Korean-language landing page
Slack / email alerts on settlement
See docs/ROADMAP.md for the full plan.
Contributing
Issues and PRs are welcome — particularly:
Ports of the Python SDK to other languages (TypeScript, Go, Rust)
Additional analytics endpoints (price reaction, comparable filings, …)
Integrations with non-x402 agent frameworks
Translation of the landing page into other languages
For substantial changes, please open an issue first describing the direction so we can sanity-check fit before you build.
License
MIT.
Available Tools
5 toolsfind_companyA
Search the KRX directory of Korean listed companies. Free.
Use this as the first step when you have a company name (English
or Korean) but not the six-digit KRX ticker. Pass the resulting
ticker to ``get_recent_filings`` (paid) or ``get_disclosure_summary``
(paid, when you also have a specific receipt number).
Args:
query: Company name (English or Korean) or six-digit ticker.
Examples: "Samsung Electronics", "삼성전자", "005930".
limit: Max matches to return (1-50, default 20).
Returns:
A list of company dicts with ``ticker``, ``corp_code``,
``name_kr``, ``name_en``, and ``market`` (KOSPI / KOSDAQ).
Empty list when nothing matches; never raises on no-results.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses it is free, returns a list of dicts, and states behavior on no results ('Empty list... never raises'). Does not mention side effects but no issues expected.
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?
Description is concise with organized sections (intro, usage link, Args, Returns). Every sentence adds value without redundancy.
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 simple tool (2 params, no enums, has output schema), description covers purpose, usage, params, return format, and edge case (empty list). No gaps for the agent.
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 0%, but description adds examples for query (English, Korean, ticker) and specifies limit range (1-50, default 20), providing crucial context beyond 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 clearly states the tool searches the KRX directory for Korean listed companies, specifies the use case (getting a ticker from a company name), and distinguishes from siblings by mentioning passing to get_recent_filings or get_disclosure_summary.
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?
Explicitly says 'Use this as the first step when you have a company name... but not the six-digit KRX ticker.' and provides follow-up usage, though does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_disclosure_summaryA
Fetch the AI-generated English summary of a Korean DART disclosure.
**This tool spends real USDC from the configured wallet** — 0.005
USDC per call as of v0.1, settled on-chain via x402. The wallet
pays only on a successful 200 response; 4xx/5xx failures do not
settle.
Args:
rcpt_no: 14-digit DART receipt number, e.g. ``"20260424900874"``.
You can discover receipt numbers from the DART portal at
https://dart.fss.or.kr/ or from koreafilings.com's listing
endpoints as they come online.
Returns:
A dict with the summary content (``summary_en``), operational
metadata (``importance_score`` 1–10, ``event_type``,
``ticker_tags``, ``sector_tags``, ``actionable_for``,
``generated_at``), and payment proof (``paid_tx``, ``network``,
``payer``). If the server served from its free-tier path the
payment block is absent.
Raises:
RuntimeError: when the SDK rejects the request. The message
distinguishes payment failures (facilitator rejection,
network mismatch, insufficient balance) from other API
errors (404 unknown rcpt_no, 429 rate limit, 5xx upstream).
| Name | Required | Description | Default |
|---|---|---|---|
| rcpt_no | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the real USDC cost, settlement conditions, error handling, and return value structure including payment proof. This exceeds expectations for transparency.
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 sections and front-loaded with purpose and cost warning. It is somewhat lengthy but every sentence serves a clear purpose, earning a 4.
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 one parameter and an output schema, the description covers input, output structure, errors, cost, and use case. It is complete and leaves no gaps for the agent.
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 single parameter rcpt_no is documented with a 14-digit format, an example, and sources for discovery. Schema description coverage is 0%, but the description compensates fully, adding significant meaning.
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 fetches an AI-generated English summary of a Korean DART disclosure. It specifies the resource (disclosure summary) and action (fetch), and is distinct from sibling tools like find_company or get_pricing.
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 explains when to use (need a summary), provides cost and failure details, and tells how to discover receipt numbers. It lacks explicit when-not or alternative tools, but the context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricingA
Fetch the current per-endpoint pricing for koreafilings.com.
This is a free call; it returns the x402 wallet address, network, USDC contract, and the price in USDC for each paid endpoint. Useful to confirm the payer will be settling on the expected chain before spending anything.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the call is free and returns specific fields (x402 wallet address, network, USDC contract, price in USDC). This gives good behavioral context, though it doesn't mention authentication or rate limits, which are likely unnecessary for a free, parameterless call.
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?
Three sentences with no wasted words. First sentence states purpose, second details output, third gives usage guidance. It is appropriately sized and 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?
Given zero parameters and the existence of an output schema (though not shown), the description mentions what the call returns and explains when to use it. It covers the necessary context for a simple tool.
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?
There are no parameters, and schema coverage is 100%, so baseline is 4. The description adds no extra parameter info because none exist, but that's 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?
Description clearly states the tool fetches current per-endpoint pricing for koreafilings.com. The verb 'Fetch' and resource 'current per-endpoint pricing' are specific. Sibling tools are about filings and disclosures, so this tool is distinct.
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?
Description explicitly notes it's a free call and useful for confirming the payer will settle on the expected chain before spending. This implies when to use it, though it doesn't provide explicit exclusions or alternatives. Nevertheless, the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_filingsA
Fetch up to limit AI summaries for one Korean ticker.
**This tool spends real USDC from the configured wallet** — 0.005
USDC × ``limit`` per call (default 0.025 USDC). The wallet pays
only on a successful 200 response; 4xx/5xx failures do not settle.
If you only have a company name, call ``find_company`` first to
resolve the ticker.
Args:
ticker: Six-digit KRX ticker, e.g. "005930" for Samsung Electronics.
limit: Max filings to fetch (1-50, default 5). Each costs 0.005 USDC.
Returns:
A dict with ``ticker``, ``count``, ``summaries`` (each summary
carries the same shape as ``get_disclosure_summary``), and a
``payment`` block with the on-chain settlement tx hash.
Raises:
RuntimeError: on payment rejection or API failure.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden, disclosing real USDC cost (0.005 per filing), payment on success only, return structure including payment tx hash, and RuntimeError on failure.
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?
Every sentence is purposeful: purpose, cost warning, usage hint, parameter descriptions, return shape, error handling. No redundancy or fluff.
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 (paid API with cost, two parameters, custom return), the description covers behavior, cost, error handling, and return shape comprehensively, despite no annotations or rich output schema in prompt.
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?
Despite 0% schema description coverage, the description adds crucial details: ticker format with example, limit range (1-50) and default, and cost per unit, far exceeding schema's plain type info.
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 verb 'Fetch' and resource 'AI summaries for one Korean ticker', distinguishing it from siblings like find_company (resolves name to ticker) and list_recent_filings (likely just lists without costs).
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?
Explicitly advises to call find_company if only a company name is available, providing an alternative. No explicit when-not, but the cost implication implicitly guides against overuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recent_filingsA
Browse recent DART filings across every listed Korean company. Free.
Returns metadata only — no AI summaries — so an agent can decide
which filings warrant a paid call. Each entry includes ``rcpt_no``
(for ``get_disclosure_summary``) and ``ticker`` (for
``get_recent_filings``).
Args:
limit: Max filings to return (1-100, default 20).
since_hours: Look back this many hours (1-168, default 24).
Returns:
A list of filing-metadata dicts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since_hours | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states 'Returns metadata only' implying read-only behavior and mentions 'Free', but it does not explicitly confirm safety, idempotency, or authentication requirements. The description is mostly adequate but lacks explicit transparency on side effects.
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 concise (6 sentences), well-structured with clear sections (purpose, return type, args, returns), and front-loads the primary purpose. Every sentence earns its place, with no fluff.
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 simplicity (2 optional parameters) and the presence of an output schema, the description is adequately complete. It covers metadata-only return and cross-references other tools, providing sufficient context for an agent to use this tool 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 description fully documents both parameters (limit and since_hours) with ranges and defaults, compensating for 0% schema description coverage. This adds meaning beyond the bare input schema, enabling precise agent decisions.
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 that the tool browses recent DART filings for Korean companies and returns metadata only. However, it does not differentiate itself from the sibling tool 'get_recent_filings', which has a similar name and purpose, creating potential ambiguity.
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 hints at a usage flow by referencing get_disclosure_summary for paid calls, but it does not explicitly state when to use this tool versus alternatives like get_recent_filings. It provides some context without clear when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- Added
find_company - Added
get_recent_filings - Added
list_recent_filings
2 tool updates
v0.1.0- First observed
get_disclosure_summary - First observed
get_pricing
TDQS
Scored across 5 tools
Each tool has a broadly distinct role: pricing lookup, company search, free filing metadata browsing, paid ticker-based summaries, and paid receipt-based summary retrieval. The main confusion risk is between list_recent_filings and get_recent_filings, whose names are very similar though their descriptions clearly separate free metadata browsing from paid AI summary generation.
All tools follow a consistent verb_noun pattern: get_pricing, find_company, list_recent_filings, get_recent_filings, get_disclosure_summary. The verbs are standard retrieval actions and the naming is uniform and predictable.
Five tools is well-scoped for this server: pricing discovery, company resolution, free filing browsing, and two paid summary-fetching operations. Each tool earns its place and the server avoids unnecessary bloat.
The core workflow is covered: resolve a company with find_company, browse recent filings for free with list_recent_filings, then fetch paid AI summaries by ticker or receipt number. Minor gaps exist such as no historical filing lookup beyond recent limits and no raw disclosure document access, but these do not break the primary use case.
Maintenance
Related MCP Connectors
Pay-per-call DeFi and macro intel for AI agents. x402 USDC tools via streamable HTTP /api/mcp.
Live financial data MCP: FX, crypto, stocks, news, URL reader. x402 on Base: $0.001/call.
AI-operated. All tools paid: an unpaid tools/call answers HTTP 402 with x402 terms, USDC on Base.
5 pay-per-call SEO tools over MCP. Free discovery, tool calls settle in USDC on Base via x402.
Related MCP Servers
- AlicenseAqualityCmaintenanceKorean crypto market data API for AI agents. Real-time Kimchi Premium (Upbit vs Binance), Korean exchange prices, USD/KRW FX rate. First verified Korean market data MCP server. Pay-per-use via x402 on Base.172MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that searches and filters DART electronic disclosures for Korean companies, enabling AI agents to create investor briefing summaries.-
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server that exposes seven read-only tools for querying Korean public company disclosures from the OpenDART system, returning normalized JSON.MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that retrieves Korean stock fundamentals and financial data from OpenDART, enabling LLMs to access corporate disclosures, financial statements, and dividend information.Apache 2.0