tossinvest-api-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tossinvest-api-mcpshow my account balance"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tossinvest-api-mcp
토스증권 Open API를 실제로 호출하는 로컬 실행형 MCP 서버
공식 OpenAPI 명세의 모든 operation을 읽어 MCP 도구를 자동 생성합니다.
비공식 프로젝트입니다. 토스증권의 지원·보증·후원을 받지 않습니다.
투자 조언 도구가 아닙니다. 투자 판단과 그 결과에 대한 모든 책임은 사용자에게 있습니다.
실제 자산에 영향을 주는 주문 API를 포함합니다. 기본값은 비활성화 + dry-run이며, 활성화 시 발생하는 손실에 대해 프로젝트는 책임지지 않습니다.
주요 기능
OpenAPI 기반 도구 자동 생성 — 엔드포인트를 하드코딩하지 않습니다. 공식 명세에 API가 추가되면 코드 수정 없이 다음 실행 시 도구가 생깁니다.
실제 API 호출 — OAuth 2.0 Client Credentials 자동 발급·만료 관리·동시 발급 방지(single-flight)
다층 주문 안전장치 — 실주문 기본 비활성화,
dryRun기본true, 8개 조건 충족 시에만 실행, mutation 자동 재시도 전면 금지금융 데이터 정밀도 보존 — 금액·수량·가격을 문자열로 유지해 부동소수점 손실을 방지
보안 기본값 — 토큰 메모리 보관, 로그·오류 redaction, 공식 도메인 외 차단(SSRF 방지), path traversal·prototype pollution 방어
Docker 지원 — 하드닝된 멀티스테이지 이미지 + Compose 제공
현재 명세(v1.2.5) 기준 29개 operation(읽기 23 / mutation 6)과 관리 도구 7개를 제공합니다.
Related MCP server: tossinvest-openapi-mcp
빠른 시작
pnpm install
pnpm build
cp .env.example .env # TOSSINVEST_CLIENT_ID / SECRET 입력
pnpm inspect # MCP Inspector로 도구 목록 확인MCP 클라이언트 등록은 MCP 클라이언트 설정을, 컨테이너 실행은 Docker로 실행을 참고하세요.
공식 문서
OpenAPI JSON: https://openapi.tossinvest.com/openapi-docs/latest/openapi.json
MCP TypeScript SDK: https://github.com/modelcontextprotocol/typescript-sdk
목차
요구사항
항목 | 버전 |
Node.js (실행) | 20.10 이상 |
Node.js (개발·빌드) | 22.13 이상 — pnpm 11의 요구사항 |
pnpm | 9 이상 (이 저장소는 11.17.0으로 고정) |
토스증권 계좌 | Open API 사용 신청 완료 |
빌드된
dist/는 Node 20.10+에서 동작하지만, 소스에서 직접 빌드하려면 pnpm 11이 요구하는 Node 22.13 이상이 필요합니다. Docker를 사용하면 호스트 Node 버전과 무관하게 실행할 수 있습니다.
설치
git clone https://github.com/Kuco-dev/tossinvest-api-mcp.git
cd tossinvest-api-mcp
pnpm install
pnpm buildAPI 키 발급 및 설정
토스증권 WTS(웹 트레이딩) 접속
설정 → Open API 메뉴 진입
API 사용 신청 후
client_id,client_secret발급client_secret은 발급 시점에만 확인 가능하므로 안전한 곳에 보관프로젝트 루트에
.env생성
cp .env.example .envTOSSINVEST_CLIENT_ID=발급받은_client_id
TOSSINVEST_CLIENT_SECRET=발급받은_client_secret
.env는.gitignore에 등록되어 있습니다. 절대 커밋하지 마세요.
허용 IP 등록
토스증권 Open API는 등록된 IP에서만 호출할 수 있습니다.
WTS → 설정 → Open API → 허용 IP 관리
현재 사용 중인 공인 IP를 등록
등록하지 않으면 토큰 발급 단계에서 403 access_denied (IP address not allowed)를 받습니다.
이 서버는 해당 오류를 ip-not-allowed 코드로 정규화하고 tossinvest_auth_status의 possibleIpAllowlistIssue를 true로 표시합니다.
가정/사무실 회선은 공인 IP가 변경될 수 있으므로, 인증이 갑자기 실패하면 IP부터 확인하세요.
환경변수
변수 | 기본값 | 설명 |
| (없음) | OAuth client ID |
| (없음) | OAuth client secret |
| (없음) | 기본 계좌 |
| 공식 명세 URL | OpenAPI JSON 위치 |
|
| API 서버 |
|
| 비공식 base URL 허용 여부 |
|
| 명세 변환 실패 시 fail-closed |
|
|
|
|
| 일반 주문 mutation 실행 허용 |
|
| 조건주문 mutation 실행 허용 |
|
| 실주문 확인 문자열 |
|
| 토큰 만료 safety skew |
|
| 요청 타임아웃 |
|
| 읽기 요청 최대 재시도 |
|
| 응답 크기 상한 |
|
|
|
|
| raw request 도구 노출 여부 |
인증 정보가 없어도 서버는 정상 기동합니다. 명세 조회·검색·상세 조회·인증 상태 조회는 인증 없이 동작하며,
실제 API 호출 시점에만 credentials-missing 오류를 반환합니다.
빌드 및 실행
pnpm install # 의존성 설치
pnpm dev # 개발 모드 (tsx watch)
pnpm build # dist/ 로 컴파일
pnpm start # 빌드 결과 실행 (stdio)
pnpm test # 테스트
pnpm test:coverage # 커버리지 포함 테스트
pnpm lint # ESLint
pnpm typecheck # 타입 검사
pnpm openapi:update # 공식 명세로 snapshot 갱신
pnpm openapi:verify # snapshot 검증
pnpm inspect # MCP Inspector 로 도구 목록 확인pnpm inspect를 실행하면 MCP Inspector가 열리며 등록된 전체 도구 목록과 입력 스키마를 확인할 수 있습니다. (pnpm build 선행 필요)
Docker로 실행
Node/pnpm을 설치하지 않고 컨테이너로 실행할 수 있습니다.
중요: 이 서버는 stdio MCP 서버입니다. 컨테이너의 stdin/stdout이 곧 MCP 통신 채널이므로 반드시
-i(interactive) 옵션이 필요하며,-t(TTY)는 주면 안 됩니다. TTY는 JSON-RPC 프레이밍을 깨뜨립니다. 같은 이유로docker compose up은 실사용에 적합하지 않습니다 (stdin이 MCP 클라이언트에 연결되지 않음).
1. 이미지 빌드
docker compose build
# 또는
docker build -t tossinvest-api-mcp:latest .멀티스테이지 빌드로 최종 이미지에는 dist/와 런타임 의존성 3개(@modelcontextprotocol/sdk, zod, dotenv)만 포함됩니다.
node 사용자로 실행되며 root 권한을 사용하지 않습니다.
2. 환경변수 설정
인증 정보는 이미지에 굽지 않고 실행 시점에 주입합니다. .dockerignore가 .env를 빌드 컨텍스트에서 제외합니다.
cp .env.example .env # 값 입력3. 실행
# 대화형 실행 (직접 JSON-RPC를 보내 확인할 때)
docker compose run --rm tossinvest-mcp
# 컨테이너 안의 도구 목록을 Inspector로 확인
docker compose --profile tools run --rm --service-ports inspector
# → http://127.0.0.1:6274 접속package.json 단축 스크립트도 제공합니다.
pnpm docker:build
pnpm docker:run
pnpm docker:inspect4. MCP 클라이언트에 Docker로 등록
MCP 클라이언트는 컨테이너를 직접 띄워야 하므로 docker compose가 아니라 docker run -i를 사용합니다.
Claude Desktop / Cursor (Linux · macOS)
{
"mcpServers": {
"tossinvest": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--env-file", "/absolute/path/tossinvest-api-mcp/.env",
"tossinvest-api-mcp:latest"
]
}
}
}Windows
{
"mcpServers": {
"tossinvest": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"--env-file", "C:/absolute/path/tossinvest-api-mcp/.env",
"tossinvest-api-mcp:latest"
]
}
}
}--env-file 대신 개별 주입도 가능합니다.
"args": [
"run", "--rm", "-i",
"-e", "TOSSINVEST_CLIENT_ID",
"-e", "TOSSINVEST_CLIENT_SECRET",
"-e", "TOSSINVEST_DEFAULT_ACCOUNT",
"tossinvest-api-mcp:latest"
]
-e KEY(값 없이)는 호스트의 동일 이름 환경변수를 전달합니다. 설정 파일에 secret을 적지 않아도 됩니다.
컨테이너 보안 설정
docker-compose.yml에는 다음 하드닝이 적용되어 있습니다.
설정 | 이유 |
| root 실행 금지 |
| 서버는 파일 쓰기가 없음 (토큰은 메모리 보관) |
| 읽기 전용 루트에서 필요한 최소 쓰기 공간만 허용 |
| 모든 리눅스 capability 제거 |
| 권한 상승 차단 |
| 자원 남용 방지 |
| stdio MCP 채널 보장 |
| SIGTERM 전달 → graceful shutdown |
실주문 env 기본 | Dockerfile ENV에서도 안전 기본값 강제 |
Inspector 서비스는 npx로 패키지를 내려받아야 해서 read_only: false이며, 포트는 127.0.0.1에만 게시되어 외부에 노출되지 않습니다.
오프라인 동작
이미지에는 OpenAPI snapshot이 포함되어 있어, 원격 명세를 받지 못해도 서버가 기동됩니다.
# 원격 명세 조회를 끄고 snapshot만 사용
docker run --rm -i -e TOSSINVEST_SPEC_CACHE_ENABLED=false tossinvest-api-mcp:latest다만 실제 API 호출에는 인터넷 연결과 허용 IP 등록이 필요합니다. 컨테이너의 아웃바운드 IP가 호스트 공인 IP와 다를 수 있으니(NAT/VPN 환경) 인증 실패 시 IP를 먼저 확인하세요.
MCP 클라이언트 설정
빌드 후 dist/index.js의 절대 경로를 사용합니다.
Claude Desktop
설정 파일 위치
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Windows
{
"mcpServers": {
"tossinvest": {
"command": "node",
"args": ["C:/absolute/path/tossinvest-api-mcp/dist/index.js"],
"env": {
"TOSSINVEST_CLIENT_ID": "사용자 값",
"TOSSINVEST_CLIENT_SECRET": "사용자 값",
"TOSSINVEST_DEFAULT_ACCOUNT": "사용자 값",
"TOSSINVEST_ENABLE_TRADING": "false"
}
}
}
}Linux / macOS
{
"mcpServers": {
"tossinvest": {
"command": "node",
"args": ["/absolute/path/tossinvest-api-mcp/dist/index.js"],
"env": {
"TOSSINVEST_CLIENT_ID": "사용자 값",
"TOSSINVEST_CLIENT_SECRET": "사용자 값",
"TOSSINVEST_DEFAULT_ACCOUNT": "사용자 값",
"TOSSINVEST_ENABLE_TRADING": "false"
}
}
}
}Claude Code
# Linux / macOS
claude mcp add tossinvest \
--env TOSSINVEST_CLIENT_ID=사용자값 \
--env TOSSINVEST_CLIENT_SECRET=사용자값 \
--env TOSSINVEST_DEFAULT_ACCOUNT=사용자값 \
-- node /absolute/path/tossinvest-api-mcp/dist/index.js# Windows PowerShell
claude mcp add tossinvest `
--env TOSSINVEST_CLIENT_ID=사용자값 `
--env TOSSINVEST_CLIENT_SECRET=사용자값 `
--env TOSSINVEST_DEFAULT_ACCOUNT=사용자값 `
-- node C:/absolute/path/tossinvest-api-mcp/dist/index.js또는 프로젝트 루트 .mcp.json:
{
"mcpServers": {
"tossinvest": {
"command": "node",
"args": ["/absolute/path/tossinvest-api-mcp/dist/index.js"],
"env": {
"TOSSINVEST_CLIENT_ID": "사용자 값",
"TOSSINVEST_CLIENT_SECRET": "사용자 값"
}
}
}
}Cursor
~/.cursor/mcp.json 또는 프로젝트의 .cursor/mcp.json:
{
"mcpServers": {
"tossinvest": {
"command": "node",
"args": ["C:/absolute/path/tossinvest-api-mcp/dist/index.js"],
"env": {
"TOSSINVEST_CLIENT_ID": "사용자 값",
"TOSSINVEST_CLIENT_SECRET": "사용자 값",
"TOSSINVEST_DEFAULT_ACCOUNT": "사용자 값"
}
}
}
}Codex CLI
~/.codex/config.toml:
[mcp_servers.tossinvest]
command = "node"
args = ["/absolute/path/tossinvest-api-mcp/dist/index.js"]
[mcp_servers.tossinvest.env]
TOSSINVEST_CLIENT_ID = "사용자 값"
TOSSINVEST_CLIENT_SECRET = "사용자 값"
TOSSINVEST_DEFAULT_ACCOUNT = "사용자 값"
TOSSINVEST_ENABLE_TRADING = "false"Windows에서는 args를 ["C:/absolute/path/tossinvest-api-mcp/dist/index.js"]로 지정합니다.
일반 MCP stdio 클라이언트
command: node
args: <절대경로>/dist/index.js
transport: stdio
env: TOSSINVEST_CLIENT_ID, TOSSINVEST_CLIENT_SECRET, ...stdout은 JSON-RPC 전용이며 모든 로그는 stderr로만 출력됩니다.
제공 도구
관리용 wrapper 도구
도구 | 설명 |
| OpenAPI 버전, 문서 버전, 서버 URL, tag, operation 수, 읽기/mutation 수, 실주문 활성화 상태, snapshot/원격 사용 여부 |
|
|
| operationId·summary·description·path·tag 검색 |
| 특정 operation 상세 (필수/선택 입력, requestBody, 응답 스키마, 계좌 헤더 필요 여부, mutation 여부, rate limit 그룹, MCP 도구 이름) |
| operationId 기반 호출 wrapper (mutation guard 동일 적용) |
| 인증 설정·토큰 준비 상태 (secret/token 미노출) |
| 토큰 명시적 갱신 ( |
|
|
OpenAPI 기반 직접 도구 자동 생성
서버는 시작 시 공식 OpenAPI 명세를 로드하여 모든 operation을 MCP 도구로 자동 등록합니다. 엔드포인트 목록을 코드에 하드코딩하지 않으므로, 공식 명세에 새 API가 추가되면 서버 코드 수정 없이 다음 시작 시 자동으로 도구가 생깁니다.
도구 이름 = OpenAPI
operationId(MCP 규칙에 맞게 정규화, 충돌 시 서버 시작 실패)설명 =
summary+description+ method/path + tag 조합입력 스키마 = parameters와 requestBody에서 생성
annotation =
readOnlyHint/destructiveHint/idempotentHint/openWorldHint
입력 형식:
{
"path": {},
"query": {},
"body": {},
"account": "1",
"dryRun": true,
"confirmation": ""
}해당 operation에 필요 없는 필드는 스키마에서 제거됩니다. 예를 들어 getAccounts는 입력이 없고,
getPrices에는 account/dryRun/confirmation이 없습니다. 임의 헤더 입력은 허용되지 않습니다.
현재 명세(문서 버전 1.2.5) 기준으로 등록되는 도구:
분류 | 개수 |
전체 operation | 29 |
읽기 전용 | 23 |
mutation (주문 3 + 조건주문 3) | 6 |
제외 | 1 ( |
issueOAuth2Token(POST /oauth2/token)은 client secret과 access token이 MCP 경계를 넘지 않도록 의도적으로 도구 등록에서 제외하고, 서버 내부 인증 계층이 전담합니다. 대신 tossinvest_auth_status / tossinvest_refresh_auth를 사용하세요.
계좌 선택 방법
계좌가 필요한 API는 다음 순서로 계좌를 결정합니다.
도구 입력의
accountTOSSINVEST_DEFAULT_ACCOUNT둘 다 없으면 호출하지 않고 오류 반환
임의로 첫 번째 계좌를 자동 선택하지 않습니다. 먼저 계좌 목록을 조회하세요.
getAccounts 도구를 호출해 accountSeq를 확인해줘확인한 accountSeq를 account에 전달하거나 .env에 넣습니다.
TOSSINVEST_DEFAULT_ACCOUNT=1사용 예시
시세 조회
삼성전자와 애플 현재가를 알려줘내부적으로 getPrices가 호출됩니다.
{
"name": "getPrices",
"arguments": { "query": { "symbols": "005930,AAPL" } }
}응답:
{
"ok": true,
"operationId": "getPrices",
"httpStatus": 200,
"requestId": "01HXYZ...",
"rateLimit": { "limit": 10, "remaining": 9, "resetSeconds": 1 },
"result": [ { "symbol": "005930", "close": "70000" } ]
}호가, 체결, 캔들도 같은 방식입니다.
{ "name": "getOrderbook", "arguments": { "query": { "symbol": "005930" } } }
{ "name": "getTrades", "arguments": { "query": { "symbol": "005930", "count": 20 } } }
{ "name": "getCandles", "arguments": { "query": { "symbol": "005930", "interval": "1d", "count": 30 } } }계좌 조회
{ "name": "getAccounts", "arguments": {} }
{ "name": "getHoldings", "arguments": { "account": "1" } }
{ "name": "getBuyingPower", "arguments": { "account": "1", "query": { "currency": "KRW" } } }
{ "name": "getSellableQuantity", "arguments": { "account": "1", "query": { "symbol": "005930" } } }
{ "name": "getCommissions", "arguments": { "account": "1" } }주문 조회
{ "name": "getOrders", "arguments": { "account": "1", "query": { "symbol": "005930", "limit": 20 } } }
{ "name": "getOrder", "arguments": { "account": "1", "path": { "orderId": "0d5QIH..." } } }
{ "name": "getConditionalOrders", "arguments": { "account": "1" } }dry-run 주문 (기본 동작)
{
"name": "createOrder",
"arguments": {
"account": "1",
"body": {
"symbol": "005930",
"side": "BUY",
"orderType": "LIMIT",
"quantity": "10",
"price": "70000"
}
}
}dryRun을 생략하면 기본값 true이므로 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다.
{
"ok": true,
"dryRun": true,
"operationId": "createOrder",
"executed": false,
"summary": {
"operationId": "createOrder",
"method": "POST",
"path": "/api/v1/orders",
"mutationType": "일반 주문 mutation (실제 자산 영향)",
"account": "*",
"symbol": "005930",
"side": "BUY",
"orderType": "LIMIT",
"quantity": "10",
"price": "70000"
},
"missingRequiredFields": [],
"blockers": [
"실주문이 비활성화되어 있습니다 (TOSSINVEST_ENABLE_TRADING=false).",
"dryRun=true 이므로 네트워크 요청을 보내지 않습니다.",
"confirmation 문자열이 비어 있습니다."
],
"requirementsToExecute": [
"TOSSINVEST_ENABLE_TRADING=true",
"도구 입력에 dryRun=false 를 명시",
"confirmation 에 TOSSINVEST_MUTATION_CONFIRMATION 과 동일한 값을 전달"
],
"note": "실제 주문은 전송되지 않았습니다. ..."
}가격·수량·금액은 문자열로 전달하세요. 부동소수점 변환으로 인한 정밀도 손실을 막기 위해 서버는 이 값을 문자열 그대로 유지합니다.
실주문 활성화 절차
실제 주문은 아래 8가지 조건이 모두 충족될 때만 실행됩니다. 하나라도 어긋나면 네트워크 요청 자체를 보내지 않습니다.
TOSSINVEST_ENABLE_TRADING=true도구 입력
dryRun=falseconfirmation이TOSSINVEST_MUTATION_CONFIRMATION과 정확히 일치인증 정보(
CLIENT_ID/CLIENT_SECRET) 정상계좌 명시(
account또는TOSSINVEST_DEFAULT_ACCOUNT)OpenAPI 스키마 필수값 충족
요청 대상이 공식 API 서버
mutation 종류가 명확히 분류됨
절차:
# 1) .env 수정
TOSSINVEST_ENABLE_TRADING=true
TOSSINVEST_MUTATION_CONFIRMATION=I_UNDERSTAND_THIS_PLACES_A_REAL_ORDER
TOSSINVEST_DEFAULT_ACCOUNT=1# 2) MCP 클라이언트 재시작 (env 반영)// 3) 반드시 먼저 dry-run 으로 내용 확인 후, 실제 실행
{
"name": "createOrder",
"arguments": {
"account": "1",
"body": {
"symbol": "005930",
"side": "BUY",
"orderType": "LIMIT",
"quantity": "10",
"price": "70000",
"clientOrderId": "my-order-001"
},
"dryRun": false,
"confirmation": "I_UNDERSTAND_THIS_PLACES_A_REAL_ORDER"
}
}clientOrderId는 토스증권의 멱등성 키(10분 유효)입니다. 중복 주문 위험을 줄이려면 지정을 권장합니다.
조건주문 활성화 절차
조건주문은 위 조건에 더해 별도 플래그가 필요합니다.
TOSSINVEST_ENABLE_TRADING=true
TOSSINVEST_ENABLE_CONDITIONAL_ORDERS=trueTOSSINVEST_ENABLE_TRADING만 켜고 조건주문을 실행하면 차단됩니다.
mutation 자동 재시도 금지 정책
다음 operation은 어떤 경우에도 자동 재시도하지 않습니다.
createOrder,modifyOrder,cancelOrdercreateConditionalOrder,modifyConditionalOrder,cancelConditionalOrder향후 명세에 추가되는 주문 관련 mutation
timeout, connection reset, 500/502/503처럼 결과가 불확실한 경우에도 재시도하지 않습니다. 주문이 이미 접수되었을 수 있기 때문입니다. 대신 다음을 반환합니다.
{
"ok": false,
"operationId": "createOrder",
"httpStatus": 503,
"error": {
"code": "mutation-result-unknown",
"message": "createOrder 요청의 결과가 불확실합니다. 자동 재시도하지 않았습니다. ...",
"requestId": "01HXYZ...",
"retryable": false,
"details": {
"originalErrorCode": "upstream-error",
"clientOrderId": "my-order-001",
"account": "*",
"nextStep": "주문내역 조회 API 로 접수 여부를 확인하세요."
}
}
}이 경우 재요청하기 전에 반드시 getOrders / getOrder(조건주문은 getConditionalOrders)로 접수 여부를 확인하세요.
또한 401 자동 갱신도 mutation에는 적용되지 않습니다. 읽기 전용 GET 요청만 토큰을 1회 갱신하고 1회 재시도합니다.
Rate limit 처리
응답 헤더 X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After를 파싱해
성공 응답의 rateLimit 필드로 반환합니다.
"rateLimit": { "limit": 10, "remaining": 9, "resetSeconds": 1 }재시도 정책:
GET 등 명확한 읽기 전용 요청만 재시도
mutation 재시도 금지
Retry-After가 있으면 우선 사용 (30초 초과 시 재시도하지 않음)없으면 exponential backoff + jitter
최대 횟수는
TOSSINVEST_MAX_READ_RETRIES(기본 2)인증 실패·입력 오류·권한 오류는 재시도하지 않음
타임아웃은
AbortController로 구현 (TOSSINVEST_REQUEST_TIMEOUT_MS)
문제 해결
증상 | 원인 / 해결 |
|
|
| client ID/secret 오타 또는 클라이언트 비활성. 자동 재시도하지 않으므로 값을 직접 확인 |
| WTS → 설정 → Open API → 허용 IP 관리에 현재 공인 IP 등록 |
|
|
| 호출 빈도 조절. 응답의 |
| 실주문 8조건 미충족. 응답의 |
| 명세 변경으로 mutation 분류 불가. |
| 주문 결과 불확실. |
| 네트워크 문제. |
도구 목록이 안 보임 |
|
클라이언트가 JSON 파싱 오류 | stdout 오염. 이 서버는 stdout에 JSON-RPC만 출력하므로, 다른 래퍼 스크립트가 출력하는지 확인 |
Docker에서 즉시 종료됨 |
|
Docker에서 JSON-RPC 깨짐 |
|
Docker에서 |
|
Docker에서 | 컨테이너 아웃바운드 IP가 호스트와 다를 수 있음. 허용 IP 재확인 |
| 정상입니다. stdio 서버이므로 |
로그 레벨을 높이면 stderr에서 더 자세한 정보를 볼 수 있습니다. 비밀값은 debug 모드에서도 redaction됩니다.
TOSSINVEST_LOG_LEVEL=debug보안 주의사항
.env와 인증 파일은.gitignore처리되어 있습니다. 절대 커밋하지 마세요.access token은 메모리에만 보관하며 파일·DB·로그·MCP 응답에 저장하거나 출력하지 않습니다.
client secret과 Authorization 헤더는 로그와 오류 객체에서 redaction됩니다.
계좌 식별값은 로그·dry-run 요약에서 마스킹됩니다.
사용자는
Authorization,Cookie,Host,Content-Length,Proxy-Authorization,X-Tossinvest-Account헤더를 직접 지정할 수 없습니다.기본적으로 공식 도메인(
openapi.tossinvest.com)만 호출할 수 있습니다 (SSRF 방지).공식 OpenAPI에 정의되지 않은 path는 호출할 수 없습니다.
path traversal, prototype pollution, 과대 응답, JSON 파싱 오류를 방어합니다.
실주문은 기본 비활성화이며 dry-run이 기본값입니다.
자세한 내용은 SECURITY.md를 참고하세요.
테스트
pnpm test
pnpm test:coverage모든 테스트는 HTTP mock을 사용하며 실제 토스증권 API를 호출하지 않습니다. 실제 주문 API를 호출하는 테스트는 존재하지 않습니다.
테스트 범위:
OpenAPI: snapshot 파싱, operationId 인덱싱/중복 검출,
$ref해석, 순환 참조, requestBody/parameter 변환, required·enum·oneOf/anyOf/allOf·nullable 처리, 도구 이름 충돌, 신규 operation 자동 등록인증: 인증 정보 누락, 최초 발급, 캐시, safety skew, single-flight 동시 발급 방지, 401 처리, secret redaction
계좌: 명시 account, 기본 account, 누락 시 차단, 필요한 API에만 헤더 추가, 마스킹
요청: path 인코딩, query 직렬화, 다중 symbol, JSON/form body, timeout, 429,
Retry-After, 4xx/5xx 정규화, requestId 추출, decimal 정밀도 유지주문 안전성: 기본 비활성, dryRun 기본 true, dry-run 무통신, confirmation 검증, 조건주문 별도 플래그, mutation 무재시도, wrapper·raw로 우회 불가
MCP: initialize, tools/list, 관리 도구, 직접 도구, 오류 응답, stdout 무오염, stderr 로그, graceful shutdown
OpenAPI snapshot 갱신
원격 명세를 우선 사용하지만, 네트워크 장애 시 번들 snapshot으로 폴백합니다.
pnpm openapi:update # 공식 JSON 다운로드 → src/openapi/openapi.snapshot.json 갱신
pnpm openapi:verify # operation 수, operationId 중복, 스키마 변환 가능 여부 검증openapi:verify 출력 예:
[openapi:verify] 검증 성공
OpenAPI 버전 : 3.1.0
API 문서 버전 : 1.2.5
API 서버 : https://openapi.tossinvest.com
path 수 : 27
등록 operation : 29
읽기 전용 : 23
mutation : 6
분류 불가 mutation: 0
제외 operation : 1MCP SDK 버전 선택
선택 버전:
@modelcontextprotocol/sdk1.29.0 (package.json에 정확한 버전으로 고정)선택 이유:
구현 시점 기준 npm
latest태그가 가리키는 안정(stable) 릴리스입니다. beta/rc 태그를 사용하지 않았습니다.저수준
Server+StdioServerTransport+setRequestHandlerAPI는 안정 API이며 deprecated되지 않았습니다.structuredContent가 안정 버전에서 지원되므로, 사람이 읽는 text와 기계가 처리하는 구조화 결과를 함께 반환합니다.experimental/*경로의 API는 사용하지 않았습니다.
프로젝트 구조
tossinvest-api-mcp/
├─ src/
│ ├─ index.ts # stdio 진입점, 시그널 처리
│ ├─ server.ts # MCP 서버 구성, 도구 등록
│ ├─ config/ # 환경변수 검증(Zod), 상수·정책 테이블
│ ├─ auth/ # OAuth 토큰 관리, 인증 오류
│ ├─ openapi/ # 명세 로더·$ref 해석·스키마 변환·도구 생성
│ │ └─ openapi.snapshot.json # 오프라인 폴백용 번들 명세
│ ├─ client/ # 요청 조립, 응답 파싱, 재시도, rate limit
│ ├─ tools/ # mutation 분류·guard, operation/관리 도구
│ ├─ security/ # redaction, URL 정책, 민감 필드 정의
│ ├─ errors/ # AppError, 오류 정규화
│ └─ utils/ # logger(stderr), single-flight, JSON
├─ tests/ # Vitest (실제 API 호출 없음)
├─ scripts/ # snapshot 갱신·검증, 빌드 자산 복사
├─ Dockerfile
└─ docker-compose.yml기여
이슈와 PR을 환영합니다. CONTRIBUTING.md를 먼저 읽어주세요.
PR 전 아래가 모두 통과해야 합니다.
pnpm typecheck && pnpm lint && pnpm test && pnpm build && pnpm openapi:verify실제 주문 API를 호출하는 코드나 테스트는 절대 추가하지 마세요. 보안 취약점은 공개 이슈 대신 SECURITY.md의 절차를 따라주세요.
라이선스
이 프로젝트는 토스증권과 무관한 비공식 프로젝트이며, 금융·투자 조언 소프트웨어가 아닙니다. 사용에 따른 모든 책임은 사용자에게 있습니다.
Available Tools
36 toolscancelConditionalOrderADestructive
조건주문 취소
조건주문을 취소합니다. conditionalOrderId 로 취소 대상을 식별합니다.
Rate Limits Group: CONDITIONAL_ORDER
[DELETE /api/v1/conditional-orders/{conditionalOrderId}]
tags: Conditional Order
⚠️ 실제 자산에 영향을 주는 조건주문 API 입니다. 기본값은 dryRun=true 이며 실행하려면 TOSSINVEST_ENABLE_CONDITIONAL_ORDERS=true 와 confirmation 이 필요합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL 경로 파라미터 | |
| dryRun | No | 기본값 true. true 이면 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다. 실제 주문을 내려면 false 로 명시해야 합니다. | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. | |
| confirmation | No | 실주문 확인 문자열. TOSSINVEST_MUTATION_CONFIRMATION 환경변수 값과 정확히 일치해야 실제 주문이 실행됩니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint=true, and the description adds critical behavioral details: the dry-run safety default, the requirement for TOSSINVEST_ENABLE_CONDITIONAL_ORDERS and confirmation, and the rate limits group. This goes beyond annotation-only disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with title, explanation, rate limits, endpoint, and warning, but the sentence about tags and the warning section could be more concise. It front-loads the purpose but includes some redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacking an output schema, the description does not explain the response format or error handling. It covers the effect (cancellation) and safety precautions, but omits return value details, which is a gap for complete agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and schema descriptions are comprehensive for all 4 parameters. The description adds minimal extra meaning (e.g., dryRun default, confirmation requirement), but does not significantly improve understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states '조건주문 취소' (cancel conditional order) and explains the action using conditionalOrderId. It differentiates from sibling tools like createConditionalOrder, getConditionalOrder, modifyConditionalOrder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the dryRun default and required environment variables for execution, but does not explicitly state when to use or avoid this tool compared to alternatives like cancelOrder for spot orders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancelOrderADestructive
주문 취소
기존 주문을 취소합니다. 이미 체결된 주문은 취소할 수 없습니다.
Rate Limits Group: ORDER
[POST /api/v1/orders/{orderId}/cancel]
tags: Order
⚠️ 실제 자산에 영향을 주는 주문 API 입니다. 기본값은 dryRun=true 이며 실행하려면 TOSSINVEST_ENABLE_TRADING=true 와 confirmation 이 필요합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | 요청 본문 (application/json). 금액·수량·가격은 정밀도 보존을 위해 문자열로 전달합니다. | |
| path | Yes | URL 경로 파라미터 | |
| dryRun | No | 기본값 true. true 이면 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다. 실제 주문을 내려면 false 로 명시해야 합니다. | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. | |
| confirmation | No | 실주문 확인 문자열. TOSSINVEST_MUTATION_CONFIRMATION 환경변수 값과 정확히 일치해야 실제 주문이 실행됩니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds critical behavioral details: dryRun defaults to true, actual execution requires TOSSINVEST_ENABLE_TRADING and confirmation, and it affects real assets. Rate limits group is also mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with line breaks, headers, and a warning. It is front-loaded with purpose. Minor redundancy (first line repeats title) but overall efficient for the information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, the description covers key aspects: purpose, constraint on executed orders, dryRun behavior, and required environment variables. Lacks details on response/error handling but sufficient for safe usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The description itself reinforces the dryRun default and confirmation requirement, adding value beyond the schema. No parameter information is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool cancels an existing order, with the specific verb '취소합니다' (cancels) and resource '기존 주문' (existing order). It distinguishes from siblings like cancelConditionalOrder by specifying it cancels general orders, not conditional ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates the tool is for canceling existing orders and notes that executed orders cannot be canceled, but does not explicitly compare to alternatives like modifyOrder or cancelConditionalOrder. Usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createConditionalOrderADestructive
조건주문 생성
특정 종목의 가격을 감시해 조건 충족 시 자동으로 매매(매수/매도)하는 조건주문을 생성합니다.
감시가와 매매 방향(매수/매도)을 설정한 후 가격이 감시가에 도달하면 조건이 발동되어 주문이 생성됩니다.
타입(type) — 조건의 개수와 관계를 정합니다:
SINGLE:first한 조건만 감시합니다.OCO(One-Cancels-the-Other): 두 조건(first·second)을 동시에 감시하다, 하나의 조건이 충족되면 나머지 조건은 자동 취소됩니다.first/second모두 매도(SELL) 이며first감시가 > 현재가 >second감시가 여야 합니다. 호가유형은 지정가(LIMIT)만 지원합니다.OTO(One-Triggers-the-Other):first조건이 체결되면 그때부터second조건 감시가 시작됩니다.first는 매수(BUY),second는 매도(SELL) 입니다. 호가유형은 지정가(LIMIT)만 지원합니다.
Rate Limits Group: CONDITIONAL_ORDER
[POST /api/v1/conditional-orders]
tags: Conditional Order
⚠️ 실제 자산에 영향을 주는 조건주문 API 입니다. 기본값은 dryRun=true 이며 실행하려면 TOSSINVEST_ENABLE_CONDITIONAL_ORDERS=true 와 confirmation 이 필요합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 조건주문 생성 요청. "이 가격(triggerPrice)에 닿으면 매수/매도(orderSide) 주문" 만 입력하면 됩니다. 가격이 감시가(triggerPrice)에 닿으면 트리거됩니다. 타입은 `type`(SINGLE/OCO/OTO)으로 지정합니다. | |
| dryRun | No | 기본값 true. true 이면 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다. 실제 주문을 내려면 false 로 명시해야 합니다. | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. | |
| confirmation | No | 실주문 확인 문자열. TOSSINVEST_MUTATION_CONFIRMATION 환경변수 값과 정확히 일치해야 실제 주문이 실행됩니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and readOnlyHint=false. The description adds context about real asset impact, dryRun safety, confirmation requirement, rate limit group, and type-specific behaviors (e.g., OCO/OTO only LIMIT). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-structured with headings and bullet points. It front-loads the core purpose and type explanations. Some redundancy exists (e.g., repeating trigger behavior), but overall efficient for a complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested objects, multiple types), the description covers key aspects: types, constraints, real-asset impact, safety features (dryRun, confirmation), and rate limits. No output schema exists, so return values are not explained; but the description is fairly complete for usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond schema by explaining type-specific constraints (e.g., OCO first/second both SELL, OTO first BUY second SELL) and clarifying that quantity is shared across conditions in OCO/OTO.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates conditional orders that monitor prices for specific stocks and automatically execute trades when conditions are met. It distinguishes itself from siblings like `createOrder` by focusing on conditional order creation, and explains the three types (SINGLE, OCO, OTO).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on when to use each type (SINGLE, OCO, OTO) with specific side and price constraints. It also mentions the default dryRun behavior and required confirmation for real execution. However, it does not explicitly contrast with `createOrder` for immediate orders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
createOrderADestructive
주문 생성
매수 또는 매도 주문을 생성합니다.
수량 지정 방식 — quantity, orderAmount 중 정확히 하나를 사용:
quantity: 주문 수량 (주 단위). 지정한 수량만큼 주문. 소수점 수량은 미국 주식 시장가 매도(MARKET+SELL)에만 허용 (그 외는 정수만)orderAmount: 주문 금액 (달러). 지정한 금액만큼 주문하며, 체결 수량은 시장가에 따라 결정. US MARKET 전용
금액 주문 (orderAmount): 정규장 시간에만 가능합니다. 정규장 외 시간에 호출 시 422 amount-order-outside-regular-hours 를 반환합니다.
Rate Limits Group: ORDER
[POST /api/v1/orders]
tags: Order
⚠️ 실제 자산에 영향을 주는 주문 API 입니다. 기본값은 dryRun=true 이며 실행하려면 TOSSINVEST_ENABLE_TRADING=true 와 confirmation 이 필요합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 요청 본문 (application/json). 금액·수량·가격은 정밀도 보존을 위해 문자열로 전달합니다. | |
| dryRun | No | 기본값 true. true 이면 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다. 실제 주문을 내려면 false 로 명시해야 합니다. | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. | |
| confirmation | No | 실주문 확인 문자열. TOSSINVEST_MUTATION_CONFIRMATION 환경변수 값과 정확히 일치해야 실제 주문이 실행됩니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint=true and openWorldHint=true. Description adds that it affects real assets, dryRun default is true, and confirmation is required for actual execution. Also mentions rate limits and error conditions beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with sections, bullet points, and warnings. It front-loads the purpose. Slightly verbose but each sentence adds value; could be trimmed slightly without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (multiple modes, constraints, no output schema), the description covers usage, parameters, and safety warnings well. Missing return value explanation, but the schema is comprehensive and sibling tools for further details exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by summarizing the two order creation methods (quantity-based vs amount-based) and their differences, which helps the agent choose correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states '주문 생성' and '매수 또는 매도 주문을 생성합니다.' which clearly indicates the verb (create) and resource (orders). It distinguishes from sibling tools like 'cancelOrder' and 'modifyOrder' by being the primary order creation endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use 'quantity' vs 'orderAmount', constraints on orderAmount (US MARKET only, regular hours), and mentions dryRun and confirmation requirements. Does not explicitly state when not to use this tool but context is clear from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getAccountsARead-onlyIdempotent
계좌 목록 조회
사용자의 계좌 목록을 조회합니다.
현재는 종합매매 (
BROKERAGE) 계좌만 반환하며, 계좌가 없으면 빈 배열. 자녀계좌는 사용할 수 없습니다.응답의
accountSeq는 다른 모든 사용자 컨텍스트 API (보유 주식, 주문, 매수가능금액 등) 의X-Tossinvest-Account헤더에 사용합니다.accountTypeenum 은BROKERAGE/OVERSEAS_DERIVATIVES/PENSION_SAVINGS/RESHORING_INVESTMENT가 정의되어 있으나 본 API 에서는 현재BROKERAGE만 노출됩니다. enum 의미는Account.accountTypeschema 참조.
Rate Limits Group: ACCOUNT
[GET /api/v1/accounts]
tags: Account
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive. The description adds significant context: only BROKERAGE accounts are returned, child accounts are excluded, and the accountType enum meaning is referenced. No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points, each sentence adds value. It is concise yet informative, covering purpose, limitations, and usage context without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description explains the important accountSeq field and references the enum schema, it does not fully describe the response structure. Given no output schema, a bit more detail on response fields would improve completeness, but it is adequate for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description does not need to add parameter semantics. The schema coverage is 100%, and the description effectively addresses the tool's usage without mentioning parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a list of accounts, specifically noting it currently returns only BROKERAGE accounts. It distinguishes itself from siblings by focusing on account listing, which is a prerequisite for other account-related APIs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (to get account list) and provides context that accountSeq is used in other APIs, implying this tool should be called first. It notes limitations (only BROKERAGE, no child accounts). However, it does not explicitly state when not to use or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getBuyingPowerARead-onlyIdempotent
매수 가능 금액 조회
매수 주문 시 사용할 수 있는 매수 가능 금액을 조회합니다. 미수거래를 제외한 현금 기반 매수 가능 금액(미수 미발생 기준)을 반환합니다.
Rate Limits Group: ORDER_INFO
[GET /api/v1/buying-power]
tags: Order Info
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds value by specifying it returns cash-based buying power (excluding margin) and includes the rate limits group. This provides useful behavioral context beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the Korean title, then a clear purpose, rate limits group, and endpoint. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is mostly complete for a simple read-only tool. However, it lacks an explanation of the return value format or structure, which would be helpful given there is no output schema. Still, the core functionality is well communicated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters having descriptions. The description does not add any additional meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves '매수 가능 금액' (buying power) and specifies it's for cash-only (no margin) orders. The verb '조회' (retrieve) and resource are clear. Unlike siblings like getSellableQuantity or getOrders, this tool is specifically for available funds for buy orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies using this tool before placing buy orders to check available funds, but does not explicitly state when not to use it or mention alternatives. However, the context is clear enough for an AI agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getCandlesARead-onlyIdempotent
캔들 차트 조회
종목의 캔들(OHLCV) 차트 데이터를 조회합니다. 최대 200개 봉을 반환합니다.
Rate Limits Group: MARKET_DATA_CHART
[GET /api/v1/candles]
tags: Market Data
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only, idempotent, and non-destructive behavior. The description adds context by specifying a maximum of 200 bars and the rate limit group, which supplements the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and includes the key purpose, rate limit group, and endpoint. While efficient, it could be better structured with explicit usage guidance. Minor lack of structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (nested parameter but well-described in schema) and lack of output schema, the description is adequate but does not explain return value format or pagination details beyond the schema. Slightly incomplete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter described in the input schema. The tool description does not add new information beyond what is in the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves OHLCV candle data for a stock symbol, with a maximum of 200 bars. This effectively distinguishes it from sibling tools like getMarketIndicatorCandles, which focus on market indicators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for stock candle data but does not explicitly contrast with alternatives (e.g., getMarketIndicatorCandles) or provide guidance on when to use this tool vs others. No exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getCommissionsARead-onlyIdempotent
매매 수수료 조회
현재 계좌의 시장별 매매 수수료율을 조회합니다. 국내주식과 해외주식의 수수료 정보를 배열로 반환합니다.
Rate Limits Group: ORDER_INFO
[GET /api/v1/commissions]
tags: Order Info
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent. Description adds value by stating return type (array) and rate limits group (ORDER_INFO), which are 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and well-structured: title, main action, return detail, rate limit, endpoint. Front-loaded with key information, no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple read tool: explains what it returns (array of commission info by market) and rate limit group. Lacks output schema but mentions return type adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter description. Tool description does not add additional parameter semantics beyond schema, so baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it queries trading commission rates for the current account by market, specifying domestic and foreign stocks. It distinguishes itself from siblings like getBuyingPower or getPrices, but does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It implies usage for commission rates but lacks exclusion criteria or context for when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getConditionalOrderARead-onlyIdempotent
조건주문 상세 조회
조건주문 단건 상세를 조회합니다. 진행 중 + 종료된 조건주문을 모두 조회할 수 있습니다.
conditionalOrderId 로 조건주문을 식별합니다.
Rate Limits Group: CONDITIONAL_ORDER_HISTORY
[GET /api/v1/conditional-orders/{conditionalOrderId}]
tags: Conditional Order History
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL 경로 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and destructiveHint. Description adds that both ongoing and terminated orders can be retrieved, but no further behavioral details (e.g., rate limits beyond group name).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise and well-structured with title, action, and details. Includes rate limit group and HTTP method. Minor whitespace but no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with no output schema, the description adequately covers purpose, identification, scope, and rate limit group. No major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, so description adds marginal extra meaning (e.g., clarifies conditionalOrderId role). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves details of a single conditional order (조건주문 상세 조회) and distinguishes from sibling tools like getConditionalOrders (list), createConditionalOrder, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving single order details, but does not explicitly state when not to use or alternative tools. However, sibling context makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getConditionalOrdersARead-onlyIdempotent
조건주문 목록 조회
조건주문 목록을 조회합니다.
모든 타입 반환: 이 API 로 등록한 조건주문뿐 아니라
다른 채널(토스증권 앱 등)에서 등록한 조건주문도 함께 반환됩니다.
타입별 필터는 제공하지 않으며, 응답의 type 필드로 구분합니다.
지원하는 status 값:
OPEN: 진행 중(감시 중·일시중지·주문 진행 중 포함) 조건주문CLOSED: 종료된(완료·만료) 조건주문
symbol 을 지정하면 해당 종목의 조건주문만 반환합니다. OPEN/CLOSED 모두에서 사용할 수 있습니다.
페이징: 커서 기반. 응답의 nextCursor 를 다음 요청의 cursor 로 전달합니다.
limit 기본 20, 최대 100.
Rate Limits Group: CONDITIONAL_ORDER_HISTORY
[GET /api/v1/conditional-orders]
tags: Conditional Order History
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. The description adds valuable context: it returns orders from all channels, supports cursor-based paging, mentions rate limits, and explains status values beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (types, status values, paging, rate limits) and no unnecessary words. It is concise yet informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key aspects: purpose, parameters, paging, and response fields like 'type' and 'nextCursor'. Without an output schema, it provides sufficient context for an agent to use the tool, though a full response structure would be ideal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions. The tool description adds extra context about the 'type' field in responses and clarifies symbol usage across statuses, which supplements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists conditional orders and specifies that it returns all types from all channels, which helps distinguish from related tools like getConditionalOrder. However, it does not explicitly name sibling tools or contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (listing conditional orders) and provides details on parameters like status and symbol. It does not explicitly state when not to use it or mention alternatives (e.g., getConditionalOrder for a single order).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getExchangeRateARead-onlyIdempotent
환율 조회
KRW ↔ USD 환율 정보를 조회합니다.
갱신 주기 1분, 참고용 표시 환율. 실제 주문 시 적용되는 거래 환율과 다를 수 있습니다.
dateTime미지정 시 현재 시점의 유효 환율이 응답됩니다.응답의
validFrom~validUntil은 해당 환율의 유효 시간 윈도 (보통 1분) 입니다.
Rate Limits Group: MARKET_INFO
[GET /api/v1/exchange-rate]
tags: Market Info
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations (readOnlyHint, idempotentHint, etc.): it discloses the 1-minute refresh cycle, the reference nature of the rate, and the validFrom/validUntil time window. No contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with bullet points. Each sentence adds meaningful information: update frequency, reference vs actual rate, dateTime behavior, response window, and rate limit group. No redundant or verbose content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single parameter, no output schema), the description covers all necessary aspects: purpose, parameter behavior, return value semantics (validFrom/Until), rate limits, and usage caveats. It is complete for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds value by explaining the behavior of the dateTime parameter and noting the reference rate nature, which is not fully captured in the schema. It does not need to re-document base/quote currencies since those are already well described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as querying KRW ↔ USD exchange rates. It uses a specific verb (조회) and resource (환율), and the scope is explicitly limited to the KRW/USD pair, which distinguishes it from sibling tools like getMarketIndicatorPrices or getOrderbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful context: the rate is a reference rate with a 1-minute update interval, not the actual transaction rate, and if dateTime is omitted, the current rate is returned. However, it does not explicitly state when not to use this tool or suggest alternatives like the actual trading rate source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getHoldingsARead-onlyIdempotent
보유 주식 조회
보유 주식 정보를 조회합니다. 국내(KR)·미국(US) 주식만 포함하며, 해외 옵션·채권은 제외합니다. 보유 종목이 없으면 요약 금액은 0이고 items는 빈 배열입니다.
Rate Limits Group: ASSET
[GET /api/v1/holdings]
tags: Asset
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | 쿼리 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc. The description adds value by specifying inclusion/exclusion of asset types and behavior for empty holdings. No contradictions. Could mention rate limits in more detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, using only a few sentences to convey purpose, scope, and edge case behavior. Structure is clear with title, body, rate limit info, and endpoint. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with two optional parameters, the description explains the return structure (summary and items) and the empty case. Lacks details on response fields, but no output schema exists. Rate limits mentioned. Sufficient for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for both parameters. The tool description itself adds no additional meaning beyond the schema, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves holding stock information, specifies scope (KR/US stocks only, excludes options/bonds), and is a distinct resource (holdings). However, it does not explicitly differentiate from the sibling tool 'getStocks', which may cause ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but provides no guidance on when to use it versus alternatives, when not to use it, or what prerequisites exist. Missing context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getKrMarketCalendarARead-onlyIdempotent
국내 장 운영 정보 조회
국내 시장의 거래 가능 시간을 조회합니다. 통합 모드 (KRX+NXT) 기준이며, 특수장(시간외종가/시간외단일가)은 제외됩니다. 전일/당일/익일 3영업일 정보를 반환합니다. 모든 시간은 KST(+09:00) 기준.
Rate Limits Group: MARKET_INFO
[GET /api/v1/market-calendar/KR]
tags: Market Info
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds behavioral traits: returns 3 business days, excludes special sessions, uses KST, integrated mode, and rate limit group. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, front-loaded with purpose, and each sentence adds value. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks description of response structure and does not clarify the optional date parameter's behavior (e.g., default to current day). Some gaps remain for a tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the date parameter already described. The description adds no additional meaning or usage context for the parameter, such as default behavior or output structure. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves Korean market trading hours, specifies scope (integrated mode, excludes special sessions, returns 3 days), and distinguishes from sibling getUsMarketCalendar by explicitly mentioning KR and 'domestic market'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the description of 'domestic market' and sibling tool names, but no explicit guidance is given on when to use this tool versus alternatives (e.g., getUsMarketCalendar) or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getMarketIndicatorCandlesARead-onlyIdempotent
시장 지표 캔들 차트 조회
시장 지표(국내 지수·국채)의 캔들(OHLCV) 차트 데이터를 조회합니다. 최대 200개 봉을 반환합니다.
지원 심볼은 그룹 상단 Market Indicators 설명의 심볼 카탈로그(8종)와 동일하며, 카탈로그에 없는 심볼은
400 unsupported-symbol 로 응답합니다. 개별 종목의 캔들은 GET /api/v1/candles 를 사용하세요.
분봉(1m)은 지수(KOSPI·KOSDAQ)만 지원합니다. 국채(KR_BOND_*)는 일봉(1d)만 지원하며, 분봉 요청 시
400 invalid-request 로 응답합니다.
Rate Limits Group: MARKET_INDICATOR_CHART
[GET /api/v1/market-indicators/{symbol}/candles]
tags: Market Indicators
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL 경로 파라미터 | |
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds behavioral details: max 200 candles, pagination mechanism, rate limit group, and error responses. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with line breaks and bullet points. Front-loaded with main purpose, then detailed constraints. Every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers key aspects: purpose, supported symbols, intervals, pagination, error handling, rate limits. However, does not describe the response format or structure beyond 'OHLCV', which could be improved for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema description coverage, the description adds valuable context not in the schema (e.g., URL encoding for '+' in 'before' parameter, clarification of interval restrictions per symbol type). Adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it queries market indicator candle chart data (OHLCV) with a max of 200 candles. It distinguishes from the sibling 'getCandles' tool by explicitly stating to use that for individual stocks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: which tool to use for individual stocks, which intervals are supported per symbol type, and mentions rate limit group. Also covers error responses for unsupported symbols and invalid requests.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getMarketIndicatorInvestorTradingARead-onlyIdempotent
투자자별 매매대금 조회
KRX 시장(코스피·코스닥)의 투자자별 매매대금을 조회합니다. 개인·외국인·기관·기타법인 4개 투자자 분류의
매수·매도 거래대금을 집계 단위(interval)별 기록으로 최신순 제공하며, 기관은 7개 세부 분류(breakdown)를
함께 제공합니다.
KOSPI/KOSDAQ만 지원합니다. 그 외 심볼은 400unsupported-symbol로 응답합니다.모든 거래대금은 원화(KRW) 정수이며, 별도의 통화 필드는 제공하지 않습니다.
4개 분류(개인·외국인·기관·기타법인)의 매수 합계와 매도 합계는 시장 전체 기준으로 서로 같습니다.
foreigner는 외국인 전체 합계(등록·미등록 외국인 포함)이며,institution의buyAmount/sellAmount는breakdown7개 항목의 합과 일치합니다.당일 기록은 장 종료 전까지 갱신될 수 있는 잠정치입니다.
updatedAt으로 마지막 갱신 시각을 확인하세요.다음 페이지는 응답의
nextUntil값을until파라미터로 전달해 조회합니다.
Rate Limits Group: MARKET_INDICATOR
[GET /api/v1/market-indicators/{symbol}/investor-trading]
tags: Market Indicators
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL 경로 파라미터 | |
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark as read-only and idempotent. Description adds valuable context: provisional data until market close, updatedAt field, breakdown consistency, and balance of buy/sell sums.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured with bullet points. Every sentence adds value; no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, description covers data types, pagination, currency, balance, and provisional nature. Nearly complete; could mention if response includes breakdown only for institutions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters. Description adds meaning: interval units, count limits, until format/pagination usage, and symbol restriction beyond enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool queries investor trading amounts for KOSPI/KOSDAQ markets, distinguishes from sibling tools like getMarketIndicatorPrices and getMarketIndicatorCandles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists supported symbols, pagination mechanism, and data interpretation notes. Lacks explicit when-not-to-use compared to alternatives, but sibling context makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getMarketIndicatorPricesARead-onlyIdempotent
시장 지표 현재가 조회
시장 지표(국내 지수·국채)의 현재가를 조회합니다. 최대 200건 까지 다건 조회를 지원하며 콤마(,)로 구분합니다.
지원 심볼은 그룹 상단 Market Indicators 설명의 심볼 카탈로그(8종)를 따르며, 카탈로그에 없는 심볼은
400 unsupported-symbol 로 응답합니다.
Rate Limits Group: MARKET_INDICATOR
[GET /api/v1/market-indicators/prices]
tags: Market Indicators
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. The description adds batch limit (200), delimiter (comma), error code (400), and rate limit group, providing useful context beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact with a clear structure: title, purpose, batch limit, symbol constraints, error note, rate limit, and tag. Information is front-loaded. Minor markdown verbosity does not detract significantly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one parameter and no output schema, the description covers key aspects: purpose, supported symbols, limits, error handling, and rate limits. It does not detail the response structure, but the output is likely obvious price data given the name and context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single parameter, already specifying symbol format, limit, and example. The description adds the symbol catalog reference and error handling, but these are minor extensions to the schema's own description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb '조회' (retrieve) and the resource '시장 지표 현재가' (current prices of market indicators). It specifies domestic indices and government bonds, distinguishing it from sibling tools like getPrices (stocks) and getExchangeRate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states supported symbols come from a catalog of 8 types and that unsupported symbols return a 400 error. This guides when to use the tool. However, it does not explicitly contrast with other market indicator tools like getMarketIndicatorCandles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getOrderARead-onlyIdempotent
주문 상세 조회
특정 주문의 상세 정보를 조회합니다. 모든 주문 상태(체결 완료, 취소, 거부 등)의 주문을 조회할 수 있습니다.
Rate Limits Group: ORDER_HISTORY
[GET /api/v1/orders/{orderId}]
tags: Order History
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL 경로 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, indicating a safe read operation. The description adds the rate limit group and HTTP method, but no additional behavioral traits beyond confirming it queries all statuses. The annotations carry most of the transparency burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear title and a concise two-sentence explanation, followed by relevant metadata (rate limits, HTTP method, tags). Every piece serves a purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-order retrieval tool with full schema coverage and informative annotations, the description covers the core functionality, status scope, and rate limit group. No output schema is present, but the return format is not critical for tool selection. The description is contextually complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters (orderId and account) with descriptions. The description does not add any further parameter-specific meaning or usage details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves detailed information for a specific order (주문 상세 조회) and explicitly mentions it can query orders in any status. This distinguishes it from sibling tools like getOrders (which lists orders) and cancelOrder/modifyOrder (which mutate orders).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when you need details of a specific order, but does not provide explicit guidance on when not to use it or cite alternatives. However, the context of sibling tools makes the use case fairly clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getOrderbookBRead-onlyIdempotent
호가 조회
매수/매도 호가 및 잔량을 조회합니다.
Rate Limits Group: MARKET_DATA
[GET /api/v1/orderbook]
tags: Market Data
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context: Rate Limits Group 'MARKET_DATA' and HTTP method 'GET'. However, it does not describe response structure or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is efficient with 3 sentences, front-loading the purpose. Includes endpoint and tags without redundancy. Minor repetition of title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with well-documented schema and annotations, the description adequately covers purpose and behavioral constraints. No output schema exists, so no need to explain returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed description of the 'symbol' parameter including pattern and examples. The description does not add additional parameter meaning beyond the schema, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title '호가 조회' and description '매수/매도 호가 및 잔량을 조회합니다' clearly state the tool retrieves orderbook data (bids/asks with quantities). It specifies the verb '조회' and resource '호가', but does not explicitly distinguish from sibling tools like getPrices or getCandles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., when to use getPrices vs getOrderbook). No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getOrdersARead-onlyIdempotent
주문 목록 조회
주문 목록을 조회합니다. status 파라미터로 주문 상태를 필터링합니다.
지원하는 status 값:
진행 중 주문:
OPEN-- PENDING, PARTIAL_FILLED, PENDING_CANCEL, PENDING_REPLACE 상태의 주문을 반환종료된 주문:
CLOSED-- FILLED, CANCELED, REJECTED, REPLACED 등 종료 상태 주문을 반환합니다.
symbol을 지정하면 해당 종목의 주문만 필터링하여 반환합니다.
페이징 동작:
status=OPEN: 모든 대기 중 주문을 전량 반환합니다.limit,cursor는 무시되며,from/to만 주문 생성일(orderedAt, KST 기준) 범위 필터로 적용됩니다 (미지정 시 전체 기간).status=CLOSED:limit(기본 20, 최대 100),cursor,from/to파라미터 모두 적용됩니다.
Rate Limits Group: ORDER_HISTORY
[GET /api/v1/orders]
tags: Order History
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral details beyond the annotations (readOnlyHint, etc.), such as pagination nuances, status lifecycle group mapping, and rate limit group. These traits are not captured in annotations and are crucial for agent decision-making.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (introduction, status values, pagination, rate limits). Every sentence adds value; no fluff. It is appropriately sized and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not explain return values. However, it covers input behavior comprehensively, including edge cases (e.g., limit ignored in OPEN). The agent can infer the response shape from typical list endpoints. Slightly incomplete but strong overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is 100%, the description adds substantial meaning by explaining how status values map to individual order statuses and how pagination parameters behave differently for OPEN vs CLOSED. This goes beyond the schema's syntactic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states '주문 목록 조회' (order list inquiry) with explicit filtering by status and symbol. It distinguishes itself from sibling tools like getOrder (single order) and createOrder by focusing on listing, making the purpose precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed context on when to use OPEN vs CLOSED status, including pagination behavior differences. While it doesn't explicitly state when not to use the tool versus alternatives, the usage context is clear and sufficient for an AI agent to decide correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getPriceLimitARead-onlyIdempotent
상/하한가 조회
종목의 당일 상한가 및 하한가를 조회합니다.
Rate Limits Group: MARKET_DATA
[GET /api/v1/price-limits]
tags: Market Data
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which cover safety and idempotency. The description adds that it queries '당일' (today's) limits and includes a rate limits group, which provides useful context beyond what annotations offer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise, with only a few lines of text. It front-loads the title and purpose, but the inclusion of the endpoint path and tags is somewhat unnecessary and could be omitted for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only query tool with strong annotations and full schema coverage, the description adequately covers the purpose and return type (upper/lower limits). It lacks details about pagination or error cases, but given the tool's simplicity, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for the symbol parameter, explaining the required format (e.g., 6-digit KRX, alphabetic US tickers). The description does not add additional meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves the daily upper and lower price limits for a stock. It uses specific verbs (조회/조회합니다) and resource (상/하한가). Among sibling tools, only this one provides price limits, so it is well-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention preconditions or limitations. However, the tool's function is self-evident, and the context is simple enough that an agent can infer usage from the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getPricesARead-onlyIdempotent
현재가 조회
종목의 현재가 정보를 조회합니다. 최대 200건 까지 다건 조회를 지원하며 콤마(,)로 구분합니다.
Rate Limits Group: MARKET_DATA
[GET /api/v1/prices]
tags: Market Data
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds useful behavioral details: rate limits group (MARKET_DATA), HTTP method (GET), and the 200-item batch constraint. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at three lines, front-loaded with the main action, and includes essential details (batch limit, rate limits, endpoint) without unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and no output schema, the description adequately covers purpose, constraints, and rate limits. It lacks response format details, but given the tool's simplicity, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description for 'symbols' already covers the format, allowed characters, and separator. The description's main text does not add new parameter meaning beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves current price information for stocks, supports batch queries up to 200 items separated by commas, and includes the HTTP endpoint. This distinguishes it from sibling tools like getCandles (historical data) and getOrderbook (order book depth).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide guidance on when to use this tool versus alternatives. For example, it doesn't contrast with getCandles for historical data or getMarketIndicatorPrices for index prices. Only a batch size limit is given, not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getRankingsARead-onlyIdempotent
주식 랭킹 조회
지정한 시장(marketCountry) · 기간(duration) · 기준(type)의 주식 랭킹을 조회합니다. 상위 100위까지 제공합니다.
TOP_GAINERS/TOP_LOSERS는duration=realtime을 지원하지 않습니다 (400unsupported-ranking-duration).tradingVolume/tradingAmount의 집계 기준은type이 결정합니다 —TOSS_SECURITIES_*는 토스증권 체결 기준, 그 외(MARKET_*/TOP_*)는 시장 전체 기준.price.basePrice는TOP_GAINERS/TOP_LOSERS만duration시작 시점 기준가이며, 나머지 타입은duration과 무관하게 항상 전일 기준가입니다.price.changeRate도 같은 의미를 따릅니다 (기간 등락률 vs 전일 대비 등락률).응답 항목 수는
count보다 적을 수 있습니다 (시세 조회에 실패한 종목은 제외).랭킹이 집계되지 않은 조합은 에러가 아닌 빈
rankings배열로 응답하며, 이때rankedAt은 null 입니다.
Rate Limits Group: RANKING
[GET /api/v1/rankings]
tags: Ranking
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only, idempotent, non-destructive. The description adds behavioral details: response count may be less than requested, empty rankings on no aggregation, and nuanced price.basePrice behavior. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with bullet points, front-loaded with the main purpose. While somewhat lengthy, every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given tool complexity, the description covers major edge cases (unsupported duration, missing data, price behavior). No output schema exists, but description partially addresses return structure. Sufficiently complete for most use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context on aggregation logic and price semantics, but the schema already describes each parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries stock rankings by marketCountry, duration, and type, providing top 100. It distinguishes itself from siblings by focusing on rankings and includes detailed type and duration explanations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (get rankings) and highlights that TOP_GAINERS and TOP_LOSERS do not support realtime duration, guiding against invalid usage. It does not explicitly mention alternatives but the context makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getSellableQuantityARead-onlyIdempotent
판매 가능 수량 조회
특정 종목의 판매 가능 수량을 조회합니다.
Rate Limits Group: ORDER_INFO
[GET /api/v1/sellable-quantity]
tags: Order Info
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. |
TDQS
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 the rate limit group and HTTP method, but no additional behavioral details like error handling or output format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: one explanatory sentence plus minimal metadata (rate limit, endpoint). No wasted words, front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks output format description and does not differentiate from similar tools like getHoldings. For a simple read-only query with good annotations, it is adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed parameter descriptions (symbol format, account fallback). The tool description does not add further parameter insights beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it queries sellable quantity for a specific stock (종목). The title '판매 가능 수량 조회' matches. It is distinct from sibling tools like getOrders or createOrder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives such as getHoldings or getBuyingPower. The description only provides the rate limit group, no context on selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getStocksBRead-onlyIdempotent
종목 기본 정보 조회
종목의 기본 정보를 조회합니다. symbols 를 콤마로 구분하여 최대 200건 까지 다건 조회를 지원합니다.
종목명, 시장, 통화, 상장 상태, 거래정지 여부 등 트레이딩에서 필요한 참조 데이터를 제공합니다.
Rate Limits Group: STOCK
[GET /api/v1/stocks]
tags: Stock Info
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. Description adds rate limit group and confirms the endpoint, but lacks details on response format, error handling, or behavior for invalid symbols. The information provided is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise: title, bullet-like list of returned fields, rate limit group, and HTTP method. Each sentence adds value, and the structure is front-loaded with the most important info. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter, but the lack of an output schema leaves the response format unknown. The description mentions some fields (name, market, currency) but not all, which may require the agent to infer or call the tool to discover the structure. Error scenarios are not covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. Description repeats the symbols parameter's bulk limit (200) but does not add new semantics beyond the schema's own detailed description. No additional constraints or clarifications are introduced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves basic stock info (name, market, currency, etc.) and supports bulk query of up to 200 symbols. It distinguishes the tool's purpose from price or order tools implicitly, but does not explicitly differentiate from siblings like getStockWarnings or getPrices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives such as getPrices or getCandles. The description only explains what it does, not when it should be preferred or when other tools are more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getStockWarningsARead-onlyIdempotent
매수 유의사항 조회
종목의 매수 유의사항 및 변동성 완화(VI) 발동 정보를 조회합니다.
포함 종류: 정리매매(LIQUIDATION_TRADING), 단기과열종목(OVERHEATED), 투자경고(INVESTMENT_WARNING), 투자위험(INVESTMENT_RISK), VI 정적/동적/혼합(VI_STATIC / VI_DYNAMIC / VI_STATIC_AND_DYNAMIC), 신주인수권(STOCK_WARRANTS). 전체 enum 은 StockWarning.warningType 참조.
"활성"의 시간 기준: 응답 시점 기준으로 startDate <= 오늘 <= endDate 인 항목 (또는 endDate 가 null 인 진행 중 항목).
응답 정렬: startDate 내림차순 (최근 발동된 항목부터). startDate 가 동일한 경우 정렬 순서는 보장되지 않습니다.
데이터 적시성: VI 발동/해제는 거래소 이벤트 발생 후 수 초 내 반영됩니다. 정리매매·단기과열·투자경고/위험 지정은 거래소 공시 기준 일배치로 반영됩니다.
미존재 vs 빈 배열:
종목 자체가 없으면
404 stock-not-found.종목은 있으나 활성 유의사항이 없으면
200 OK+result: [].
Rate Limits Group: STOCK
[GET /api/v1/stocks/{symbol}/warnings]
tags: Stock Info
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | URL 경로 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations confirm read-only, idempotent, non-destructive behavior. The description adds critical details: active time criteria, sorting order, data latency (seconds for VI, daily batch for others), and response differences (404 vs empty array). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with paragraphs and bullet points, covering necessary details efficiently. Slightly verbose with some internal references (e.g., full enum reference) but overall concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description thoroughly explains the response format (empty array vs 404), active definition, sorting, and timeliness. This is complete and actionable for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'symbol' is fully described in the input schema with pattern and examples. The description does not add extra parameter semantics beyond what the schema provides, so baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves buy warnings and VI activation information for a stock. It lists specific warning types and provides distinct error handling (404 vs empty array), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when results are empty vs when a stock is not found, and notes data timeliness for different warning types. However, it does not explicitly contrast with sibling tools or state when to use it over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getTradesBRead-onlyIdempotent
최근 체결 내역 조회
당일 최근 체결 내역을 조회합니다.
Rate Limits Group: MARKET_DATA
[GET /api/v1/trades]
tags: Market Data
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and idempotency. The description adds that it queries today's trades and belongs to the MARKET_DATA rate limit group, but does not disclose other behavioral traits like return format, ordering, or pagination behavior. With strong annotations, the description provides modest added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a title, one explanatory sentence, and metadata (rate limits, endpoint, tags). Every sentence adds value, and the information is front-loaded. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter with nested object, no output schema), the description is adequate but lacks details about return structure, ordering of trades, or error handling. It doesn't clarify the distinction from similar market data tools. More context would improve agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% as both parameters (symbol, count) have descriptions in the schema. The tool description itself does not add any parameter semantics beyond what the schema already provides. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it queries recent trade history ('최근 체결 내역 조회') and specifies it's for today ('당일'). This verb+resource combination is specific enough to identify the tool's purpose, though it does not explicitly differentiate from sibling tools like getCandles or getOrderbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites, when not to use, or contrast with sibling tools. The only context is the rate limits group, which is not enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getUsMarketCalendarARead-onlyIdempotent
해외 장 운영 정보 조회
미국 시장의 장 운영 시간을 조회합니다. 4 세션(dayMarket, preMarket, regularMarket, afterMarket) 별로 nullable. 휴장 시 4 세션 모두 null. 전일/당일/익일 3영업일 정보를 반환합니다. 모든 시간은 KST(+09:00) 기준.
Rate Limits Group: MARKET_INFO
[GET /api/v1/market-calendar/US]
tags: Market Info
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | 쿼리 파라미터 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds useful details beyond annotations: nullable sessions, all null on holidays, three business days, times in KST, and rate limit group. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, front-loaded purpose, and every sentence adds value. Could be slightly more structured but is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains output structure (4 sessions, 3 days, nullable) and rate limits, compensating for no output schema. Adequate for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of the parameter, so baseline is 3. Description does not add much beyond the schema's description of the date parameter but provides response context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it queries US market hours and returns three business days of session info, effectively distinguishing from the sibling getKrMarketCalendar by name and context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool over alternatives like getKrMarketCalendar; it only implicitly indicates US market focus.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modifyConditionalOrderADestructive
조건주문 수정
조건주문을 수정합니다. 조건주문 전체를 재설정하므로 본문에 type·expireDate·first(필요 시 second) 를 모두 전달합니다.
수량(quantity)은 각 감시 조건(first/second) 안에 입력합니다.
(등록과 달리 expireDate 가 필수입니다.) 종목은 conditionalOrderId 로 식별되므로 본문에 symbol 은 필요 없습니다.
본문의 type 은 변경 결과 타입이며, 타입 전환(예: SINGLE→OCO)이 허용됩니다. 응답의 type 으로 확인하세요.
conditionalOrderId 로 수정 대상을 식별합니다.
주의: 수정은 기존 조건주문을 취소하고 새 조건주문을 생성하는 방식으로 동작합니다.
따라서 수정 후에는 새로운 conditionalOrderId 가 발급되고 기존 ID 는 무효화됩니다.
이후 조회·수정·취소에는 반드시 응답으로 반환된 conditionalOrderId 를 사용하세요.
Rate Limits Group: CONDITIONAL_ORDER
[POST /api/v1/conditional-orders/{conditionalOrderId}/modify]
tags: Conditional Order
⚠️ 실제 자산에 영향을 주는 조건주문 API 입니다. 기본값은 dryRun=true 이며 실행하려면 TOSSINVEST_ENABLE_CONDITIONAL_ORDERS=true 와 confirmation 이 필요합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 조건주문 수정 요청. 등록과 동일하게 "이 가격에 닿으면 매매" 만 입력하며, 조건주문 전체를 재설정하므로 유지할 조건도 함께 전달해야 합니다. 종목은 `conditionalOrderId` 로 식별되므로 수정 요청에는 `symbol` 이 필요 없습니다. | |
| path | Yes | URL 경로 파라미터 | |
| dryRun | No | 기본값 true. true 이면 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다. 실제 주문을 내려면 false 로 명시해야 합니다. | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. | |
| confirmation | No | 실주문 확인 문자열. TOSSINVEST_MUTATION_CONFIRMATION 환경변수 값과 정확히 일치해야 실제 주문이 실행됩니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true, readOnlyHint=false), the description reveals critical behavioral details: the modification cancels and recreates the order, resulting in a new conditionalOrderId and invalidation of the old one. It also warns about real asset impact, dryRun default, required confirmation and environment variable, and specifies rate limits group.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise but includes some repetition (e.g., explaining the reset behavior in multiple places). While every sentence adds value, the structure could be tightened. The caution and rate limits sections are well-placed, but overall length is acceptable given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, no output schema, and annotations that do not fully explain side effects, the description is comprehensive. It covers the cancellation-and-recreation behavior, new ID issuance, required fields, dryRun mode, confirmation, environment variable, rate limits, and real asset impact. An agent can safely invoke this tool with the provided information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters. The description adds value by explaining that type is the result type and transitions are allowed, that expireDate is required here unlike creation, and that symbol is not needed. However, there is a potential contradiction: the description states quantity is inside first/second conditions, but schema shows quantity as a top-level field. This could cause confusion, slightly reducing the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as modifying a conditional order ('조건주문 수정') and distinguishes it from creation (expireDate required) and cancellation (new ID issued). It specifies that the entire order is reset, leaving no ambiguity about the operation's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to modify a conditional order) and provides explicit guidance: send all fields (type, expireDate, first, second if needed), and notes that symbol is unnecessary. It contrasts with creation by stating expireDate is required here. However, it does not explicitly state when to use alternatives like cancelConditionalOrder or createConditionalOrder instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modifyOrderADestructive
주문 정정
기존 주문의 가격 또는 수량을 정정합니다.
KR 주식: quantity 필수. 양의 정수만 허용합니다.
US 주식: quantity 제공 불가. 가격 변경만 지원합니다. quantity 제공 시 400 us-modify-quantity-not-supported 에러를 반환합니다.
Rate Limits Group: ORDER
[POST /api/v1/orders/{orderId}/modify]
tags: Order
⚠️ 실제 자산에 영향을 주는 주문 API 입니다. 기본값은 dryRun=true 이며 실행하려면 TOSSINVEST_ENABLE_TRADING=true 와 confirmation 이 필요합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 요청 본문 (application/json). 금액·수량·가격은 정밀도 보존을 위해 문자열로 전달합니다. | |
| path | Yes | URL 경로 파라미터 | |
| dryRun | No | 기본값 true. true 이면 토스증권 서버로 어떤 네트워크 요청도 보내지 않고 실행 계획만 반환합니다. 실제 주문을 내려면 false 로 명시해야 합니다. | |
| account | No | 요청에 사용할 계좌의 accountSeq. getAccounts 응답의 accountSeq 값을 사용합니다. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 환경변수를 사용하며, 둘 다 없으면 호출하지 않고 오류를 반환합니다. | |
| confirmation | No | 실주문 확인 문자열. TOSSINVEST_MUTATION_CONFIRMATION 환경변수 값과 정확히 일치해야 실제 주문이 실행됩니다. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Extensive behavioral context beyond annotations: dryRun default, confirmation requirement, market-specific rules (KR quantity required, US quantity not allowed), rate limits group, and specific error codes. No contradictions with annotations (destructiveHint=true, readOnlyHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and well-structured with clear sections for KR stocks, US stocks, and important warnings. No unnecessary sentences; every part adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description should cover return behavior. It provides many error codes and prerequisites, but does not describe the success response format. Still, it is comprehensive enough for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds value by summarizing market-specific parameter constraints (KR vs US) and mentioning the rate limits group, which is not in the schema. It also provides context for dryRun and confirmation, though these are already in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool modifies existing orders (price or quantity) and differentiates between KR and US markets. It distinguishes itself from sibling tools like createOrder or cancelOrder by specifying its action on existing orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied for modifying orders, but no explicit comparison to alternatives like cancelOrder. However, it provides critical guidelines: default dryRun=true, requirement of TOSSINVEST_ENABLE_TRADING=true and confirmation for actual execution, and market-specific constraints, which are highly useful for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_api_overviewARead-onlyIdempotent
로드된 토스증권 OpenAPI 명세의 요약 정보를 반환합니다. 버전, 서버 URL, tag 목록, operation 수, 실주문 활성화 상태, snapshot/원격 사용 여부를 포함합니다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and idempotency. The description adds specifics about the returned fields (version, server URL, tags, etc.), which is additional context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that first states the primary purpose and then lists the specific items included. It is extremely concise with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description sufficiently explains what the tool returns. No additional details are necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description does not need to explain them. The schema coverage is 100%, and the baseline for zero parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns a summary of the Toss Securities OpenAPI spec, listing specific elements like version, server URL, tags, operation count, etc. This distinguishes it from sibling tools that deal with market data, orders, or accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool returns but does not explicitly guide when to use it versus alternatives. It is implied as an initial overview tool, but no explicit 'when not to use' or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_auth_statusARead-onlyIdempotent
인증 설정과 토큰 준비 상태를 안전하게 반환합니다. client ID 는 마스킹되며 client secret 과 access token 은 절대 반환하지 않습니다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds valuable behavioral context: client ID is masked, and client secret/access token are never returned. This goes beyond annotations and helps the agent understand safety constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences, front-loaded with the core purpose. Every word adds value; no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description explains what is returned (auth settings, token readiness) and crucially what is not returned (secrets). It is complete for a status-check tool, though the exact fields of the response are not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. Baseline is 4. The description does not add parameter details because there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns authentication settings and token readiness status, with specific behavior on masking client ID and not returning secrets. The verb '반환합니다' and resource '인증 설정과 토큰 준비 상태' are specific. It distinguishes from siblings like tossinvest_refresh_auth.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as tossinvest_refresh_auth or other auth-related tools. No context on prerequisites, timing, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_call_operationADestructive
operationId 로 임의의 토스증권 API operation 을 호출합니다. 직접 도구 등록을 지원하지 않는 클라이언트를 위한 wrapper 입니다. 이 wrapper 도 동일한 mutation guard 를 통과하므로 주문 안전정책을 우회할 수 없습니다 (dryRun 기본 true).
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | 요청 본문 (JSON) | |
| path | No | path parameter | |
| query | No | query parameter | |
| dryRun | No | mutation 인 경우 기본 true. false 로 명시해야 실제 요청을 보냅니다. | |
| account | No | 계좌 accountSeq. 미지정 시 TOSSINVEST_DEFAULT_ACCOUNT 사용. | |
| operationId | Yes | 호출할 operationId | |
| confirmation | No | mutation 실행 확인 문자열 (TOSSINVEST_MUTATION_CONFIRMATION 과 일치해야 함). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by revealing the mutation guard, dryRun defaulting to true, and that it cannot bypass order safety policies. Annotations only indicate destructive and readOnly=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with core action, no wasted words. Highly concise and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no output schema, and nested objects, the description is short. It lacks guidance on finding operationId (sibling tool exists) and handling responses. Adequate for a wrapper but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. The description does not add meaningful parameter details beyond what the schema already provides, such as the dryRun default which is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool calls any Toss Securities API operation by operationId, acting as a wrapper for unsupported clients. This distinguishes it from sibling tools which are specific operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states it is for clients that do not support direct tool registration, providing context for when to use it. However, it does not explicitly exclude usage when a specific tool exists, though implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_get_operationARead-onlyIdempotent
특정 operationId 의 상세 정보(method, path, tag, 설명, 필수/선택 입력, requestBody, 응답 스키마, 계좌 헤더 필요 여부, mutation 여부, rate limit 그룹, MCP 도구 이름)를 반환합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| operationId | Yes | OpenAPI operationId |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds no extra behavioral traits beyond listing what fields are returned, which is useful but not beyond what annotations already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence listing many attributes, which is dense but clear. It could be broken into bullet points or structured for easier parsing, but it is efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter, full schema coverage, and no output schema, the description comprehensively lists all returned fields (method, path, tag, inputs, response schema, etc.), making the tool's behavior fully understandable without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for operationId. The tool description does not add further meaning to the parameter itself; it only describes the output. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns detailed information for a specific operationId, including method, path, tag, inputs, etc. This distinguishes it from sibling tools like tossinvest_list_operations and tossinvest_search_operations, which list or search operations without returning full details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention scenarios where detailed operation info is needed, nor does it exclude cases where other tools are more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_list_operationsCRead-onlyIdempotent
등록된 operation 목록을 필터링해 반환합니다. tag, method, path, readOnly, destructive, keyword 로 필터링할 수 있습니다.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | tag 이름 (부분 일치, 대소문자 무시) | |
| path | No | path 부분 문자열 | |
| method | No | HTTP method | |
| keyword | No | operationId/summary/description 키워드 | |
| readOnly | No | 읽기 전용 operation 만 조회 | |
| destructive | No | 자산에 영향을 주는 mutation 만 조회 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds only that filtering by those properties is possible, but omits details like pagination, result limits, or output structure. Minimal additional value 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that conveys the core functionality and filter options without any redundant or verbose language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no output schema, and many sibling tools, the description is too brief. It does not explain how filters combine, whether pagination exists, or what constitutes an 'operation', leaving significant gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described individually. The description merely lists the filterable fields without adding new meaning. Baseline score of 3 is appropriate as the schema already carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns a filtered list of registered operations, specifying the filter criteria. However, it does not differentiate itself from the sibling 'tossinvest_search_operations', which may have overlapping functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'tossinvest_get_operation' or 'tossinvest_search_operations'. There is no mention of context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_refresh_authB
access token 을 명시적으로 재발급합니다. 토큰 문자열은 반환하지 않고 만료 정보만 반환합니다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, but the description does not elaborate on effects (e.g., invalidating previous tokens, permission requirements, rate limits). It adds only that the token string is not returned, which is minimal 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the key action. Every word is informative with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool, the description covers core purpose and return value. However, it lacks specifics on the expiration info structure, which for a complete picture would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so baseline is 4. The description adds meaning about the return behavior (only expiration info, not token string), compensating for the lack of an output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reissues an access token and explicitly mentions it returns only expiration info, not the token string. The verb 'refresh auth' matches sibling naming, but it does not explicitly distinguish from 'tossinvest_auth_status'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like tossinvest_auth_status. The description does not specify prerequisites, such as requiring a valid token, or when reissuing is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tossinvest_search_operationsARead-onlyIdempotent
operationId, summary, description, path, tag 를 대상으로 operation 을 검색합니다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 최대 결과 수 (기본 20) | |
| query | Yes | 검색어 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, providing safety context. The description adds that it searches specific fields but does not disclose additional traits like pagination or empty result handling. The description adds moderate value 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that efficiently conveys the tool's purpose without unnecessary words. It earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema and the tool's search nature, the description could be more complete by mentioning that it returns matching operations or the response format. It is adequate but leaves some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters (query and limit) with descriptions. The description does not add additional meaning to the parameters, such as formatting or search syntax. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: searching operations by operationId, summary, description, path, and tag. This distinguishes it from sibling tools like list_operations (likely listing all) and get_operation (retrieving a specific one).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. It does not mention that it is for filtering or searching, while list_operations might be for bulk retrieval. No when-not or alternative tool mentions.
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. Dates show when Glama detected each change.
36 tool updates
v0.1.0- First observed
cancelConditionalOrder - First observed
cancelOrder - First observed
createConditionalOrder - First observed
createOrder - First observed
getAccounts - First observed
getBuyingPower - First observed
getCandles - First observed
getCommissions - First observed
getConditionalOrder - First observed
getConditionalOrders - First observed
getExchangeRate - First observed
getHoldings - First observed
getKrMarketCalendar - First observed
getMarketIndicatorCandles - First observed
getMarketIndicatorInvestorTrading - First observed
getMarketIndicatorPrices - First observed
getOrder - First observed
getOrderbook - First observed
getOrders - First observed
getPriceLimit - First observed
getPrices - First observed
getRankings - First observed
getSellableQuantity - First observed
getStocks - First observed
getStockWarnings - First observed
getTrades - First observed
getUsMarketCalendar - First observed
modifyConditionalOrder - First observed
modifyOrder - First observed
tossinvest_api_overview - First observed
tossinvest_auth_status - First observed
tossinvest_call_operation - First observed
tossinvest_get_operation - First observed
tossinvest_list_operations - First observed
tossinvest_refresh_auth - First observed
tossinvest_search_operations
TDQS
Each tool targets a distinct function: market calendar vs indicators, stock prices vs indicator prices, orders vs conditional orders, etc. The descriptions clearly differentiate between similar concepts (e.g., getPrices vs getMarketIndicatorPrices), leaving no ambiguity.
Most tools follow a verb_noun pattern (getX, createX, cancelX), but there is a separate group with a 'tossinvest_' prefix and snake_case (tossinvest_list_operations, etc.). This mixed convention, along with camelCase in some names (getOrderbook), creates noticeable inconsistency.
With 36 tools, the server covers a broad trading domain without being excessive. The count is reasonable for features like orders, conditional orders, market data, indicators, and account management, though it is slightly on the higher side.
The tool set includes all essential operations for a trading API: market data (calendar, indicators, orderbook, prices, trades), order management (create, cancel, modify, list, get), conditional orders, account info (holdings, buying power, commissions, exchange rate), rankings, and even meta tools for exploring the API. No obvious gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server wrapping Toss Securities Open API, enabling stock price queries and trading for Korean and US stocks via natural language.3640MIT
- AlicenseCqualityBmaintenanceSafe-by-default MCP server for the official Toss Securities Open API, providing read-only market and account data with optional order operations protected by multiple safety gates.27162MIT
- AlicenseAqualityAmaintenanceToss Securities (토스증권) Open API MCP server for the Korean stock market. Supports real-time quotes, orderbook, candles, account holdings, buying power, and order management (create/modify/cancel) with a built-in safety gate requiring explicit confirmation before any real order is placed.17403MIT
- AlicenseAqualityCmaintenanceSelf-hosted MCP server that wraps the Toss Securities Open API, enabling natural language queries for account balances, holdings, transactions, and stock prices via Claude.4MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Kuco-dev/tossinvest-api-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server