Skip to main content
Glama
migusdn

KIS REST API MCP Server

inquery-balance

Retrieve current stock balance information from Korea Investment & Securities to monitor portfolio holdings and account status.

Instructions

Get current stock balance information from Korea Investment & Securities

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • server.py:298-301 (registration)
    The @mcp.tool decorator registers the 'inquery-balance' tool with the FastMCP server, specifying its name and description.
    @mcp.tool(
        name="inquery-balance",
        description="Get current stock balance information from Korea Investment & Securities",
    )
  • The main handler function for the 'inquery-balance' tool. It fetches an access token, prepares the request data for the KIS balance inquiry API, makes a GET request to the balance endpoint, and returns the JSON response.
    async def inquery_balance():
        """
        Get current stock balance information from Korea Investment & Securities
        
        Returns:
            Dictionary containing stock balance information including:
            - pdno: Stock code
            - prdt_name: Stock name
            - hldg_qty: Holding quantity
            - pchs_amt: Purchase amount
            - prpr: Current price
            - evlu_amt: Evaluation amount
            - evlu_pfls_amt: Evaluation profit/loss amount
            - evlu_pfls_rt: Evaluation profit/loss rate
        """
        async with httpx.AsyncClient() as client:
            token = await get_access_token(client)
            logger.info(f"TrIdManager.get_tr_id('balance'): {TrIdManager.get_tr_id('balance')}")
            # Prepare request data
            request_data = {
                "CANO": os.environ["KIS_CANO"],  # 계좌번호
                "ACNT_PRDT_CD": "01",  # 계좌상품코드 (기본값: 01)
                "AFHR_FLPR_YN": "N",  # 시간외단일가여부
                "INQR_DVSN": "01",  # 조회구분
                "UNPR_DVSN": "01",  # 단가구분
                "FUND_STTL_ICLD_YN": "N",  # 펀드결제분포함여부
                "FNCG_AMT_AUTO_RDPT_YN": "N",  # 융자금액자동상환여부
                "PRCS_DVSN": "00",  # 처리구분
                "CTX_AREA_FK100": "",  # 연속조회검색조건100
                "CTX_AREA_NK100": "",  # 연속조회키100
                "OFL_YN": ""  # 오프라인여부
            }
            response = await client.get(
                f"{TrIdManager.get_domain('balance')}{BALANCE_PATH}",
                headers={
                    "content-type": CONTENT_TYPE,
                    "authorization": f"{AUTH_TYPE} {token}",
                    "appkey": os.environ["KIS_APP_KEY"],
                    "appsecret": os.environ["KIS_APP_SECRET"],
                    "tr_id": TrIdManager.get_tr_id("balance")
                },
                params=request_data
            )
            
            if response.status_code != 200:
                raise Exception(f"Failed to get balance: {response.text}")
            
            return response.json()
  • Constant defining the API path for the domestic stock balance inquiry endpoint used by the inquery-balance tool.
    BALANCE_PATH = "/uapi/domestic-stock/v1/trading/inquire-balance"  # 잔고조회
  • TrIdManager class provides the transaction IDs ('TTTC8434R' for real, 'VTTC8434R' for virtual) and domain selection logic used by the inquery-balance handler for API requests.
    class TrIdManager:
        """Transaction ID manager for Korea Investment & Securities API"""
        
        # 실전계좌용 TR_ID
        REAL = {
            # 국내주식
            "balance": "TTTC8434R",  # 잔고조회
            "price": "FHKST01010100",  # 현재가조회
            "buy": "TTTC0802U",  # 주식매수
            "sell": "TTTC0801U",  # 주식매도
            "order_list": "TTTC8001R",  # 일별주문체결조회
            "order_detail": "TTTC8036R",  # 주문체결내역조회
            "stock_info": "FHKST01010400",  # 일별주가조회
            "stock_history": "FHKST03010200",  # 주식일별주가조회
            "stock_ask": "FHKST01010200",  # 주식호가조회
            
            # 해외주식
            "us_buy": "TTTT1002U",      # 미국 매수 주문
            "us_sell": "TTTT1006U",     # 미국 매도 주문
            "jp_buy": "TTTS0308U",      # 일본 매수 주문
            "jp_sell": "TTTS0307U",     # 일본 매도 주문
            "sh_buy": "TTTS0202U",      # 상해 매수 주문
            "sh_sell": "TTTS1005U",     # 상해 매도 주문
            "hk_buy": "TTTS1002U",      # 홍콩 매수 주문
            "hk_sell": "TTTS1001U",     # 홍콩 매도 주문
            "sz_buy": "TTTS0305U",      # 심천 매수 주문
            "sz_sell": "TTTS0304U",     # 심천 매도 주문
            "vn_buy": "TTTS0311U",      # 베트남 매수 주문
            "vn_sell": "TTTS0310U",     # 베트남 매도 주문
        }
        
        # 모의계좌용 TR_ID
        VIRTUAL = {
            # 국내주식
            "balance": "VTTC8434R",  # 잔고조회
            "price": "FHKST01010100",  # 현재가조회
            "buy": "VTTC0802U",  # 주식매수
            "sell": "VTTC0801U",  # 주식매도
            "order_list": "VTTC8001R",  # 일별주문체결조회
            "order_detail": "VTTC8036R",  # 주문체결내역조회
            "stock_info": "FHKST01010400",  # 일별주가조회
            "stock_history": "FHKST03010200",  # 주식일별주가조회
            "stock_ask": "FHKST01010200",  # 주식호가조회
            
            # 해외주식
            "us_buy": "VTTT1002U",      # 미국 매수 주문
            "us_sell": "VTTT1001U",     # 미국 매도 주문
            "jp_buy": "VTTS0308U",      # 일본 매수 주문
            "jp_sell": "VTTS0307U",     # 일본 매도 주문
            "sh_buy": "VTTS0202U",      # 상해 매수 주문
            "sh_sell": "VTTS1005U",     # 상해 매도 주문
            "hk_buy": "VTTS1002U",      # 홍콩 매수 주문
            "hk_sell": "VTTS1001U",     # 홍콩 매도 주문
            "sz_buy": "VTTS0305U",      # 심천 매수 주문
            "sz_sell": "VTTS0304U",     # 심천 매도 주문
            "vn_buy": "VTTS0311U",      # 베트남 매수 주문
            "vn_sell": "VTTS0310U",     # 베트남 매도 주문
        }
        
        @classmethod
        def get_tr_id(cls, operation: str) -> str:
            """
            Get transaction ID for the given operation
            
            Args:
                operation: Operation type ('balance', 'price', 'buy', 'sell', etc.)
                
            Returns:
                str: Transaction ID for the operation
            """
            is_real_account = os.environ.get("KIS_ACCOUNT_TYPE", "REAL").upper() == "REAL"
            tr_id_map = cls.REAL if is_real_account else cls.VIRTUAL
            return tr_id_map.get(operation)
        
        @classmethod
        def get_domain(cls, operation: str) -> str:
            """
            Get domain for the given operation
            
            Args:
                operation: Operation type ('balance', 'price', 'buy', 'sell', etc.)
                
            Returns:
                str: Domain URL for the operation
            """
            is_real_account = os.environ.get("KIS_ACCOUNT_TYPE", "REAL").upper() == "REAL"
            
            # 잔고조회는 실전/모의 계좌별로 다른 도메인 사용
            if operation == "balance":
                return DOMAIN if is_real_account else VIRTUAL_DOMAIN
                
            # 조회 API는 실전/모의 동일한 도메인 사용
            if operation in ["price", "stock_info", "stock_history", "stock_ask"]:
                return DOMAIN
                
            # 거래 API는 계좌 타입에 따라 다른 도메인 사용
            return DOMAIN if is_real_account else VIRTUAL_DOMAIN

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/migusdn/KIS_MCP_Server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server