Skip to main content
Glama
whdrnr2583-cmd

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 DART_API_KEY + your OPENAI_API_KEY

your DART_API_KEY (stays local); we hold the OpenAI key for you

Local install required

yes (pip install koreanpulse)

yes (same pip install; only translation calls hit our Worker)

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

track_korean_filings

DART filings real-time + EN translation/summary

monitor_activist_investors

Activist 5%-rule filings auto-tagged (KCGI / Align / Truston / Anda / Cha / VIP / ValueAct / Elliott)

monitor_foreign_holders

Foreign 5%-rule disclosures (BlackRock / Vanguard / Norges / GIC / Temasek + 15 more)

lookup_corp_code

Korean company name → DART corp code

resolve_stock_code

KRX 6-digit → DART corp entry

search_korean_industry_news

etnews / 한국경제 RSS, classified into 16 industries

koreanpulse_about

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 cache

  • W5–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-worker cron + daily-worker cron + koreanpulse.alerts module 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_call

  • W9–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=hosted routes 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 /today dashboard build (KST 16:30 weekdays).

  • Webhook Worker (webhook-worker/) — Cloudflare Worker + D1 (SQLite). Handles Lemon Squeezy events and /v1/validate for 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 (OSS self-host)

hosted (Cloud Solo / Analyst / Desk)

Local MCP install

required

required (same pip install)

Provider key

your OPENAI_API_KEY

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 koreanpulse locally. A Cloudflare Worker hosting the MCP transport directly is on the roadmap but not yet shipped — expect it after watchlist polling/dispatch lands.

  • 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 deploy

Endpoints (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 on meta.webhook_id

  • POST /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:

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 full sendMessage URL)

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 tools
koreanpulse_aboutkoreanpulse server self-descriptionA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_codeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYessubstring of the Korean corp name. Examples: "삼성전자", "현대차", "셀트리온".
listed_onlyNoif True, only return companies with a KRX stock code.
limitNomax matches to return.
license_keyNosubscription key. Required when license gate is enabled.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 disclosuresA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNohow many days back from today (1–60).
company_corp_codeNooptional DART corp_code to focus on one target.
activist_onlyNoif True, drop rows that didn't match a known activist.
translateNoserver-side EN translation of titles (cached).
limitNomax rows (≤100).
license_keyNorequired when license gate is enabled.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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/KOSDAQA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNohow many days back from today (1–60).
company_corp_codeNooptional DART corp_code to focus on one target.
originNooptional filter — one of 'us', 'uk', 'eu', 'other'.
translateNoserver-side EN translation of titles (cached).
limitNomax rows (≤100).
license_keyNorequired when license gate is enabled.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 entryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stock_codeYes
license_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
industriesNofilter to one or more industry tags. Available: semiconductor, shipbuilding, battery, biotech, defense, auto, ev_charging, ai, steel, petrochem, construction, fintech, gaming, ecommerce, telco, energy.
sourcesNofilter to source keys (etnews, hankyung). None = all.
limitNomax articles (≤50).
translateNoserver-side translates `title_en`. Cached aggressively.
license_keyNorequired when license gate is enabled.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 filingsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_corp_codeNo8-digit DART corp code. Use `lookup_corp_code` first to resolve a company name. Omit to query all companies.
daysNohow many days back from today (1–30).
filing_typeNooptional one-letter code: A=periodic, B=major event, C=issuance, D=shareholding, E=other, F=audit, G=fund, H=ABS, I=exchange, J=FTC.
limitNomax 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.
translateNoTrue to fill `title_en` via server-side LLM (cached).
summarizeNoTrue to fill `summary_en` (≤200 words). Costs more — use sparingly. Long-form analysis should be done by the client LLM.
license_keyNosubscription key. Required when KOREANPULSE_REQUIRE_LICENSE=1.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 7 tool updatesv0.1.0
    • First observedkoreanpulse_about
    • First observedlookup_corp_code
    • First observedmonitor_activist_investors
    • First observedmonitor_foreign_holders
    • First observedresolve_stock_code
    • First observedsearch_korean_industry_news
    • First observedtrack_korean_filings

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivitySlowing
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP Server for public disclosure information of Korean companies, powered by the dartpoint.ai API.
    3
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    MCP 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.
    3
    9 npm
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    6
    33 PyPI
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    9
    MIT