koreanpulse
koreanpulse
Get pinged in English the moment a 5%-rule filing or DART event hits a stock you care about. (Beta — watchlist polling + alert dispatch ship Q3 2026.)
The pitch: We'll watch your KRX tickers in Korean and ping you in English when something material moves — foreign-holder 5%-rule disclosures, Korean activist filings, major DART events. KRX itself, ASIFMA, Wellington and Aberdeen all on record — Korean disclosure flow into English is structurally inadequate. Bloomberg costs $24K/yr and still misses the front page of 전자신문. We translate, classify, and route the same Korean primary sources institutional analysts read into your Discord / Telegram / inbox. Free public daily snapshot at /today (live today); paid Cloud tiers for the workflow (Solo $29/mo, Analyst $79/mo, Desk $249/mo) — lock-in pricing for waitlist; queries + hosted translation are live today, watchlist polling + alert dispatch ship Q3 2026. OSS self-host available for hackers — see Run it yourself.
Status
Pre-alpha (v0.0.0). 7 MCP tools shipped. 181 tests pass. Beta/waitlist tone — watchlist polling + alert dispatch ship Q3 2026. Beta acquisition plan in docs/BETA.md.
Related MCP server: dart-mcp
Why this exists
"Majority of foreign investors find it surprisingly difficult to penetrate the Korean hedge fund market due to its limited accessibility and availability of information in foreign language." — HedgeVista, 2025
"Published information should be made available in both Korean and English for all investors." — ASIFMA Korean Capital Markets Report, 2022
"The Korea Exchange will provide investor relations services to companies that lack the capability, particularly in English." — Wellington Management on Korea Value-Up program, 2025
The English-IR gap is multi-source verified. The triggers below sit on top of it:
2026-04 to 05 retail inflection — Hana × Futu (3.3M HK retail accounts) and Samsung × Interactive Brokers (4.6M global retail) launched direct KRX trading in the last 7 days. ~7.9M foreign retail accounts now wired in, up from ~0 two years ago. May 4 saw a record 3.9T₩ ($2.7B) single-day foreign net-buy on KOSPI+NXT. (Sources: FSC, 주간한국, KED Global)
KOSPI on the MSCI Developed Market watchlist → expected foreign capital inflow
IRC (Investor Registration Certificate) abolished Dec 2023 — foreign account openings accelerated 3–4× vs 2023 baseline (FSC)
Millennium made its first Korean allocation ($250M to Billionfold) in 2025
Korean activist scene maturing (KCGI, Align Partners) + global activists filing in Korea (ValueAct, Elliott)
Korean shipbuilding, HBM, defense, biotech all globally relevant — but Korean-only sourcing
Korean retail rotated heavily out of crypto into KOSPI ($110B left Upbit/Bithumb in 2025)
Bloomberg/FactSet enterprise tier only — indie/SMB tier empty
Who pays
Audience | Plan | Why |
Crypto-native rotator into KOSPI/KOSDAQ | Cloud Solo $29/mo | One Discord channel pinged on watchlist hits — that's the whole job |
Korean diaspora / overseas Korean investor | Cloud Solo $29/mo | English digest of the news they grew up reading, alerts to Telegram |
K-content / EM journalist | Cloud Solo $29/mo | Replaces hours of manual translation, daily English digest |
Boutique fund analyst covering Korea | Cloud Analyst $79/mo | 25 watchlists, 1-year archive search, multiple alert channels, CSV/JSON export |
Paid-research-budget retail trader | Cloud Analyst $79/mo | Saved searches, priority cache, multi-channel alerts |
Boutique long/short desk, small research team | Cloud Desk $249/mo | 3 seats, shared watchlists, Slack/webhook alerts, team archive |
The free daily snapshot at /today (no login, no API key) is the funnel front door — a preview of the daily digest paying customers get pushed to their channel of choice.
Design partner program available for the first 20 named seats — contact us.
Pricing
🚧 Beta — lock-in pricing for waitlist. Solo $29 / Analyst $79 / Desk $249. Queries + hosted translation cache are live today. Watchlist polling, alert dispatch, seat enforcement, and per-tier retention windows ship Q3 2026. Today the only runtime-enforced difference between tiers is the monthly query cap (2K / 15K / 100K); seat counts, watchlist counts, alert-channel limits, and archive-retention windows are paper limits until the polling/dispatch loop lands. Early supporters keep the launch rate — no auto-charge until the workflow ships.
Tier | $/mo | Watchlists | Queries/mo | Archive | Alert channels |
Cloud Solo | 29 | 5 (Q3 2026) | ~2,000 (live) | 30 days (Q3 2026) | 1 Discord or Telegram (Q3 2026) |
Cloud Analyst | 79 | 25 (Q3 2026) | ~15,000 (live) | 1 year (Q3 2026) | Multi (Discord / Telegram / Email) (Q3 2026) |
Cloud Desk | 249 | shared, 3 seats (Q3 2026) | ~100,000 (live) | team archive (Q3 2026) | Slack / webhooks (Q3 2026) |
Annual billing: −20% at launch. 30-day refund.
Enterprise / SLA: contact us. No published price.
Run it yourself (OSS)
Source is AGPL-3.0. Self-hosters can run the MCP server locally with their own DART and OpenAI keys. This path is for hackers and max-privacy users.
OSS self-host | Cloud (Solo / Analyst / Desk) | |
Cost | $0 | $29 / $79 / $249 per month |
Provider keys | your | your |
Local install required | yes ( | yes (same |
Watchlist polling + alerts | not included | Q3 2026 ship target (waitlist) |
Hosted archive | none | Q3 2026 ship target (30 days / 1 year / team archive) |
Hosted translation cache | none | included (cross-tenant cache hits compound, live today) |
Account sync | none | Q3 2026 ship target |
Support | community only (issues/PRs) | priority support on Analyst / Desk |
Best for | hackers, privacy-strict envs, OSS contributors | anyone who'll want the watchlist-to-alert workflow once it ships |
OSS self-host is not in the pricing table above — it's a separate lane. See docs/SELF_HOSTING.md for the install + key wiring. A true HTTP-transport remote MCP (no local install at all) is on the roadmap but not yet shipped.
What it does
7 MCP tools shipped, callable from Claude Desktop / Cursor / any MCP client:
Tool | One-line |
| DART filings real-time + EN translation/summary |
| Activist 5%-rule filings auto-tagged (KCGI / Align / Truston / Anda / Cha / VIP / ValueAct / Elliott) |
| Foreign 5%-rule disclosures (BlackRock / Vanguard / Norges / GIC / Temasek + 15 more) |
| Korean company name → DART corp code |
| KRX 6-digit → DART corp entry |
| etnews / 한국경제 RSS, classified into 16 industries |
| Server info / available tools |
5 more planned (docs/SPEC.md): digest_analyst_reports, monitor_activist_investors, get_ma_pipeline, track_government_policy, summarize_korean_earnings_call.
Differentiation vs incumbents
Bloomberg | FactSet | KED Global | koreanpulse | |
Korean primary source depth | medium | medium | English wire only | deep |
Real-time AI agent integration (MCP) | none | none | none | native |
Indie/SMB pricing | none ($24K+/yr) | none | free (low signal) | $29 / $79 / $249 Cloud tiers (waitlist, lock-in) |
Korean activist / M&A pipeline | weak | weak | reactive | proactive watch (Q3 2026) |
Capacity (DART quota math)
DART caps each API key at 40,000 calls/day (verified 2026-05). We enforce a soft cap at 32,000/day (80%) with DART_DAILY_QUOTA env override.
Filing-list responses go through list_filings_cached() with a freshness-aware TTL (60s for today's window, 1h for ≤6d old, 24h for ≥7d old). Cache hits don't burn DART quota.
Cache hit | Customer ceiling/day | MAU ceiling (12mo mix) |
0% (no filing cache) | 32,000 | ~800 |
70% (3-mo realistic) | 107,000 | ~9,500 |
85% (mature) | 213,000 | ~19,000 |
95% (high reuse) | ~25,000 MAU (DART-limited) | — |
Hard ceiling: ~30,000 MAU per DART key. Second key (separate 사업자등록번호) required beyond that.
Forecast 12mo mix (756 MAU) sits at ~930 DART calls/day = 2.9% of soft quota with 70% cache. ~34× headroom to scale before quota engineering.
See src/koreanpulse/cache.py, src/koreanpulse/dart.py:list_filings_cached.
Roadmap
Live today: queries (DART filings, foreign-holder + activist tracking, industry news), hosted translation cache (Cloud KOREANPULSE_CACHE_MODE=hosted), /today daily snapshot, Lemon Squeezy → D1 license issuance.
Q3 2026 ship targets (waitlist):
Watchlist polling loop (Cloudflare cron +
koreanpulse.alerts)Alert dispatch enforcement (Discord / Telegram / Slack / webhook)
Per-tier limit enforcement: watchlist count, alert-channel count, archive retention, seat count
True HTTP-transport remote MCP (no local install)
Earlier milestones:
W1–2 ✅ project skeleton, FastMCP server, DART client, agentprod integration
W3–4 ✅ MVP:
track_korean_filings,lookup_corp_code,search_korean_industry_news, translation layer with cacheW5–6 ✅ Lemon Squeezy webhook handler skeleton (license auto-issuance)
W5–6 ✅ Cloudflare D1-backed
LicenseStore(replaces in-memory)W7–8 ⏳ Watchlist polling + alert dispatch (Q3 2026 ship target) — wiring
cache-workercron +daily-workercron +koreanpulse.alertsmodule into the watchlist-to-alert workflow that powers Solo / Analyst / Desk. D1 schema and alert-dispatch primitives already shipped; the cron loop is the missing piece.W7–8
digest_analyst_reports,summarize_korean_earnings_callW9–10 Multi-seat / shared watchlists for Cloud Desk
W11–12 First paid customer
Architecture
MCP server — FastMCP (Python), runs on the user's machine over stdio. Zero hosting cost on our side. Cloud customers still install this locally; switching
KOREANPULSE_CACHE_MODE=hostedroutes translation calls (only) to the Worker.Cache Worker (
cache-worker/) — Cloudflare Workers + KV. Holds our OpenAI key, fronts a global translation cache, gates each call behind a license check. Free tier (100K req/day Workers + 100K read/day KV) covers paid traffic until well past $5K MRR.Daily Worker (
daily-worker/) — Cloudflare Workers + KV. Cron-driven/todaydashboard build (KST 16:30 weekdays).Webhook Worker (
webhook-worker/) — Cloudflare Worker + D1 (SQLite). Handles Lemon Squeezy events and/v1/validatefor the Cache Worker. Replaces the old Lightsail/FastAPI/Postgres stack so the operator runs zero servers.Reuses
agentprod— Throttle, Retry, CostTracker.
OSS self-host vs Cloud
Two ways to run the MCP, switched via KOREANPULSE_CACHE_MODE. Both require a local install (pip install koreanpulse + 4-line Claude Desktop config); the difference is whether translation calls go through our Worker or directly to OpenAI from your machine.
|
| |
Local MCP install | required | required (same |
Provider key | your | ours, on the Worker (no OpenAI key on your side) |
Translation cache | local JSONL file | global Cloudflare KV (cross-tenant reuse) |
Per-call cost | OpenAI billed to you | absorbed in your Cloud plan |
Privacy | translation never leaves your machine + OpenAI | translation calls go to our Worker; DART traffic still local |
Best for | hackers, OSS contributors, max-privacy envs | anyone who'll want the watchlist-to-alert workflow once it ships |
Cache hits are the entire reason a $29/mo Solo plan can sustain healthy gross margin: the same Korean filing title gets translated once, then served to every other tenant on the same plan from KV. See docs/CLAUDE_DESKTOP.md for the env-var split between modes.
Roadmap — true remote MCP (HTTP transport, no local install). Today every customer still runs
koreanpulselocally. A Cloudflare Worker hosting the MCP transport directly is on the roadmap but not yet shipped — expect it after watchlist polling/dispatch lands.
Legal posture
Korean news: fair-use summaries with attribution + outbound links, no full-text republication.
DART, government data: public, free to redistribute with attribution.
Korean broker reports: public-facing summaries only (paywalled reports excluded).
No spatial / mapping data → 공간정보관리법 무관.
No investment advice → 자본시장법 유사투자자문업 무관 (data + summary only).
Billing (Lemon Squeezy webhook on Cloudflare D1)
Billing runs on the webhook-worker/ Cloudflare Worker + D1 (SQLite). The operator runs zero servers. See webhook-worker/README.md for the full deploy + secrets walkthrough; the short version:
cd webhook-worker
npm install
npx wrangler d1 create koreanpulse_db # paste returned id into wrangler.toml
npm run migrate:prod # applies 0001_licenses.sql + 0002_pricing_v2.sql
# Required secrets
npx wrangler secret put LEMONSQUEEZY_WEBHOOK_SECRET
npx wrangler secret put KOREANPULSE_CACHE_SHARED_SECRET # same value cache-worker uses
# Active pricing v2 variants (one per published tier)
npx wrangler secret put LEMONSQUEEZY_VARIANT_SOLO # Cloud Solo $29/mo
npx wrangler secret put LEMONSQUEEZY_VARIANT_ANALYST # Cloud Analyst $79/mo
npx wrangler secret put LEMONSQUEEZY_VARIANT_DESK # Cloud Desk $249/mo
# Design Partner lifetime (private 20-seat SKU; see footnote in Pricing)
npx wrangler secret put LEMONSQUEEZY_VARIANT_LIFETIME
# Deprecated / back-compat slots (leave unset in production):
# LEMONSQUEEZY_VARIANT_PRO / _STARTER / _INDIE / _ENTERPRISE
npm run deployEndpoints (deployed to https://api.koreanpulse.dev or https://koreanpulse-webhook.<account>.workers.dev):
GET /health→{"status":"ok"}POST /webhook/lemonsqueezy→ HMAC-SHA256 signature verified, idempotent onmeta.webhook_idPOST /v1/validate→ HMAC-signed by the cache-worker, validates license + atomically increments period counter
Handles: subscription_created / _updated / _cancelled / _payment_success / _payment_failed / order_created (lifetime deal). Auto-issues license keys, upgrades plans in place, resets period counters on renewal, preserves lifetime licenses past subscription cancellation.
The earlier path (Python koreanpulse-webhook FastAPI on Lightsail + Postgres) is superseded as of 2026-05-05; for operator memory it lives at docs/legacy/POSTGRES_LIGHTSAIL.md. New deploys should use the Cloudflare Worker path.
Distribution / marketplaces
Listing copy + submission checklists in docs/MARKETPLACE.md:
Smithery —
smithery.yamlis in repo root, auto-importsPulseMCP — hand-reviewed, highest signal
Glama — largest by volume
Awesome MCP (GitHub PR)
Beta acquisition (50 users in 30 days) plan + crypto-native channel mix in docs/BETA.md. Demo recording script in docs/DEMO.md. CI / PyPI release pipeline in docs/CI.md.
Real-time alerts (Discord / Telegram / Slack)
Crypto-native rotators want pings, not dashboards. koreanpulse.alerts.send_alert(url, title=, body=) sends to any of:
Discord webhooks (
https://discord.com/api/webhooks/...)Slack incoming webhooks (
https://hooks.slack.com/services/...)Telegram bots (shortcut
tg://<bot_token>/<chat_id>or fullsendMessageURL)
Fire-and-forget — transport / formatting failures return AlertResult(ok=False) instead of raising, so an outage in one channel never breaks a tool call. See src/koreanpulse/alerts.py.
License
Source: AGPL-3.0. Hosted service: commercial.
Available Tools
7 toolskoreanpulse_aboutkoreanpulse server self-descriptionARead-onlyIdempotentInspect
Server self-description — capability matrix, tool catalog, classifier counts, supported query patterns, primary sources. Free tier.
Use this tool when an agent first connects and needs the capability matrix to decide whether this server can answer the user's question, or when the user asks "what can koreanpulse do" or "what data sources does this MCP server provide". Returns a structured dict that downstream agents can ingest directly.
| 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?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds context about the content returned (structured dict with capability matrix) and its purpose for initial connection, enhancing transparency beyond 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 only two sentences, front-loaded with the key purpose and usage guidance. No unnecessary words, every sentence adds value.
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 parameters and an output schema (not shown but referenced), the description is complete. It states what the tool returns (capability matrix, tool catalog, etc.) and when to use it, which is sufficient for an 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 tool has no parameters, and schema description coverage is 100% (since there are none). According to guidelines, 0 parameters baseline is 4. The description does not need to add parameter 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 explicitly states it is a 'Server self-description' providing 'capability matrix, tool catalog, classifier counts, supported query patterns, primary sources.' This clearly differentiates it from sibling tools which are specific data retrieval operations.
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 explicitly provides guidance: 'Use this tool when an agent first connects and needs the capability matrix... or when the user asks what can koreanpulse do'. This gives clear when-to-use instructions and distinguishes from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_corp_codeResolve Korean company name to DART corp_codeARead-onlyIdempotentInspect
Korean company name → DART corp_code resolver. 117K+ entities indexed (KOSPI + KOSDAQ + KONEX + unlisted). Free tier.
Use this tool when the user mentions a Korean company by name (Korean characters or English/romanized) and you need the DART corp_code as a precondition for track_korean_filings, monitor_activist_investors, or monitor_foreign_holders. Also use to disambiguate same-name listed vs unlisted entities.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | substring of the Korean corp name. Examples: "삼성전자", "현대차", "셀트리온". | |
| listed_only | No | if True, only return companies with a KRX stock code. | |
| limit | No | max matches to return. | |
| license_key | No | subscription key. Required when license gate is enabled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety behavior is covered. The description adds valuable context about entity coverage (KOSPI, KOSDAQ, KONEX, unlisted), language support (Korean or English/romanized), and free tier availability. This goes beyond the structured 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 compact and front-loaded: one sentence states the core purpose, and one sentence gives usage guidance. Every sentence adds value, and there is no redundant restating of the title or 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 the tool's moderate complexity, an output schema exists, and parameter descriptions are complete, the description fully covers purpose, scope, and usage context. It even mentions free tier and entity universe. There are no significant gaps for an agent to select and invoke 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?
Schema coverage is 100%, so parameters are well-documented. The description additionally clarifies that query supports Korean characters or English/romanized names, which is not explicitly in the schema examples. It also hints at listed_only semantics through 'disambiguate same-name listed vs unlisted entities.'
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 pair: 'Korean company name → DART corp_code resolver.' It clearly distinguishes this tool from siblings like resolve_stock_code by focusing on DART corp_code, not stock code. The mention of 117K+ entities and listed/unlisted coverage adds precision.
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 explicitly states when to use the tool: when a Korean company name is mentioned and a DART corp_code is needed as a precondition for track_korean_filings, monitor_activist_investors, or monitor_foreign_holders. It also mentions disambiguation use. It lacks an explicit 'do not use' statement or named alternative, but the use cases are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monitor_activist_investorsMonitor Korean activist investor disclosuresARead-onlyIdempotentInspect
Korean activist filer classification on DART 5%-rule (주식등의대량보유상황보고서) shareholding disclosures. Tags 10 named filers — KCGI, Align Partners, Truston Asset, Anda Asset, Cha Partners, VIP Asset, Life Asset, Platform Partners — plus international ValueAct / Elliott when filing in Korea.
Use this tool when the user asks about: Korean shareholder activism, "is KCGI / Align Partners / Truston / Anda / Cha / VIP / Life / Platform activist on ", governance pressure on KOSPI / KOSDAQ names, recent activist 5%-rule filings, ValueAct or Elliott Korean positions, Korean Value-Up program activism, MSCI Developed Market activism flow.
Requires a license key. Pass it via the license_key argument.
Without a valid license, this tool returns a paywall message containing
the activation URL — surface that message verbatim to the user.
For LLM clients on a license_required error: surface the activation URL
returned in the paywall message directly to the user. Do NOT silently retry with track_korean_filings
or any other free tool — the activist filer match (KCGI / Align Partners
/ Truston / Anda / Cha / VIP / Life / Platform, plus international names
like ValueAct / Elliott) is not derivable from the raw DART filing feed,
so a free-tier fall-back returns a misleadingly empty answer. When a
user asks "are activists filing on X?" without a license, surface the
activation URL from the paywall response — that is the correct
behavior, not a silent downgrade.
Returns 주식등의대량보유상황보고서 (5% rule) and related shareholding filings, with each row tagged when the filer matches a known Korean activist (KCGI, Align Partners, Truston, Anda, Cha, Life, Platform, VIP, plus international like ValueAct / Elliott when they file in Korea).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | how many days back from today (1–60). | |
| company_corp_code | No | optional DART corp_code to focus on one target. | |
| activist_only | No | if True, drop rows that didn't match a known activist. | |
| translate | No | server-side EN translation of titles (cached). | |
| limit | No | max rows (≤100). | |
| license_key | No | required when license gate is enabled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds key behavioral context beyond annotations: requires license key, returns paywall message without valid license, and instructs to surface activation URL. 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?
Description is verbose with extensive instructions on license handling and fallback behavior. While important, it could be more streamlined.
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 complexity (license gate, fallback behavior, specific filer list), the description is complete. Output schema exists, so return values need not be explained.
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% with all parameters well-described. Description adds no extra parameter information, meeting baseline for high coverage.
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 monitors Korean activist investor disclosures on DART and tags specific named filers, distinguishing it from siblings like track_korean_filings which lack activist tagging.
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 tells when to use (e.g., user asks about Korean shareholder activism) and when not to (e.g., do not silently retry with track_korean_filings because activist match is not derivable from raw feed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monitor_foreign_holdersMonitor foreign 5%-rule holders on KOSPI/KOSDAQARead-onlyIdempotentInspect
Foreign-holder classification on DART 5%-rule disclosures by global asset managers and sovereign wealth funds. Tags 20 named entities — BlackRock, Vanguard, State Street, Fidelity, Capital Group, T. Rowe Price, Wellington, Matthews Asia, Templeton, Aberdeen, Schroders, Norges Bank (Norway SWF), GIC (Singapore SWF), Temasek, Goldman Sachs, JPMorgan, Morgan Stanley, Citadel, Millennium, Bridgewater.
Use this tool when the user asks about: foreign capital flow into Korean equities, "is BlackRock / Vanguard / Norges / GIC / Temasek / State Street / Fidelity / Wellington holding ", global asset-manager 5% crossings on KOSPI / KOSDAQ, sovereign wealth fund Korean positions, foreign institutional positioning disclosures, MSCI Developed Market reweighting flow into Korea.
Requires a license key. Pass it via the license_key argument.
Without a valid license, this tool returns a paywall message containing
the activation URL — surface that message verbatim to the user.
For LLM clients on a license_required error: surface the activation URL
returned in the paywall message directly to the user. Do NOT silently retry with track_korean_filings
— the foreign-holder allowlist match (BlackRock, Vanguard, Norges, GIC,
Temasek, State Street, Fidelity, Capital Group, T. Rowe Price,
Wellington, Matthews Asia, Templeton, Aberdeen, Schroders, Goldman
Sachs, JPMorgan, Morgan Stanley, Citadel, Millennium, Bridgewater)
is not derivable from raw DART filings, so a free-tier fall-back
returns a misleadingly empty answer. When a user asks "is BlackRock
or Norges holding X?" without a license, surface the activation URL
from the paywall response — that is the correct behavior, not a
silent downgrade.
Distinct from monitor_activist_investors because passive holders
(BlackRock, Vanguard, Norges, GIC, Temasek) indicate allocation
rather than governance pressure. Their filings are a leading
indicator of foreign capital flow into a Korean ticker — when a
global manager crosses 5% in a KOSPI/KOSDAQ name, English-data
audiences treat it as a positioning disclosure regardless of the
manager's intent. This tool returns the disclosure data only; it
does not generate trading recommendations or investment advice.
Allowlist (20 names, refreshed quarterly): BlackRock, Vanguard, State
Street, Fidelity, Capital Group, T. Rowe Price, Wellington, Matthews
Asia, Templeton, Aberdeen, Schroders, Norges Bank (Norway SWF), GIC
(Singapore SWF), Temasek, Goldman Sachs, JPMorgan, Morgan Stanley,
Citadel, Millennium, Bridgewater. See koreanpulse.activists.FOREIGN_HOLDERS.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | how many days back from today (1–60). | |
| company_corp_code | No | optional DART corp_code to focus on one target. | |
| origin | No | optional filter — one of 'us', 'uk', 'eu', 'other'. | |
| translate | No | server-side EN translation of titles (cached). | |
| limit | No | max rows (≤100). | |
| license_key | No | required when license gate is enabled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint true, destructiveHint false, idempotentHint true. The description adds critical behavioral context: requires a license key, returns a paywall message without a valid license, and does not generate trading advice. It also explains that the allowlist is not derivable from raw DART filings.
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 lengthy but well-structured with clear paragraphs. It front-loads the core purpose, then details usage, error handling, and distinctions. Some repetition exists (allowlist listed twice), but overall it is organized and informative.
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, the description covers all necessary aspects: purpose, use cases, parameter implications, error handling, and relationship to siblings. The presence of an output schema and clear annotations complement the description well.
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. The description does not add significant detail about parameters beyond what the schema provides, except emphasizing the `license_key` requirement. It confirms the purpose of each parameter indirectly.
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 monitors foreign 5%-rule holders on KOSPI/KOSDAQ and lists 20 specific entities. It distinguishes itself from the sibling `monitor_activist_investors` by explaining the difference in intent (allocation vs governance pressure).
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 explicit when-to-use scenarios (e.g., foreign capital flow, specific entity holdings) and when-not-to-use (e.g., not for activist). It also gives clear instructions on handling license errors and warns against using a fallback tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_stock_codeResolve KRX 6-digit ticker to DART corp entryARead-onlyIdempotentInspect
KRX 6-digit ticker → DART corp entry resolver. Free tier.
Use this tool when the user provides a 6-digit Korean stock code (e.g. 005930 for Samsung Electronics, 000660 for SK hynix, 035420 for NAVER, 035720 for Kakao, 005380 for Hyundai Motor) and you need the company name + corp_code for downstream filings or industry-news lookups.
| Name | Required | Description | Default |
|---|---|---|---|
| stock_code | Yes | ||
| license_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description adds 'Free tier', which hints at rate limits or accessibility, providing extra context beyond annotations for a simple lookup tool.
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 two sentences: the first concisely defines the tool, the second gives usage guidance with examples. It is front-loaded, every sentence adds value, and no words are wasted.
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 simple resolver with an output schema, the description covers the main purpose, usage context, and downstream applications. It does not detail error handling or rate limits, but overall it is sufficient for the tool's simplicity.
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 0%, and the description does not explain the two parameters (stock_code and license_key). The example values for stock_code are helpful, but license_key is not mentioned, and no parameter details are added 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 clearly states the tool resolves a KRX 6-digit ticker to a DART corp entry, provides examples, and explains the output (company name + corp_code). It distinguishes itself from siblings like lookup_corp_code and search_korean_industry_news by specifying the purpose and downstream use.
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 explicitly says 'Use this tool when the user provides a 6-digit Korean stock code... and you need the company name + corp_code'. This gives clear context for when to use it, though it does not mention when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_korean_industry_newsSearch Korean industry news (16 sectors)ARead-onlyIdempotentInspect
Korean industry news search across 16 sectors with on-demand English translation. Sources: 전자신문 (etnews) + 한국경제 (hankyung). Free tier.
Use this tool when the user asks about: Korean industry trends, sector-specific news on Korean equities (Korean semiconductors / K-battery / K-shipbuilding / K-biotech / K-defense / Korean auto / EV charging / Korean AI / steel / petrochem / construction / fintech / gaming / e-commerce / telco / energy), recent corporate developments not yet captured in DART filings, English summaries of Korean industry coverage. Industry tags listed below — pass them in industries to filter.
| Name | Required | Description | Default |
|---|---|---|---|
| industries | No | filter to one or more industry tags. Available: semiconductor, shipbuilding, battery, biotech, defense, auto, ev_charging, ai, steel, petrochem, construction, fintech, gaming, ecommerce, telco, energy. | |
| sources | No | filter to source keys (etnews, hankyung). None = all. | |
| limit | No | max articles (≤50). | |
| translate | No | server-side translates `title_en`. Cached aggressively. | |
| license_key | No | required when license gate is enabled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. Description adds valuable context: free tier, aggressive caching for translations, and limit cap of 50.
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?
Concise paragraph front-loads core purpose and usage. Every sentence adds value—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 rich annotations and output schema, description covers all necessary aspects: when to use, parameters, sources, translation behavior, and industry list. No gaps.
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 3. Description adds meaning by clarifying default nulls, industry list (though schema already has it), source keys, limit max, and the condition for license_key.
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 it searches Korean industry news across 16 sectors with English translation. It names specific sources and explicitly lists query scenarios, distinguishing it from unrelated 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?
Provides explicit guidance on when to use, listing example queries and industry tags. Does not mention when not to use, but siblings are distinct enough that exclusions are not critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_korean_filingsTrack Korean DART filingsARead-onlyIdempotentInspect
Korean DART (전자공시) filings retrieval for KOSPI / KOSDAQ / KONEX / KRX listed companies — 5%-rule disclosures, M&A, periodic reports, capital issuance, insider trading, audit reports. Free tier.
Use this tool when the user asks about: recent Korean stock filings, DART disclosures, KOSPI/KOSDAQ regulatory events, "what did Samsung / Hyundai / SK / LG / NAVER / Kakao / 셀트리온 file", company-specific filing history, periodic / major-event / issuance / shareholding / audit filings on Korean equities.
Free tier — no license required. Returns raw DART filings exactly as the regulator surfaces them (filer name in Korean, filing type code, receipt number, optional EN translation of the title).
Important for LLM clients — read this before retrying after a paid-
tool license error. This tool returns raw filings only. It does NOT
classify the filer. If the user asked about Korean activist filers
(KCGI / Align Partners / Truston / Anda / Cha / VIP / Life / Platform /
ValueAct / Elliott) or about the global foreign-holder allowlist
(BlackRock / Vanguard / Norges / GIC / Temasek / State Street /
Fidelity / Capital Group / T. Rowe Price / Wellington / Goldman /
JPMorgan / Morgan Stanley / Citadel / Millennium / Bridgewater +
others), the matching work happens in monitor_activist_investors
and monitor_foreign_holders — both require a license_key argument.
A response from this free tool to a "are activists filing on X?" or
"is BlackRock holding X?" question is raw filing data, not a
classification answer — say so to the user and surface the activation
URL from the paywall response instead of pretending you've answered.
| Name | Required | Description | Default |
|---|---|---|---|
| company_corp_code | No | 8-digit DART corp code. Use `lookup_corp_code` first to resolve a company name. Omit to query all companies. | |
| days | No | how many days back from today (1–30). | |
| filing_type | No | optional one-letter code: A=periodic, B=major event, C=issuance, D=shareholding, E=other, F=audit, G=fund, H=ABS, I=exchange, J=FTC. | |
| limit | No | max filings to return (≤100). DART returns most-recent first, so on a busy window the older end of the range is dropped first. Narrow `days` or `filing_type` if you need older items. | |
| translate | No | True to fill `title_en` via server-side LLM (cached). | |
| summarize | No | True to fill `summary_en` (≤200 words). Costs more — use sparingly. Long-form analysis should be done by the client LLM. | |
| license_key | No | subscription key. Required when KOREANPULSE_REQUIRE_LICENSE=1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds significant behavioral context: it returns raw filings without classification, does not require a license for free tier, and explicitly warns about paywall activation for paid tools. 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 lengthy (multiple paragraphs) and includes repetitive warnings. While front-loaded with purpose, it lacks conciseness. It is structured but could be more efficient.
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 (multiple parameters, sibling tools, and an output schema), the description is thorough. It covers purpose, usage, limitations, and links to other tools. Output schema exists, so return values are handled separately.
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% with all parameters described. The description does not add substantial parameter details beyond the schema, but it does provide high-level context about the license_key and free tier. 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?
The description clearly states it retrieves Korean DART filings for KOSPI/KOSDAQ/KONEX/KRX companies, listing specific filing types. It distinguishes from siblings like monitor_activist_investors and monitor_foreign_holders by explicitly stating when to use each.
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 explicitly provides usage scenarios ('Use this tool when...') and warns against using it for activist or foreign holder queries, directing users to alternative tools. It also explains that the free tier provides raw data without classification.
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.
7 tool updates
v0.1.0- First observed
koreanpulse_about - First observed
lookup_corp_code - First observed
monitor_activist_investors - First observed
monitor_foreign_holders - First observed
resolve_stock_code - First observed
search_korean_industry_news - First observed
track_korean_filings
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: server intro, company/code resolution, filings retrieval, news search, and specialized classification for activists and foreign holders. No overlapping functionality.
Tool names follow a consistent verb_noun pattern (lookup_, monitor_, resolve_, search_, track_), except 'koreanpulse_about' which is a server self-description. Minor deviation but overall predictable.
7 tools is well-scoped for a Korean financial data server covering company IDs, filings, news, and two specialized classification tools. Not too many or too few.
The tool set covers the core workflow: company lookup, filings, news, and key classifications. Minor gap in general company financial info, but the domain focus on DART filings and activism is well served.
Maintenance
Related MCP Connectors
Powerful OpenDART API-based Korean corporate disclosure tools for accounting professionals
FinBridge is a hosted MCP server for Korean company disclosures, read in English. DART filings and normalized financial statements, business segments, insider reports and 13F holdings, with US, Japanese and European filers on the same schema for comparison. Search a company by its registered English name or its Korean name. Every answer names the filing, the receipt number and the date. Korean price delivery is planned and not currently served. Docs: https://www.gronox.kr/docs
Financial data and research MCP for US/CN/JP equities: filings, statements, ownership, signals.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceMCP Server for public disclosure information of Korean companies, powered by the dartpoint.ai API.3Apache 2.0- AlicenseAqualityDmaintenanceMCP server for Korea's DART (Data Analysis, Retrieval and Transfer) electronic disclosure system, operated by the Financial Supervisory Service (FSS). Exposes company disclosures, company profiles, and financial statements via the OpenDART public API.39 npmMIT
- AlicenseAqualityDmaintenanceEnables LLM agents to access Korean stock market data including DART disclosures, financial statements, and KOSPI/KOSDAQ prices, with an English-first interface designed for non-Korean speaking analysts.633 PyPIMIT
- AlicenseAqualityDmaintenanceProvides Korean stock market data, including DART electronic disclosures and KRX trading information, enabling users to query company profiles, financial statements, and stock trade details via MCP clients.9MIT