RedoxNet.Mcp.LsOpenApi 1.2.0

There is a newer version of this package available.
See the version list below for details.
{
  "inputs": [
    {
      "type": "promptString",
      "id": "ls_appkey",
      "description": "LS Securities OpenAPI AppKey",
      "password": true
    },
    {
      "type": "promptString",
      "id": "ls_appsecretkey",
      "description": "LS Securities OpenAPI AppSecretKey",
      "password": true
    },
    {
      "type": "pickString",
      "id": "ls_market",
      "description": "LS OpenAPI environment: real or virtual",
      "default": "real",
      "options": ["real", "virtual"]
    }
  ],
  "servers": {
    "RedoxNet.Mcp.LsOpenApi": {
      "type": "stdio",
      "command": "dnx",
      "args": ["RedoxNet.Mcp.LsOpenApi@1.2.0", "--yes"],
      "env": {
        "LS_APPKEY": "${input:ls_appkey}",
        "LS_APPSECRETKEY": "${input:ls_appsecretkey}",
        "LS_MARKET": "${input:ls_market}"
      }
    }
  }
}
                    
This package contains an MCP Server. The server can be used in VS Code by copying the generated JSON to your VS Code workspace's .vscode/mcp.json settings file.
dotnet tool install --global RedoxNet.Mcp.LsOpenApi --version 1.2.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local RedoxNet.Mcp.LsOpenApi --version 1.2.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=RedoxNet.Mcp.LsOpenApi&version=1.2.0
                    
nuke :add-package RedoxNet.Mcp.LsOpenApi --version 1.2.0
                    

RedoxNet.Mcp.LsOpenApi

MCP server for the LS 증권 OpenAPI — exposes Korean stock market data as MCP tools so AI assistants can query quotes, charts, ETF data, market screeners, and index / industry / theme context in natural language, alongside a local-only portfolio module (multi-account holdings, watchlists, watched themes, JSON backup / restore).

Unofficial third-party MCP server. Not affiliated with or endorsed by LS Securities Co., Ltd. (LS증권). v0.x.x scope: read-only market data + local portfolio notes (manual entry; no broker sync, no order placement).

Install

Prerequisite. dnx is the dotnet tool launcher that ships with .NET SDK 10 or later. Install from .NET downloads if you don't have it yet. Verify with dnx --help.

dnx fetches the latest published version from NuGet on every launch — no separate install step. Wire it into your MCP host:

Claude Desktop / Claude Code

claude_desktop_config.json (Claude Desktop) or .mcp.json at your workspace root (Claude Code):

{
  "mcpServers": {
    "lsopenapi": {
      "command": "dnx",
      "args": ["RedoxNet.Mcp.LsOpenApi", "--yes"],
      "env": {
        "LS_APPKEY": "...",
        "LS_APPSECRETKEY": "...",
        "LS_MARKET": "real"  // default if omitted; use "virtual" only for LS mock accounts
      }
    }
  }
}

Codex CLI

%USERPROFILE%\.codex\config.toml (Windows) or ~/.codex/config.toml (macOS / Linux):

[mcp_servers.lsopenapi]
command = "dnx"
args = ["RedoxNet.Mcp.LsOpenApi", "--yes"]

[mcp_servers.lsopenapi.env]
LS_APPKEY = "..."
LS_APPSECRETKEY = "..."
LS_MARKET = "real"  # default if omitted; use "virtual" only for LS mock accounts

VS Code

Workspace .vscode/mcp.json:

{
  "servers": {
    "lsopenapi": {
      "type": "stdio",
      "command": "dnx",
      "args": ["RedoxNet.Mcp.LsOpenApi", "--yes"],
      "env": {
        "LS_APPKEY": "...",
        "LS_APPSECRETKEY": "...",
        "LS_MARKET": "real"  // default if omitted; use "virtual" only for LS mock accounts
      }
    }
  }
}

FieldCure AssistStudio

Settings → Connect → Add MCP Server, then fill the dialog:

Field Value
Server Name Any label, e.g. LS Open Api
Description (for AI) Leave blank — auto-filled from the server on first connect
Transport Stdio
Command dnx
Arguments RedoxNet.Mcp.LsOpenApi --yes  — space-separated, no quotes or commas
Environment Variables one KEY=VALUE per line (see below)
LS_APPKEY=...
LS_APPSECRETKEY=...
LS_MARKET=real

