InvestMCP
Provides read-only access to Binance's official REST API for crypto futures market data and the user's own Binance futures account data using their read-only API key; no order or transfer capabilities.
Click on "Deploy 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., "@InvestMCPHow are my holdings performing compared to the KOSPI?"
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.
InvestMCP
English abstract. InvestMCP is a read-only MCP server that lets an individual investor ask an AI chat client such as Claude or ChatGPT about their own brokerage and crypto futures accounts together with public market data and ticker research. It merges my earlier K-invest and Ticker Research projects into one process with 28 tools: 10 account/portfolio, 11 public-data/status and 7 research. Account data comes only from official APIs (Toss Securities, Korea Investment & Securities, Binance, Hyperliquid), filings from SEC EDGAR, and unofficial Yahoo data via yfinance is labelled as such; there are no order or transfer tools. Each user runs it locally with their own keys for their own accounts; it is not a shared or hosted data service. Full English documentation: README.en.md.
무엇인가
개인 투자자가 Claude·ChatGPT 같은 AI 채팅에서 자기 증권·크립토 계좌와 공개 시장 데이터를 한곳에서 묻는 읽기 전용 MCP 서버다. 국내·미국 주식과 크립토 선물을 다룬다. "내 보유 종목이 코스피 대비 어떤가"라는 질문에는 get_holdings로 종목을 읽고 compare_price_performance로 비교한다. "이 종목의 TTM 실적과 최근 내부자 거래는"이라는 질문에는 SEC 공시 도구를 쓴다.
이전에 만든 두 프로젝트 K-invest와 Ticker Research를 하나로 합쳤다. 계좌·회계 엔진은 기존 InvestMCP 2.15.4에서, 리서치 계산은 Ticker Research의 최신 공개 포크에서 가져왔다. 프로세스 하나, 도구 카탈로그 하나, 인증 경계 하나다. SEC 구현은 합치지 않았다. 재무 도구와 리서치 도구는 회계 기간·연속성·출처 검증 장치가 서로 달라서 각자 자기 구현을 쓴다.
각 사용자가 자기 키로 자기 계좌만 조회하도록 직접 실행한다. 공유하거나 남에게 시세를 제공하는 호스팅 데이터 서비스가 아니다. 근거가 되는 약관은 내 계좌 설정에 있다.
이 프로젝트는 Codex와 Claude AI 코딩 에이전트를 오케스트레이션해 만들었다. 설계, 범위, 채택과 공개 결정은 내가 내렸고, 에이전트가 구현과 테스트 실행을 맡았다.
Related MCP server: milele-prime-mcp
설계 원칙
주문·이체 도구가 없다. 주문 제출, 체결, 취소, 이체, 출금 기능이 없다. 거래 이력은 읽지만 거래를 일으키지 못한다.
계좌는 공식 API로만 읽는다. 토스증권 Open API, 한국투자증권 Open API, Binance, Hyperliquid 공식 API를 쓴다. 공시는 SEC EDGAR, 환율은 ECB 기준환율이다. 비공식 출처인 yfinance(Yahoo 데이터)와 공개 시세 API인 Upbit은 데이터 출처 표에 구분해 적었다.
키는 사용자 기기의 환경 변수에만 둔다. 서버는 프로세스 환경 변수만 읽고
.env파일을 자동으로 불러오지 않는다. 브로커 키는 해당 브로커 인증에만 보낸다.숫자에는 출처와 기준 시각이 붙는다. 계좌·시장 도구는 응답 섹션마다
meta에 출처(provider), 데이터 기준 시각(as_of,as_of_basis), 조회 시각(observed_at)을 넣는다. 기준 시각을 알 수 없으면as_of를 null로 두고 이유 코드를 남긴다. 리서치 도구도 섹션마다as_of,as_of_basis,source를 붙인다.없는 데이터는 0이 아니다. 가격 누락, 불완전한 이력, 확인되지 않은 입출금은 unavailable로 남기고 0으로 채우지 않는다. 계좌를 설정하지 않았으면
NOT_CONFIGURED와 필요한 변수 이름을 돌려준다.
데이터 출처
출처 | 구분 | 키 | 용도 |
공식 | 본인 키 필요 | 계좌, 보유 종목, 체결 이력, 브로커 시세 조회 | |
공식 | 본인 키 필요 | 계좌, 국내·해외 잔고, 시세와 이력 | |
공식 | 시장 데이터는 불필요, 계좌는 본인 읽기 전용 키 | 선물 시장·계좌 데이터 | |
공식, 주소 기반 공개 조회 | 불필요 (본인 주소 입력) | 선택적 선물 계좌 조회 | |
공개 시세 API; terms: see provider | 불필요 | 크립토 NAV 관측용 KRW 스테이블코인 가격 | |
공식 공개 공시 | 불필요 | 재무 사실, TTM, 내부자 거래, EPS 이력 | |
공식 공개 일별 기준값 | 불필요 | 키 없는 환율. 참고용이며 체결 가격이 아니다 | |
Apache-2.0 라이브러리, 비공식 Yahoo 데이터; terms: see provider | 불필요 | 키 없는 시세·캔들, 재무 지표, 컨센서스, 기술적 리서치, 미 국채 수익률 대용 |
Yahoo 데이터 약관: see provider. Upbit 데이터 약관: see provider. 이 저장소에는 Yahoo 응답 녹화본이나 브로커 샘플 코드 픽스처가 없다.
공개 서비스는 요청을 제한하거나 지연하거나 지역에 따라 막을 수 있다. Yahoo는 공식 거래소 API가 아니다. 가격 수익률 차트는 따로 밝히지 않는 한 배당을 빼고 계산하며, 잠정 가격과 불완전한 구간은 표시한다. 분할 매수와 EPS 시나리오는 계산이지 예측이 아니다. 로컬 성과 추정은 거래 이력의 완전성, 환율의 신뢰성, 외부 입출금 근거에 달려 있다.
도구 28개
stdio와 HTTP가 같은 28개 도구를 노출한다. 모든 인자와 설명은 TOOLS.md에 있다.
영역 | 개수 | 도구 |
계좌·포트폴리오 | 10 |
|
시장 데이터·상태 | 11 |
|
종목 리서치 | 7 |
|
† local write로 표시한 도구다. 명세서 가져오기, NAV 스냅샷, 데이터셋 내보내기를 로컬 데이터 디렉터리에 기록한다. 계좌 조회도 나중의 회계 계산을 위해 관측값을 로컬에 남길 수 있다.
get_quote와get_portfolio_summary는 여러 종목·섹션을 한 번에 받는 스키마다. 브로커별 옛 도구 이름과 호환 별칭은 내부 함수로만 남겼고, 목록에도 나오지 않고 호출도 거부된다.가격 이력 비교는
compare_price_performance가 맡는다. 예전get_market_series를 대체했다.plan_entry와compare_tickers는 사용자가 넣은 금액으로 시나리오를 계산할 뿐 주문을 내지 않는다.토스증권을 설정하지 않으면 일반 시세와 캔들은 yfinance로 대체한다. 호가, 가격 제한, 장 운영 일정, 브로커 간 시세 비교 같은 선택 섹션은 본인 브로커 키가 있어야 하며 없으면 unavailable이다. 여러 출처를 합치는 도구는 부분 커버리지를 명시한다.
키 없이 환율을 보려면
get_market_info에include를["fx"]로 넘긴다.
빠른 시작
Python 3.11 이상이 필요하다. 소스 체크아웃이나 압축을 푼 소스 디렉터리에서 설치하고 데모 모드로 스모크 검사를 돌린다.
python -m pip install .
INVESTMCP_DEMO=1 python scripts/smoke.pyscripts/smoke.py는 설치된 패키지를 stdio로 띄워 MCP 클라이언트로 초기화하고, 도구 목록이 28개인지 확인하고, ECB의 실제 USD/KRW 기준환율을 받고, 합성 계좌의 보유 종목과 포트폴리오 수익률을 읽는다. 임시 데이터 디렉터리를 만들었다가 지우며 브로커 키는 필요 없다. 환율 단계에는 인터넷 연결이 필요하다. 성공하면 PASS 네 줄을 출력하고, 하나라도 실패하면 0이 아닌 코드로 끝난다.
PASS start: stdio initialization
PASS list: 28 tools
PASS public: ECB USD/KRW reference rate
PASS demo: synthetic holdings and portfolio returns가상 환경에 설치하려면 먼저 python -m venv .venv로 만들고 활성화한다. uv로는 다음과 같다.
uv venv
uv pip install --python .venv/bin/python .
INVESTMCP_DEMO=1 .venv/bin/python scripts/smoke.pyMCP 클라이언트용으로 서버를 띄운다.
INVESTMCP_DEMO=1 investmcp
# 같은 동작:
INVESTMCP_DEMO=1 python -m investmcp --transport stdiostdio는 JSON-RPC 메시지를 기다린다. 대화형 셸이 아니다. 로그는 stderr로 나간다.
데모 모드. INVESTMCP_DEMO=1이면 계좌·포트폴리오 응답이 가상 포트폴리오로 바뀐다. DEMO-TOSS-1, DEMO-KIS-1 계좌, 합성 국내·미국 종목과 거래, 환율, 빈 합성 Binance 선물 계좌다. 실제 계좌와 같은 포트폴리오 엔진이 보유 종목, 실현 손익, 성과, 집중도 위험을 계산한다. 생성된 거래와 31개 일별 NAV 관측이 30일 구간을 채우므로, 미리 수집하지 않아도 get_portfolio_returns가 비어 있지 않은 결과를 돌려준다. 데모 모드의 계좌 호출은 브로커나 네트워크에 접근하지 않는다. 공개 데이터·리서치 도구는 그대로 공개 데이터를 받아온다. 데모 NAV 스냅샷은 별도 demo 하위 디렉터리에 저장한다. 명세서 가져오기는 실제 계좌 설정이 있어야 하고, 데모 내보내기는 합성 데이터셋을 저장하지 않고 돌려준다.
연결
Claude Desktop · Claude Code (stdio)
데스크톱 클라이언트가 환경을 찾을 수 있도록 설치된 실행 파일의 절대 경로를 쓴다. Claude Desktop MCP 설정은 다음과 같다.
{
"mcpServers": {
"finance": {
"command": "/absolute/path/to/.venv/bin/investmcp",
"args": ["--transport", "stdio"],
"env": {"INVESTMCP_DEMO": "1"}
}
}
}Claude Code에서는 같은 mcpServers 객체를 프로젝트 .mcp.json에 넣거나, Claude Code의 MCP 설정으로 실행 파일을 등록한다. 실제 키는 공유되는 프로젝트 설정이 아니라 프로세스 환경이나 로컬 비밀 관리자에 둔다. 설정 파일 위치는 MCP 로컬 클라이언트 가이드를 따른다.
claude.ai · ChatGPT 원격 커넥터 (HTTP + OAuth)
HTTP는 선택 사항이며 MCP_AUTH_TOKEN이 없으면 시작하지 않는다. 기본 바인드 주소는 루프백, 기본 포트는 18800이다. 강한 무작위 토큰을 환경 변수로 넣고 실행한다.
investmcp --transport streamable-http --host 127.0.0.1 --port 18800엔드포인트는 /mcp다. 직접 베어러 인증을 지원하는 클라이언트는 설정한 토큰을 Authorization: Bearer로 보낸다. 이 토큰은 MCP 서버용이며 브로커 키와 별개다.
원격 커넥터는 리버스 프록시에서 HTTPS를 종료하고 서버 오리진 전체를 넘긴다. /mcp, OAuth 메타데이터, /register, /authorize, /token, /revoke가 모두 포함된다. MCP_PUBLIC_URL에 공개 HTTPS 오리진(예: https://finance.example.com)을 넣으면 같은 오리진이 OAuth 리소스 식별자로 광고된다. Host, Origin, Authorization 헤더를 보존하고 백엔드 포트를 직접 노출하지 않는다. 서버는 Host를 검증하고 프록시 헤더를 신뢰하지 않는다.
OAuth는 MCP_OAUTH_ENABLED=1과 MCP_OAUTH_APPROVAL_HASH로 켠다. 해시는 로컬에서 만든다.
python -m investmcp.consent_gate hash이 명령은 승인 암호를 화면에 표시하지 않고 읽어 scrypt 해시를 출력한다. 그 해시를 MCP_AUTH_TOKEN과 별도로 MCP_OAUTH_APPROVAL_HASH에 넣고, 설정을 바꾼 뒤에는 서버를 재시작한다. 동의 페이지는 인가 코드를 발급하기 전에 승인 암호를 요구한다. 이 페이지에 브로커 키를 넣지 않는다.
OAuth는 디스커버리, 동적 클라이언트 등록, PKCE S256 인가 코드 흐름, 동의 바인딩, 액세스 토큰 만료, 리프레시 토큰 회전과 폐기, 해시로 저장하는 토큰 상태를 지원한다. 기본 리다이렉트 오리진은 Claude와 ChatGPT의 HTTPS 오리진이다. 커넥터가 다른 콜백 오리진을 쓰면 CONSENT_GATE_REDIRECT_ORIGINS에 정확한 HTTPS 오리진의 JSON 목록을 넣는다. 수동 등록 클라이언트는 MCP_OAUTH_CLIENT_ID와 MCP_OAUTH_CLIENT_SECRET을 쓰고, 동적 등록에는 둘 다 필요 없다. OAuth를 켜도 직접 베어러 접근은 유지된다.
claude.ai:
https://finance.example.com/mcp를 가리키는 사용자 지정 원격 커넥터를 추가하고 OAuth 동의를 마친다. 사용 가능 여부는 계정과 워크스페이스 정책에 따른다. Claude custom connectors 참고.ChatGPT: 사용자 지정 MCP/플러그인 연결 화면에 HTTPS
/mcpURL을 넣고, 동적 클라이언트 등록 방식의 OAuth를 골라 연결한 뒤 동의를 마친다. 서버는 클라이언트 메타데이터 문서 등록을 광고하지 않는다. 현재 화면과 계정 요건은 Connect and test, OAuth authentication 참고.
브로커 키는 서버가 도는 기기에만 있고 해당 브로커 인증에만 쓰인다. 연결된 클라이언트는 요청한 도구 결과를 받으며, 여기에는 계좌 데이터가 들어갈 수 있다. 단일 사용자 서버다. 베어러 토큰이나 OAuth 동의 권한을 가진 사람은 그 사용자가 설정한 계좌를 읽을 수 있으므로, 원격으로 열더라도 접근 권한은 본인만 가져야 한다.
내 계좌 설정
각 사용자는 자기 키로 자기 계좌에만 이 서버를 쓴다. 공유·호스팅 데이터 서비스가 아니다. 토스증권과 한국투자증권 약관은 키 공유와 제3자 시세 제공을 금지한다. 다른 사람의 요청을 내 키로 대신 처리하지 않는다. 토스증권 Open API 약관, 한국투자증권 개인 고객 Open API 약관을 확인한다.
서버는 프로세스 환경 변수만 읽고 .env 파일을 자동으로 읽지 않는다. .env.example은 값이 빈 변수 이름 목록이다. 값은 실행기나 비밀 관리자로 넣는다.
토스증권: 토스증권 WTS → 설정 → Open API에서 본인 키를 발급받아
TOSS_CLIENT_ID,TOSS_CLIENT_SECRET을 설정한다. 여러 계좌는TOSS_ACCOUNTS_JSON에accounts배열을 가진 JSON 객체로 넣는다. 각 계좌 객체는label,client_id,client_secret을 갖고, 선택 필드account_id는 라벨이 바뀌어도 원장 식별자를 유지한다. 계좌 객체 하나만 넣어도 된다. 이것은 로컬 설정 형식이며 브로커 응답이 아니다.한국투자증권: 공식 API 포털에서 키를 받아
KIS_APP_KEY,KIS_APP_SECRET,KIS_CANO, 필요하면KIS_ACNT_PRDT_CD를 설정한다. 여러 계좌는KIS_ACCOUNTS_JSON에label,app_key,app_secret,cano,acnt_prdt_cd를 가진 계좌 객체들로 넣는다.Binance: 선물 계좌 조회에는 본인 읽기 전용 키를
BINANCE_API_KEY,BINANCE_API_SECRET에 넣는다. RSA 키는 PEM 텍스트로BINANCE_SIGNING_KEY에 넣을 수 있다. 키의 거래·출금 권한은 끈다. Binance 공개 시장 도구는 키가 필요 없다.Hyperliquid: 선택 사항이다. 본인이 넣은 계정 주소로 공식 info API를 읽는다. 서명 키는 받지 않는다.
SEC: 기본 User-Agent가
investmcp/0.1.0 (contact: you@example.com)이라 설치와 공개 도구에 비밀값이 필요 없다. SEC를 꾸준히 쓰기 전에SEC_USER_AGENT를 본인 애플리케이션 식별자와 실제 연락처로 바꾼다. 연락처가 적절하지 않거나 제한된 네트워크에서 온 요청은 SEC가 거부할 수 있다.
원장, NAV, OAuth, 토큰, 로컬 캐시는 모두 INVESTMCP_DATA_DIR(기본 ~/.investmcp) 아래에 둔다. 이 디렉터리는 비공개로 두고, 과거 수익률이 필요하면 백업한다. 명세서 PDF는 그 아래 statements/inbox에 둔다. 도구는 파일 이름만 받고 경로 이동과 심볼릭 링크를 거부한다. 이 저장소에는 명세서, 계좌 데이터베이스, 개인 픽스처가 없다.
환경 변수
이름과 설명만 적는다. 값은 적지 않는다. 전체 35개다.
이름 | 설명 |
| 켜면 계좌·포트폴리오 도구가 합성 데모 포트폴리오를 쓴다 |
| 원장, NAV, OAuth, 토큰, 캐시를 저장하는 디렉터리 |
| 기본 전송 방식 ( |
| HTTP 바인드 주소 |
| HTTP 포트 |
| 켜면 요청마다 모든 이력 구간을 브로커에서 다시 읽는다 |
| 토스증권 Open API 클라이언트 ID |
| 토스증권 Open API 클라이언트 시크릿 |
| 여러 토스증권 계좌 설정 (JSON) |
| 한국투자증권 앱 키 |
| 한국투자증권 앱 시크릿 |
| 한국투자증권 계좌번호 (CANO) |
| 한국투자증권 계좌 상품 코드 |
| 여러 한국투자증권 계좌 설정 (JSON) |
| 한국투자증권 요청 사이 최소 간격 (초) |
| 요청 제한 응답 뒤 재시도 횟수 (최대 2) |
| 이력 조회 한 번에 읽는 최대 페이지 수 |
| Binance 읽기 전용 API 키 |
| Binance API 시크릿 |
| 시크릿 대신 쓰는 Binance RSA 서명 키 (PEM 텍스트) |
| 조회할 본인 Hyperliquid 주소, 쉼표로 구분 |
| SEC 요청 User-Agent (애플리케이션 식별자와 연락처) |
|
|
| HTTP 베어러 토큰. HTTP 전송에 필수 |
| 공개 HTTPS 오리진. OAuth 리소스 식별자로도 쓴다 |
| OAuth 켜기 |
| 동의 페이지 승인 암호의 scrypt 해시 |
| 수동 등록 OAuth 클라이언트 ID |
| 수동 등록 OAuth 클라이언트 시크릿 |
| 수동 등록 클라이언트 허용 여부 |
| 동적 등록 클라이언트 최대 수 |
| 액세스 토큰 수명 (초) |
| 리프레시 토큰 수명 (초) |
| 회전된 리프레시 토큰의 재사용 유예 시간 (초). 이후 재사용하면 토큰 계열 전체를 폐기한다 |
| 허용할 OAuth 리다이렉트 HTTPS 오리진의 JSON 목록 |
구조
flowchart LR
A["MCP 클라이언트<br/>Claude · ChatGPT"] -->|"stdio / HTTP + OAuth"| B["investmcp 서버<br/>도구 28개"]
B --> C["계좌·포트폴리오 10"]
B --> D["시장 데이터·상태 11"]
B --> E["종목 리서치 7<br/>ticker_engine"]
C --> F["토스증권 · 한국투자증권 · Binance · Hyperliquid · Upbit"]
C --> G[("로컬 원장 · NAV<br/>INVESTMCP_DATA_DIR")]
D --> H["SEC EDGAR · ECB · Binance 공개 · yfinance<br/>설정 시 토스증권 · 한국투자증권"]
E --> I["SEC EDGAR · yfinance"]경로 | 내용 |
| 서버, 전송, OAuth, 계좌·포트폴리오 엔진, 재무용 SEC와 공개 데이터 모듈, 데모 포트폴리오 |
| 리서치 공급자와 계산. 같은 서버에 마운트된다 |
| stdio 온라인 스모크 검사 |
| 합성 데이터 단위 테스트 |
| 도구별 인자와 설명 |
| 값이 빈 환경 변수 이름 목록 |
설치하면 investmcp와 ticker_engine 두 패키지만 import 대상으로 들어간다. 리서치 도구는 통합 서버의 전송 인증을 그대로 쓰며 별도 서비스 토큰 파일이 필요 없다.
테스트
python -m pip install '.[dev]'
python -m pytest -q
ruff check .단위 테스트는 합성 입력과 임시 데이터 디렉터리만 쓰고, 외부 네트워크 연결을 막는다(tests/conftest.py). 첫 공개 릴리스 기준으로 Linux, Python 3.14에서 947개 테스트가 모두 통과했다. 온라인 동작은 별도의 scripts/smoke.py로 확인한다. 의존성 하한은 원래 프로젝트를 따르고, 실제 버전은 Python 리졸버가 호환되는 릴리스로 고른다.
라이선스
MIT — Copyright (c) 2026 ianlyoo. LICENSE를 본다. 런타임 의존성의 라이선스 점검 결과는 THIRD_PARTY_NOTICES.md에 있다.
이 소프트웨어와 그 출력은 정보 제공용이며 투자 조언이 아니다.
Available Tools
28 toolscompare_price_performanceARead-onlyIdempotent
Compare the daily price performance of 1-8 US or Korean stocks, ETFs or indices on one common trading calendar (상대강도, 기준일 100, 수익률 비교, 코스피와 비교). For 내 보유 종목을 코스피/S&P와 비교: get holdings from investmcp get_holdings, then call this once with their symbols (KR 6-digit codes and US tickers together) and benchmark KOSPI (or SPY/^GSPC). Prefer it for cross-market price history and index levels: it uses the KOSPI index itself (not an ETF proxy such as KODEX 200), aligns calendars, converts USD and KRW holdings into one currency and labels sources. metric: normalized_price (default; every series = 100 on the common base date), price_return_pct, relative_strength_ratio (symbol / benchmark, base 100) or excess_return_pp (return minus the benchmark's, %p); the last two need benchmark (e.g. SPY, QQQ, KOSPI, ^GSPC). If relative strength (상대강도) is asked without a benchmark, the result is normalized_price with a warning naming that choice; pass benchmark for a true relative-strength ratio. Window: period 1mo (default) | 3mo | 6mo | ytd | 1y | d calendar days, or start_date/end_date, or trading_days N (N common trading days ending at the latest one). Symbols: AVGO, BRK.B, 005930 (tries .KS then .KQ), 005930.KS, ^GSPC, aliases KOSPI, KOSDAQ, S&P500, SPX, NASDAQ, NDX; an ETF benchmark is labelled a proxy. currency native | USD | KRW converts with the Yahoo KRW=X close of the same date. Prices are Yahoo daily closes, split-adjusted, dividends excluded: price return, not total return. One symbol failing returns its entry in errors; the rest are still compared. Up to 260 points per series; long windows switch to weekly points (data_quality.sampling). trading_days N counts today's session when a provisional point ends the series. By default the last point is provisional: today's trades (regular session, or pre-market before the open) after the last confirmed close, with provisional=true, session and exchange-local time; the confirmed close replaces it after the close, so no date appears twice. After-hours trades appear in freshness and the summary, never as a point. confirmed_only=true: completed daily closes only. table: period_return_pct to the last point and confirmed_return_pct to the last confirmed close. Text: a one-line summary, then the full result as compact JSON (the same object as structuredContent). Show source_line and warnings under the chart. Read-only calculation; no account access or orders.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | normalized_price | |
| period | No | 1mo (default) | 3mo | 6mo | ytd | 1y | <N>d | |
| symbols | Yes | 1-8 symbols, order kept | |
| currency | No | native | |
| end_date | No | YYYY-MM-DD; default today | |
| benchmark | No | e.g. SPY, QQQ, KOSPI, ^GSPC | |
| start_date | No | YYYY-MM-DD; instead of period | |
| trading_days | No | N common trading days; instead of period | |
| confirmed_only | No | false (default): include the latest trade as a provisional value; true: completed daily closes only |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| as_of | No | last completed (confirmed) daily bar date used, exchange-local; provisional values are dated after it |
| error | No | |
| table | No | |
| errors | No | |
| metric | Yes | |
| series | No | |
| warnings | No | show under the chart or table |
| base_date | No | |
| benchmark | No | |
| freshness | No | per symbol: last confirmed close, latest trade (session, time, source, delay) and status |
| base_index | No | |
| price_mode | No | latest (default): the newest trade is included as a provisional value, labelled with its session and time; confirmed_only: completed daily closes only |
| metric_unit | Yes | index (base 100) | percent | ratio index (base 100) | pp |
| source_line | Yes | show under the chart or table |
| data_quality | Yes | |
| latest_as_of | No | UTC time of the newest latest-price trade used; null under confirmed_only or when none is available |
| retrieved_at | Yes | UTC time of this calculation |
| currency_mode | Yes | |
| requested_period | Yes | |
| effective_end_date | No | |
| effective_start_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/no-destruction, yet the description adds substantial behavior beyond them: Yahoo daily split-adjusted closes with dividends excluded (price return, not total return), per-symbol error isolation, a 260-point cap with weekly downsampling on long windows, and the provisional-last-point lifecycle (today's trades vs confirmed close, after-hours never becoming a point). That is exactly the mutation/freshness context annotations cannot express.
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?
Purpose and the headline workflow are front-loaded, and nearly every sentence carries non-redundant, decision-relevant detail. It is nonetheless a single dense block of several hundred words mixing window rules, sampling, provisional points and output formatting, which makes scanning harder than it needs to be.
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 9-parameter, read-only calculation tool with an output schema, the description covers everything an agent needs: symbol formats and aliases, window selection, benchmark requirements, currency handling, error isolation, and even what the text response contains (one-line summary plus compact JSON mirroring structuredContent). Nothing decision-critical is left to inference.
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?
With 78% schema coverage the schema already names parameters, but the description supplies the semantics the schema lacks: what each of the four metric values means (base-100 normalization, symbol/benchmark ratio, return minus benchmark in %p), which metrics require a benchmark, symbol alias resolution (005930 tries .KS then .KQ), the period vs start/end vs trading_days alternatives, and how currency conversion is performed (Yahoo KRW=X same-date close).
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?
States a specific verb (compare), resource (daily price performance) and hard scope (1-8 US/Korean stocks, ETFs or indices on one common trading calendar). It also differentiates itself from generic price-history siblings by explaining that it uses the KOSPI index itself rather than an ETF proxy and aligns cross-market calendars, so an agent can tell it apart without opening the schema.
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?
Gives an explicit end-to-end usage recipe ('get holdings from investmcp get_holdings, then call this once with their symbols ... and benchmark KOSPI (or SPY/^GSPC)') and states when to prefer it ('cross-market price history and index levels'). It also routes within the tool: if relative strength is requested without a benchmark, it says what happens and what to pass instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_tickersARead-only
Compare 1–8 tickers for entry-plan scoring and allocation: calculation, not an order; the amount is your input; no account access. Symbols: US tickers (USD) and KRX listings by code, e.g. 000660, 005930 (tries .KS then .KQ) or 005930.KS (KRW); not indices or other markets. currency defaults to the listing's; amounts and prices stay in it (no FX conversion): USD with a KRX listing or KRW with a US one returns CURRENCY_MISMATCH. KRX listings: Yahoo daily bars, the latest trade and indicators only (no options levels, SEC filings, consensus or earnings date, stated in warnings), limit prices on the KRX tick grid in force since 2023-01-25 (호가단위, rounded down) and whole shares per tranche. US and KRX tickers can be mixed: each keeps its own currency (data.currency_policy); total_amount then needs currency, the currency it is split in, and a ticker priced in the other one gets a percentage-only plan. An unsupported symbol is listed in data.unavailable with its reason_code and the rest are compared. For price-performance charts or relative strength (상대강도), use compare_price_performance. Returns {ok, data, error, meta} as structuredContent and the same compact JSON as text; ok=false is a tool error naming the problem. data.comparison: per ticker attractiveness and entry_plan (tranches), ranking and allocation_scenarios (with total_amount); data.freshness and technical_basis per ticker. Spots are latest trades with their times (freshness; a spread over 5 minutes is warned) and indicators match get_technical_indicators; confirmed_only=true uses confirmed closes. detail: standard (default) gives values with provenance once per section and rounded numbers, summary headline values only, full every field with per-value provenance; meta.detail_note says how to read same_as, _each and {columns, rows} tables. Per-ticker inputs_used and dropped_levels only in full.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | summary | standard (default) | full. full: every field, per-value provenance, every bar and the markdown report. standard: values with provenance once per section, the last 20 bars, the latest 4 quarters and 3 rows of other collections (TTM kept), rounded numbers; method and rule text only in full. summary: headline values only, no bars, collections or inputs | standard |
| symbols | Yes | ||
| currency | No | ||
| horizon_days | No | ||
| total_amount | No | ||
| confirmed_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/openWorld, and the description adds substantive context beyond them: no account access, no order placement, no FX conversion, warning surfaces (stale spread over 5 minutes, missing options/SEC/consensus data on KRX), and error semantics (ok=false names the problem). The non-idempotent annotation is consistent with a live-quote-dependent comparison.
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?
Purpose and the alternative-tool routing are front-loaded, and nearly every clause carries operational information with no filler. However, the body is delivered as a few very long run-on sentences packing currency policy, KRX rules, return shape and detail levels together, which makes it harder to scan than it needs to be.
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 6-parameter, multi-market comparison tool this is unusually complete: symbol formats, currency policy, partial-failure behavior, freshness, detail levels and error envelope are all addressed, and an output schema exists so return values need little further explanation. The only omission is horizon_days, which is minor against the overall coverage.
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 only 17%, so the description carries most of the burden and does so for symbols (format, exchange suffix fallback .KS/.KQ, mixing rules), currency (defaults to listing currency, mismatch behavior, required with total_amount when mixed), total_amount (percentage-only plan for cross-currency tickers), and confirmed_only (confirmed closes). horizon_days is never explained anywhere, and detail is largely covered by the schema itself rather than the 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?
States a specific verb and resource with scope (1–8 tickers, entry-plan scoring and allocation) and immediately disambiguates from siblings by naming compare_price_performance for charts/relative strength. It also clarifies it is a calculation, not an order, so the agent knows what class of operation this is.
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 routes between tools ('For price-performance charts or relative strength (상대강도), use compare_price_performance') and states what is out of scope (indices, other markets). It also gives the conditions that select behaviors: mixing US and KRX tickers, CURRENCY_MISMATCH when currency conflicts, and unsupported symbols landing in data.unavailable rather than failing the whole call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_portfolio_datasetA
Freeze an auditable portfolio dataset locally, then return small pages.
Only for an explicit request to export, save or freeze a dataset. A dated portfolio value series is get_portfolio_returns(include_series=true), which stores nothing.
Transaction exports default to YTD (365 days with end_date alone); pass start_date (e.g. 2024-01-01) or period="ALL" for older history.
Writes only local dataset copies and never places orders or uploads data. First call (no dataset_id) captures normalized inputs through existing engine paths. Later calls supply dataset_id and next_cursor as cursor; they read only the frozen copy, with no provider/FX refetch. Returned manifest identifies the original dates and filters; replay does not reapply collection parameters. IDs are content hashes. The latest 20 datasets are retained; expired/unknown IDs return DATASET_EXPIRED and never silently rebuild. Start a new first call explicitly to collect changed inputs. Missing money stays null with a status.
JSON rows have record_type, row_id, data. CSV has those first two columns and data_json (canonical JSON preserving nested fields, null and statuses). Supporting holdings, cash, source coverage, cost FX, quantity breaks and NAV components are paged audit records. Manifest descriptors name their row types; read every page to reconstruct/hash the entire dataset. Totals sum frozen input money by type/currency; reporting summaries retain their stated period. Account IDs are opaque keyed hashes. Human account labels are retained only when already exposed, and raw broker payloads/credentials are excluded.
Args: dataset: transactions, realized_pnl, holdings, or nav_history period: reporting period (default YTD); explicit ISO dates override it start_date: ISO YYYY-MM-DD; realized inputs include earlier basis history end_date: ISO YYYY-MM-DD. Holdings export is current, not historic backfill dataset_id: frozen ID for replay; omit only for a new collection cursor: opaque next_cursor from the preceding page; requires dataset_id format: json or csv; both carry the same typed audit rows page_size: 1–200, additionally limited to 64 KiB of row data per page account: existing account filter; nav_history requires all accounts symbol: optional existing symbol filter; not applicable to nav_history input_snapshot_ids: nav_history only, exact E-store versions; bounds use their dates when no explicit dates are supplied
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | ||
| format | No | json | |
| period | No | YTD | |
| symbol | No | ||
| account | No | all | |
| dataset | Yes | ||
| end_date | No | ||
| page_size | No | ||
| dataset_id | No | ||
| start_date | No | ||
| input_snapshot_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already cover safety and openness, the description adds substantial behavior: local-only dataset writes, no orders or uploads, frozen-copy replay with no provider/FX refetch, latest-20 retention, DATASET_EXPIRED on unknown IDs, and privacy handling for account IDs and raw broker payloads. These details materially improve invocation safety and expectations 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 long but proportionate to an 11-parameter paged export tool with retention and replay behavior. It is front-loaded with the core action and usage constraint, then organized into readable paragraphs and a structured Args section.
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?
Even with an output schema present, the description sufficiently covers paging, manifest behavior, row formats, hashing, retention, and error semantics. Given the tool's complexity, schema size, annotations, and output schema, an agent has enough information to call it correctly.
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 0%, so the description must carry parameter meaning; the Args section explains all 11 parameters, including defaults, filters, page limits, cursor requirements, and dataset-specific constraints. It adds clear semantics beyond the raw schema, such as page_size being capped by 64 KiB per page and input_snapshot_ids applying only to nav_history.
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 first sentence states a specific verb and resource: "Freeze an auditable portfolio dataset locally, then return small pages." It also explicitly distinguishes this from the adjacent get_portfolio_returns(include_series=true) use case, which stores nothing.
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?
It gives a clear inclusion criterion: "Only for an explicit request to export, save or freeze a dataset." It names the main alternative and when to use it, and it clarifies default date behavior and when to use start_date or period="ALL".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_candlesARead-onlyIdempotent
Get candlestick chart data (OHLCV) for a stock (Toss).
Args: symbol: Stock symbol (e.g., "AAPL", "005930") interval: Candle interval — "1d" for daily or "1m" for 1-minute count: Number of candles to retrieve (max 200, default 100) adjusted: Request provider adjustments (default True); actual basis unverified. before: Provider cursor; inclusive local timestamp filter, upstream boundary unverified. start_date/end_date: Inclusive YYYY-MM-DD candle-local labels. One page per call.
Returns: Raw provider payload for existing calls. Paging calls add returned_range, next_cursor, complete (page chain only, not historical coverage), limit, result_status/reason_codes and source_metadata. Merge pages ascending by timestamp and deduplicate; adjusted prices are not verified total returns.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| before | No | ||
| symbol | Yes | ||
| adjusted | No | ||
| end_date | No | ||
| interval | No | 1d | |
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world. The description adds meaningful caveats beyond that: adjusted prices are 'not verified total returns', the 'before' boundary is 'unverified', and 'complete' covers only the page chain, not historical coverage. That is exactly the kind of epistemic context an agent needs; a pagination/size caveat beyond max 200 would round it out.
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?
Front-loads purpose, then uses clear Args/Returns structure with no filler. The Returns section is somewhat dense and restates scope ('Raw provider payload for existing calls'), but each sentence adds a real constraint or caveat rather than padding.
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 7-parameter, paginated, provider-backed data tool with an output schema, this covers params, paging semantics, return shape, and reliability caveats — enough to call it correctly. The remaining gap is the absence of sibling routing guidance for choosing this versus quote/indicator tools.
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 0%, so the description carries the full burden, and it does: it explains symbol format examples, interval enum values, count max/default, the meaning of 'adjusted', the nature of 'before' as a provider cursor, and that start/end are inclusive candle-local YYYY-MM-DD labels. Every one of the 7 parameters gains meaning not present 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?
States a specific verb and resource — 'Get candlestick chart data (OHLCV) for a stock (Toss)' — which is unambiguous and clearly different from snapshot/quote tools by naming OHLCV and the provider. It does not explicitly contrast with siblings such as get_quote or get_technical_indicators, so it falls short of a 5.
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?
Gives procedural guidance for paging ('One page per call', 'Merge pages ascending by timestamp and deduplicate'), which implies when the tool is appropriate. However, it never says when to prefer this over get_quote, get_technical_indicators, or compare_price_performance, and offers no guidance on choosing interval or date ranges.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_crypto_account_historyARead-onlyIdempotent
Your own crypto futures fills (with fees) or funding paid/received, newest first, paged.
start/end: inclusive UTC YYYY-MM-DD (default: the last 7 days). Values stay in their native asset. The page header carries per-venue coverage and next_cursor (limit 1-500, default 50). Fetched broker rows are recorded in the local append-only ledger (no broker writes).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| kind | Yes | ||
| limit | No | ||
| start | No | ||
| venue | No | all | |
| cursor | No | ||
| symbol | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, and the description goes further: newest-first ordering, cursor paging, limit range 1-500 default 50, per-venue coverage in the page header, and values kept in native asset. It also discloses that fetched rows land in a local append-only ledger with no broker writes — a meaningful side effect the annotations don't express. Rate limits and auth needs are unstated, keeping it at 4.
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?
Front-loaded with the core result, then parameter detail in a compact block; no filler sentences. The parenthetical about the local ledger is appended slightly awkwardly but still 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?
With an output schema present the description needn't explain return values, and annotations cover the safety profile, so the remaining burden is paging and filtering semantics — paging is fully handled and date filtering is precise. Only the symbol/venue filter semantics leave a real gap for a 7-parameter 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 description coverage is 0%, so the description must carry the load; it does for start/end (inclusive UTC YYYY-MM-DD, default last 7 days), limit (1-500, default 50) and cursor (next_cursor), plus `kind` via the opening sentence. But `symbol` and `venue` are never explained — venue is only obliquely hinted at via 'per-venue coverage'. Partial compensation.
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 first sentence names the exact resource (own crypto futures fills with fees, or funding paid/received) and its ordering/paging behavior, which is clearly distinct from siblings like get_crypto_positions or get_trading_pnl. It never names a sibling to contrast against, so it falls short of a 5.
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 through the `kind` enum (fills vs funding) and the default 7-day window, but the description never states when to reach for this tool over get_trading_pnl or get_transactions, nor any prerequisite (e.g. broker connection must exist). Guidance is present but inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_crypto_marketARead-onlyIdempotent
Public Binance USD-M futures market data for one symbol (e.g. "BTCUSDT"); no API key.
Always returns the snapshot: last price, mark/index price, latest funding rate and open interest. include adds the public funding rate history, open interest history and OHLCV candles (interval; limit rows each, 1-500).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes | ||
| include | No | ||
| interval | No | 1h |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-redundant behavior: it is public and keyless, always returns a fixed snapshot set, and clarifies that each include returns limit rows (1-500).
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?
Front-loaded with scope and auth first, then the return contract, then the optional expansions. Every clause carries information; minor density in the include/interval/limit sentence, but nothing wasted.
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?
An output schema exists, so return values needn't be fully spelled out, yet the description still names the snapshot contents. Combined with the include semantics and limit range, an agent has enough to call it correctly; only the default limit and interaction with the base snapshot are unstated.
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 0%, so the description must carry parameter meaning, and it does: it names the three valid include values, ties interval to candles, and constrains limit to 1-500 rows per include. The symbol format is given by example. It omits the limit default (30) and whether limit applies to the snapshot too, so not a full 5.
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?
States a specific verb and resource: public Binance USD-M futures market data for one symbol, naming the exact snapshot fields returned. It does not explicitly differentiate from the overlapping sibling get_candles, which it partially duplicates via the 'candles' include option.
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 API key' establishes a key prerequisite for public data access, and 'Always returns the snapshot' tells the agent what happens by default. However, it never says when to prefer this tool over get_candles or get_quote, leaving the choice between overlapping siblings to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_crypto_positionsARead-onlyIdempotent
Your open crypto futures positions and native account balances (Binance USD-M, Hyperliquid).
Kept out of portfolio NAV and holdings. Unknown leverage, margin mode and mark prices stay null; inspect each venue's source_status and coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the bar is lower, and the description still adds genuine value: it discloses that leverage, margin mode and mark prices are returned as null when unknown and points the agent at per-venue source_status and coverage fields for data quality. That is exactly the kind of caveat an agent needs before interpreting results.
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 compact sentences with the subject front-loaded and no filler. The second sentence is a slightly telegraphic fragment ('Kept out of portfolio NAV and holdings'), but it carries real routing information rather than padding.
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 an output schema present, return values need not be explained, and annotations cover the safety profile. The description fills the remaining gaps — venue scope, exclusion from portfolio aggregates, and null-handling for missing fields — leaving little an agent needs that isn't 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?
Only one parameter exists and schema description coverage is 0%, but the enum (all/binance/hyperliquid) is self-documenting. The description names both venues, which maps onto the enum values, yet it never mentions the parameter itself, the 'all' default, or what 'all' returns.
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?
Names a specific resource — open crypto futures positions plus native account balances — and scopes it to two named venues (Binance USD-M, Hyperliquid). The sentence 'Kept out of portfolio NAV and holdings' actively separates it from siblings like snapshot_portfolio_nav and get_holdings, so an agent can route correctly without opening the schema.
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 exclusion note ('Kept out of portfolio NAV and holdings') implies that portfolio-level questions belong to sibling tools, which is useful implied guidance. However, it never states explicitly when to call this tool versus get_crypto_account_history or get_trading_pnl, and names no alternative by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eps_scenariosARead-onlyIdempotent
For any EPS question on a US SEC filer (EPS 시나리오, 약세/기본/강세, bear/base/bull, EPS 전망·컨센서스, P/E 적정가) call this first, before web search; web news can be added after. Returns chart-ready tables: GAAP diluted EPS per fiscal year from SEC EDGAR companyfacts (10-K) with the P/E at each fiscal year end, Yahoo Finance consensus EPS for the current and next fiscal year (low/avg/high, analysts; via yfinance, unofficial) and bear/base/bull implied prices = EPS x P/E multiple. The historical GAAP P/E band is applied only when the EPS bases match; otherwise rows keep EPS with implied_price and implied_return_pct null, a needs_input_pe_multiples note asks for pe_multiples (a dict, e.g. {"bear":25,"base":32,"bull":40}), and pe_multiples_used lists the band and forward P/E per year as reference only, not applied. A calculation, not a forecast or price target. Fiscal years filed before a later stock split are left out, not adjusted. Korean listings and indices return UNSUPPORTED_MARKET. No dividends. implied_return_pct is measured from reference_price: by default the latest trade (regular, pre-market or after-hours, with its basis, session and time), else the last confirmed close (latest_close, kept separately); eps_as_of (10-K filing) and estimates_as_of are separate from the price time. confirmed_only=true: from the close. Text: a one-line summary, then the full result as compact JSON (the same object as structuredContent). Show source_line and warnings with the table. Read-only calculation; no account access or orders.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | US ticker, e.g. AVGO, NVDA, BRK.B | |
| pe_multiples | No | optional label -> P/E multiple, up to 6 | |
| confirmed_only | No | false (default): include the latest trade as a provisional value; true: completed daily closes only |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| cik | No | |
| as_of | No | last completed (confirmed) daily bar date used, exchange-local; provisional values are dated after it |
| error | No | |
| notes | No | |
| symbol | Yes | |
| history | No | |
| pe_band | No | |
| currency | No | |
| warnings | No | show under the chart or table |
| eps_as_of | No | filing date of the newest annual 10-K EPS used |
| estimates | No | |
| freshness | No | per symbol: last confirmed close, latest trade (session, time, source, delay) and status |
| scenarios | No | |
| price_mode | No | latest (default): the newest trade is included as a provisional value, labelled with its session and time; confirmed_only: completed daily closes only |
| entity_name | No | |
| source_line | Yes | show under the chart or table |
| data_quality | Yes | |
| latest_as_of | No | UTC time of the newest latest-price trade used; null under confirmed_only or when none is available |
| latest_close | No | last confirmed regular close |
| retrieved_at | Yes | UTC time of this calculation |
| fiscal_context | No | |
| disclaimer_kind | No | |
| estimates_as_of | No | UTC time the consensus estimates were retrieved |
| reference_price | No | price used for implied_return_pct |
| resolved_symbol | No | |
| latest_close_date | No | |
| pe_multiples_used | No | |
| next_earnings_date | No | exchange-local date of the next earnings release (Yahoo, unofficial) |
| consensus_revisions | No | |
| next_earnings_date_is_estimate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/open-world; the description adds substantial context the annotations cannot: it is a calculation, not a forecast or price target; pre-split fiscal years are dropped rather than adjusted; the P/E band is applied only when EPS bases match, otherwise nulls plus a needs_input_pe_multiples note; confirmed_only switches between latest trade and completed close. It is dense but genuinely informative, though the source caveat for yfinance (unofficial) is the only reliability marker.
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 routing instruction is front-loaded correctly, but the remainder is a series of long run-on sentences mixing output format, edge cases, provenance fields and timing semantics. Little is truly wasted, yet the density makes it hard to scan and the JSON-return description could be tightened.
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 the full call path for a complex derived-metrics tool: sources, edge cases (splits, unsupported markets), the human-in-the-loop pe_multiples recovery path, reference price timing, and text/structuredContent parity. Even though an output schema exists, the description still tells the agent how to present the result and which fields to surface.
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, but the description adds value by giving a concrete pe_multiples example ({"bear":25,"base":32,"bull":40}) and explaining what confirmed_only switches between (latest trade with session/basis vs last confirmed close). Those are behavioral consequences of the parameters rather than restatements of the schema text.
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?
States a specific computation: GAAP diluted EPS per fiscal year from SEC EDGAR 10-K filings, Yahoo consensus EPS, and bear/base/bull implied prices from EPS x P/E. It is clearly distinguished from siblings like get_sec_financials and get_key_metrics by naming the derived scenario output rather than raw financials.
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 says to call this first for any EPS question on a US SEC filer, before web search, and that news can be layered afterwards. It also names what is out of scope (Korean listings/indices return UNSUPPORTED_MARKET, no dividends), which gives routing rules in both directions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financialsARead-onlyIdempotent
Get comprehensive financial data from yfinance (US, Korea, Japan).
Provides income statement, balance sheet, cash flow, valuation metrics, and profitability ratios from yfinance. Works with US stocks ("AAPL"), Korean stocks ("005930.KS"), and Japanese stocks ("7203.T").
Args: symbol: Stock ticker. US: "AAPL", Korean: "005930.KS", Japanese: "7203.T"
Returns: Structured JSON envelope with financial statements and key metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, idempotent, non-destructive behavior, and the description adds the external yfinance source plus a structured JSON return envelope. It does not cover data latency, rate limits, or failure modes, but that is a limited gap given annotation coverage.
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 and has clear Args/Returns sections, but the market/ticker examples are repeated in the body and again under Args, and yfinance is mentioned twice. It is readable but not maximally economical.
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 an output schema and safety annotations already present, the description covers the source, data types, and parameter format. It is still incomplete for tool selection because it does not distinguish this comprehensive yfinance financials tool from nearby financial siblings such as get_sec_financials, get_ttm_financials, or get_key_metrics.
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 has zero schema description coverage, but the description fully compensates with 'Stock ticker' and concrete US/Korean/Japanese ticker examples. For a one-parameter tool, that is enough to invoke it 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 uses a specific verb ('Get') and resource ('comprehensive financial data from yfinance') and enumerates the statement/metric types, so the agent knows exactly what it returns. It does not explicitly name the sibling tools it replaces (e.g., get_sec_financials, get_ttm_financials), so it stops short of full sibling differentiation.
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?
It states the coverage markets (US, Korea, Japan) and gives ticker examples, which implies when the tool is applicable. However, it never states when not to use it or which sibling to choose for SEC/TTM/key-metrics needs, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_holdingsARead-onlyIdempotent
Current positions, merged per symbol in native currency and KRW, plus cash.
account: "all", "toss", "kis", or one account label ("toss:primary", "kis:pension"). detail_level "summary" lists the top 15 positions; "full" lists every position with its accounts and the look-through exposure per underlying; "raw" returns each broker's own balance payloads unmerged. Fetched broker rows are recorded in the local append-only ledger (no broker writes).
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | all | |
| detail_level | No | summary | |
| include_cash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read/write safety profile, and the description adds real value beyond them: it discloses merge behavior (native + KRW), that 'raw' returns unmerged broker payloads, and that rows are appended to a local ledger with no broker writes. It stops short of noting rate limits or freshness/latency.
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 core output is front-loaded in the first sentence, with parameter nuances following in compact clauses. Dense and largely waste-free, though the multi-line enumeration is slightly heavier than necessary.
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?
An output schema exists so return shape need not be spelled out, and the description covers the key behavioral facts an agent needs: merge basis, the three fidelity levels, and the ledger side effect. Adequate for a 3-param read 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 description coverage is 0%, so the description must compensate, and it does for two of three params: it enumerates the account values (including the 'toss:primary' label format) and fully explains the three detail_level modes. include_cash is only gestured at ('plus cash') and its toggling is not explained.
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?
States a specific resource (current positions/cash) and its merge semantics (merged per symbol in native currency and KRW). This clearly separates it from get_crypto_positions and get_transactions, though it never names a sibling explicitly to draw the boundary against get_portfolio_summary.
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 only implied through the account and detail_level value descriptions; there is no explicit 'use this instead of X when Y'. An agent can infer which detail level fits, but the choice between this and get_portfolio_summary / get_crypto_positions is left unstated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_tradesARead-onlyIdempotent
Get insider trading data from SEC Form 4 filings (US stocks only).
Shows insider purchases (code P) and sales (code S), plus option exercises, grants, tax withholdings, etc. Each trade includes the insider name, title, shares, price, and whether it's a 10% operator.
Args: symbol: US stock ticker (e.g., "AAPL") days_back: How many days back to search (default 180, max 365)
Returns: Structured JSON envelope with insider trade records.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | ||
| days_back | No | ||
| detail_level | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new context: the upstream source (SEC Form 4), US-only coverage, the P/S transaction codes, and that non-trade events like grants and tax withholdings are included. It stops short of noting data lag (Form 4 filing delay) or any rate/limit behavior.
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?
Front-loaded with the core purpose, then a scannable Args/Returns block; every line is short and useful. The coverage enumeration ('plus option exercises, grants, tax withholdings, etc.') is slightly padded but conveys legitimate scope 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?
An output schema exists, so the description needn't detail return values, and its one-line return note suffices. Annotations cover the safety profile. The remaining gap is the undocumented detail_level parameter, which is material for a three-parameter tool with zero schema-description coverage.
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 0%, so the description must carry parameter meaning. It documents symbol as a US ticker and adds a real constraint the schema lacks (days_back default 180, max 365), but it omits detail_level entirely despite that being a summary/full enum that changes the response shape.
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?
States a specific verb and resource ('Get insider trading data from SEC Form 4 filings') plus a scope qualifier ('US stocks only'), which separates it from portfolio-oriented siblings like get_transactions and get_holdings. It never names a sibling explicitly, so differentiation is inferential rather than stated.
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 'US stocks only' qualifier and the Form 4 sourcing imply when this tool applies, and the enumerated trade categories help the agent recognize relevant data. However, there is no explicit when-to-use/when-not guidance and no routing against alternatives such as get_transactions or get_ticker_research.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_key_metricsARead-onlyIdempotent
Get key financial metrics summary from yfinance (US, Korea, Japan).
Returns P/E, PEG, P/B, EV/EBITDA, margins, ROE, ROA, growth rates, etc.
Args: symbol: Stock ticker. US: "AAPL", Korean: "005930.KS", Japanese: "7203.T"
Returns: Structured JSON envelope with key financial metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that this is a read-only, idempotent, non-destructive, open-world operation. The description adds useful behavioral context by naming yfinance as the source and identifying the metric categories returned. It does not discuss rate limits, data freshness, or source limitations, so it stops short of full transparency.
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 front-loaded, with a clear purpose sentence followed by metrics, args, and returns. The Returns sentence is somewhat redundant because an output schema exists, but overall there is little 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?
For a one-parameter read-only financial data tool with annotations and an output schema, the description covers source, metric scope, supported markets, and symbol format. It is sufficient to invoke the tool correctly, though it omits sibling routing and data freshness caveats.
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 0%, so the description must carry parameter semantics, and it does. It explains that symbol is a stock ticker and gives concrete formats for US, Korean, and Japanese tickers.
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 a clear verb and resource: getting a key financial metrics summary. It also lists representative metrics and supported markets, making the tool understandable. However, it does not explicitly differentiate itself from close siblings such as get_financials, get_ttm_financials, or get_stock_snapshot.
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 listed metrics imply valuation and profitability use cases, and the market examples imply coverage scope. But there is no explicit guidance on when to choose this tool over alternatives like get_financials or get_stock_snapshot. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_infoBRead-onlyIdempotent
Market sessions and holidays (KR or US; Toss), an ECB daily reference exchange rate, and the 10Y US Treasury yield (yfinance ^TNX). Each section's meta names its provider and as_of.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | USD | |
| quote | No | KRW | |
| market | No | US | |
| include | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state read-only, idempotent, open-world, non-destructive behavior. The description adds useful provenance/freshness context by naming providers and saying each section's meta contains provider and as_of, but it omits rate limits, availability caveats, or failure behavior.
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?
One dense sentence covers the three data sections and the meta note with little waste. It is front-loaded, though the compressed semicolon list could be structured more readably.
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?
An output schema and rich annotations reduce what the description must cover, and it identifies the data sections and providers. However, with 0% input-schema descriptions, it leaves the agent unable to confidently use base/quote/include beyond defaults.
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 0%, so the description must explain the four parameters, but it never mentions base, quote, include, or their defaults. It only indirectly signals market values KR/US and the three data sections, leaving base/quote semantics and include filtering undocumented.
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?
Names three concrete data sections and their providers, so the resource is identifiable. It does not use a verb or explicitly contrast with siblings, though no sibling covers the same market-calendar/FX/risk-free data.
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?
There is no when-to-use or when-not-to-use guidance, no alternatives, and no prerequisites. The section list only implies the tool's domain; an agent must infer that it should be called for market hours, FX, and risk-free rate data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_returnsBRead-onlyIdempotent
Portfolio return for a period: simple return, TWR and XIRR side by side, P&L split and NAV risk statistics.
Read from stored daily NAV snapshots and the ledger. include_series adds the daily NAV history of the same period with drawdown statistics. That is the dated value series; it stores nothing, and no export or snapshot is needed for it. Fetched broker rows are recorded in the local append-only ledger (no broker writes).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | equity | |
| period | No | YTD | |
| detail_level | No | summary | |
| include_series | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly/idempotent annotations already covering the safety profile, the description still adds non-obvious behavior: nothing is persisted for the series view, no export or snapshot step is required, and no broker-side writes occur. Minor tension: it says fetched rows are recorded in a local append-only ledger, which is a state change, though the description is explicit that broker-side writes do not happen.
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?
Front-loaded with the primary output, then the optional series behavior, then the side-effect caveat. Sentences are dense but each carries information; the ledger sentence is slightly tangential but earns its place by preempting a write concern.
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?
An output schema exists, so return values needn't be described, and the safety story is covered. What's missing is the meaning of scope and detail_level, which materially change what comes back from an otherwise adequately described 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 0% and three of four parameters are enums with no explanation. Only include_series gets any treatment; scope (equity vs consolidated vs toss vs kis) and detail_level are left entirely unexplained, which is a substantial gap since scope in particular selects fundamentally different data.
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 first sentence names the resource and enumerates the concrete outputs (simple return, TWR, XIRR, P&L split, NAV risk statistics), so the purpose is unambiguous. It does not, however, differentiate itself from close siblings such as get_portfolio_summary or get_trading_pnl, which an agent must choose between.
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?
It states the data source (stored daily NAV snapshots plus ledger) and gives a clear condition for include_series, which is genuinely helpful. But it never says when to prefer this over get_portfolio_summary, snapshot_portfolio_nav, or get_trading_pnl, leaving sibling routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_summaryARead-onlyIdempotent
Whole-portfolio totals across every broker account, by section.
totals: total assets, stock value, cash, cost basis, unrealized P&L, per-account breakdown and the NAV bridge, in KRW at current spot. exposure: weights by currency and market, and look-through exposure per underlying (leveraged products at their daily multiple; open crypto futures at signed notional, never in totals). concentration: top positions, HHI and risk level. realized: year-to-date realized P&L, dividends, fees and taxes from the ledger (slower). Default: totals and realized. Never writes a snapshot. Fetched broker rows are recorded in the local append-only ledger (no broker writes).
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | ||
| detail_level | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: broker rows are fetched live into a local append-only ledger with no broker writes, values are in KRW at current spot, leveraged products use the daily multiple, and open crypto futures are carried at signed notional but excluded from totals. The '(slower)' note on realized P&L is a useful performance caveat as well.
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 first clause front-loads the scope, then each section gets one tight clause with no filler; the closing two sentences carry the no-write guarantee. Density is high but every sentence contributes distinct information for section selection or trust calibration.
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 an output schema present the return shapes need not be restated, yet the per-section inventory adds selection value without becoming a schema dump. Safety (annotations + explicit no-write statements), currency, valuation conventions, and the slower-path caveat are all covered; only detail_level semantics are missing, which is minor relative to the whole.
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 0%, so the description must carry parameter meaning, and it does so thoroughly for 'sections' — each enum value is defined with its contents (NAV bridge, HHI, look-through exposure, ledger-sourced realized P&L). 'detail_level' ('summary' vs 'full') is never mentioned anywhere, which is a real gap given zero schema coverage.
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 opening line states a specific resource and scope: whole-portfolio totals across every broker account, decomposed by section. The four section names are enumerated with what each returns, so an agent knows exactly what capability this represents and can distinguish it from sibling holding/return tools.
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?
It supplies the default section pair (totals + realized) and marks 'realized' as '(slower)', which is actionable cost guidance for choosing sections. It also clarifies the tool never writes a snapshot, implicitly steering write-intent callers to snapshot_portfolio_nav. However, no sibling is named explicitly and there is no stated when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quoteARead-onlyIdempotent
Current stock quotes for up to 10 symbols (e.g. "AAPL", "005930").
provider "auto" uses yfinance without Toss keys, otherwise reads Toss with KIS fallback; "toss" or "kis" reads one; "both" compares the two with session timing. include adds per symbol: orderbook (bid/ask depth), trades (public market tape), limits (daily price limits), warnings (delisting/VI/overheated) and info (name, market, ISIN). KIS covers Japanese stocks (exchange TKSE).
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | auto | |
| include | No | ||
| symbols | Yes | ||
| exchange | No | NASDAQ | |
| provider | No | auto | |
| detail_level | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive behavior, so the bar is lower. The description adds meaningful operational context: provider fallback logic, Toss-key dependency, session-timing comparison for 'both', per-symbol include behavior, and KIS Japanese-stock support.
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 the core purpose and then moves into provider/include details with little wasted text. It is dense but appropriate for a six-parameter tool, though the long semicolon-and-parenthetical sentence could be easier to scan.
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?
There is an output schema, so return values need not be explained. But with 6 parameters, only 1 required, and 0% schema description coverage, the description omits meanings for market and detail_level and only partially explains exchange, leaving clear gaps for an agent configuring the call.
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 0%, so the description must carry parameter meaning. It explains symbols (up to 10, with examples), provider modes, include values, and partially exchange via 'KIS covers Japanese stocks (exchange TKSE)'; however, it does not explain market or detail_level and only partially covers exchange.
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 a specific verb and resource: 'Current stock quotes for up to 10 symbols' with example symbols. It is clear what the tool returns, but it does not contrast itself with related siblings such as get_stock_snapshot or get_candles, so an agent may still need to infer the boundary.
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 by the first sentence and by the provider-selection details, but the description never explicitly says when to use this tool instead of alternatives like get_stock_snapshot or get_candles. The provider guidance helps configure the call, not choose the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sec_financialsARead-onlyIdempotent
Get SEC financials for US stocks: up to five annual fiscal years, quarterly facts, derived TTM, earnings quality, and segment revenue when available. Missing or incomplete data is marked unavailable or carries warnings; quarters/TTM/segments are not guaranteed for every issuer.
Uses CompanyFacts and filings (10-K/10-Q; applicable amended forms). No API key required. Uses SEC_USER_AGENT for fair access.
Args: symbol: US stock ticker (e.g., "AAPL", "MSFT")
Returns: Structured JSON envelope with annuals, quarters, TTM, quality and segment data.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description goes beyond them by disclosing data provenance, the fair-access requirement via SEC_USER_AGENT, absence of an API key requirement, and how missing data is surfaced ('marked unavailable or carries warnings'). That is meaningful operational context an agent cannot get from the annotations, though it does not quantify rate limits or latency.
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 most decision-relevant content (what is returned and the coverage caveat) is front-loaded in the first two sentences, with provenance and Args/Returns following in a predictable structure. The Returns section partly restates the output schema, which is mild redundancy, but nothing is padded or circular.
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 single-parameter read tool with a published output schema, the definition supplies nearly everything needed: sources, edge-case handling, auth/environment requirements, and a return summary. The one genuine gap is routing guidance against the heavily overlapping financials siblings, which the description leaves entirely implicit.
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 0% and the single property has no description, so the description must carry the load — and it does, defining 'symbol' as a US stock ticker with concrete examples ('AAPL', 'MSFT'). The US-only constraint is real added meaning beyond the bare string type, though it stops short of specifying case, suffix, or exchange-qualified formats.
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 names a specific verb and resource ('Get SEC financials') and enumerates the exact data classes returned: up to five annual fiscal years, quarterly facts, derived TTM, earnings quality, and segment revenue. It is clearly not a portfolio or price tool, but it never distinguishes itself from close siblings like get_financials, get_ttm_financials, or get_key_metrics, which overlap heavily in 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?
It conveys useful invocation context: coverage caveats ('quarters/TTM/segments are not guaranteed'), the underlying sources (CompanyFacts, 10-K/10-Q, amended forms), and that no API key is required. However, in a sibling set containing get_financials, get_ttm_financials, and get_key_metrics, it gives no explicit rule for when to choose this tool over those alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusARead-onlyIdempotent
Connector status: cached service health, live source probes, configured accounts, or the usage guide.
mode="passive" reads cached status only (no upstream calls); "probe" calls each market-data source once; "accounts" lists the configured broker accounts and checks each one live; "help" returns the usage guide for this tool list (topic: overview, quotes, portfolio, financials, futures, futures_account, diagnostics, examples, all).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | passive | |
| topic | No | overview | |
| detail_level | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: passive mode makes no upstream calls, probe hits every market-data source once (implying latency), and accounts performs live per-account checks. The outstanding gap is any note on failure handling or how long a probe takes.
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 one-line purpose followed by per-mode definitions, front-loaded and free of filler. The help-topic list is somewhat dense inline but every clause maps to an enum value an agent must choose between.
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?
An output schema exists, so return-value shape need not be described, and mode/topic semantics are fully covered. The only omission is what detail_level changes, which matters since a caller can select it.
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 0%, so the description carries the full burden and mostly does: all four mode values are explained and the help-topic vocabulary is enumerated in full. The third parameter, detail_level (summary/full), is not mentioned anywhere, leaving one enum undocumented in both schema and 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 opens with a specific verb+resource framing ('Connector status') and enumerates the four distinct payloads the tool can return (cached health, live probes, accounts, usage guide). It is clear this is a diagnostics tool, implicitly distinct from the data-fetching siblings, though it never names a sibling to draw that boundary explicitly.
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?
Each mode is given a use-defining behavior: passive = cached only, no upstream calls; probe = one call per source; accounts = lists and live-checks each broker account; help = usage guide. This effectively tells an agent which mode to pick and what the cost tradeoff is. It does not state when to call this tool at all versus the sibling tools, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stock_snapshotBRead-onlyIdempotent
Return a compact stock snapshot with quotes, financial metrics, provider analyst consensus, and insider data.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | auto | |
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds that analyst consensus is provider-sourced and that insider data is folded in, but it says nothing about latency, rate limits, partial-data behavior, or market coverage (the us/kr enum goes unmentioned).
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 lists the payload contents without a word of filler. Nothing could be cut without losing 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?
An output schema exists, so return values need no explanation here. However, for a two-param tool with an undocumentable 'auto' market default and no routing guidance against 26 siblings, the description leaves real gaps an agent would need to guess at.
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 0% – neither symbol nor market is documented anywhere. The description offers no compensating detail, notably nothing about what "auto" means for market detection or whether symbol format differs between us and kr. Only the word "stock" implies symbol is a ticker, distinguishing it from the crypto siblings.
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?
States a concrete verb ("Return") and resource ("compact stock snapshot") and enumerates the bundled content: quotes, financial metrics, analyst consensus, insider data. That enumeration implicitly distinguishes it from the narrow siblings get_quote, get_key_metrics, and get_insider_trades, but it never says so explicitly.
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?
There is no when-to-use guidance and no named alternative. An agent cannot tell from this text whether to call get_stock_snapshot or to compose get_quote + get_key_metrics + get_insider_trades; only the adjective "compact" hints at a bundled overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_technical_indicatorsARead-onlyIdempotent
Daily technical indicators for one US or Korean stock, ETF or index (RSI/MACD/볼린저 밴드, 이동평균). For RSI/MACD/볼린저 of holdings, get symbols from investmcp get_holdings, then call this per symbol instead of computing indicators from raw candles. indicators: up to 6 of {name, params}: rsi {n:14}, macd {fast:12, slow:26, signal:9}, bb {n:20, k:2}, sma/ema/rma {n}, atr {n:14}, stdev, highest, lowest, roc {n}, volume; default rsi, macd and bb. Lengths 2-400; recursive ones (ema, rma, rsi, atr, macd) at most 252, as they need 10 x n warm-up bars. For SMA 20/50/200 pass three sma items. period 1mo | 3mo | 6mo (default) | ytd | 1y | d, at most 260 daily points; history before the window is fetched for warm-up, never reseeded. Returns the close series, one series per indicator output (unit, price or separate panel), a latest table and warnings, including possible split discontinuities. Yahoo daily closes, price return. By default a provisional last bar from today's trades (regular session, or pre-market before the open; never after-hours) ends every series: latest rows give the provisional value with session and time plus confirmed_value for the last confirmed bar (data_quality.bar_status partial). plan_entry and compare_tickers use the same bars and calculation, so their RSI/MACD/ATR match. confirmed_only=true: completed bars only; recursive indicators (RSI/MACD/EMA/ATR) can differ from earlier releases by about 0.001, as all three tools now share one warm-up window. Text: a one-line summary, then the full result as compact JSON (the same object as structuredContent). Show source_line and warnings under the chart. Read-only calculation; no account access or orders.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | 1mo | 3mo | 6mo (default) | ytd | 1y | <N>d | 6mo |
| symbol | Yes | e.g. AVGO, 005930, ^GSPC | |
| indicators | No | default rsi, macd, bb | |
| confirmed_only | No | false (default): include the latest trade as a provisional value; true: completed daily closes only |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| feed | No | |
| name | No | |
| as_of | No | last completed (confirmed) daily bar date used, exchange-local; provisional values are dated after it |
| error | No | |
| latest | No | |
| series | No | |
| symbol | Yes | |
| currency | No | |
| provider | Yes | |
| warnings | No | show under the chart or table |
| freshness | No | per symbol: last confirmed close, latest trade (session, time, source, delay) and status |
| indicators | No | |
| price_mode | No | latest (default): the newest trade is included as a provisional value, labelled with its session and time; confirmed_only: completed daily closes only |
| price_basis | Yes | |
| source_line | Yes | show under the chart or table |
| data_quality | Yes | |
| latest_as_of | No | UTC time of the newest latest-price trade used; null under confirmed_only or when none is available |
| retrieved_at | Yes | UTC time of this calculation |
| resolved_symbol | No | |
| requested_period | Yes | |
| effective_end_date | No | |
| effective_start_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only and idempotent, but the description adds critical behavior: data source (Yahoo daily closes, price return), provisional last bar handling with session details, confirmed_only effects, warm-up bar requirements, possible split discontinuities, and numerical differences in recursive indicators.
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?
Despite its length, the description is front-loaded with purpose and every sentence adds necessary detail about parameters, behavior, or edge cases. No wasted information; the density is justified by the tool's 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?
An output schema exists, but the description still provides enough context about returned series, tables, and warnings to set expectations. Combined with annotations and schema, it is fully complete for an agent to call the tool correctly.
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%, but the description adds substantial practical constraints not in the schema: max 6 indicators, length limits 2-400 with recursive limit 252, warm-up need of 10x n, how to request multiple SMAs, max 260 daily points, and the meaning of confirmed_only.
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?
States a specific verb and resource: daily technical indicators for a single stock, ETF, or index. Distinguishes from siblings by naming get_holdings for symbol lookup and warning against computing from raw candles, and notes consistency with plan_entry and compare_tickers.
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 says when to use this tool instead of computing indicators manually and how to get symbols for holdings. Also explains the tradeoff of confirmed_only and the consistency guarantee with sibling tools, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticker_researchARead-only
Issuer facts and explainable factors for one US ticker; explicit refresh; no account access or orders. Returns {ok, data, error, meta} as structuredContent and the same compact JSON as text; ok=false is a tool error naming the problem. data.snapshot.sections: sec_financials and sec_insider (SEC EDGAR), yfinance_metrics and yfinance_bars (Yahoo Finance via yfinance, unofficial), and factors calculated from the bars (RSI/MACD/ATR, moving averages, levels, risk), each section with as_of, as_of_basis and source; data.freshness gives the last confirmed close and the latest trade (session, time, status). For prices now/today/intraday use freshness, not the factors' bar dates. detail: standard (default) gives values with provenance once per section and rounded numbers, summary headline values only, full every field with per-value provenance; meta.detail_note says how to read same_as, _each and {columns, rows} tables. standard keeps the last 20 daily bars as columns {t,o,h,l,c,v} with the full bar_range, and the markdown report only in full.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | summary | standard (default) | full. full: every field, per-value provenance, every bar and the markdown report. standard: values with provenance once per section, the last 20 bars, the latest 4 quarters and 3 rows of other collections (TTM kept), rounded numbers; method and rule text only in full. summary: headline values only, no bars, collections or inputs | standard |
| symbol | Yes | ||
| refresh | No | ||
| confirmed_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/no-destroy safety, and the description adds genuinely new behavioral context: data comes from SEC EDGAR and unofficial yfinance, refresh is explicit, and ok=false is surfaced as a tool error naming the problem. It stops short of disclosing rate limits, caching/staleness windows for refresh, or the cost of 'full' detail, which keeps it below 5.
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 first sentence is well front-loaded and information-dense, but the remainder is a long run-on block that duplicates the detail-level rules already present in the schema and buries the freshness rule mid-paragraph. No outright waste, but structure and layering could be sharper.
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?
An output schema exists and the description still helpfully maps the top-level envelope and section names (sec_financials, yfinance_metrics, factors, freshness), which is appropriate for a multi-source aggregation tool. The gaps are the undocumented 'confirmed_only' and 'refresh' semantics rather than return-value description.
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 only 25%, so the description should compensate, yet it elaborates mainly on 'detail' levels that the schema already documents in comparable detail, and mentions 'refresh' only in passing ('explicit refresh'). 'confirmed_only' is never explained anywhere, and 'symbol' is left implicit.
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?
States a concrete resource ('Issuer facts and explainable factors for one US ticker') and scope boundaries ('no account access or orders'), which helps separate it from portfolio/order siblings. It does not, however, distinguish itself from overlapping siblings like get_stock_snapshot, get_sec_financials or get_technical_indicators, which appear to return portions of the same data.
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?
There is one useful usage rule: 'For prices now/today/intraday use freshness, not the factors' bar dates', which governs interpreting output. But there is no guidance on when to choose this tool over the many sibling tools that expose quotes, candles, SEC financials or indicators, and no routing to get_ticker_research_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticker_research_statusARead-only
Passive configuration status; performs no provider calls. Returns {ok, data, error, meta} as structuredContent and the same compact JSON as text; ok=false is a tool error naming the problem. data: status, provider readiness, auth mode, planning_configured and the latest-price source health.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing that no provider calls occur, the exact envelope {ok, data, error, meta}, that it is returned as both structuredContent and compact JSON text, and that ok=false signals a tool-level error naming the problem. The listed data fields (provider readiness, auth mode, planning_configured, latest-price source health) tell an agent what failures mean. Minor inconsistency: annotations claim idempotentHint=false for a passively-read status snapshot, but the description does not contradict them outright.
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?
Front-loaded with the key fact (passive, no provider calls), then the return contract. Dense semicolon packing is efficient though it reads like a spec dump; every clause does carry 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?
Covers behavior, error semantics, and the meaning of the returned data fields, which is more than enough for a zero-argument status tool that also has an output schema. The only gap is guidance on when in a workflow to call it and how it relates to get_status.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 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?
States a specific verb+resource: a passive configuration/status read for ticker research, and explicitly notes it makes no provider calls. It is clear what the tool does, but it never distinguishes itself from the look-alike sibling get_status or explains its relationship to get_ticker_research.
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 only implied: 'Passive configuration status; performs no provider calls' suggests a cheap pre-flight diagnostic before invoking the paid research path, but the description never says when to call it or names an alternative. With siblings like get_status and get_ticker_research present, an explicit routing sentence is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trading_pnlARead-onlyIdempotent
Realized trading P&L under per-account moving-average cost basis.
view "by_symbol": realized P&L, fees and taxes per symbol for the period. view "round_trips": closed buy-to-sell cycles, win rate and open-position P&L. start/end (ISO YYYY-MM-DD) override period. detail_level "summary" lists 20 by_symbol rows, incomplete data first, then the largest realized P&L (symbols_page has the total), or the top 10 round_trips symbols by |realized P&L| with reason groups (symbol_count, omitted_symbols); pass symbol or detail_level "full" for every symbol. Fetched broker rows are recorded in the local append-only ledger (no broker writes).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| view | No | by_symbol | |
| start | No | ||
| period | No | YTD | |
| symbol | No | ||
| account | No | all | |
| detail_level | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and open-world, so the marginal bar is met by the description adding real side-effect context: fetched broker rows land in a local append-only ledger with no broker writes. It also discloses result-truncation behavior (20 rows / top 10 by |realized P&L|, omitted_symbols). It does not mention cost of fetching or rate/limit behavior.
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?
It is front-loaded with the core definition and each subsequent clause conveys distinct information with almost no filler. Some clauses are dense and reference undeclared fields ('symbols_page has the total', 'reason groups (symbol_count, omitted_symbols)'), making it harder to scan than it needs to be.
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 7-parameter, zero-required tool with annotations and an output schema, the description covers mode selection, date precedence, truncation and write side effects. The remaining gap is per-parameter meaning for 'account' and 'period', which an agent must infer from the enum and default.
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 0%, so the description carries the burden and mostly does: view enum values, ISO format and override precedence for start/end, detail_level summary-vs-full, and symbol for drilling in. The 'account' parameter and the period enum values (MTD/YTD/ALL) are never explained beyond the default, leaving partial gaps.
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 first line states a specific resource and metric (realized trading P&L) plus the accounting method (per-account moving-average cost basis), which is more precise than the name alone. The two 'view' bullets further split the tool into its two modes. It does not name or contrast with siblings such as get_portfolio_returns or get_transactions, so it stops short of a 5.
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?
It tells the agent which view to pick and what each returns, states that start/end override period, and explains that 'summary' truncates while passing symbol or detail_level 'full' expands to every symbol. That is actionable routing within the tool. It offers no exclusions or comparison against alternative portfolio/P&L tools, so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsARead-onlyIdempotent
Your trades across every Toss and KIS account, newest first, one page at a time.
start/end: ISO YYYY-MM-DD (default: the last 90 days). account: "all", "toss", "kis" or one label. The page header carries the totals and counts for the whole window and next_cursor for the following page (limit 1-500, default 100). detail_level "summary" returns compact rows (columns + rows), "full" every normalized field per row, "raw" the brokers' own rows, one source at a time. Fetched broker rows are recorded in the local append-only ledger (no broker writes).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| limit | No | ||
| start | No | ||
| cursor | No | ||
| symbol | No | ||
| account | No | all | |
| detail_level | No | summary |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent profile, yet the description adds genuinely non-obvious behavior: fetched broker rows are written to a local append-only ledger, 'no broker writes'. It also discloses pagination via next_cursor, that the page header carries window-wide totals/counts, and that 'raw' returns one source at a time.
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?
Front-loaded with the what and ordering, then parameter semantics packed densely with zero filler. The detail_level sentence is a run-on that mixes three modes plus the one-source-at-a-time constraint, but no sentence is wasted.
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?
An output schema exists, so return values needn't be explained, yet the description still usefully sketches the page header's totals and cursor. With 7 parameters and 0% schema coverage, the only real omission is the unexplained 'symbol' filter.
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 0%, so the description must carry the load, and it does: ISO date format with a 90-day default, account values ('all', 'toss', 'kis' or a label), limit bounds 1-500 with default 100, cursor as next_cursor, and full semantics for the three detail_level modes. Only the 'symbol' parameter is never mentioned, leaving one of seven undocumented.
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?
States a specific resource and scope: 'Your trades across every Toss and KIS account, newest first, one page at a time.' This clearly separates it from holdings/snapshot siblings by making it a historical transaction feed. It does not explicitly name a sibling it is not, which keeps it just shy of a 5.
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 rather than stated: the agent can infer this is the trade-history listing versus get_holdings or get_trading_pnl, but the description never says when to prefer this tool or when to use an alternative. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ttm_financialsBRead-onlyIdempotent
Get SEC 10-Q/FY-derived TTM financials for a US stock.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful provenance (TTM computed from 10-Q/FY filings) and a scope limit (US stocks only), but says nothing about freshness, missing-data behavior for non-US or non-filing companies, or latency.
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, densely packed sentence with the distinguishing qualifier 'TTM' and the source in the front half. Nothing is wasted and nothing needs reordering.
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 an output schema present, return shape needn't be explained, and the read-only annotation covers safety. Still, for a tool sitting in a cluster of five overlapping financials tools, the description omits the selection rule and any note about filing-based lag or coverage gaps, which are exactly the facts an agent needs to call it correctly.
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 0% and the single parameter 'symbol' has no description, so the schema contributes nothing. The description partially compensates by implying the value is a US-listed ticker, but gives no format example or resolution rules (e.g., class shares), so meaning is only loosely filled in.
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 names a specific verb+resource ('Get ... TTM financials') and adds qualifying detail about the data source ('SEC 10-Q/FY-derived') and scope ('US stock'), which distinguishes it from a generic financials tool. It does not, however, explicitly contrast itself with close siblings like get_sec_financials or get_financials, leaving the agent to infer that 'TTM' is the differentiator.
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?
There is no guidance on when to prefer this over get_financials, get_sec_financials, or get_key_metrics, nor any stated exclusions or prerequisites. The agent must guess which financials tool fits a given question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_statementAIdempotent
Import Toss stock BUY/SELL rows from a private inbox PDF statement into the local ledger.
Two steps. 1) file=".pdf": parses it and returns the preview and the import plan (nothing is written); keep preview_id. 2) preview_id plus confirm=true stores the planned rows locally. A blocked plan (parse issues, conflicts, unmatched rows inside API coverage) cannot be confirmed. Never places orders; previews expire after 15 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| account | No | auto | |
| confirm | No | ||
| preview_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds critical behavior: step 1 writes nothing, step 2 stores planned rows locally, blocked plans cannot be confirmed, no orders are placed, and previews expire after 15 minutes. These details materially clarify the mutation model and 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?
The purpose is front-loaded, followed by a tightly structured two-step procedure and key constraints. Every sentence adds operational value with no redundant filler.
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 complex two-step import tool, the description covers the important workflow, write behavior, blocking conditions, and preview expiry, while an output schema exists to describe returns. The remaining gap is the undocumented account parameter, but the overall definition is nearly 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 description coverage is 0%, so the description must carry parameter meaning. It explains file, preview_id, and confirm well, including the two-step interaction, but it does not explain the account parameter or its auto default.
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 a specific verb and resource: importing Toss stock BUY/SELL rows from a private-inbox PDF statement into the local ledger. It clearly distinguishes this import path from sibling read/query tools and states that it never places 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?
It gives explicit two-step usage: first call with file to preview, then call with preview_id and confirm=true to store rows. It also states blocked plans cannot be confirmed, but it does not name any alternative tool or broader when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_entryARead-only
Scaled entry calculation, not an order; the amount is your input; no account access. Symbols: US tickers (USD) and KRX listings by code, e.g. 000660, 005930 (tries .KS then .KQ) or 005930.KS (KRW); not indices or other markets. currency defaults to the listing's; amounts and prices stay in it (no FX conversion): USD with a KRX listing or KRW with a US one returns CURRENCY_MISMATCH. KRX listings: Yahoo daily bars, the latest trade and indicators only (no options levels, SEC filings, consensus or earnings date, stated in warnings), limit prices on the KRX tick grid in force since 2023-01-25 (호가단위, rounded down) and whole shares per tranche. Returns {ok, data, error, meta} as structuredContent and the same compact JSON as text; ok=false is a tool error naming the problem. data: attractiveness (score, band, components with their factor inputs), plan (tranches with price, percent, amount and touch probability, expected average cost and fill, comparison_vs_lump_sum, unfilled_remainder, reassess_below), freshness and technical_basis. Spot is the latest trade (any session) and RSI/MACD/ATR/MAs use the same bars as get_technical_indicators, including today's provisional bar (technical_basis, freshness); confirmed_only=true uses the last confirmed close and completed bars. detail: standard (default) gives values with provenance once per section and rounded numbers, summary headline values only, full every field with per-value provenance; meta.detail_note says how to read same_as, _each and {columns, rows} tables. Rejected candidate levels (dropped_levels): standard {reason: {level: price}}, full with their inputs; style constants (style_parameters) and method text only in full; summary drops inputs and levels.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | balanced | |
| amount | Yes | ||
| detail | No | summary | standard (default) | full. full: every field, per-value provenance, every bar and the markdown report. standard: values with provenance once per section, the last 20 bars, the latest 4 quarters and 3 rows of other collections (TTM kept), rounded numbers; method and rule text only in full. summary: headline values only, no bars, collections or inputs | standard |
| symbol | Yes | ||
| currency | No | ||
| horizon_days | No | ||
| confirmed_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses the data source and resolution (Yahoo daily bars, latest trade only for KRX), explicit exclusions surfaced as warnings (no options levels, SEC filings, consensus, earnings date), the KRX tick-grid rounding rule and whole-share constraint, and the error contract (ok=false is a tool error naming the problem). It also clarifies staleness semantics — spot is the latest trade from any session and indicators include today's provisional bar unless confirmed_only=true — which is exactly the behavioral context annotations cannot express.
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 critical constraints (not an order, no account access, symbol formats, currency mismatch) are front-loaded and the rest is grouped by concern — sources, return shape, detail levels. It is dense and the detail-level paragraph substantially restates the schema's own enum description, which is the main wasted space.
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 analytical tool with an output schema, this covers everything an agent needs to call it correctly: accepted symbol markets, currency coupling, error signaling, and how detail levels change payload shape (meta.detail_note, dropped_levels formats, style_parameters only in full). No material unknown is left for a 7-parameter, market-scoped calculation.
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 only 14%, so the description carries most of the load, and it does: symbol syntax (US tickers, KRX codes with .KS then .KQ fallback, explicit 000660/005930 examples), currency defaulting and the USD-on-KRX / KRW-on-US CURRENCY_MISMATCH failure, amount as the required input, and confirmed_only's effect on bars and spot. Gaps remain: style and horizon_days get no explanation at all beyond a passing mention that style constants exist.
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 opening clause names a specific computation ('Scaled entry calculation') and immediately disqualifies the most likely misreading ('not an order; no account access'), which separates it from execution-style tools in the sibling list. It also names the concrete artifact produced (tranches with price, percent, amount, touch probability). It stops short of naming an actual sibling to route away from, so it lands at a clear-but-not-exemplary 4.
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 only implied: the reader must infer 'call this when you want a tranche plan rather than an order or a raw indicator dump.' The negatives ('not an order', 'no account access') are framing, not when-to-use guidance. The one real routing hint is that RSI/MACD/ATR/MAs come from the same bars as get_technical_indicators, but it never says to prefer that tool for indicators alone.
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.
28 tool updates
v0.1.0- First observed
compare_price_performance - First observed
compare_tickers - First observed
export_portfolio_dataset - First observed
get_candles - First observed
get_crypto_account_history - First observed
get_crypto_market - First observed
get_crypto_positions - First observed
get_eps_scenarios - First observed
get_financials - First observed
get_holdings - First observed
get_insider_trades - First observed
get_key_metrics - First observed
get_market_info - First observed
get_portfolio_returns - First observed
get_portfolio_summary - First observed
get_quote - First observed
get_sec_financials - First observed
get_status - First observed
get_stock_snapshot - First observed
get_technical_indicators - First observed
get_ticker_research - First observed
get_ticker_research_status - First observed
get_trading_pnl - First observed
get_transactions - First observed
get_ttm_financials - First observed
import_statement - First observed
plan_entry - First observed
snapshot_portfolio_nav
TDQS
Scored across 28 tools
Several tool clusters have overlapping boundaries: get_financials, get_key_metrics, get_sec_financials, get_ttm_financials, get_stock_snapshot, and get_ticker_research all return related fundamental/quote/research data, so an agent may struggle to choose the right one. Portfolio tools also overlap (get_holdings, get_portfolio_summary, get_portfolio_returns, get_trading_pnl, export_portfolio_dataset), though the detailed descriptions mitigate some confusion.
All tool names use snake_case and follow a predictable verb_noun pattern (get_*, compare_*, export_*, import_*, snapshot_*, plan_entry). There are no mixed conventions or vague standalone names.
28 tools is heavy for a single server; the broad investment domain justifies some breadth, but the overlapping financial-data and portfolio-analysis tools suggest the surface could be consolidated. It sits at the borderline between appropriately comprehensive and overstuffed.
The surface covers portfolio holdings, transactions, NAV history, returns, P&L, market quotes, candles, fundamentals, SEC filings, insider data, crypto, technical indicators, planning, and comparisons. Order placement is intentionally excluded and some auxiliary areas (watchlists, alerts, news) are absent, but core read-only investment workflows are well covered.
Maintenance
Related MCP Connectors
- FensoryOAuthcom.fensory
Trading MCP server for AI agents, with live market data, account reads and controlled execution.
Free, read-only directory of 114 AI trading tools: broker MCP servers, market data APIs, bots and backtesters. Sourced facts on who can place orders and what safeguards exist; search, compare and check order gating for every broker MCP.
Read-only educational MCP for CryptoDecentral Sovereign. No auth, trading, custody, or advice.
Research-only MCP server: your AI as a quant research desk. 90 tools, no trades, no brokers.
Related MCP Servers
- AlicenseAqualityDmaintenanceA read-only MCP server that provides access to Charles Schwab account data and market information, including portfolio positions, real-time quotes, options chains, price history, and account balances through AI assistants.9MIT

milele-prime-mcpofficial
FlicenseNot gradedqualityDmaintenanceRead-only MCP server that lets a verified client connect their own AI to their trading account to read account data without order execution.-- AlicenseAqualityBmaintenanceA read-only MCP server for Trading 212 accounts, enabling AI assistants to query balances, positions, orders, dividends, pies, and instruments without trading capabilities.121MIT
- FlicenseNot gradedqualityCmaintenanceA read-only MCP server that exposes Interactive Brokers and Moomoo brokerage accounts as tools, enabling natural-language queries across positions, trade history, realized P&L, and sector exposure in one merged view.-