koreanpulse
koreanpulse is an MCP server that provides Korean stock market intelligence to AI assistants, connecting them to real-time Korean equity data — DART corporate disclosures, foreign investor holdings, activist investor filings, and industry news — all translated into English.
Free Tools (no license required)
Track Korean DART Filings (
track_korean_filings): Retrieve real-time DART (전자공시) filings for KOSPI/KOSDAQ/KONEX/KRX listed companies, including 5%-rule disclosures, M&A events, periodic reports, capital issuance, insider trading, and audit reports — with optional English translation and summaries.Resolve Company Names (
lookup_corp_code): Convert a Korean company name (Korean or romanized English) to its DART corp code, covering 117K+ listed and unlisted entities.Resolve Stock Codes (
resolve_stock_code): Convert a KRX 6-digit ticker (e.g., 005930 for Samsung Electronics) to the corresponding DART corp entry and company name.Search Korean Industry News (
search_korean_industry_news): Search news from 전자신문 and 한국경제 across 16 sectors (semiconductor, shipbuilding, battery, biotech, defense, auto, EV charging, AI, steel, petrochem, construction, fintech, gaming, e-commerce, telco, energy) with English translation.Server Self-Description (
koreanpulse_about): Returns the server's capability matrix, tool catalog, supported query patterns, and data sources for agent-side discovery.
Paid Tools (requires license key)
Monitor Activist Investors (
monitor_activist_investors): Track DART 5%-rule shareholding filings by 10 named Korean and international activist investors — KCGI, Align Partners, Truston Asset, Anda Asset, Cha Partners, VIP Asset, Life Asset, Platform Partners, ValueAct, and Elliott.Monitor Foreign Holders (
monitor_foreign_holders): Track DART 5%-rule disclosures by 20 named global asset managers and sovereign wealth funds (BlackRock, Vanguard, State Street, Norges Bank, GIC, Temasek, and more), with holder origin filtering (US/UK/EU/other).
Key details: All outputs include server-cached English translations and attribution links. Accessible via hosted remote MCP endpoint (https://mcp.koreanpulse.dev/mcp) or locally via pip install koreanpulse. Integrates with Claude Desktop, Cursor, ChatGPT, and the OpenAI Responses API. Read-only — no trading execution or investment advice.
Enables alert dispatch to Discord channels for watchlist hits on Korean financial filings and events.
Handles payment processing and license issuance via Lemon Squeezy webhooks for Cloud subscription tiers.
Provides translation of Korean financial filings and industry news into English using OpenAI's API.
Fetches and classifies Korean industry news from RSS feeds (etnews, 한국경제) for the search tool.
Enables alert dispatch to Slack channels or webhooks for watchlist hits on Korean financial filings and events.
Enables alert dispatch to Telegram chats for watchlist hits on Korean financial filings and events.
koreanpulse
Korean stock disclosures, activist filings & foreign-holder flows in English — for AI agents via MCP.
Korean stock market intelligence for AI assistants. koreanpulse is an MCP server that connects ChatGPT / Claude / Cursor / FastMCP agents to Korean (KRX / KOSPI / KOSDAQ) equity data — track DART corporate disclosures as they are filed, monitor foreign investor holding changes and activist investor campaigns, and search classified Korean industry news, all in English. Data and intelligence only — not buy/sell recommendations.
The goal: get pinged in English when a 5%-rule filing or DART event hits a stock you care about. (Beta — watchlist polling + alert dispatch are planned and not yet available; what works today is on-demand queries.)
The pitch: koreanpulse translates, tags, and filters Korean primary-source disclosure data — foreign-holder 5%-rule disclosures, Korean activist filings, major DART events — for AI assistants. KRX itself, ASIFMA, and several global asset managers are on record that Korean disclosure flow into English is structurally thin. Free public daily snapshot at /today; paid Cloud tiers (Solo $29/mo, Analyst $79/mo, Desk $249/mo) unlock the two allowlist-tagging tools now — watchlist polling + alert dispatch are planned and not yet available; early subscribers keep their signup rate when those land. OSS self-host available for hackers — see Run it yourself.
For AI/MCP agent builders. koreanpulse plugs Korean equity primary sources into your existing Claude Desktop / Cursor / FastMCP agent — same MCP shape your agent already uses for US data. Three connection modes: (a) hosted remote MCP at
https://mcp.koreanpulse.dev/mcpfor ChatGPT / Claude.ai / OpenAI Responses API custom connectors, (b)pip install koreanpulse+ 4-line config for Claude Desktop / Cursor stdio, (c) Smithery marketplace listing for Smithery CLI users. The 7 tools surface DART filings, foreign-holder 5%-rule flows, Korean activist filings, and 16-sector industry news as typed function calls; the rest of your trading-agent stack stays unchanged.
Claude.ai / ChatGPT (remote MCP). Add
https://mcp.koreanpulse.dev/mcpas a custom connector in Claude.ai (Settings → Connectors), ChatGPT (Settings → Connectors or Apps SDK), or wire it directly from the OpenAI Responses API:tools=[{type: "mcp", server_url: "https://mcp.koreanpulse.dev/mcp"}]. Read-only — surfaces filings and disclosures only. No trading execution, no investment advice.
What this server answers (capability vector for agent retrieval). Korean DART (전자공시) filings on any KOSPI / KOSDAQ / KONEX / KRX ticker; 5%-rule shareholding disclosures tagged against a maintained allowlist — Korean activist filers (KCGI / Align Partners / Truston Asset / Anda Asset / Cha Partners / VIP Asset / Life Asset / Platform Partners / Must Asset Management / Dalton Investments / Flashlight Capital Partners / Oasis Management / Palliser Capital / Whitebox Advisors / City of London Investment Management + ValueAct / Elliott when filing in Korea) and global foreign holders (BlackRock / Vanguard / State Street / Fidelity / Capital Group / T. Rowe Price / Wellington / Matthews Asia / Templeton / Aberdeen / Schroders / Norges Bank / GIC / Temasek / Goldman Sachs / JPMorgan / Morgan Stanley / Citadel / Millennium / Bridgewater); Korean industry news across 16 sectors (semiconductor / shipbuilding / battery / biotech / defense / auto / EV charging / AI / steel / petrochem / construction / fintech / gaming / e-commerce / telco / energy) sourced from 전자신문 + 한국경제 + The Korea Herald (English-native) + 지디넷코리아. All with on-demand English translation cached server-side. Tool catalog and example queries are also returned by
koreanpulse_aboutfor agent-side capability discovery.
Status
Pre-alpha (v0.1.13). 7 MCP tools shipped — 5 free + 2 license-gated (activist + foreign-holder allowlist tagging, Solo $29/mo+). 433 tests pass, 1 skipped. Beta — watchlist polling + alert dispatch are planned and not yet available. Beta acquisition plan in docs/BETA.md.
Related MCP server: dart-mcp
Why I built this
I'm a Seoul-based developer. I kept watching English-speaking friends miss the Korean disclosure that would have flipped their KOSPI trade — KCGI filing on a value-up target, BlackRock crossing 5% on an HBM name, an activist quietly accumulating. The Korean primary source (DART 전자공시) is unambiguous; English coverage is often hours late or absent. I wanted a thing they could plug into the chat assistant they already use, ask "anything new on Samsung Electronics?", and get the same answer I'd get reading DART directly. That's koreanpulse.
I run it as MCP because that's the shape of stack the people I'd want to use this already have — Claude Desktop, Cursor, the OpenAI Responses API, ChatGPT custom connectors. No new client to install. Free tier is the daily snapshot and the five free tools; the two license-gated tools (5%-rule allowlist tagging on activists and foreign holders) are the part that takes a Korean speaker hours to do by hand.
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:
Broker access keeps widening — Hana Securities × Futu launched Korean stock trading for Futu's Hong Kong retail customers (April 2026), and Samsung Securities × Interactive Brokers launched a pilot (May 2026)
KOSPI has been under review for MSCI Developed Market reclassification — one reason global investors track Korean market-access changes
IRC (Investor Registration Certificate) requirement abolished 2023-12-14, removing the decades-old registration step for foreign investors' direct KRX access
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 (alerts are planned, not yet available) |
Korean diaspora / overseas Korean investor | Cloud Solo $29/mo | English digest of the news they grew up reading (alert delivery planned) |
K-content / EM journalist | Cloud Solo $29/mo | Replaces hours of manual translation |
Boutique fund analyst covering Korea | Cloud Analyst $79/mo | Higher query cap now; watchlists / archive / multi-channel alerts are planned |
Paid-research-budget retail trader | Cloud Analyst $79/mo | Higher query cap now; saved searches planned |
Boutique long/short desk, small research team | Cloud Desk $249/mo | Highest query cap now; seats / shared watchlists / Slack alerts planned |
The free daily snapshot at /today (no login, no API key) is the funnel front door — the same classified data the paid tools query, published once per weekday.
Design partner program available for the first 20 named seats — contact us.
Pricing
🚧 Beta. Solo $29 / Analyst $79 / Desk $249. Subscribing via Polar starts a paid monthly subscription that charges immediately at checkout; a 30-day refund window applies. What a paying user receives immediately: the two license-gated allowlist-tagging tools, hosted translation, and the metered query cap (2K / 15K / 100K). Watchlist polling, alert dispatch, seat enforcement, and per-tier retention windows are planned and not yet available — until they ship, seat counts, watchlist counts, alert-channel limits, and archive-retention windows are paper limits, and most tier differentiation is roadmap. Early subscribers keep their signup rate when those features land.
Tier | $/mo | Watchlists | Queries/mo | Archive | Alert channels |
Cloud Solo | 29 | 5 (planned) | ~2,000 (metered) | 30 days (planned) | 1 Discord or Telegram (planned) |
Cloud Analyst | 79 | 25 (planned) | ~15,000 (metered) | 1 year (planned) | Multi (Discord / Telegram / Email) (planned) |
Cloud Desk | 249 | shared, 3 seats (planned) | ~100,000 (metered) | team archive (planned) | Slack / webhooks (planned) |
30-day refund window on first payment.
Subscribe: koreanpulse.dev/#pricing — per-tier Polar checkouts (Solo / Analyst / Desk), each covered by Polar as Merchant of Record (sales tax / VAT / refunds handled). The license key is emailed by the webhook worker on subscription.created.
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 | planned — not yet available |
Hosted archive | none | planned — not yet available (30 days / 1 year / team archive) |
Hosted translation cache | none | included now (cross-tenant cache hits compound) |
Account sync | none | planned — not yet available |
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. Note: the OSS-vs-Cloud table above covers the pip-install paths. There is also a zero-install path — the hosted remote MCP at https://mcp.koreanpulse.dev/mcp answers the 5 free tools (including DART filings) with no local install and no DART API key of your own; add the URL as a custom connector in ChatGPT / Claude.ai (license-gated tools take a license_key argument).
Tools
7 MCP tools shipped — 5 free + 2 license-gated. Callable from Claude Desktop / Cursor / any MCP client. The paid tier unlocks the allowlist-tagging work that takes a Korean speaker to do by hand; the free tier ships the raw DART + RSS surface.
Free tier (no license_key, no signup):
Tool | One-line |
| Recent DART filings + EN translation/summary |
| Korean company name → DART corp code |
| KRX 6-digit → DART corp entry |
| etnews / 한국경제 / Korea Herald / zdnet RSS, classified into 16 industries |
| Server info, free vs paid tool list |
Paid tier (Solo $29/mo+, requires license_key — pass as tool argument or via the calling client's secure-input field):
Tool | One-line |
| 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) |
When a paid tool is called without a license, the server returns a short notice explaining that a license key is required. No checkout link is included in the tool response.
4 more planned (docs/SPEC.md): digest_analyst_reports, 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 | enterprise-priced | enterprise-priced | free (low signal) | $29 / $79 / $249 Cloud tiers |
Korean activist / M&A pipeline | weak | weak | reactive | proactive watch (planned) |
Differentiation vs other Korean MCP servers
A handful of Korean-data MCP servers exist. Pick what matches your job. We focus on English-first equity data with allowlist-based filer tagging, served as a hosted endpoint your LLM client can connect to in one click. If you need raw KRX OHLCV or Korean-language financial-statement tables, others do that better.
Capability | koreanpulse | korea-stock-mcp (jjlabsio, 137★) | korean-dart-mcp (chrisryugj, 35★) | openregistry (sophymarine) |
Transport | Streamable HTTP + SSE | stdio only ( | stdio only ( | Streamable HTTP |
Hosted endpoint |
| — (self-install) | — (self-install) |
|
1-click connect (ChatGPT / Claude.ai) | Yes | No (stdio) | No (stdio) | Yes |
Your own DART API key to start | No — hosted endpoint serves DART for you | Yes (register + configure) | Yes (register + configure) | n/a |
Activist filer tagging (KCGI / Align / Truston / Anda / Cha / VIP / Life / Platform / Must / Dalton / FCP / Oasis / Palliser / Whitebox / City of London / ValueAct / Elliott) | 17 labels | — raw filings only | — raw filings only | — registry data only |
Foreign-holder 5%-rule allowlist (BlackRock / Vanguard / Norges / GIC / Temasek + 15 more) | 20 labels | — raw filings only | — raw filings only | — registry data only |
English-first docstrings (LLM-friendly) | All tools | Korean primary, English secondary | Korean primary | Yes |
Korean industry news (etnews / 한국경제 / Korea Herald / zdnet RSS, EN translated) | 16 industries | — | — | — |
KRX OHLCV (daily prices) | — out of scope | Yes (KOSPI / KOSDAQ / KONEX) | — | — |
XBRL financial statements | — out of scope | Yes | Yes | — |
HWP / PDF attachment → markdown | — out of scope | — | Yes | — |
Multi-user architecture (one endpoint, N AI agents in parallel) | N→1 hosted (quota-ceiling estimate ~9,500 MAU at 70% cache hit — derivation in Capacity) | 1:1 (one process per user on user's machine) | 1:1 (one process per user on user's machine) | Hosted |
DART API key required from end user | No (free tools use our shared key) | Yes (each user signs up) | Yes (each user signs up) | No |
Pricing | Free 5 tools · Solo $29 · Analyst $79 · Desk $249/mo | Free OSS (BYO API keys) | Free OSS (BYO API keys) | Free anonymous tier |
Other servers in the space (different scope or smaller install base): SongT-50/korean-stock-mcp, koreal6803/finlab-ai (quant-focused), eddmpython/dartlab (Python lib). Comparison last verified 2026-05-07 — other projects may have shipped changes since.
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
Available now: queries (DART filings, foreign-holder + activist tracking, industry news), hosted translation cache (Cloud KOREANPULSE_CACHE_MODE=hosted), /today daily snapshot, Polar → D1 license issuance (Polar is our sole billing provider and Merchant of Record), first-party hosted MCP endpoint at https://mcp.koreanpulse.dev/mcp (Streamable HTTP transport for ChatGPT / Claude.ai / OpenAI Responses API custom connectors — no pip install).
Planned — not yet available:
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
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 ✅ Webhook handler skeleton (license auto-issuance) — Polar billing
W5–6 ✅ Cloudflare D1-backed
LicenseStore(replaces in-memory)W7–8 ⏳ Watchlist polling + alert dispatch (planned, not yet available) — 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 Polar billing events (Polar is our sole billing provider, active 2026-05-06+) 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.
(Quick-start comparison also appears in "Run it yourself" above — keep both in sync when editing.)
|
| |
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.
Hosted HTTP transport (no local install). First-party endpoint at
https://mcp.koreanpulse.dev/mcp(Streamable HTTP, single-region node fronted by Caddy + Let's Encrypt cert). Add as a custom connector in ChatGPT (Settings → Connectors), Claude.ai (Settings → Connectors), or wire it directly from the OpenAI Responses API. Last validated end-to-end against ChatGPT and Claude.ai on 2026-05-06 —monitor_activist_investorschainslookup_corp_codeand returns Korean→English translated 5%-rule filings without any client-side install. The local stdio install path remains canonical for self-hosters and max-privacy users; the Smithery listing keeps Smithery CLI users in the discovery path.
Legal posture
Korean news: short summaries with attribution + outbound links only, no full-text republication. Summaries are generated from public RSS feed metadata.
DART data: retrieved via the DART open API with attribution; every item links to the original filing. Underlying filings remain subject to their own applicable rules.
Korean broker reports: not ingested (paywalled reports excluded).
No spatial / mapping data is used.
Not investment advice. koreanpulse provides disclosure data, translation, filtering, and tagging. It does not execute trades and does not provide personalized buy/sell recommendations; no individualized analysis is performed. All output is general data intended for informational purposes only.
Users should assess the licensing, data-use, and financial-services obligations that apply to their own jurisdiction and use case, especially when redistributing data downstream. Nothing in this repository is legal advice.
Privacy + data protection: see https://koreanpulse.dev/privacy — covers Korea PIPA, EU GDPR, US CCPA. Terms of service: https://koreanpulse.dev/terms.
Billing (Polar — active provider)
Billing runs on the webhook-worker/ Cloudflare Worker + D1 (SQLite). The operator runs zero servers.
Active provider: Polar (polar.sh) — Merchant of Record since 2026-05-06. Handles VAT / sales tax / refunds / chargebacks for all subscriptions. License keys are emailed automatically on subscription.created via the webhook worker.
Lemon Squeezy: not in use. Their store application was declined on 2026-05-06; we did not appeal. No LS variant secrets are configured in production and no LS webhook deliveries are accepted. The /webhook/lemonsqueezy handler code remains in the repo only as a historical implementation reference — Polar is the sole billing provider.
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
# ── Polar (active provider) ──────────────────────────────────────────
npx wrangler secret put POLAR_WEBHOOK_SECRET # `polar_whs_...` from Polar webhook page
npx wrangler secret put POLAR_API_TOKEN # `polar_oat_...` (subscriptions:read scope)
npx wrangler secret put POLAR_PRODUCT_SOLO # UUID of Cloud Solo product
npx wrangler secret put POLAR_PRODUCT_ANALYST # UUID of Cloud Analyst product
npx wrangler secret put POLAR_PRODUCT_DESK # UUID of Cloud Desk product
# ── Shared ───────────────────────────────────────────────────────────
npx wrangler secret put KOREANPULSE_CACHE_SHARED_SECRET # same value cache-worker uses
npm run deployEndpoints (deployed to https://api.koreanpulse.dev or https://koreanpulse-webhook.<account>.workers.dev):
GET /health→{"status":"ok"}POST /webhook/polar→ Standard Webhooks signature verified (webhook-id/webhook-timestamp/webhook-signature), idempotent onwebhook-idPOST /webhook/lemonsqueezy→ not in use (handler retained as historical reference — see Billing note above)POST /v1/validate→ HMAC-signed by the cache-worker, validates license + atomically increments period counter
Polar events handled: subscription.created / .active / .updated / .canceled / .revoked. Auto-issues license keys, upgrades plans in place, deactivates on cancellation. License rows are tagged with metadata.provider = "polar" so the source is traceable per row.
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:
First-party hosted endpoint —
https://mcp.koreanpulse.dev/mcp(ChatGPT / Claude.ai / OpenAI Responses API custom connectors)Smithery — marketplace listing for Smithery CLI users
PulseMCP — not yet submitted (deferred)
Glama — live (auto-discovered, score badge)
MCP Market — Smithery ingest (auto)
mcp.so — live (manual submission)
MCP Registry (registry.modelcontextprotocol.io) — published
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.
Alert primitives (library — the hosted watchlist→alert loop is not yet available)
The koreanpulse.alerts module ships the dispatch primitive that the planned watchlist workflow will use. 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.
Example prompts
Copy-paste these into Claude.ai, ChatGPT, or any MCP client connected to https://mcp.koreanpulse.dev/mcp:
Ask Claude: "What DART filings were submitted for Samsung Electronics in the last 7 days?"Ask Claude: "Look up the DART corp code for Kakao and show me its latest disclosures."Ask Claude: "Any Korean semiconductor news this week from 전자신문?"Ask Claude: "Which activist investors filed 5%-rule disclosures on KOSPI stocks this month? [license_key: YOUR_KEY]"Ask Claude: "Show me recent foreign-holder 5%-rule filings — has BlackRock or Norges Bank crossed any thresholds? [license_key: YOUR_KEY]"The first three prompts use free tools (no signup). The last two use the activist and foreign-holder allowlist tagging and require a Solo $29/mo license key — the server returns a short notice explaining that a license key is required if license_key is missing (no checkout link in the response).
License
Source: AGPL-3.0-or-later. Hosted service: commercial.
Copyright (C) 2026 Lee Jong-guk (이종국)
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. It is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE for the full text, or https://www.gnu.org/licenses/.
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
Korean stock research MCP: DART financials, global filings, daily prices and research tools.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Market analyst tools + AI agent: crypto, US equities, options, Korea, fundamentals, macro, backtests
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.310MIT
- AlicenseAqualityCmaintenanceEnables 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.6MIT
- AlicenseAqualityCmaintenanceProvides 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