Skip to main content
Glama
meritz-securities

meritz-mcp

Official

메리츠증권 Open API MCP 서버

개발자 포털 · API 신청 · API 문서 · 문의

test release license

MCP 표준을 지원하는 AI 클라이언트에 연결해, 메리츠증권 Open API를 대화로 다루실 수 있게 해 주는 MCP 서버입니다. 시세·잔고·주문을 자연어로 요청하시면 됩니다.

먼저 설치하세요

최신 고객용 설치파일은 릴리스 페이지에서 받으십시오.

사용 환경

설치파일

Claude Desktop — Mac Apple Silicon

MCPB 다운로드

Claude Desktop — Mac Intel

MCPB 다운로드

Claude Desktop — Windows

MCPB 다운로드

Claude Code·Codex·Gemini·Cursor·VS Code

OS별 실행파일

설치 후 앱키와 시크릿을 입력합니다. 기본값은 조회 전용입니다.

Related MCP server: pykrx-mcp

저장소가 네 개입니다

하고 싶으신 일

여기로

AI 클라이언트에 붙이기

이 저장소

파이썬으로 직접 호출해 보기

open-api — 실행 예제

터미널에서 조회·주문하기

open-api-studiomeritz CLI

호출 코드를 받아 쓰기

open-api-codegen-mcp

앱키 발급

개발자 포털 https://openapi.imeritz.com 에서 앱키(App Key)와 시크릿(App Secret)을 발급받으세요.

  1. 포털에 로그인합니다

  2. 앱을 등록하고 사용하실 계좌를 연결합니다

  3. 앱키와 시크릿을 발급받습니다

앱키에는 계좌가 묶입니다. 계좌번호를 따로 넣지 않아도 그 계좌가 조회되고, 주문도 그 계좌로 나갑니다.

앱키에 연결된 계좌는 실계좌입니다. 모의계좌를 전제로 시험하지 말아 주세요.

조회 결과는 연결하신 AI 서비스로 전송됩니다. 해당 서비스의 데이터 처리 정책이 적용되며, 당사는 이에 관여하지 않습니다. 자세한 내용은 DISCLAIMER.md를 확인해 주세요.

설치 — 쓰시는 도구를 고르십시오

Python이나 uv를 따로 깔지 않으셔도 됩니다. 서버가 단일 실행 파일로 제공됩니다. 기본값은 조회 전용이고, 앱키는 설치 화면이나 환경변수로 넣습니다. 실행 파일 안에는 앱키가 없습니다.

Claude Desktop — 설치 파일 더블클릭

내 컴퓨터

내려받기

Mac — Apple 칩 (M1 이후)

meritz-open-api-darwin-arm64.mcpb

Mac — Intel 칩

meritz-open-api-darwin-x64.mcpb

Windows

meritz-open-api-win32-x64.mcpb

내려받은 파일을 더블클릭하면 Claude Desktop이 열리고, 앱키와 시크릿을 묻는 화면이 나옵니다. 입력하고 설치를 누르시면 끝입니다. 앱키는 OS 키체인(Mac) 또는 자격 증명 관리자(Windows)에 저장됩니다.

  • 어느 칩인지 모르시면 Mac은 Apple 메뉴 → 이 Mac에 관하여에서 "칩" 항목을 보세요. "Apple M…"이면 Apple 칩입니다.

  • 이 실행 파일에는 아직 코드서명이 없어 Mac에서 "확인되지 않은 개발자" 경고가 뜹니다. 넘기시기 전에 릴리스의 SHA256SUMS.txt 와 받으신 파일의 해시를 대조해 주세요 (shasum -a 256 <파일>). 값이 같으면 시스템 설정 → 개인정보 보호 및 보안 → 그래도 열기로 진행하시고, 다르면 실행하지 마시고 문의해 주세요.

  • 새 버전은 파일을 다시 내려받아 설치하십시오. 직접 내려받은 설치 파일은 자동으로 갱신되지 않습니다.

  • 파일 하나에 세 실행 파일을 다 넣지 않고 OS별로 나눈 것은, 크기를 30MB 안팎으로 유지하기 위해서입니다.

터미널로 설치하기 — install.py

포털 안내대로 저장소를 받아 install.py를 실행하면 이 PC에 맞는 실행 파일을 릴리스에서 내려받고, 클라이언트별로 붙여 넣을 명령을 보여 줍니다. Python은 이 스크립트를 돌리는 데만 쓰이고 실행 파일은 Python 없이 동작합니다.

git clone https://github.com/meritz-securities/open-api-mcp.git
cd open-api-mcp
python3 install.py                      # Windows: python install.py
python3 install.py --register claude-code   # Claude Code에 바로 등록 (codex · gemini 도 됩니다)

Mac 에서는 실행 권한 부여와 격리 속성(com.apple.quarantine) 해제까지 이 스크립트가 대신 해 줍니다. 아래 "실행 파일 + 명령 한 줄"을 손으로 하실 때만 두 단계를 직접 하시면 됩니다.