AssistStudio renders the optional Plotly chart spec from ls_get_chart inline in the chat — call it with include_chart=true (single timeframe) to get a candlestick chart directly in the conversation.

Environment variables

Name Required Description
LS_APPKEY yes LS OpenAPI app key.
LS_APPSECRETKEY yes LS OpenAPI app secret key.
LS_MARKET no real or virtual (default real).
LS_TOOL_PROFILE no standard (default — hides the 3 catalog tools from tools/list) or all (exposes them).
LS_TOOL_PROFILE_STRICT no true rejects a tools/call for a profile-hidden tool instead of honoring it (default false).
LS_BASEURL no Override REST base URL (rarely needed).
LS_LOG_LEVEL no Trace/Debug/Information/Warning/Error/Critical/None (default Information).
LSOPENAPI_DB_PATH no Override the local portfolio SQLite path. Default: alongside token.db.

Credentials are accepted only through the process environment — never through chat, tool arguments, or MCP elicitation. Prompting for them in conversation would either log them or train callers to share them in transcripts, so that input path is intentionally closed off.

Local data lives at %LOCALAPPDATA%\RedoxNet\LsOpenApi\ on Windows and ~/.local/share/redoxnet/lsopenapi/ on Linux/macOS: token.db (auth cache, SHA-256 keyed) and portfolio.db (user-supplied holdings/watchlists; never read or written by tools outside the portfolio family).

Tools (34 in the standard profile)

v0.10 (BREAKING) compresses the tool surface: the twenty v0.9 portfolio tools fold into five action-routed dispatchers (ls_account, ls_watchlist, ls_watched_themes, ls_portfolio_io, ls_holding), and the new LS_TOOL_PROFILE env var hides the three catalog tools in the default standard profile. Surface 48 → 32 (standard) / 35 (all). Additive in the same release: ls_get_stock_info gains an opt-in foreign ownership section (t1716); list / screener tools unify their row cap to limit and emit total_available; ls_get_index_history gains output_mode=export with a dataset_id drill.

Market data (LS-backed, credentials required)

ls_search_tr / ls_describe_tr / ls_call_tr are catalog tools — hidden in the default standard profile; set LS_TOOL_PROFILE=all to expose them.

Tool TR Purpose
ls_search_tr Search the embedded TR catalog by Korean / English keyword.
ls_describe_tr Full InBlock / OutBlock schema for a specific TR.
ls_call_tr any Invoke any TR with a caller-supplied in_block.
ls_get_quote t1101 Current price + 10-level order book.
ls_get_multi_quote t8407 Up to 50 stocks per call. Accepts 6-character codes (digits, optionally one uppercase letter for ETFs e.g. 0117V0).
ls_get_top_stocks t1441 / t1444 / t1452 / t1463 / t1466 Top gainers/losers, market cap, volume, trading value, and volume-surge screeners.
ls_get_stock_info t1102 + t1716 PER/PBR/EPS, quarterly financials, 52-week + YTD ranges, top-5 brokerages, SPAC / 관리종목 flags, and an opt-in foreign ownership-level section. Pick blocks with sections (default snapshot+fundamentals).
ls_get_chart t8410 / t8412 / t1301 OHLCV (day/week/month/year/min/tick), indicators (SMA/EMA/RSI/MACD/BB), token-efficient summary + dataset_id, multi-timeframe in one call, optional Plotly v5 chart spec. Raw bars only with output_mode='export'; with_warmup toggles the summary warm-up; summary.coverage explains any null indicators.
ls_add_indicator (handle cache + chart TR) Adds an indicator to a dataset_id returned by ls_get_chart and returns the updated summary + chart spec. Example: "add MA200 too".
ls_reframe_chart (handle cache + chart TR) Reframes a dataset_id to a new period/count using the cached symbol. Example: "이걸 일봉으로 바꿔서 최근 6개월만 보여줘".
ls_search_stock t8436 Name → code search with instrument filter (all / stock / etf).
ls_get_etf_info t1901 ETF/ETN snapshot — NAV, 괴리율, 추적오차율, reference index, AUM, LP list.
ls_get_etf_holdings t1904 ETF PDF (구성종목) — per-holding weight / valuation. limit caps the rows (default 20; limit=-1 for the full list).
ls_get_global_market_quote t3521 Overseas index / FX / futures snapshot. Aliases include nasdaq, sp500, dow, soxx, usdkrw, wti, gold; raw LS symbols like NAS@IXIC are accepted.

