Skip to main content
Glama
kospi-kosdaq

kospi-kosdaq

by dragon1086

kospi-kosdaq-stock-server

PyPI version

An MCP server that provides KOSPI/KOSDAQ stock data from KRX Data Marketplace.

What's New in v0.3.0

Since December 27, 2024, KRX Data Marketplace requires Kakao/Naver login for data access. This version implements:

  • Direct KRX API integration with Kakao OAuth login

  • Playwright-based headless browser for authentication

  • Automatic session management with 4-hour timeout and auto re-login

  • No more pykrx dependency for core functionality

Related MCP server: kookmin-stock

Features

  • Lookup KOSPI/KOSDAQ ticker symbols and names

  • Retrieve OHLCV (Open/High/Low/Close/Volume) data for stocks

  • Retrieve market capitalization data

  • Retrieve fundamental data (PER/PBR/Dividend Yield)

  • Retrieve trading volume by investor type (institutional, foreign, individual)

  • Retrieve index OHLCV data (KOSPI, KOSDAQ indices)

Requirements

  • Python 3.10+

  • Kakao account (2FA must be disabled)

  • Playwright Chromium browser

Environment Variables

# Required: Kakao login credentials
KAKAO_ID=your_kakao_id
KAKAO_PW=your_kakao_password

Important: Your Kakao account must have 2-step verification (2FA) disabled. On first login, you may need to approve the login request via KakaoTalk.

Installation

Prerequisites

# Install Playwright and Chromium browser
pip install playwright
playwright install chromium

Installing via Smithery

npx -y @smithery/cli install @dragon1086/kospi-kosdaq-stock-server --client claude

Manual Installation

# Create and activate a virtual environment
uv venv .venv
source .venv/bin/activate  # On Unix/macOS
# .venv\Scripts\activate   # On Windows

# Install the package
uv pip install kospi-kosdaq-stock-server

# Install Playwright browser
playwright install chromium

Configuration for Claude Desktop

macOS

  1. Open the config file:

code ~/Library/Application\ Support/Claude/claude_desktop_config.json
  1. Add the server configuration:

{
  "mcpServers": {
    "kospi-kosdaq": {
      "command": "uvx",
      "args": ["kospi_kosdaq_stock_server"],
      "env": {
        "KAKAO_ID": "your_kakao_id",
        "KAKAO_PW": "your_kakao_password"
      }
    }
  }
}

Windows

  1. Open the config file at %APPDATA%/Claude/claude_desktop_config.json

  2. Add the same configuration as above

  3. Restart Claude Desktop

Available Tools

load_all_tickers

Loads all ticker symbols and names for KOSPI and KOSDAQ.

  • No arguments required

  • Returns: Dictionary mapping ticker codes to stock names

get_stock_ohlcv

Retrieves OHLCV (Open/High/Low/Close/Volume) data for a specific stock.

  • fromdate (string, required): Start date (YYYYMMDD)

  • todate (string, required): End date (YYYYMMDD)

  • ticker (string, required): Stock ticker symbol (e.g., "005930")

  • adjusted (boolean, optional): Use adjusted prices (default: True)

get_stock_market_cap

Retrieves market capitalization data for a specific stock.

  • fromdate (string, required): Start date (YYYYMMDD)

  • todate (string, required): End date (YYYYMMDD)

  • ticker (string, required): Stock ticker symbol

get_stock_fundamental

Retrieves fundamental data (PER/PBR/Dividend Yield) for a specific stock.

  • fromdate (string, required): Start date (YYYYMMDD)

  • todate (string, required): End date (YYYYMMDD)

  • ticker (string, required): Stock ticker symbol

get_stock_trading_volume

Retrieves trading volume by investor type for a specific stock.

  • fromdate (string, required): Start date (YYYYMMDD)

  • todate (string, required): End date (YYYYMMDD)

  • ticker (string, required): Stock ticker symbol

  • detail (boolean, optional): If true, returns 12 investor types; if false (default), returns 5 aggregated types

get_index_ohlcv

Retrieves OHLCV data for market indices.

  • fromdate (string, required): Start date (YYYYMMDD)

  • todate (string, required): End date (YYYYMMDD)

  • ticker (string, required): Index ticker (e.g., "1001" for KOSPI, "2001" for KOSDAQ)

  • freq (string, optional): Frequency - "d" (daily), "m" (monthly), "y" (yearly). Default: "d"

Available Resources

stock://tickers

Returns all KOSPI/KOSDAQ ticker symbols and names.

stock://index-tickers

Returns index ticker information:

  • KOSPI: 1001, KOSPI 200: 1028, KOSPI 100: 1034, KOSPI 50: 1035

  • KOSDAQ: 2001, KOSDAQ 150: 2203