Claude Code · Codex CLI · ChatGPT 데스크톱 · Gemini CLI · Cursor · VS Code — 실행 파일 + 명령 한 줄

  1. 실행 파일을 내려받아 원하는 곳에 둡니다.

    내 컴퓨터

    내려받기

    Mac — Apple 칩

    meritz-mcp-darwin-arm64

    Mac — Intel 칩

    meritz-mcp-darwin-x64

    Windows

    meritz-mcp-win32-x64.exe

    Mac 에서는 실행 권한과 격리 속성 해제를 둘 다 해 주셔야 합니다. 한 번만 하시면 됩니다.

    chmod +x ~/Downloads/meritz-mcp-darwin-arm64
    shasum -a 256 ~/Downloads/meritz-mcp-darwin-arm64   # SHA256SUMS.txt 와 대조
    xattr -d com.apple.quarantine ~/Downloads/meritz-mcp-darwin-arm64
    mkdir -p ~/meritz && mv ~/Downloads/meritz-mcp-darwin-arm64 ~/meritz/meritz-mcp

    격리 해제를 건너뛰면 서버가 뜨지 않습니다. 브라우저로 내려받은 파일에는 macOS 가 com.apple.quarantine 속성을 붙입니다. 이 실행 파일은 ad-hoc 서명이라 Apple 개발자 인증서가 없고 공증도 되어 있지 않아, 속성이 붙은 채로 실행되면 아무 메시지 없이 종료코드 -9(SIGKILL)로 죽습니다. AI 앱의 도구 목록에 메리츠가 보이지 않는다면 이 속성이 남아 있을 가능성이 큽니다. 같은 파일에서 속성만 지우면 정상 동작합니다. install.py 로 설치하시면 실행 권한 부여와 격리 해제를 스크립트가 대신 해 줍니다. (Claude Desktop 용 .mcpb 더블클릭은 Claude Desktop 이 직접 압축을 풀기 때문에 이 속성이 붙지 않아, 이 작업이 필요 없습니다.)

    Windows.exe 를 처음 실행할 때 SmartScreen 경고가 뜹니다. 아직 코드서명이 없는 실행 파일이라 표시되는 경고입니다. 넘기시기 전에 릴리스의 SHA256SUMS.txt 와 해시를 대조해 주세요 (certutil -hashfile <파일> SHA256). 값이 같으면 경고 창의 추가 정보 → 실행으로 진행하시고, 다르면 실행하지 마시고 문의해 주세요.

  2. 쓰시는 도구에 한 줄로 등록합니다. <실행 파일 경로>는 위에서 둔 위치의 전체 경로입니다 (예: /Users/홍길동/meritz/meritz-mcp).

    도구

    명령

    Claude Code

    claude mcp add meritz --env MERITZ_APP_KEY=발급받은_앱키 --env MERITZ_APP_SECRET=발급받은_시크릿 -- <실행 파일 경로>

    Codex CLI

    codex mcp add meritz --env MERITZ_APP_KEY=발급받은_앱키 --env MERITZ_APP_SECRET=발급받은_시크릿 -- <실행 파일 경로>

    ChatGPT 데스크톱

    설정 → MCP servers → Add server → 이름 입력 → STDIO 선택 → 실행 파일 경로 입력 → 저장 → 재시작. 터미널을 쓰시면 위 Codex CLI 명령과 같습니다

    Gemini CLI

    gemini mcp add -e MERITZ_APP_KEY=발급받은_앱키 -e MERITZ_APP_SECRET=발급받은_시크릿 meritz <실행 파일 경로>

    Cursor · VS Code

    연결 도우미 docs/connect.html 파일을 내려받아 브라우저로 여신 뒤 실행 파일 경로와 앱키를 넣으시면 한 번에 추가 버튼이 만들어집니다

    ChatGPT 데스크톱 — ChatGPT 데스크톱 앱·Codex CLI·IDE 확장은 ~/.codex/config.toml 을 함께 씁니다. 어느 쪽에서 등록하셔도 나머지에 같이 잡힙니다. ChatGPT 웹은 이 설정 파일을 읽지 못해 지원되지 않습니다 — 웹에서 쓰시려면 아래 터널 방식을 보십시오.

    기동 대기는 60초로 늘려 두십시오. 첫 기동에 8초 남짓 걸립니다(실측 8.2·8.2·8.6초). Codex·ChatGPT 데스크톱의 기본 대기는 10초라 여유가 2초도 되지 않아, 느린 PC 나 백신 검사가 끼면 넘겨 도구가 아예 뜨지 않습니다. ~/.codex/config.toml[mcp_servers.meritz] 테이블에 startup_timeout_sec = 60 한 줄을 넣어 주세요 — 아래 "설정을 직접 넣으시려면"의 예시가 그 형태입니다. codex mcp add 로 등록하셨다면 그 파일을 열어 해당 테이블에 직접 추가하시면 됩니다.

    연결 도우미docs/connect.html 파일을 내려받아 브라우저로 여시면 앱키·실행 파일 경로를 넣는 대로 위 명령과 Cursor·VS Code 버튼, JSON 설정을 만들어 드립니다. 입력한 값은 브라우저 밖으로 나가지 않습니다. (GitHub 에서 링크를 누르면 HTML 소스가 그대로 보입니다. 파일을 내려받아 브라우저로 여세요.)