Index + industry (LS-backed)

Tool TR Purpose
ls_get_index_quote t1511 Single Korean index snapshot. Aliases: kospi/kosdaq/kospi200/krx100. Returns value, change %, OHLC with timestamps, 52-week + YTD range, market breadth, and 4 related auxiliary indices.
ls_get_index_history t1514 Daily/weekly/monthly index time series — per-bar OHLC, volume, breadth, foreign/institutional net flow. verbosity shapes the payload; output_mode=export caches the whole series under a dataset_id for no-API-call drill (from / to / recent_n).
ls_get_industry_indices t8424 + t1511 fanout Top-N industry indices sorted by change %. 60s cache so repeated calls with different limit reuse one fanout.
ls_get_industry_stocks t1516 Stocks inside one industry + the industry's index summary. Body-based paging. Accepts upcode or industry_keyword (LIKE on cached t8424 catalog).
ls_get_market_funds_trend t8428 Market-liquidity time series — 고객예탁금, 신용잔고, 미수금, 선물예수금, and equity/mixed/bond/MMF fund money (억원).

LS themes (LS-backed)

Tool TR Purpose
ls_get_theme_stocks t1537 Stocks inside one LS curated theme + summary (tmcnt/upcnt/uprate). Header-based tr_cont paging. Accepts theme_code or theme_keyword.
ls_get_stock_themes t1532 Reverse lookup — every theme a stock belongs to. Empty array is a valid response.

Screeners & per-stock analytics (LS-backed)

Tool TR Purpose
ls_get_fundamentals_rank t3341 Rank stocks by a fundamental metric: per / pbr / peg / eps / bps / roe / 매출액·영업이익·세전계속이익 증가율 / 부채비율 / 유보율. PER/PBR/PEG forced ascending. Each row carries the full fundamental snapshot so two metrics on the same stock are visible in one call.
ls_get_investor_flow t1601 + t1702 Investor-type flow across 12 categories (개인 / 외국인 / 기관계 / 증권 / 투신 / 은행 / 보험 / 종금 / 기금 / 국가 / 기타 / 사모펀드). No shcode → intraday market-wide snapshot (six unlabeled segments). With shcode → single-stock daily time series with metric (volume/value/price) + direction (net/buy/sell) + cumulative toggle.
ls_get_stock_events t3202 Per-stock corporate-action / 주주총회 calendar covering all 14 LS event types. kinds accepts English snake_case, Korean labels, or raw two-char upgu codes. TBD entries survive date filtering.
ls_get_market_warnings t1404 + t1405 Union of the two KRX surveillance screens (13 designations: 관리 / 불성실공시 / 투자유의 / 투자환기 / 투자경고 / 매매정지 / 정리매매 / 투자주의 / 투자위험 / 위험예고 / 단기과열지정 / 이상급등 / 상장주식수부족). shcodes clips against holdings for "내 보유 중 관리종목" queries.
ls_get_analyst_opinions t3401 Per-stock brokerage (sell-side) investment-opinion history — rating + target price before/after each change, broker, opinion-day close, plus a current-price snapshot.
ls_get_short_selling_trend t1927 Per-stock daily short-selling (공매도) — short volume/value (백만원), short ratio, average short price, cumulative short volume, uptick-applied vs. exempt split.
ls_get_high_low_stocks t1442 New-high / new-low (신고가 / 신저가) screener. direction, period (52w default), maintained (돌파유지 vs 일시돌파); ETF/ETN excluded by default.

Program trading (LS-backed)