stock://data-sources

Returns current data source status.

Docker Support

Using Docker Compose

# Build and run
docker-compose up -d

# View logs
docker-compose logs -f

Environment Variables for Docker

Create a .env file:

KAKAO_ID=your_kakao_id
KAKAO_PW=your_kakao_password

Troubleshooting

"KakaoTalk login notification" popup

On first login, Kakao may require approval via KakaoTalk:

  1. Run with headless=False to see the browser

  2. Approve the login in KakaoTalk

  3. Cookies will be saved for future sessions

401 Unauthorized / Session Expired

Session expires after ~4 hours. The server auto-renews, but if it fails:

  1. Delete ~/.krx_session.json

  2. Restart the server

Linux Headless Environment

# Install required packages on Ubuntu/Debian
apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
    libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2

Architecture

┌─────────────────────────────────────────────────────┐
│                MCP Server (FastMCP)                 │
│              kospi_kosdaq_stock_server.py           │
└──────────────────────┬──────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────┐
│               KRXDataClient                         │
│  - get_market_ohlcv()                               │
│  - get_market_cap()                                 │
│  - get_market_fundamental()                         │
│  - get_market_trading_volume_by_date()              │
│  - get_index_ohlcv()                                │
└──────────────────────┬──────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────┐
│             KakaoAuthManager                        │
│  - Playwright headless browser                      │
│  - Kakao OAuth login                                │
│  - Session cookie management                        │
│  - Auto re-login on session expiry (4h)             │
└──────────────────────┬──────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────┐
│           KRX Data Marketplace                      │
│             data.krx.co.kr                          │
└─────────────────────────────────────────────────────┘

Known Limitations

  • Kakao accounts with 2FA enabled are not supported

  • First login may require KakaoTalk approval

  • Session validity: ~4 hours (auto-renewal supported)

  • Naver login is not yet implemented

Usage Example

Human: Please load all available stock tickers.
Assistant: I'll load all KOSPI and KOSDAQ stock tickers.

> Using tool 'load_all_tickers'...
Successfully loaded 2,738 stock tickers.
Human: Show me Samsung Electronics' stock data for December 2024.
Assistant: I'll retrieve Samsung Electronics' (005930) OHLCV data.

> Using tool 'get_stock_ohlcv'...
Date        Open      High      Low       Close     Volume
2024-12-20  53,800    54,200    53,500    53,900    8,234,521
2024-12-19  54,000    54,300    53,700    53,800    7,123,456
...

License

MIT License

Contributing

Issues and pull requests are welcome!

Changelog

v0.3.0 (2025-01-04)

  • Breaking: Removed pykrx dependency for core functionality

  • Added KRX Data Marketplace direct integration with Kakao OAuth

  • Added Playwright-based headless authentication

  • Added automatic session management

  • Added index OHLCV support

v0.2.x

  • pykrx-based implementation (deprecated due to KRX login requirement)

Available Tools

6 tools
get_index_ohlcvA

Retrieves OHLCV data for a specific index.

Args:
    fromdate (str): Start date for retrieval (YYYYMMDD)
    todate   (str): End date for retrieval (YYYYMMDD)
    ticker   (str): Index ticker symbol (e.g., 1001 for KOSPI, 2001 for KOSDAQ)
    freq     (str, optional): d - daily / m - monthly / y - yearly. Defaults to 'd'.

Returns:
    DataFrame:
        >> get_index_ohlcv("20210101", "20210130", "1001")
                       Open     High      Low    Close       Volume    Trading Value
        Date
        2021-01-04  2874.50  2946.54  2869.11  2944.45  1026510465  25011393960858
        2021-01-05  2943.67  2990.57  2921.84  2990.57  1519911750  26548380179493
        2021-01-06  2993.34  3027.16  2961.37  2968.21  1793418534  29909396443430
        2021-01-07  2980.75  3055.28  2980.75  3031.68  1524654500  27182807334912
        2021-01-08  3040.11  3161.11  3040.11  3152.18  1297903388  40909490005818

Inputs: fromdate (required), todate (required), ticker (required), freq.

get_stock_fundamentalA

Retrieves fundamental data (PER/PBR/Dividend Yield) for a specific stock.

Args:
    fromdate (str): Start date for retrieval (YYYYMMDD)
    todate   (str): End date for retrieval (YYYYMMDD)
    ticker   (str): Stock ticker symbol

Returns:
    DataFrame:
        >> get_stock_fundamental("20210104", "20210108", "005930")
                          BPS        PER       PBR   EPS       DIV   DPS
            Date
            2021-01-08  37528  28.046875  2.369141  3166  1.589844  1416
            2021-01-07  37528  26.187500  2.210938  3166  1.709961  1416
            2021-01-06  37528  25.953125  2.189453  3166  1.719727  1416
            2021-01-05  37528  26.500000  2.240234  3166  1.690430  1416
            2021-01-04  37528  26.218750  2.210938  3166  1.709961  1416