도구

방법

Claude Code

claude mcp add meritz -- uvx --from git+https://github.com/meritz-securities/open-api-mcp meritz-mcp

Cursor

한 번에 추가

VS Code

한 번에 추가

Codex CLI

codex mcp add meritz -- uvx --from git+https://github.com/meritz-securities/open-api-mcp meritz-mcp

실행 파일을 쓰는 설정입니다. Codex CLI 는 ~/.codex/config.toml 을 씁니다.

[mcp_servers.meritz]
command = "/Users/홍길동/meritz/meritz-mcp"
startup_timeout_sec = 60

[mcp_servers.meritz.env]
MERITZ_APP_KEY = "발급받은_앱키"
MERITZ_APP_SECRET = "발급받은_시크릿"
MERITZ_READ_ONLY = "1"

startup_timeout_sec[mcp_servers.meritz] 테이블 안, [mcp_servers.meritz.env] 줄보다 에 두셔야 합니다. 아래에 두면 환경변수로 읽힙니다.

환경변수는 반드시 [mcp_servers.meritz.env] 테이블로 적으십시오. env_vars = { … } 처럼 인라인 테이블로 적으면 invalid type: map, expected a sequence~/.codex/config.toml 전체가 읽히지 않아 Codex CLI 와 ChatGPT 데스크톱이 모두 뜨지 않습니다. codex mcp add 로 등록하시면 이 형식이 그대로 만들어집니다.

그 밖의 도구는 대개 이 JSON 형식을 받습니다 (Claude Desktop claude_desktop_config.json, Cursor mcp.json, Gemini CLI settings.json).

{
  "mcpServers": {
    "meritz": {
      "command": "/Users/홍길동/meritz/meritz-mcp",
      "env": {
        "MERITZ_APP_KEY": "발급받은_앱키",
        "MERITZ_APP_SECRET": "발급받은_시크릿",
        "MERITZ_READ_ONLY": "1"
      }
    }
  }
}

릴리스에 올라온 파일이 무엇인지

릴리스 페이지에는 파일이 여덟 개 있습니다. 쓰시는 것 하나만 받으시면 됩니다.

파일

무엇인지

meritz-open-api-darwin-arm64.mcpbmeritz-open-api-darwin-x64.mcpbmeritz-open-api-win32-x64.mcpb

Claude Desktop 설치 파일 (OS별 3종, 30MB 안팎). 더블클릭하면 설치됩니다

meritz-mcp-darwin-arm64meritz-mcp-darwin-x64meritz-mcp-win32-x64.exe

실행 파일 (OS별 3종, 30MB 안팎). Claude Code·Codex CLI·ChatGPT 데스크톱·Gemini CLI·Cursor·VS Code 에 경로로 등록해서 씁니다

SHA256SUMS.txt

위 파일들의 체크섬

meritz-open-api.mcpb (100KB대)

예전 방식입니다. 새로 받으실 분은 고르지 마십시오. 실행 파일이 들어 있지 않고 uvx 로 내려받아 실행하는 형태라, 파이썬과 uv 가 따로 깔려 있어야 동작합니다. 다음 릴리스부터는 올라오지 않습니다

받은 파일이 올라온 그대로인지 확인하시려면 SHA256SUMS.txt 를 받은 파일과 같은 폴더에 두고:

shasum -a 256 -c SHA256SUMS.txt        # 내려받지 않은 파일은 "FAILED open or read" 로 나옵니다
shasum -a 256 meritz-mcp-darwin-arm64  # 값 하나만 뽑아 SHA256SUMS.txt 의 해당 줄과 눈으로 대조하셔도 됩니다

Windows(PowerShell)에서는 값을 뽑아 대조하십시오.

Get-FileHash .\meritz-mcp-win32-x64.exe -Algorithm SHA256

Claude 웹·모바일, ChatGPT 웹 — 내 PC의 서버를 터널로 연결 (권장하지 않음)

권장하지 않는 부가 방법입니다. 이 방식은 주문까지 가능한 서버를 인터넷에 노출합니다. 두 서비스 모두 커넥터 인증이 OAuth 또는 없음뿐이라, 주소의 난수 경로가 사실상 유일한 접근 통제입니다. 주소를 알게 된 사람은 누구나 주문할 수 있고, 그 주소는 AI 서비스 쪽에 커넥터 설정으로 저장됩니다. 가능하면 위의 실행 파일 등록 방식을 쓰시고, 쓰신 뒤에는 터널을 닫아 주십시오.

ChatGPT 데스크톱 앱을 쓰신다면 터널이 필요 없습니다. 위의 실행 파일 등록을 쓰십시오. 아래는 ChatGPT 과 Claude 웹·모바일용입니다.