Tool TR Purpose
ls_get_program_trading t1662 / t1633 / t1636 / t1637 Program-trading (프로그램매매) flow. scope=market — intraday (t1662) or daily (t1633) market-wide 차익 / 비차익 net buying with the KOSPI200 index; scope=ranking — per-stock net-buy ranking (t1636) with a market-cap-normalized footprint ratio; scope=stock — one stock's intraday / daily flow (t1637). include_chart=true ships an inline Plotly v5 chart.
ls_analyze_program_flow t1637 Program-trading footprint analysis for one stock — a regime (accumulation / distribution / churn / neutral), a 0–1 confidence, signals (persistence, churn ratio, intensity, intraday pace, price coupling), and plain-language evidence to narrate.

Portfolio (local-only, no broker sync)

Manual entries persisted to portfolio.db next to token.db. v0.10 folds the twenty v0.9 portfolio tools into five action-routed dispatchers — each takes an action argument and validates the per-action required parameters — plus two standalone tools. List responses fall back to a quote_error envelope when LS credentials are missing, but saved data still returns.

Tool Actions Purpose
ls_account list / upsert / remove Registered accounts. upsert also renames a broker label across accounts (rename_broker_from mode); remove is a two-step confirm cascade with auto-succession of the default (id ASC).
ls_holding set / buy / sell / remove / corporate_action Holding writes — initial state, weighted-average buy merge, partial/full sell (auto-remove at zero, InsufficientQuantity above the position), outright delete, and the open-enum corporate action (type ∈ split / reverse_split / bonus).
ls_holdings_list Holdings grouped by account with per-account + total summary. Optional account, theme_code, theme_keyword, industry (FICS substring) filters (AND-combine). Standalone — the read path is the most common portfolio intent.
ls_stocks_refresh_metadata Synchronous refresh for theme / FICS-industry caches. Default scope = holdings ∪ watchlist symbols when shcodes omitted. Standalone.
ls_watchlist list / add / remove / group_upsert / group_delete Saved watchlist items and their groups. list takes scope (items / groups); group_upsert creates, updates, or renames a group (rename_from).
ls_watched_themes list / add / remove Track LS theme codes (t1531 tmcode such as 0064); list carries each theme's avg percent change.
ls_portfolio_io export / import Versioned JSON snapshot (schema v1) of accounts/holdings/watchlists/watched themes. import mode=replace requires confirm=true and writes a before-import-*.json auto-backup.

Ambiguity policy. Reads fall back; writes require an explicit target when ambiguous. 0 accounts → RequiresAccount; 1 account → auto with applied_to echo; 2+ → AmbiguousAccount with candidates[] so the model can re-call without prompting the user. Every mutation response includes applied_to (single account) or applied_to[] with before/after snapshots (corporate actions).

Error envelopes. RequiresAccount / AmbiguousAccount / AccountNotFound / RequiresConfirmation / InsufficientQuantity / ValidationError — all carry structured fields (candidates, identifier, holding count + market value, etc.) so the LLM can recover automatically.

Full release notes: https://github.com/redoxnet/mcp-lsopenapi/blob/main/RELEASENOTES.Mcp.md

Documentation & source

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
1.6.0 418 5/28/2026
1.5.1 316 5/27/2026
1.5.0 312 5/27/2026
1.4.0 299 5/26/2026
1.3.0 297 5/26/2026
1.2.0 118 5/22/2026
1.1.0 312 5/22/2026
1.0.0 333 5/21/2026
0.10.1 314 5/20/2026
0.10.0 104 5/20/2026
0.9.0 112 5/20/2026
0.8.0 111 5/20/2026
0.7.0 127 5/18/2026
0.6.0 117 5/16/2026
0.5.0 132 5/15/2026
0.4.0 114 5/15/2026
0.3.0 117 5/14/2026
0.2.0 114 5/14/2026
0.1.0 117 5/13/2026

v1.2.0 — MCP Apps capability negotiation. Chart-emitting tools now adapt to the connected host: a host that advertises the SEP-1865 io.modelcontextprotocol/ui capability (or is a known chart renderer) gets the include_chart parameter and inline Plotly charts via structuredContent; a text-only host gets neither, and structuredContent is stripped so the model is never handed a UI-only payload. The chart_available text marker is removed. No existing tool, parameter signature, or other response field changes. See https://github.com/redoxnet/mcp-lsopenapi/blob/main/RELEASENOTES.Mcp.md.