Inputs: fromdate (required), todate (required), ticker (required).

get_stock_market_capA

Retrieves market capitalization data for a specific stock.

Args:
    fromdate (str): Start date for retrieval (YYYYMMDD)
    todate   (str): End date for retrieval (YYYYMMDD)
    ticker   (str): Stock ticker symbol

Returns:
    DataFrame:
        >> get_stock_market_cap("20150720", "20150724", "005930")
                          Market Cap  Volume      Trading Value  Listed Shares
        Date
        2015-07-24  181030885173000  196584  241383636000  147299337
        2015-07-23  181767381858000  208965  259446564000  147299337
        2015-07-22  184566069261000  268323  333813094000  147299337
        2015-07-21  186039062631000  194055  244129106000  147299337
        2015-07-20  187806654675000  128928  165366199000  147299337

Inputs: fromdate (required), todate (required), ticker (required).

get_stock_ohlcvA

Retrieves OHLCV (Open/High/Low/Close/Volume) data for a specific stock.

Args:
    fromdate (str): Start date for retrieval (YYYYMMDD)
    todate   (str): End date for retrieval (YYYYMMDD)
    ticker   (str): Stock ticker symbol
    adjusted (bool, optional): Whether to use adjusted prices (True: adjusted, False: unadjusted). Defaults to True.

Returns:
    DataFrame:
        >> get_stock_ohlcv("20210118", "20210126", "005930")
                        Open     High     Low    Close   Volume
        Date
        2021-01-26  89500  94800  89500  93800  46415214
        2021-01-25  87300  89400  86800  88700  25577517
        2021-01-22  89000  89700  86800  86800  30861661
        2021-01-21  87500  88600  86500  88100  25318011
        2021-01-20  89000  89000  86500  87200  25211127
        2021-01-19  84500  88000  83600  87000  39895044
        2021-01-18  86600  87300  84100  85000  43227951

Inputs: fromdate (required), todate (required), ticker (required), adjusted.

get_stock_trading_volumeA

Retrieves trading volume by investor type for a specific stock.

Args:
    fromdate (str): Start date for retrieval (YYYYMMDD)
    todate   (str): End date for retrieval (YYYYMMDD)
    ticker   (str): Stock ticker symbol

Returns:
    DataFrame with columns:
    - Volume (Sell/Buy/Net Buy)
    - Trading Value (Sell/Buy/Net Buy)
    Broken down by investor types (Financial Investment, Insurance, Trust, etc.)

Inputs: fromdate (required), todate (required), ticker (required).

load_all_tickersA

Loads all ticker symbols and names for KOSPI and KOSDAQ into memory.

Returns:
    Dict[str, str]: A dictionary mapping tickers to stock names.
    Example: {"005930": "삼성전자", "035720": "카카오", ...}

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 6 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose with no overlap. get_index_ohlcv retrieves index data, get_stock_ohlcv retrieves stock price data, get_stock_fundamental provides fundamental metrics, get_stock_market_cap gives market capitalization, get_stock_trading_volume shows investor breakdowns, and load_all_tickers provides ticker metadata. The separation between index vs. stock tools and different data types is unambiguous.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern with 'get_' or 'load_' prefixes. The naming is perfectly uniform: get_index_ohlcv, get_stock_fundamental, get_stock_market_cap, get_stock_ohlcv, get_stock_trading_volume, and load_all_tickers. This consistency makes the tool set predictable and easy to understand.

    Tool Count5/5

    With 6 tools, this server is well-scoped for financial data retrieval. Each tool serves a specific, necessary function for stock and index analysis without redundancy. The count is ideal for covering core data needs (price, fundamentals, market cap, volume breakdowns, and ticker metadata) without being overwhelming or insufficient.

    Completeness4/5

    The tool set covers essential data retrieval for Korean stock market analysis comprehensively, including price data, fundamentals, market cap, trading insights, and ticker information. A minor gap exists in lacking tools for real-time data or more advanced analytics like technical indicators, but the core CRUD-like retrieval operations for the domain are well-covered.

    Maintenance

    ActivityStale
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      A
      quality
      D
      maintenance
      MCP server that provides Korean stock market data including indices, top gainers, stock quotes, news, fundamentals, and buy recommendations. Enables LLMs to access real-time and historical Korean stock information.
      6
      -
    • A
      license
      A
      quality
      C
      maintenance
      MCP server wrapping Toss Securities Open API, enabling stock price queries and trading for Korean and US stocks via natural language.
      36
      265 npm
      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