Claude 웹·모바일 앱과 ChatGPT 웹은 인터넷 주소(HTTPS)로 접근되는 MCP 서버만 받습니다. 이 서버는 내 PC에서 돌지만, 터널 도구로 임시 HTTPS 주소를 만들어 붙일 수 있습니다. PC를 켜 두어야 하고, 무료 터널은 주소가 매번 바뀌며, 주소를 아는 사람은 누구나 접근할 수 있으므로 아래처럼 난수 경로를 꼭 넣으십시오. 두 서비스 모두 커넥터 인증 옵션이 OAuth 또는 없음뿐이라, 접속 토큰을 헤더가 아닌 주소 경로에 넣는 것이 유일한 방법입니다.

  1. 서버를 HTTP 모드로 띄웁니다. <난수>는 아무도 모르는 긴 문자열로 바꾸세요 (연결 도우미가 만들어 드립니다).

    MERITZ_APP_KEY=발급받은_앱키 MERITZ_APP_SECRET=발급받은_시크릿 \
    MCP_TYPE=streamable-http MCP_PORT=8765 MCP_PATH=/mcp/<난수> ~/meritz/meritz-mcp

    Windows(PowerShell)에서는 $env:MERITZ_APP_KEY="…" 식으로 변수를 먼저 지정하고 실행 파일을 실행합니다.

  2. 다른 터미널에서 터널을 엽니다. 둘 중 하나면 됩니다.

    cloudflared tunnel --url http://127.0.0.1:8765     # 계정 없이 임시 주소가 나옵니다
    ngrok http 8765                                     # ngrok 계정이 필요합니다

    https://…trycloudflare.com 또는 https://….ngrok-free.app 같은 주소가 표시됩니다.

  3. 챗 서비스에 붙입니다. 주소는 https://<터널 주소>/mcp/<난수> 입니다.

    서비스

    위치

    조건

    Claude

    설정 → 커넥터 → 커스텀 커넥터 추가 → 주소 입력, 인증은 비워 둠

    전 요금제. 웹·데스크톱에서 설정하면 휴대폰 앱과 음성 모드에서도 같은 연결을 씁니다

    ChatGPT 웹

    설정 → 커넥터 → 고급 → 개발자 모드 켜기 → 만들기 → 주소 입력, 인증 없음

    유료 요금제. 웹에서 설정. 음성 모드에서는 도구가 호출되지 않습니다

PC를 끄거나 터널을 닫으면 연결이 끊깁니다. 다시 열면 주소가 바뀌므로 커넥터의 주소도 고쳐 주셔야 합니다.

도구

분류마다 하나씩, 여섯 개입니다. 여기에 서버 정보를 돌려주는 meritz_info까지 모두 일곱 개가 뜹니다. api_type으로 호출할 API를 고르시면 됩니다.

도구

다루는 것

API

meritz_account

잔고·예수금·평가·거래내역·손익

11건

meritz_market

국내주식 시세·호가·체결·투자자별 매매

10건

meritz_overseas_market

해외주식 시세·호가·체결

6건

meritz_trading

주문·정정·취소·주문내역·예약주문

24건

meritz_forex

환율·환전

4건

meritz_reference

거래일·장 운영시간·거래소 등 참조 정보

5건

국내와 해외 시세를 한 도구에 담지 않은 것은 종목코드와 거래소 코드 체계가 서로 달라서입니다. 섞어 두면 모델이 국내 파라미터를 해외 조회에 그대로 넣습니다.

api_type='describe'로 부르시면 파라미터와 응답 필드 설명을 돌려드립니다. meritz_info는 서버 설정과 카탈로그 요약을 돌려드립니다. 카탈로그는 개발자 포털 등록 명세에서 만들며, REST 62건 중 60건을 도구로 노출합니다(토큰 발급·폐기 2건은 서버가 내부에서 처리합니다).

실시간(웹소켓)은 이 서버에서 다루지 않습니다. MCP는 요청·응답 모델이라 구독 스트림과 맞지 않기 때문입니다. 실시간 코드가 필요하시면 open-api-codegen-mcp를 써 주세요.

주문은 두 단계입니다

주문과 환전은 먼저 내용을 보여드린 뒤 확인을 받아 전송합니다. 기본값은 조회 전용이며, 주문·환전 안전장치와 실제 접수 판정의 자세한 내용은 DISCLAIMER.md를 확인해 주세요.

환경변수

변수

기본값

설명

MERITZ_APP_KEY / MERITZ_APP_SECRET

포털에서 발급

MERITZ_BASE_URL

운영 도메인

호출 대상 서버를 직접 지정합니다 (https 만)

MERITZ_WS_URL

운영 실시간 도메인

MERITZ_BASE_URL을 운영이 아닌 주소로 두셨다면 함께 지정하셔야 합니다

MERITZ_READ_ONLY

1

기본이 조회 전용입니다. 주문·환전까지 쓰시려면 0으로 두세요

MERITZ_TIMEOUT

15

요청 제한시간(초)

MCP_TYPE

stdio

streamable-http로 두면 HTTP 서버로 뜹니다 (터널 연결용)

MCP_HOST / MCP_PORT / MCP_PATH

127.0.0.1 / 8000 / /mcp

HTTP 모드의 주소·포트·경로. 경로에 난수를 넣어 접속 토큰으로 쓰십시오

응답 판정

HTTP 200이 왔다고 성공으로 넘기지 않습니다.

1) HTTP 200 인가 — 초당 호출 한도를 넘기면 500 과 함께 EGW00200 이 옵니다
2) 주문이라면 warn_cls_code 부터 — 경고면 접수되지 않았습니다
3) rsp_cd 를 읽을 수 있는가 → 성공 코드면 성공, 아니면 업무 오류
4) 읽을 수 없다면 알려진 문제인지 확인 (corrections.json)
     알려진 것이 아니면 실패로 처리합니다
     맞으면 데이터가 있을 때만 통과시키되 "검증되지 않음"을 표시합니다
     주문·환전은 여기서도 통과시키지 않습니다

성공으로 보는 코드는 0000·0001·5762·5766·5820·5822입니다. 5762는 다음 페이지가 있다는 뜻이고, 5820·5822는 보통 조회 결과가 없다는 뜻입니다.

5820으로 자료 유무를 판정하지 마십시오. 담보 조회·종목별 실현손익·해외 실현손익은 자료를 담은 채로도 5820을 보냅니다. data가 비었는지로 판정하십시오. 오류 코드표는 open-api 저장소의 docs/errors.md에 있습니다 — 오류는 종류와 무관하게 HTTP 500으로 오고, 조치 정보는 rsp_sub_msg에 담깁니다.

개발

uv sync
uv run pytest tests/ -q

저장소를 내려받아 소스로 실행하실 때는 .env.example.env로 복사해 쓰셔도 됩니다. 단일 실행 파일은 .env를 읽지 않으니 환경변수로 넣어 주십시오.

실행 파일과 설치 파일을 직접 만드시려면:

./build_binary.sh                    # bin/meritz-mcp — PyInstaller 단일 실행 파일, 자기 점검 포함
python3 make_bundle.py darwin-arm64  # dist/meritz-open-api-darwin-arm64.mcpb (darwin-x64 · win32-x64 도 같음)

릴리스는 태그를 밀면 GitHub Actions가 세 플랫폼을 빌드해 올립니다: git tag vX.Y.Z && git push origin vX.Y.Z.

사용 전 확인해 주세요

  • 이 서버는 실제 계좌에 영향을 줍니다. 모의계좌를 전제로 시험하지 말아 주세요

  • 앱키와 시크릿을 저장소에 커밋하지 말아 주세요

  • 조회 결과는 연결하신 AI 서비스로 전송되며, 해당 서비스의 데이터 처리 정책이 적용됩니다

  • 투자 판단이나 매매 추천을 위한 도구가 아닙니다. DISCLAIMER.md를 꼭 읽어 주세요

라이선스

MIT — LICENSE

실행 파일에 함께 들어가는 오픈소스의 고지는 THIRD-PARTY-NOTICES.txt 에 있습니다.

문의는 개발자 포털을 이용해 주세요.

Available Tools

7 tools
meritz_account메리츠 계좌A
Read-onlyIdempotent

메리츠 Open API — 계좌 (11건). api_type 으로 호출할 API 를 고르고 params 에 파라미터를 넣습니다. api_type='describe' 로 부르면 파라미터 설명을 돌려줍니다.

collateral GET 내 계좌 담보 현황 조회 deposit GET 내 계좌 예수금 상세 조회 holdings GET 내 계좌 종목별 평가 조회 ovs_currencies GET 해외주식 외화잔고 조회 ovs_holdings GET 해외주식 잔고 조회 ovs_profit_loss GET 해외주식 실현손익 profit_loss GET 국내주식 실현손익 (일자별) profit_loss_summary GET 국내주식 실현손익 (합계) profit_loss_symbols GET 국내주식 실현손익 (종목별) transactions GET 내 계좌 입출금 내역 조회 valuation GET 내 계좌 자산평가 조회

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
api_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's listing of GET operations adds little beyond what annotations provide. It does not contradict annotations, but also does not add extra behavioral context like pagination or authentication requirements.

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 a compact list with a short instruction header. Each endpoint line is informative and the structure is scannable. No filler words, though the list itself is necessary for the api_type values.

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?

Given the tool covers 11 endpoints, the description provides sufficient routing via api_type and a self-service describe option for parameters. The presence of an output schema covers return values. Auth requirements are not mentioned, but that may be handled elsewhere in the API ecosystem.

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 schema has 0% description coverage, but the description compensates by enumerating all valid api_type values (the 11 endpoints) and explaining the params object. The describe mechanism provides a way to get further parameter details, adding meaningful guidance beyond the bare 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 this is the Meritz Open API for account-related queries, listing 11 specific GET endpoints. It names the resource (계좌) and the action (조회) for each, and the account scope distinguishes it from sibling tools like meritz_market and meritz_trading.

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 explains how to use the tool (select api_type, provide params) and mentions the 'describe' mode for parameter explanations. However, it does not explicitly state when to prefer this tool over siblings, though the account-specific scope makes that self-evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meritz_forex메리츠 환전A
Destructive

메리츠 Open API — 환전 (4건). api_type 으로 호출할 API 를 고르고 params 에 파라미터를 넣습니다. api_type='describe' 로 부르면 파라미터 설명을 돌려줍니다.

fx_exchanges POST 실시간 환전신청 ⚠ 상태변경 fx_exchanges_history GET 환전 내역 조회 fx_rates GET 고시환율 조회 fx_rates_applied GET 환전 적용환율 조회

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
api_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true), the description flags fx_exchanges as a state-changing POST with a warning while labeling the others as GET queries. It also reveals the self-describing describe behavior. It does not detail side effects or permissions, but annotations already signal the risk profile.

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-line usage rule, a self-documentation hint, then a scannable table of the four API variants with the mutation warning. No filler or repetition.

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 multi-endpoint router with a generic params schema, the describe instruction and method listing make the tool callable without further research. It lacks endpoint-specific parameter schemas and auth/rate-limit caveats, but the self-describe mechanism and output schema cover the critical gap.

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?

With 0% schema description coverage, the description compensates by listing the valid api_type values and explaining that params is the argument container. The api_type='describe' mechanism is a practical way for an agent to discover endpoint-specific parameters, though the actual parameter names are not enumerated inline.

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 states the tool is a Meritz Open API wrapper for forex/exchange and enumerates four distinct API calls (fx_exchanges, fx_exchanges_history, fx_rates, fx_rates_applied) with HTTP methods and purpose labels. This makes the tool's scope concrete and differentiates it from account/market/trading siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the invocation pattern: choose an API via api_type, pass arguments via params, and use api_type='describe' for parameter documentation. However, it does not state when to prefer this tool over sibling tools or give exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meritz_infoA
Read-only

서버 설정과 API 카탈로그 요약, 알려진 문제를 돌려줍니다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description does not need to restate safety. It adds useful content categories (server settings, API catalog summary, known issues), but does not disclose any further behavior such as freshness of known issues, authentication expectations, or output limitations.

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 a single front-loaded sentence with no filler. Every part contributes meaning: what data is returned and for which general purpose.

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?

Given the zero-parameter schema, read-only annotation, and existing output schema, the description is largely sufficient. The only minor gap is the lack of sibling differentiation or usage context, but for a simple informational endpoint the provided content list is reasonably complete.

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 zero parameters and the schema has 100% coverage, so there is nothing for the description to explain about parameters. The baseline of 4 for a parameterless tool applies, and the description does not omit any parameter-related information.

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 states a clear verb ('returns') and specific resources: server settings, API catalog summary, and known issues. It distinguishes itself from the sibling domain tools (account, market, trading, etc.) by describing a meta/informational scope rather than a business operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives such as meritz_reference or the domain-specific tools. The purpose is clear, but the agent is left to infer usage context from the tool name and siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meritz_market메리츠 국내주식 시세A
Read-onlyIdempotent

메리츠 Open API — 국내주식 시세 (10건). api_type 으로 호출할 API 를 고르고 params 에 파라미터를 넣습니다. api_type='describe' 로 부르면 파라미터 설명을 돌려줍니다.

market_candles_days GET 시세추이 조회(일봉) market_candles_minutes GET 시세추이 조회(분봉) market_investors GET 종목별 투자자매매동향 market_investors_detail GET 국내주식 종목별 투자자매매동향 상세 market_orderbook GET 호가 조회 market_orderbook_after GET 시간외 단일가 호가 조회 market_prices GET 현재가 조회 market_prices_after GET 시간외 단일가 조회 market_trades_minutes GET 체결추이 조회(분) market_trades_ticks GET 체결추이 조회(틱)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
api_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context: the api_type='describe' mode that returns parameter explanations, and the enumeration of the ten sub-APIs, which informs the agent of the tool's full capability without relying on the schema. It does not contradict the annotations.

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 efficient: it front-loads the purpose and usage pattern, then lists the ten endpoints in a compact, scannable table. Every line serves a purpose—there is no filler or redundant explanation—making it easy for an agent to parse and act on.

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?

Given the tool exposes ten distinct endpoints and has a sparse input schema, the description gives an agent a sufficient overview of available operations and how to discover parameter schemas via the describe mode. The output schema exists, so return value details are covered elsewhere. The description could mention authentication or rate limits, but those are not critical given the read-only, idempotent nature already indicated.

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 description coverage is 0%, so the description must compensate. It does so by listing the valid api_type values (the endpoint names) and explaining that params holds the parameters. It also instructs the agent to use api_type='describe' to obtain detailed parameter descriptions, effectively providing a self-documenting mechanism for a tool with minimal schema information.

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 provides domestic stock market quotes and lists 10 specific GET endpoints for different data types (candles, investors, orderbook, prices, trades). It distinguishes itself from siblings by specifying '국내주식' (domestic stocks) and by focusing solely on market data, which is separate from trading, accounts, or overseas markets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to choose an API via api_type and how to use params, and mentions that api_type='describe' returns parameter descriptions. However, it does not explicitly state when to use this tool versus alternatives like meritz_overseas_market or meritz_trading; the usage context is implied by the tool name and scope rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meritz_overseas_market메리츠 해외주식 시세A
Read-onlyIdempotent

메리츠 Open API — 해외주식 시세 (6건). api_type 으로 호출할 API 를 고르고 params 에 파라미터를 넣습니다. api_type='describe' 로 부르면 파라미터 설명을 돌려줍니다.

ovs_market_candles_days GET 해외주식 시세추이 조회 (일봉) ovs_market_candles_minutes GET 해외주식 시세추이 조회 (분봉) ovs_market_orderbook GET 해외주식 호가 조회 ovs_market_prices GET 해외주식 현재가 조회 ovs_market_trades_minutes GET 해외주식 체결추이 조회 (분) ovs_market_trades_ticks GET 해외주식 체결추이 (틱)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
api_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: all operations are GET requests, and api_type='describe' returns parameter descriptions dynamically. It does not mention auth or rate limits, but given the annotation coverage this is acceptable.

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 well-structured: a short usage instruction followed by a compact endpoint table. Each line earns its place by mapping an api_type to a data type. The opening phrase slightly duplicates the title but is not harmful. Overall it is efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool is a multi-endpoint dispatcher with opaque params, the description is not fully self-sufficient for direct invocation of each sub-API. It mitigates this by pointing to api_type='describe' for parameter details, and an output schema exists. Still, for an agent to call, say, ovs_market_candles_days correctly, it would need an extra describe round-trip; the static description alone lacks that detail.

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?

Input schema has 0% description coverage, so the description must compensate. It adds meaning by listing valid api_type values and explaining that params should contain API parameters. However, it does not describe the actual keys or structures for the params object, relying instead on the api_type='describe' mechanism as a runtime fallback. This is partial compensation but not full parameter documentation.

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 this tool provides overseas stock market quotes ('해외주식 시세') and enumerates six distinct endpoint variants with specific purposes such as daily candles, minute candles, orderbook, current price, and trades. This makes the tool's function obvious and differentiates it from sibling tools like meritz_market.

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 tells the agent how to select an API via api_type and provides a table mapping each api_type value to its data purpose. It also instructs to call api_type='describe' for parameter explanations. It does not explicitly discuss when to prefer this tool over meritz_market or meritz_forex, but the overseas-market scope is clear from the title and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meritz_reference메리츠 기준정보A
Read-onlyIdempotent

메리츠 Open API — 기준정보 (5건). api_type 으로 호출할 API 를 고르고 params 에 파라미터를 넣습니다. api_type='describe' 로 부르면 파라미터 설명을 돌려줍니다.

ref_market_days GET 국내 영업일 조회 ref_market_hours GET 국내 장운영 조회 ref_ovs_exchanges GET 해외 거래소 조회 ref_ovs_market_days GET 해외 영업일 조회 ref_ovs_market_hours GET 해외 장운영 조회

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
api_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly discloses dispatcher-style behavior: api_type selects one of five GET endpoints, and api_type='describe' returns parameter explanations. This aligns with the annotations (readOnlyHint, idempotentHint, destructiveHint=false) and adds useful behavioral context beyond the schema, though it omits details like error behavior or rate limits.

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 efficient: two short prose lines plus a clearly aligned five-row table. The routing instruction is front-loaded, and every line contributes useful information without repetition or filler.

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 read-only router with an output schema, the description provides the essential operation list, HTTP verbs, and a self-describe fallback for parameter details. The main gap is the absence of per-endpoint parameter examples, but the describe mode mitigates this and allows an agent to discover the details at runtime.

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?

With 0% schema description coverage, the description partially compensates by explaining that api_type selects the endpoint and params holds parameters, and by pointing to the describe mode for parameter details. However, it does not document the actual parameters for each of the five endpoints, so an agent must call describe to learn the exact parameter names and formats.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as reference data and enumerates five concrete GET operations with clear labels (domestic/overseas market days, market hours, and exchanges). It is specific enough to distinguish the tool from trading or account tools, though it does not explicitly contrast it with siblings like meritz_info or meritz_market.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the routing mechanics: choose an API via api_type and supply params. It does not explicitly state when to use meritz_reference versus alternative sibling tools, but the listed operation names strongly imply it is for static reference lookups such as market days and exchange lists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meritz_trading메리츠 주문A
Destructive

메리츠 Open API — 주문 (24건). api_type 으로 호출할 API 를 고르고 params 에 파라미터를 넣습니다. api_type='describe' 로 부르면 파라미터 설명을 돌려줍니다.

credit_orders_buy POST 신용매수 주문 ⚠ 상태변경 credit_orders_sell POST 신용매도 주문 ⚠ 상태변경 orders_buy POST 일반주문 매수 ⚠ 상태변경 orders_cancel POST 국내주식 주문 취소 ⚠ 상태변경 orders_estimate GET 주문가능금액·수량 조회 orders_history GET 주문내역 조회 orders_modify POST 국내주식 주문 정정 ⚠ 상태변경 orders_sell POST 일반주문 매도 ⚠ 상태변경 ovs_orders_buy POST 해외주식 매수 주문 ⚠ 상태변경 ovs_orders_cancel POST 해외주식 주문 취소 ⚠ 상태변경 ovs_orders_detail GET 해외주식 주문체결 상세조회 ovs_orders_estimate GET 해외주식 주문가능금액 조회 ovs_orders_history GET 해외주식 주문체결내역 조회 ovs_orders_modify POST 해외주식 주문 정정 ⚠ 상태변경 ovs_orders_sell POST 해외주식 매도 주문 ⚠ 상태변경 ovs_orders_today GET 해외주식 당일 주문체결내역 조회 ovs_reserved_orders GET 해외주식 예약주문 조회 ovs_reserved_orders_buy POST 해외주식 예약주문 매수 ⚠ 상태변경 ovs_reserved_orders_cancel POST 해외주식 예약주문 취소 ⚠ 상태변경 ovs_reserved_orders_sell POST 해외주식 예약주문 매도 ⚠ 상태변경 reserved_orders GET 국내주식 예약주문 조회 reserved_orders_buy POST 국내주식 예약주문 매수 ⚠ 상태변경 reserved_orders_cancel POST 국내주식 예약주문 취소 ⚠ 상태변경 reserved_orders_sell POST 국내주식 예약주문 매도 ⚠ 상태변경

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
api_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, readOnlyHint=false, and idempotentHint=false; the description adds a per-endpoint table marking POST state-changing calls with ⚠ 상태변경 and identifies safe GET queries. This provides concrete behavioral detail beyond the generic annotations, and nothing in the description contradicts them.

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 text is long but structured as a scannable table; the introductory sentence and describe instruction are the only prose. Each table line adds a distinct endpoint with its HTTP method and safety marker, so the length is justified for a 24-endpoint dispatcher.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-endpoint dispatcher, the description names every order API, its method, and whether it changes state, and points to 'describe' for parameter details. It does not explain abbreviations like 'ovs', authentication prerequisites, or endpoint grouping, and the output schema is expected to cover return shape—adequate but not comprehensive.

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 description coverage is 0%, so the description must carry the parameter-semantics load. It defines api_type as the selector with 24 concrete values listed in the table, and params as the container for endpoint arguments, plus the 'describe' call to discover parameter details. It does not enumerate per-endpoint params, but the mechanism is sufficiently specified.

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 "메리츠 Open API — 주문" and enumerates 24 order-related endpoints, clearly bounding the tool to trading/order operations. The table of domestic, overseas, and reserved order actions distinguishes this tool from sibling domains like account, market, forex, reference, and info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the dispatch pattern (api_type selects the API, params holds arguments) and the 'describe' introspection call. However, it never states when to prefer this tool over sibling tools such as meritz_account or meritz_market, nor does it give exclusion criteria or when-not-to-use guidance.

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.3.0
    • First observedmeritz_account
    • First observedmeritz_forex
    • First observedmeritz_info
    • First observedmeritz_market
    • First observedmeritz_overseas_market
    • First observedmeritz_reference
    • First observedmeritz_trading

TDQS

A4.2/5.0

Scored across 7 tools

Disambiguation5/5

The seven tools are partitioned by clear domains: account, market, overseas market, trading, forex, reference, and server info. There is little risk of selecting the wrong tool because each namespace maps to a distinct financial function, and even the adjacent market/overseas_market pair is clearly separated by the overseas prefix.

Naming Consistency5/5

All tool names follow the same meritz_<domain> snake_case convention, and the nested api_type values are also uniformly snake_case. The naming pattern is predictable and consistent across the entire server.

Tool Count5/5

Seven tools is well within the ideal 3-15 range and matches the server's intended scope: one namespace per major brokerage function plus an info tool. Although meritz_trading contains many sub-APIs, that is an internal detail rather than an MCP tool-count problem.

Completeness5/5

The surface covers account inquiries, domestic and overseas market data, the full order lifecycle, forex exchange, reference data, and a server-info/catalog tool. Common trading workflows have no dead ends, and the meritz_info tool aids discoverability of available operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to query real-time and historical Korean stock market data from KRX (Korea Exchange) including indices, stocks, ETFs, bonds, derivatives, and commodities via MCP tools and resources.
    26 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides Korean stock market data (KOSPI, KOSDAQ, KONEX) including prices, fundamentals, investor trading, short selling, and indices via MCP protocol, enabling natural language queries from AI agents like ChatGPT and Claude.
    44 PyPI
    3
    MIT
  • A
    license
    A
    quality
    C
    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
    32 PyPI
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables trading and market data access for Toss Securities through natural language, with built-in trading guardrails to prevent errors.
    20
    MIT