Skip to main content
Glama
INo-xious

stockbit-mcp

by INo-xious

Stockbit MCP

Bring Claude to your IDX trading desk.

Accepting donations: Saweria Link

Bandarmology, quotes, orderbook, fundamentals, your watchlists and portfolio — and, only if you switch it on, confirm-gated order entry — through your own Stockbit account, from Claude Desktop, Claude Code, Cursor or any MCP client.

npm CI Node License

English | Bahasa Indonesia

WARNING

Unofficial and unaffiliated. This project is not affiliated with, endorsed by or supported by Stockbit, PT Stockbit Sekuritas Digital or the Indonesia Stock Exchange. Nothing it produces is investment advice, and the author is not a licensed adviser.

IMPORTANT

What you need. A Stockbit account you log into yourself with a username and password — Google and Facebook sign-in are broken on Stockbit's own site. Node.js 22 or newer. A Chromium-family browser (Chrome, Edge, Brave, Vivaldi) for the one-time login. broker_distribution additionally needs a Rp 10,000,000 balance, which is Stockbit's gate, not this project's.

NOTE

Your data stays with you. This runs on your machine, talks only to Stockbit's own API hosts with your own session, and keeps the refresh token in the macOS Keychain (an encrypted file elsewhere). Nothing is sent to the author. The only channels that leave your machine are the alert webhook and Telegram bot you configure yourself.

CAUTION

Undocumented API; trading off by default. This uses the private JSON API behind Stockbit's own apps, which can change without notice. Automated access may conflict with Stockbit's Terms of Use — use it at your own risk, on your own account. Nothing here can place an order until you run stockbit-auth trading-enable yourself, at a terminal.

Broker-to-broker flow for one stock over a month

Broker-to-broker flow, rendered by the server. Synthetic data.


How it works (and why it is safe to run)

It is an HTTP client, not a bot. Every number it reports comes from a JSON endpoint in a closed route table — no headless browser scraping pages, no reading data off Stockbit's UI, no polling loop you did not start.

  • One interactive login, captured from your own browser. You sign in on Stockbit's real page; the server reads the refresh token out of the response and stores it. Your password never touches this code.

  • Three token domains, three separate stores. exodus (market data), carina (Stockbit Sekuritas), api-sekuritas (e-IPO). Logging out of one leaves the others alone, and the route table decides which credential each request may carry.

  • The 24-hour access token is cached on disk, encrypted, and shared between processes. Because the refresh token rotates on every use, N clients each minting their own access token retire each other's credential. Same AES-256-GCM and mode 0600 as the file-backend refresh token — which on macOS is a genuine reduction, since there the refresh token is in the Keychain and this is not. STOCKBIT_NO_ACCESS_CACHE=1 turns it off. See SECURITY.md.

  • A closed route table. 153 permitted request shapes across three hosts, enumerated in src/http/routes/. Anything not in that table cannot be requested — test/transport.test.ts asserts it, and every one of the 32 non-GET routes is admitted by a named decision record.

  • Every log and every tool result is redacted. Tokens, PINs and bot tokens are matched by shape as well as by key name.

  • A rate limit that behaves like a person. Three concurrent requests, 150 ms apart.

  • Trading is a ladder you climb deliberately: offstockbit-auth trading-enable --paper--live. The environment can only move you down it. Orders are two steps with a human in the middle, and where your client supports elicitation you are asked directly, and your answer decides it — a model cannot skip that ask by asserting you already agreed.

flowchart LR
  C["Claude Desktop / Code / Cursor"] <-->|MCP over stdio| S["stockbit-mcp<br/>(your machine)"]
  S -->|market data| E["exodus.stockbit.com"]
  S -->|portfolio, orders| K["carina.stockbit.com"]
  S -->|IPO| A["api-sekuritas.stockbit.com"]
  S -.->|drawing only| B["your logged-in browser"]
  S -.->|paper mode| L["local ledger"]

Related MCP server: jv-idx-mcp

What this tool does not do

  • No PIN handling by any tool. The six-digit trading PIN is typed at your terminal, used for one request and never stored. If anything asks you for it through an assistant, that is not this.

  • No order without a ticket. By default, the write tools also need your confirmation. The only exception is capped --auto-confirm, which you must deliberately enable for live trading at a terminal; a model cannot enable it or widen its value cap. The tools take no price or quantity, so what reaches the exchange is exactly what the ticket described.

  • No auto-resend, no auto-cancel. When an order's outcome is uncertain the server says so and stops. A resend is how one intention becomes two orders.

  • Saved workflow recipes cannot write. Enforced by construction: a write tool is never added to the map recipes look names up in.

  • No route outside the table. No day-trade or smart orders, no withdrawals, no deposits, no posting to the stream.

  • No scraping, and no UI automation for data. Your own browser is used for three things and nothing else: the one-time login, drawing on your own chart, and opening Stockbit when you ask to look at it. Nothing is ever read out of the page.

  • Nothing leaves your machine except to Stockbit, to channels you configured, and — when you run status — one request to the npm registry asking whether a newer release exists. That one carries the package name and nothing else, it is cached for a day, and STOCKBIT_NO_UPDATE_CHECK=1 turns it off.

  • No short selling — IDX retail has none — and no financial advice.

Prerequisites

Stockbit account

Username and password. Google/Facebook sign-in is broken upstream.

Node.js

22 or newer. (src/auth/cdp.ts needs a global WebSocket.)

A browser

Chromium-family for the one-time login. Or import a HAR from any browser.

macOS

The Keychain prompts once when the token is stored.

Windows

Run the login in a terminal, or use the login tool from your client.

Linux

notify-send for desktop alerts; the encrypted file store is used instead of a keychain.

Rp 10,000,000

Only for broker_distribution. Stockbit's gate. Everything else works without it.

What it does

Bandarmology. broker_summary, broker_distribution, broker_activity, bandar_detector — who accumulated, who distributed, and who was on the other side of the tape. NET and GROSS, all four market boards, ten period windows including year-to-date in a single request. This is the data no other market API has, and it is why this project exists.

Market, company and fundamentals. Quotes, full orderbook depth, auto-rejection bands, movers, daily bars, seasonality, key statistics, ratios, financial statements, ownership, insider activity, corporate actions, analyst ratings and peer comparison.

One analysis engine. Indicators, 16 candlestick patterns, multi-timeframe alignment, 9 strategy presets, backtests with walk-forward validation, universe scans, and TradingView Pine generation — all over the same series grammar, so the Pine you paste into TradingView fires on the condition that was actually measured.

Your account. Watchlists and saved screens, read and edited, with every write verified by reading the account back.

Your chart. Read and draw on your real Stockbit chart, in your own logged-in browser.

Automation. Eight workflows, also offered as MCP prompts. An alert daemon that keeps watching while no client is open, delivering to a log, a desktop notification, a webhook and Telegram.

A daily chart with moving averages, Bollinger bands, RSI and MACD

What price_chart returns. Synthetic data.

Why not a TradingView MCP?

TradingView

Stockbit MCP

IDX broker-level flow

none

the core of it

Data access

drives a chart GUI

a JSON API, read directly

Your portfolio

no

yes, with your own session

Order entry

no

yes, confirm-gated and off by default

Indonesian corporate data

thin

financials, ownership, corporate actions, IPO pipeline

Installation

Claude Code

claude mcp add --scope user stockbit -- npx -y stockbit-mcp

Claude Desktopclaude_desktop_config.json:

{ "mcpServers": { "stockbit": { "command": "npx", "args": ["-y", "stockbit-mcp"] } } }

On Windows, npx needs a shell:

{ "mcpServers": { "stockbit": { "command": "cmd", "args": ["/c", "npx", "-y", "stockbit-mcp"] } } }

Claude Desktop Extension — download the latest stockbit-mcp-*.mcpb from Releases and double-click it.

Cursor~/.cursor/mcp.json. Cursor stops at 40 tools and the default core profile is 41, so set a narrower list. Cursor drops the overflow without saying which tool it dropped, so the one you lose is not yours to choose — name the families you want instead (STOCKBIT_TOOLS=market,bandarmology, say):

{ "mcpServers": { "stockbit": { "command": "npx", "args": ["-y", "stockbit-mcp"] } } }

VS Code.vscode/mcp.json. Its cap is 128; the default fits with room to spare:

{ "servers": { "stockbit": { "type": "stdio", "command": "npx", "args": ["-y", "stockbit-mcp"] } } }

Windsurf~/.codeium/windsurf/mcp_config.json, same shape as Claude Desktop.

Codex CLI~/.codex/config.toml:

[mcp_servers.stockbit]
command = "npx"
args = ["-y", "stockbit-mcp"]

Claude Code plugin (adds six trading-desk skills):

/plugin marketplace add INo-xious/stockbit-mcp
/plugin install stockbit@stockbit-mcp

From source

git clone https://github.com/INo-xious/stockbit-mcp && cd stockbit-mcp
npm ci && npm run build
node dist/bin/stockbit-mcp.js

npm i -g stockbit-mcp avoids the npx cold start on every launch — at the cost of the automatic updates described next.

Staying up to date

Every configuration above uses npx -y stockbit-mcp with no version. Do not rely on that alone to keep you current.

This section used to promise that npx re-resolves the newest release on every start, on the strength of one measurement: with 1.1.0 in the cache, the next bare npx -y stockbit-mcp ran 1.1.1. That measurement was real and the conclusion drawn from it was wrong. npx caches a resolved tree under a version RANGE, so a cache entry holding ^1.2.2 with 1.2.2 installed is already satisfied by 1.2.4 and is reused without asking the registry. Observed in the field: a server sat on 1.2.2 while 1.2.4 was published, and only two ~/.npm/_npx directories deleted by hand moved it.

So the server now tells you instead. status compares its own version against the registry — one cached request a day, STOCKBIT_NO_UPDATE_CHECK=1 to turn it off — and says so when you are behind. stockbit-mcp --version answers the same question from a shell.

How you installed

Do you get new versions automatically?

npx -y stockbit-mcp (every config above)

Not reliably. Run npx -y stockbit-mcp@latest, or clear ~/.npm/_npx

npm i -g stockbit-mcp

No. Run npm update -g stockbit-mcp

Desktop Extension (.mcpb)

No. Download the new .mcpb from Releases

From source

No. git pull && npm ci && npm run build

If you would rather not move. Pin a version and nothing changes under you:

{ "mcpServers": { "stockbit": { "command": "npx", "args": ["-y", "stockbit-mcp@1.1.1"] } } }

Or take patches and minors but never a breaking change — this project follows semver, so a new major is the only release that can break your setup:

{ "mcpServers": { "stockbit": { "command": "npx", "args": ["-y", "stockbit-mcp@^1"] } } }

To force a refresh right now, without waiting for a restart:

npx -y stockbit-mcp@latest --version

Which version you are actually running is always answerable — ask your assistant "is my Stockbit MCP working?" and status reports it, alongside what else is and is not set up.

Quick start

  1. Install — one of the above.

  2. Log in, once. Say "log me into Stockbit" and sign in in the browser window that opens. Or, at a terminal: npx -y -p stockbit-mcp stockbit-auth login. No browser? stockbit-auth import-har takes a login captured in any browser; stockbit-auth doctor diagnoses the rest.

  3. Restart your client so it picks up the tools.

  4. Ask: "Is my Stockbit MCP working?" — Claude calls status, which reports the version, which sessions exist (never the tokens), the trading mode, where the IDX trading day is in WIB, and the single next command if anything is missing. It answers with no session at all, which is where everyone starts.

  5. Optional — practise first. npx -y -p stockbit-mcp stockbit-auth trading-enable --paper, then "buy 1 lot of BBRI on paper". No real money, no PIN, and the same protocol as the real thing.

Example prompts

"analyze BBRI" "who accumulated GOTO between 2026-07-01 and 2026-07-31" "broker distribution for BRMS" "technicals for BBRI" "chart BBRI with bollinger bands and a MACD panel" "give me Pine for BBRI with a golden cross alert" "alert me when BBRI's RSI drops below 30" "run a deep dive on BBRI" "do the morning scan" "draw the support and resistance on BBRI's chart" "which of my watchlist stocks had brokers accumulating yesterday" "size a BBRI position: entry 4100, stop 3900, risk 1% of Rp 50 million"

How Claude knows which tool to use

You say…

Claude uses…

"is this working?"

status

"who is accumulating BBRI?"

broker_summarybroker_distribution

"look at BBRI properly"

the deep_dive prompt, or analyze

"what moved today?"

market_sessiontop_moverstechnicals

"has this strategy worked?"

backteststrategy_compare (with walk-forward)

"scan my watchlist for oversold"

scan over universe: watchlist

"tell me when BBRI hits 4000"

alert_create, then the stockbit-alerts daemon

"draw support and resistance"

chartbit_analyzechartbit_draw

"how many lots should I buy?"

position_size

"buy 2 lots of BBRI"

trading_statusorder_previewyou confirmorder_buy

"what do I hold?"

portfoliocash_balance

"what IPOs are open?"

eipo_listeipo_detail

"when does BBRI pay a dividend?"

dividend_calendar

"what is the news on GOTO?"

news / stream

Tool reference

138 tools in 17 families. The full generated reference — every tool, its evidence, its arguments — is docs/TOOLS.md.

Family

Tools

When to use

Evidence

system

3

Is this working; log in; log out

Observed

market

18

Prices, depth, movers, bars, the session

Mixed

bandarmology

6

Who accumulated, who distributed

Mixed

analysis

9

Indicators, patterns, backtests, charts, sizing

Observed

company

9

Profile, ownership, management, peers, ratings

Projected

fundamentals

10

Key stats, ratios, statements, seasonality

Mixed

insider

4

Insider and affiliate transactions

Projected

corpaction

7

Dividends, splits, rights, the calendar

Projected

stream

7

Posts, news, research

Projected

screener

5

The catalogue, the presets, running a screen

Projected

account

11

Your watchlists and saved screens, and editing them

Mixed

chartbit

17

Reading and drawing on your real chart

Observed

alerts

4

Rules that fire while no client is open

Observed

pine

1

TradingView Pine generation

Observed

workflows

2

Saved recipes, also offered as prompts

Observed

trading

16

Your brokerage account and order entry

Projected

eipo

9

The IPO pipeline and subscribing

Projected

Verification status

Every tool carries one of three words, and they mean exactly this:

  • Observed — a real response from a live account was seen, and the code was written against it.

  • Read-back — a write whose effect is verified by re-reading the account afterwards. The request body may still be a guess, but a wrong guess shows up as not-visible, never as a false success.

  • Projected — field names taken from Stockbit's web bundle, never seen on a live response. readFrom names the wire key each value came from, and an absent field means "not recognised", not zero.

Projected is not a warning that something is broken. It is a statement that nobody has checked it, and that the code is built so an unchecked guess fails loudly rather than quietly.

The trading and e-IPO families have never been observed live — reading them needs a securities session, which needs the account owner's PIN at their own terminal. Per-family detail, with dates and what was compared against what, is in docs/VERIFICATION.md; what is still open, and in what order it matters, is in docs/PENDING-VERIFICATION.md.

Safety model

The switches. Trading is off until you run stockbit-auth trading-enable --paper or --live yourself. A bare trading-enable is refused — the two differ by everything. STOCKBIT_TRADING can only move the mode down the ladder (livepaperoff); no value of it turns anything on. No module under src/tools/, src/trading/ or src/eipo/ may write the settings file, and a test asserts that.

The PIN. Typed at your terminal, used for one request, never stored. No MCP tool accepts one.

The ticket protocol. order_preview prices and checks the order and returns a summary you read. The write tools take that ticket id and an optional confirmation, and nothing else. A ticket expires in two minutes and carries a fingerprint that is rechecked before the request goes out.

Who confirms. Where your client supports MCP elicitation, you are asked directly, before confirm is even looked at, and your answer is the decisive one — declining refuses the order however the model set confirm. Elicitation is the only channel in MCP that reaches a person; confirm: true is a boolean the model sets, and treating the two as interchangeable was a real defect here, fixed in ADR-0010. On a client that cannot elicit, confirm: true is the only gate there is, the order proceeds, and both the result and the audit line say plainly that no human was asked. The model must never set confirm on your behalf.

You own three switches over that, all set at your own terminal and none reachable by any tool:

trading-enable --elicitation required

Refuse rather than send when no person can be reached. confirm: true never substitutes.

trading-enable --elicitation when-available

Ask wherever the client can; fall back to confirm: true where it cannot. The default.

trading-enable --elicitation never

Do not ask at all. confirm: true is the only gate.

trading-enable --auto-confirm --max-order-value N

Waive the per-order step entirely, under a value cap. Live only, and ignored outright when --elicitation required contradicts it.

The confirmation dialog also carries a second box you may tick: don't ask again, for fifteen minutes, for orders worth no more than the one you just approved, under the trading policy that was in force when you ticked it. It lives in that server's memory and never on disk — a restart ends it, trading_forget ends it in that conversation, and stockbit-auth trading-forget ends it everywhere including servers already running. status says whether one is live.

Outcomes. After a write, outcome is one of seven classes. ok is the only clean success; landed-despite-error also means the read-back found the order, but the request itself errored. Never resend any non-ok result:

outcome

Meaning

ok

On the book, confirmed by reading the orders back.

rejected

Refused by the exchange. Not working.

write-failed

Refused before it left. Nothing was sent.

not-found-after-error

The request errored and the book read back clean.

not-visible

Accepted, but not found on the read-back. Do not resend.

landed-despite-error

The request errored and the order is there anyway.

outcome-unknown

The state could not be established. Do not resend.

Audit. Every order attempt and every account edit appends a line to a log, redacted, whatever the outcome — and if that line could not be written, the result says so rather than implying an audit trail that does not exist.

Credential storage. macOS Keychain where available. Elsewhere an AES-256-GCM file whose key is derived from hostname and username: that is obfuscation, not a vault — anything running as you on your machine can derive the same key. See SECURITY.md.

Decision records: ADR-0004 (order entry), ADR-0007 (login as a tool), ADR-0008 (paper mode). Full guide: docs/trading.md.

Paper trading

stockbit-auth trading-enable --paper          # Rp 100,000,000 to practise with
stockbit-auth paper-reset --cash 250000000

A local ledger, no exchange, no session, no PIN — and the identical protocol, so nothing about the live path is a surprise later. Your portfolio, positions, cash, orders and history are served from the ledger while it is on, and every result says PAPER ACCOUNT — no real money.

Fills are approximate in three specific ways, stated on every result: close-only minutely data (so some real fills are missed), no queue position (so paper is optimistic), and no partial fills. Do not backtest against it and believe the number.

Tool profiles and context management

Every client pays for the whole tool list in the model's context on every turn — and that is a per-turn cost, not a startup one. The full surface is around 220,000 bytes of tools/list, roughly 55,000 tokens, on every single message; core is about a third of that.

core is the default. STOCKBIT_TOOLS changes it:

Value

Effect

unset — the default

core: 41 tools and 6 prompts. The questions people actually ask. No order writes. One over Cursor's cap — see above.

all

All 138. Roughly 55,000 tokens of tool schemas per turn, against ~17,700 for core.

market,bandarmology

Those families only.

core,trading

Core plus order entry.

quote,analyze

Individual tools, mixed freely with families.

system (status, login, logout) is never filtered out — it is how you find out why everything else is missing. An unknown value stops the server with a message naming every family, rather than silently loading all 138.

Output sizes. analyze makes about 27 upstream requests and returns 4–8 KB. broker_summary takes a limit. financials is large. Chart tools return a base64 SVG and a file path. Prefer technicals when you only need the numbers.

Alerts and the daemon

An MCP server exists only while a client holds it open, so a rule that fires at 14:20 on a Tuesday needs a separate process:

npx -y -p stockbit-mcp stockbit-alerts watch      # every 60s during IDX hours
npx -y -p stockbit-mcp stockbit-alerts check      # one pass
npx -y -p stockbit-mcp stockbit-alerts test       # exercise every channel

Channels: an append-only log (always, and first — a channel that fails silently is worse than none), a desktop notification, a webhook (STOCKBIT_ALERT_WEBHOOK, https or localhost only), and Telegram.

For Telegram: get a token from @BotFather, message your bot once, then read the numeric chat id from https://api.telegram.org/bot<token>/getUpdates. Set STOCKBIT_TELEGRAM_BOT_TOKEN and STOCKBIT_TELEGRAM_CHAT_ID — environment only, because a token on the command line is visible to every user on the machine through ps.

Keep it running with launchd (macOS), Task Scheduler (Windows) or a systemd user unit (Linux).

CLI reference

Command

stockbit-mcp

The MCP server. Speaks stdio; your client launches it.

stockbit-auth login [--fresh-profile] [--switch-account]

One-time browser login. --switch-account signs the current account out of the browser profile first, so you get a real form instead of the app.

stockbit-auth import-har

Import a login captured in any browser.

stockbit-auth doctor

Diagnose browsers, the token store and the capture path.

stockbit-auth bootstrap

Paste a refresh token by hand.

stockbit-auth status [--verify] [--json]

Everything, redacted. --json is safe to paste into an issue. --verify spends one refresh to prove the token — which ROTATES it and ends your website session.

stockbit-auth logout [--keep-profile]

Clear the token and the logged-in browser profile.

stockbit-auth trading-login [--browser]

Unlock Stockbit Sekuritas with your PIN. Never stored.

stockbit-auth trading-status [--offline]

The trading policy, and whether the session works.

stockbit-auth trading-enable --paper [--cash N]

Practise mode.

stockbit-auth trading-enable --live [--max-order-value N] [--max-lots N] [--symbols A,B] [--auto-confirm]

Real orders.

stockbit-auth trading-disable

Back to off. The session and the ledger are left alone.

stockbit-auth paper-reset [--cash N]

Start the paper ledger over.

stockbit-auth trading-logout

End the trading session and delete its credential.

stockbit-alerts watch|check|test

The alert daemon.

stockbit-batch plan|bars|broker|probe|status

Historical backfill for an ML dataset: one request per (symbol, session) for broker summaries, throttled, off-hours by default, resumable from a checkpoint, stoppable with a kill-file. plan makes no requests and tells you the cost first.

Every command answers --help/-h without running anything, and an unknown flag or stray argument is an error naming what that command accepts — never silently ignored.

Files it writes

Everything lives in one directory — ~/.stockbit, or wherever STOCKBIT_STORE_DIR points. Nothing is written outside it.

Path

refresh.enc

Your session token, AES-256-GCM (off macOS).

settings.json

The trading switches. Written by stockbit-auth, never by the server.

paper/ledger.json

The paper account.

charts/, pine/

Rendered charts and generated Pine.

alerts.json, alerts.log

Alert rules, and every alert that fired.

order-mutations.log

Every order and IPO attempt, append-only.

account-mutations.log

Every watchlist and screener edit, append-only.

layout-backups/, layout-mutations.log

Pre-write chart snapshots and the write log.

Environment variables

Variable

Effect

STOCKBIT_TOOLS

core (the default), all, or a comma-separated list of families and tool names.

STOCKBIT_STORE_DIR

Where everything on disk lives. Default ~/.stockbit.

STOCKBIT_TRADING

off forces off; paper lowers live to paper. It can only lower the mode.

STOCKBIT_BROWSER

Absolute path to the Chromium binary used for login.

STOCKBIT_WEB_BROWSER

Which browser to open Stockbit in, e.g. "Microsoft Edge".

STOCKBIT_NO_BROWSER=1

Never open a browser window; login refuses and names the CLI.

STOCKBIT_LOGIN_TIMEOUT_MS

How long the login capture waits.

STOCKBIT_ACCESS_TOKEN

Use this bearer instead of the stored session. Memory only.

STOCKBIT_FORCE_FILE_STORE=1

Skip the Keychain and use the encrypted file store.

STOCKBIT_ALERT_WEBHOOK

https endpoint for fired alerts.

STOCKBIT_TELEGRAM_BOT_TOKEN, STOCKBIT_TELEGRAM_CHAT_ID

Telegram delivery.

STOCKBIT_DEBUG=1

Log response shapes on parse failures.

Troubleshooting

Symptom

status says no session

Log in. Say "log me into Stockbit" or run stockbit-auth login.

HTTP 401 after a week away

The refresh token rotates on a sliding 7-day window. Log in again.

Google sign-in does nothing

Broken on Stockbit's own site (deprecated gapi.auth2). Use username and password.

Cloudflare challenge on trading-login

stockbit-auth trading-login --browser.

A blank white Chartbit page

You are signed out in that browser.

broker_distribution errors

Stockbit's Rp 10,000,000 balance gate.

Empty movers

Weekend or a holiday. Check market_session.

VS Code or Cursor: "too many tools"

You have set STOCKBIT_TOOLS=all. Remove it — the default is core, which is 41. On Cursor (cap 40) name a narrower list.

Windows: npx ENOENT

Use "command": "cmd", "args": ["/c", "npx", …].

Something else

stockbit-auth doctor, then stockbit-auth status --json — both are safe to paste.

Testing

npm ci
npm run typecheck
npm test          # the whole suite, entirely offline — fetch is stubbed, no network, no skips
npm run build
npm run smoke     # starts the built binary over stdio and asks it what it registered
npm run check:pack

CI runs all of that on Ubuntu, macOS and Windows against Node 22 and 24, plus a dependency audit, an offline link check, and npm run docs:tools && git diff --exit-code docs/TOOLS.md.

Architecture

bin/         three entry points: the MCP server, auth, the alert daemon
src/
  http/      the closed route table and the transport that enforces it
  auth/      login capture, the three token stores, refresh with a cross-process lock
  core/      one module per Stockbit domain — the readers everything else is built on
  analysis/  indicators, patterns, strategies, backtests, scans, position sizing
  render/    pure SVG: candles, flow diagrams. No browser.
  tools/     MCP registration, one module per family
  trading/   tickets, previews, order submission, the paper ledger
  eipo/      the IPO pipeline
  alerts/    rules, the daemon, delivery
  workflows/ the eight built-in recipes

Three invariants, each enforced by a test rather than a convention:

  1. Nothing can reach a Stockbit host outside the route table (test/transport.test.ts).

  2. A write tool is never reachable from a saved workflow recipedefine.write does not add to the handler map (test/tools.test.ts).

  3. Nothing that serves a model can write the settings file (test/settings.test.ts).

Roadmap

A trade journal; rasterising charts to PNG for vision models; Windows DPAPI and Linux libsecret credential stores; CSV export; a stockbit run <tool> CLI. After that: converting the carina and e-IPO families from Projected to Observed, which takes one live session and is the account owner's call.

Contributing · Security

CONTRIBUTING.md · SECURITY.md · CODE_OF_CONDUCT.md · CONTEXT.md (the vocabulary) · docs/README.md (the index).

Longer than this page: the user guide walks through every feature and what to ask for; docs/TOOLS.md is the generated reference; docs/adr/ records every decision that changed what this server may do.

Please report vulnerabilities privately through GitHub Security Advisories, not a public issue.

Acknowledgements

Garit32 — collaborator, and the author of most of the commits on this project's history, including the Windows login capture and browser detection.

tradesdontlie/tradingview-mcp — the polish this README was measured against. Stockbit's chart page is built on TradingView's charting library, which is why Chartbit works the way it does.

Disclaimer

This software is for personal, educational and research use.

It is not affiliated with, endorsed by or supported by Stockbit, PT Stockbit Sekuritas Digital, or the Indonesia Stock Exchange. Stockbit's Terms of Use restrict automated access to their services, and using this software may conflict with them; account suspension is a possible consequence and it is yours to weigh. The API it uses is undocumented and can change or break at any time without notice.

Nothing this software produces is investment advice. The author is not a licensed investment adviser and is not registered with OJK. Indicators, backtests, pattern detections and broker-flow readings are computations over historical data, not predictions. Backtested results do not predict future returns.

If you enable live trading, this software can send real orders that spend real money. It is off by default. Orders require your explicit confirmation unless you separately opt into capped --auto-confirm; you remain solely responsible for every order placed through it, including orders within a cap you authorised in advance.

You are responsible for complying with Stockbit's terms, IDX rules, and Indonesian law.

Provided under the MIT licence, without warranty of any kind.

License

MIT © Darren Wang

Available Tools

41 tools
alert_checkA
Read-only

Evaluate stored alert rules against current Stockbit bars and report which fired. Fetches only the symbols with rules, and only as much history as the slowest indicator needs. A rule that fires is recorded so it does not fire again for the same bar. reason on a rule that did not fire distinguishes 'condition-false' from 'warming-up' — the second means the comparison could not be made, which is NOT the same as a no. It covers two situations: not enough history yet, which more bars fix; or an operand the SERIES DOES NOT CARRY — a response can omit volume, and where a bar is missing it the value is absent rather than zero. The second never resolves by waiting, however much history arrives, because the field is not in the payload. Check volume is present on the bars before widening the window.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolNoOnly check rules for this ticker
dry_runNoEvaluate without recording fires, so a check can be repeated. Default false.

TDQS

A3.5/5.0
Behavior1/5

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

The annotations declare readOnlyHint=true, yet the description states 'A rule that fires is recorded so it does not fire again for the same bar' and describes dry_run as 'Evaluate without recording fires.' This directly contradicts the read-only claim and indicates a state-changing side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and the later caveats about reason, warming-up, and missing volume are substantive rather than filler. It is longer than necessary but each part contributes to correct interpretation of results.

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

Completeness4/5

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

With no output schema, the description does a good job of explaining the tricky reason semantics and the volume-missing situation, and it makes the optional parameters understandable. It still does not describe the full response shape (how fired rules are identified), but the essential invocation and interpretation guidance is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters already have clear descriptions ('Only check rules for this ticker' and dry_run's explanation). The body of the tool description adds useful behavior context but no additional parameter-level syntax or formatting detail, so the baseline score applies.

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

Purpose5/5

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

The opening sentence states a specific action — 'Evaluate stored alert rules against current Stockbit bars and report which fired' — and clearly identifies the resource. This sets it apart from sibling alert_list, alert_create, and alert_delete, which manage rule definitions rather than execute checks.

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

Usage Guidelines4/5

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

The description gives clear context on when to call this tool: to evaluate stored rules and see which fired, with optional symbol scoping and dry_run behavior. It does not explicitly name alternatives or state when not to use it, but the purpose sentence makes the use case unambiguous.

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

alert_createA
Read-only

Create a price or indicator alert on an IDX stock, stored on this machine. The condition uses the SAME grammar as pine_script signals and is evaluated with the same indicator maths, so an alert and the Pine alertcondition for it agree. Reference a declared series (sma20, sma50, rsi14, macdLine, macdSignal, bbUpper…), a price field (close, high, low, volume, hl2…), or a number. Declare what you reference via overlays/panels — the tool refuses a condition it cannot evaluate rather than storing a rule that silently never fires. A field the SERIES does not carry is a separate matter from one you did not declare. Of the referenceable price fields, volume is the one a response can omit: where a bar is missing it the value reads as absent rather than as zero, and a condition referencing it is UNJUDGEABLE on that bar — reported as warming up, not as false. That is deliberate: a rule comparing volume against a figure the response never sent would otherwise fire, or not fire, on a zero nobody reported. Alerts fire once per bar. Nothing is delivered automatically — alert_check evaluates them; there is no background daemon yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
leftYesSeries id, price field, or number
nameYesWhat this alert means, e.g. 'RSI oversold'
noteNoFree text for your own reference
rightYes
panelsNoOscillators the condition references
symbolYesIDX ticker, e.g. BBRI
overlaysNoPrice series the condition references
cooldown_minutesNoMinimum minutes between fires. Default 0 (once per bar).

TDQS

A3.7/5.0
Behavior1/5

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

The prose discloses rich behavior: the same grammar as pine_script, refusal to store unevaluable conditions, volume absence semantics, once-per-bar firing, and no background delivery. However, the annotations declare readOnlyHint=true while the description says this tool creates and stores an alert, which is a direct contradiction. Per the rubric, this must be scored 1 and flagged.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense and purposeful: it front-loads the main action, then explains grammar/declaration rules, the volume edge case, and firing/delivery behavior. The volume paragraph is somewhat intricate, but it covers a non-obvious semantic that would otherwise cause incorrect expectations.

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

Completeness4/5

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

For a complex 9-parameter tool with no output schema, the description covers input syntax, required series declarations, failure behavior, firing frequency, and delivery model. The only notable gap is the lack of any statement about what the tool returns on success (e.g., an alert ID), but this does not block correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 78%, so the schema already documents most parameters. The description adds meaningful semantics beyond the schema: left/right can reference series, price fields, or numbers; referenced series must be declared via overlays/panels; volume omission is treated as absent and makes conditions unjudgeable; and the default cooldown is once per bar.

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

Purpose5/5

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

The first sentence states a specific verb (Create), a specific resource (price or indicator alert), a domain (IDX stock), and a storage location (this machine). This clearly distinguishes alert_create from its siblings alert_list, alert_delete, and alert_check.

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

Usage Guidelines4/5

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

The description explains the create-then-check workflow by noting that alerts are not delivered automatically and must be evaluated via alert_check, with no background daemon. It does not explicitly name alternatives to avoid, but the create vs. list/delete/check split is clear from context.

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

alert_deleteA
Read-only

Delete an alert rule by id, or disable it instead with disable_only.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRule id from alert_list
disable_onlyNoKeep the rule but stop it firing. Default false.

TDQS

A3.7/5.0
Behavior1/5

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

Annotations declare readOnlyHint=true and destructiveHint=false, directly contradicting a delete operation. The description itself gives no safety or side-effect context, making behavior ambiguous. This is an annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the verb and object, and no filler. Every word earns its place.

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

Completeness3/5

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

For a simple two-parameter tool, the schema coverage and description cover the core call correctly. However, the contradiction with annotations and the lack of any note about success/failure response leave an agent slightly under-informed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers both parameters with 100% coverage. The description adds the semantic that disable_only is an alternative to deletion ('instead'), which clarifies the boolean's purpose beyond the schema's wording.

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

Purpose5/5

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

The description identifies the exact action (delete) and resource (alert rule by id), and even presents the disable alternative. This clearly differentiates it from create/list/check siblings despite not naming them.

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

Usage Guidelines4/5

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

The phrase 'or disable it instead' gives a concrete choice between deleting and preserving-with-disable, which is actionable. It does not explicitly name sibling tools or state when not to delete, but the intended use is clear.

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

alert_listA
Read-only

List the alert rules stored on this machine, with when each last fired.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolNoOnly rules for this ticker

TDQS

A4/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds local-machine scope and the last-fired output detail, but does not disclose ordering, pagination, or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single front-loaded sentence with zero filler; the key verb, object, scope, and output feature are all present.

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

Completeness4/5

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

For a simple read-only list with one optional, fully-documented parameter and rich annotations, the description is nearly complete. It could mention the optional symbol filter or what an alert rule contains, but the schema and sibling names cover those gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the sole optional parameter 'symbol' is documented as 'Only rules for this ticker'. The description does not add parameter-specific meaning, but baseline 3 is appropriate since the schema carries the full load.

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

Purpose5/5

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

States a specific verb ('List'), resource ('alert rules'), scope ('stored on this machine'), and output detail ('with when each last fired'). It clearly distinguishes from create/delete siblings.

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

Usage Guidelines4/5

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

Clear context of what the tool does, with no exclusions. It doesn't explicitly name alternatives, but the list operation is unambiguous against alert_create/alert_delete, and the optional symbol filter is documented in the schema.

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

analyzeA
Read-only

Weigh several readings of one IDX stock into a single lean — bullish, neutral or bearish — with a confidence score and the evidence behind both. CONFIDENCE IS NOT A PROBABILITY. It measures how complete and internally consistent the evidence is — how many pillars were readable, whether they agree, how far the composite sits from neutral, and how fresh the data is. It STOPS AT 90 by construction, because nothing in this data source could justify claiming more about a future price. Four weighted pillars: broker flow and positioning (0.35 — the signal no other data source has), trend across daily/weekly/monthly (0.30), valuation (0.20), candlestick patterns (0.15). A pillar that cannot be read is reported as MISSING, contributes nothing, and its weight is redistributed — it never lands as a neutral vote, because 'we could not see it' and 'we looked and it was balanced' are different answers. WHAT IT CANNOT DO: there is no analyst consensus or price target anywhere in this server, so nothing here reflects what analysts forecast. Valuation is scored against ABSOLUTE bands, not sector peers — treat it as weak for banks, property and cyclicals. Community sentiment is counted, never scored. FLOOR-LOCKED STOCKS: when the last close sits on the auto-rejection floor, broker accumulation-versus-distribution carries no information; the flow pillar is downgraded and says so. Read that as unreliable, not as bearish. COST: about 27 upstream requests at the default 260 bars — 22 bar pages (12 rows each) plus five single-shot reads — issued sequentially. Use technicals or timeframe_alignment if you only want the numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault
barsNoDaily sessions to pull (default 260 ≈ one trading year; 500 also fills the monthly view)
symbolYesIDX ticker, e.g. BBRI
broker_periodNoBroker-flow window (default LAST_7_DAYS). YEAR_TO_DATE costs the same one request.
pattern_windowNoSessions of candlesticks to read (default 10). Must be at least 1.
include_sentimentNoFetch the community post count for context (default true). Never scored.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations by disclosing confidence is not probability, stops at 90 by construction, missing pillars redistribute weight, floor-locked stocks degrade the flow pillar, and community sentiment is never scored. It also discloses cost (~27 upstream requests), which is highly relevant behavior for an agent deciding whether to call this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely packed, with clear headed sections and the main purpose front-loaded in the first sentence. Each section justifies its existence: confidence caveat, pillar weights, limitations, floor-locked behavior, cost, and alternative routing.

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

Completeness5/5

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

For a complex composite-analysis tool with no output schema, the description covers what the tool returns, what it cannot do, edge-case behavior, cost, and when to use alternatives. An agent has enough context to decide whether to invoke it and to interpret its result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all five parameters. The description still adds meaningful context by explaining the cost implication of bar count, how broker_period affects request count, that sentiment is counted but never scored, and how pillar weights interpret the inputs.

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

Purpose5/5

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

The opening sentence names a specific verb ('Weigh'), a specific resource ('one IDX stock'), and a concrete output ('a single lean — bullish, neutral or bearish — with a confidence score and the evidence'). It is immediately clear this is a composite analysis tool and how it differs from data-only siblings like technicals or broker_summary.

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

Usage Guidelines5/5

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

The description explicitly says to use `technicals` or `timeframe_alignment` if the agent only wants the numbers, giving a clear alternatives condition. It also provides strong context on when the output is less trustworthy: no analyst consensus, valuation weak for certain sectors, floor-locked stocks unreliable, and sentiment never scored.

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

backtestA
Read-only

Run a trading strategy over Stockbit's own daily history and report what it would actually have done: every trade, an equity curve, and metrics (return, CAGR, Sharpe, max drawdown, win rate, profit factor, expectancy, exposure) against buy-and-hold over the SAME window. Use a preset name, or supply your own entry/exit in the same condition grammar alert_create and pine_script use — so a backtested rule, a live alert and a TradingView strategy are one object rather than three that drift. The execution model is deliberately pessimistic and it matters: signals are read at the bar CLOSE and filled at the NEXT bar's open (never at the price the signal was computed from); a bar that hits both stop and target resolves to the STOP; a gap through a level fills at the open, not the level; and a session locked by IDX auto-rejection (high === low) cannot be filled at all. Costs default to Indonesian retail: 0.15% to buy, 0.25% to sell (the extra 0.1% is the sale tax), plus 0.1% slippage, in whole 100-share lots. ALWAYS read warnings before quoting a number. Under ten trades it says so, and it means it. Set walk_forward for an out-of-sample check. Long-only: retail shorting is not available on IDX.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest session, YYYY-MM-DD
barsNoSessions of history (default 500, the practical maximum)
fromNoEarliest session, YYYY-MM-DD
foldsNoWalk-forward folds, default 3
panelsNoOscillators the conditions reference
symbolYesIDX ticker, e.g. BBRI
exit_opNo
entry_opNo
overlaysNoSeries the conditions reference
strategyNoA preset. Omit to supply entry/exit yourself.
exit_leftNoExit condition, left side
entry_leftNoEntry condition, left side
exit_rightNo
entry_rightNo
slippage_pctNoDefault 0.1
walk_forwardNoAlso run an out-of-sample check. Costs no extra requests.
max_hold_barsNoForce an exit after this many bars
stop_loss_pctNoPercent below the fill price, e.g. 5
include_equityNoInclude the equity curve, one point per bar. Default false.
include_tradesNoInclude the full trade log. Default true.
initial_capitalNoIDR, default 10,000,000
take_profit_pctNoPercent above the fill price
commission_buy_pctNoDefault 0.15
commission_sell_pctNoDefault 0.25 (includes the 0.1% sale tax)

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses a deliberately pessimistic execution model: signals read at bar close and filled next open, stop/target conflict resolves to stop, gaps fill at open, and IDX auto-rejection blocks fills. It also spells out Indonesian retail cost defaults, 100-share lots, warning semantics, and long-only constraints — all beyond what the readOnlyHint/openWorldHint annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and generally front-loaded, leading with the primary purpose and outputs before diving into execution details and defaults. The execution-model section is long and compressed into a single paragraph, yet every clause carries a meaningful constraint; minor structure improvements like bullets could improve readability.

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

Completeness4/5

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

For a complex 24-parameter tool with no output schema, the description covers the core output shape, warnings, execution model, cost assumptions, walk-forward mode, and market constraint. It does not explain every parameter or the exact response envelope, but the rich schema plus this description give an agent enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, so the baseline is high. The description adds real value on top by explaining that entry/exit conditions use the same grammar as alert_create and pine_script, that walk_forward costs no extra requests, and that include_equity/include_trades control output size. It does not fully document the custom condition expression format, but it references the canonical grammar source.

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

Purpose5/5

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

Description starts with a specific verb and resource: 'Run a trading strategy over Stockbit's own daily history' and lists concrete outputs: trades, equity curve, metrics vs buy-and-hold. It also distinguishes itself from alert creation and TradingView strategies by framing backtested rules, live alerts, and strategies as one shared object.

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

Usage Guidelines3/5

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

The description gives strong in-tool usage guidance: use a preset or supply your own entry/exit grammar, set walk_forward for out-of-sample checks, and respect long-only constraints. However, it does not explicitly say when to choose backtest over sibling tools like strategy_compare, analyze, or workflow_run, leaving alternative selection mostly to inference.

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

bandar_detectorA
Read-only

A typed accumulation/distribution reading for one IDX stock, computed from the same broker summary broker_summary returns: net buy and net sell totals for the window, the top accumulators and distributors, and how concentrated each side is. It returns no verdict, no score and no price forecast. A broker code is a pipe carrying thousands of unrelated clients, not a person — the bandar-check skill has the rest of what this cannot prove, and reading it before drawing a conclusion is the difference between flow and a story. SIGNS: values are IDR, volumes are LOTS. Sell figures are NEGATIVE — sellValueIdr, sellLots, and netValueIdr on anything in topDistributors — because that is how Stockbit sends them. Do not negate them again. netValueIdr is buyValueIdr minus the MAGNITUDE of sellValueIdr: how lopsided the two sides are, not how much was bought. Near zero is the normal reading of a complete NET table, since both sides describe the same trades from opposite ends. A large magnitude means they do not cover the same trades — usually truncation, sometimes GROSS. limit applies PER SIDE, so equal list lengths prove nothing; check whether buyersListed or sellersListed has REACHED limit, and if so raise it and see whether the totals move. topDistributors is largest seller FIRST, by size of flow. Concentration shares are fractions of one side taken on magnitudes, so both sides are positive; a null share means the question cannot be asked — that side is empty, or none of its figures could be read. unreadable.buyers / .sellers count listed brokers left out of that side's totals, so buyers: 1 against buyersListed: 16 means every buy figure covers 15 brokers. Broker codes come back bare unless you pass resolve_names: true, which adds each house as name on the two lists by joining against the cached brokers directory. Best-effort: if the directory cannot be read every figure is unchanged and names.note says why, and a code the directory does not carry simply has no name. DATES: omit from/to for the latest session, or supply BOTH (YYYY-MM-DD). A half-specified range is rejected because the API would silently answer with the latest session instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end, YYYY-MM-DD (inclusive). Requires `from`.
topNoBrokers to keep per side (default 5, max 50)
fromNoRange start, YYYY-MM-DD. Requires `to`.
limitNoMax brokers per side fetched from the summary (default 50). Raising it widens the totals and the concentration denominators; it is not the same as `top`, which only trims the two lists that are returned.
periodNoPreset window instead of from/to — LATEST (default), YESTERDAY, LAST_7_DAYS, LAST_3_MONTHS, YEAR_TO_DATE. Aggregated server-side in one request, so YEAR_TO_DATE costs the same as today. Ignored when from/to are given.
symbolYesIDX ticker, e.g. BBRI
date_toNoAlias for `to`.
end_dateNoAlias for `to`.
date_fromNoAlias for `from`.
start_dateNoAlias for `from`.
market_boardNoDefault REGULER — the ordinary order book, and what bandarmology means. ALL folds in negotiated blocks and can be several times larger.
investor_typeNoDefault ALL
resolve_namesNoAdd each broker's securities house as `name`, joined from the cached directory.
transaction_typeNoNET (default) nets each broker's buys against its sells; GROSS does not.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the annotations, disclosing that sell figures are negative, netValueIdr is a lopsidedness measure rather than bought volume, topDistributors is ordered largest seller first, null shares indicate an unreadable side, and limit applies per side. It also documents resolve_names best-effort failure modes and date rejection behavior, with no contradiction against the readOnlyHint or destructiveHint annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is organized with clear sections like SIGNS and DATES, front-loaded with the core purpose, and every paragraph carries substantive operational detail. It sacrifices brevity for completeness, and a few rhetorical embellishments could be trimmed, but the structure keeps it navigable.

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

Completeness5/5

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

With 14 parameters and no output schema, the description covers sign conventions, edge cases, failure modes, naming behavior, date rules, and the meaning of result fields. An agent has enough information to call the tool correctly and interpret its response without needing external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds real meaning beyond the schema: limit is explicitly contrasted with top, GROSS vs NET behavior is explained, period aggregation cost is noted, and resolve_names semantics are fully described. This gives the agent a much richer understanding of how parameters change both the request and the interpretation of results.

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

Purpose5/5

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

The description opens with a specific, unambiguous statement: it is a typed accumulation/distribution reading for one IDX stock, computed from the same broker summary that broker_summary returns. It names the outputs — net buy/sell totals, top accumulators/distributors, concentration — and explicitly says it returns no verdict, score, or price forecast, which separates it clearly from related tools.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when this tool is not enough and directs it to the bandar-check skill before drawing a conclusion. It also gives concrete invocation rules: omit from/to for the latest session, supply both for a range, a half-specified range is rejected, and market_board ALL behaves differently from REGULER.

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

broker_activityA
Read-only

Which STOCKS one broker traded, and how much of each. This is the reverse lookup of broker_summary: that tool fixes a stock and lists brokers, this one fixes a broker and lists stocks. Chain them to answer what neither answers alone — take the biggest net seller of a stock from broker_summary, then ask here what else that broker was distributing. broker_code is the two-letter code (YP, CC, XL); use the brokers tool to find one by name. An unknown or malformed code is rejected before any request goes out. CHOOSING THE WINDOW. Pass period for a preset, or from+to (YYYY-MM-DD) for an exact range; both ends are required together. Omit both and you get the server's default, which measured 2026-09-01 was that single day. Rows are per stock PER DAY, so a multi-day window returns several rows for the same ticker — one per session it traded. The period NAME never goes on the wire. This endpoint answers 400 to period on every spelling and every value (measured 2026-09-01), but it accepts from/to, so a preset is resolved into a date pair here and the dates are sent. That resolution is this server's own calendar arithmetic, checked against Stockbit's: asked for LAST_7_DAYS and LAST_3_MONTHS, broker_summary resolved them to the same dates this does. YEAR_TO_DATE it starts on January 1st where Stockbit starts on the first trading day — a difference that cannot move a figure, because a window padded with days the exchange was shut contains no extra trades (measured: a Saturday start and the following Monday returned identical rows). You never have to trust that arithmetic. request echoes the dates actually sent and from/to on the result are the window the SERVER says it served. FILTERS: market_types and investor_types each take a LIST, and each value is sent as its own repeated parameter. Passing several boards means the union of those boards. Omit a filter and it is not sent at all, in which case the server picks the default and this tool cannot tell you which one it picked. REGULER is the ordinary order book and what bandarmology normally means; ALL folds in negotiated block trades and can be several times larger. request in the result echoes exactly what was sent, so the filters behind the rows are always visible. BUY AND SELL ARE SEPARATE ROWS, and side is the only thing that tells them apart. The response splits the two halves into brokers_buy and brokers_sell and sends BOTH as positive numbers, so a sell row read without its side looks exactly like a buy. Never infer the direction from a sign, and never sum value across sides without grouping by side first — that total is turnover, not net flow. Each row carries symbol, side, date, value (rupiah), lot, avgPrice, freq and investorType, every one with readFrom naming the wire key it came from, and the whole untouched row beside them. Absent means the wire did not carry it — never zero. rowsFrom names the containers the rows came out of. count: 0 with a populated rowsFrom is a broker who traded nothing in that window; rowsFrom: null means the payload was NOT PARSED — a shape this tool does not recognise, with dataKeys naming what was actually there. Reporting the second as the first is the defect this tool was fixed for: it read count: 0 for a broker with 868 buy rows and 836 sell rows, because it searched for an array and this route nests the two sides inside an object.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end, YYYY-MM-DD (inclusive). Requires `from`.
fromNoRange start, YYYY-MM-DD. Requires `to`.
pageNo1-based page. Omitted means the server default.
limitNoRows per page. Omitted means the server default.
periodNoPreset window, resolved here into `from`/`to` and sent as dates — the name itself is refused by this endpoint. Ignored when `from`/`to` are given. Omitted means the server's own default window.
date_toNoAlias for `to`.
sort_byNoSort key, without the SORT_BY_ prefix. Known values: TOTAL_VALUE, NET_VALUE, SELL_VALUE, TOTAL_VOLUME, TOTAL_FREQUENCY, CODE, NAME, GROUP. The list was read from Stockbit's own bundle and is partial, so any uppercase token is accepted.
end_dateNoAlias for `to`.
date_fromNoAlias for `from`.
start_dateNoAlias for `from`.
broker_codeYesBroker code, 2-4 uppercase letters or digits, e.g. YP
market_typesNoBoards to include, as a list. Each value is sent as its own repeated parameter.
investor_typesNoInvestor classes to include, as a list. Also sent as repeated parameters.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false, and the description adds extensive behavioral context without contradicting them: unknown broker codes are rejected before any request, `period` is not sent but resolved to dates, rows are per stock per day, buy and sell rows are separate with positive numbers, absences mean the wire did not carry the field rather than zero, and `count: 0` with populated `rowsFrom` vs `rowsFrom: null` have different meanings. This goes far beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place given the endpoint's many non-obvious behaviors: reversed lookup semantics, period resolution, repeated-parameter filters, side handling, and response shape quirks. It is front-loaded with the core purpose and sibling distinction, then organized under clear uppercase section labels, making it easy to scan. No filler or redundant repetition.

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

Completeness5/5

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

There is no output schema, so the description must explain return values, and it does so thoroughly: row fields, `readFrom`, `rowsFrom`, `count: 0` semantics, `rowsFrom: null`, `dataKeys`, and the nested buy/sell containers. It also covers default window behavior, error handling for `period`, alias handling, and the measured date-resolution verification. For a 13-parameter tool with no output schema, nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 substantial extra meaning for nearly every parameter group: `broker_code` format and how to find it, `period` being resolved rather than sent, `from`/`to` required together, filters as repeated parameters with union semantics, omit behavior, and the critical warning never to infer direction from sign because both sides are positive. This is far more than the schema alone provides.

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

Purpose5/5

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

The description uses a specific verb and resource: it tells the agent exactly what the tool returns ('which STOCKS one broker traded, and how much of each') and explicitly contrasts it with broker_summary as the reverse lookup. This makes it instantly distinguishable from the sibling tool without needing to open schemas.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: it names broker_summary as the forward lookup, explains how to chain the two, and tells the agent to use the `brokers` tool to resolve a name into a code. It also provides detailed window selection rules, including that `period` is resolved locally and the preset name never goes on the wire, and what happens when both `period` and `from`/`to` are omitted.

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

broker_distributionA
Read-only

Broker-to-broker flow for an IDX stock, ALWAYS rendered as an SVG diagram laid out BUYER -> SELLER exactly like Stockbit's own Broker Distribution: top buyers on the left, the sellers they bought from on the right. Each seller's bar is that seller's TOTAL, so a partly-filled bar means the buyers shown account for only part of what it sold. For each top broker, WHICH brokers were on the other side of their trades and how much moved between them. broker_summary says how much a broker accumulated; this shows who they accumulated it from. Returns the diagram as an image AND writes a .svg file, reporting the path in savedTo (pass save_path to choose where). It deliberately does NOT return a table of numbers — the picture is the output. Use broker_summary for per-broker figures. DATES: pass a period preset, or BOTH from and to (YYYY-MM-DD). from/to override period. data_type=VALUE is IDR, VOLUME is LOTS (1 lot = 100 shares); the summary states which. REQUIRES a Stockbit account with at least Rp 10,000,000 total balance — Stockbit gates this feature. If the account does not qualify the tool returns an error saying so. An empty diagram on a weekend or public holiday is expected, not an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoWindow end, YYYY-MM-DD (inclusive). Requires `from`.
fromNoWindow start, YYYY-MM-DD. Requires `to`.
themeNoPalette. Default dark.
periodNoPreset window; default LAST_1_DAY. Ignored when from/to are given.
symbolYesIDX ticker, e.g. BBRI
browserNoBrowser to open Stockbit in, by name, e.g. "Edge". Defaults to STOCKBIT_WEB_BROWSER, else the OS default.
date_toNoAlias for `to`.
end_dateNoAlias for `to`.
data_typeNoDefault VALUE (IDR). VOLUME returns lots (1 lot = 100 shares).
date_fromNoAlias for `from`.
save_pathNoWhere to write the .svg. Defaults to charts/ inside the store (~/.stockbit, or $STOCKBIT_STORE_DIR).
start_dateNoAlias for `from`.
top_sourcesNoSource brokers to draw (default 8)
top_targetsNoCounterparties to draw; the rest merge into an 'others' band (default 12)
market_boardNoDefault REGULER, matching Stockbit's UI. ALL folds in negotiated blocks and changes the numbers a lot.
investor_typeNoDefault ALL
open_in_stockbitNoOpen the symbol's Stockbit page in the user's browser. Default true.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing side effects (writes a .svg file, may open the browser), the gating account requirement (Rp 10,000,000 balance and the error it produces), the output form (image plus savedTo path), and edge-case behavior (empty diagram on holidays is expected). This is rich behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: core purpose first, then diagram semantics, output behavior, date rules, data_type, requirements, and an edge case. It is front-loaded with the most important facts and avoids fluff or repetition.

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

Completeness5/5

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

For a complex tool with 17 parameters and no output schema, the description supplies the essential missing context: return value semantics (savedTo path), output format (SVG image), error conditions (account balance, holiday empties), and how it differs from its closest sibling. An agent has enough to invoke it correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds real value on top by explaining date format and override behavior, the IDR vs LOTS distinction, the impact of market_board=ALL ('changes the numbers a lot'), and the purpose of save_path. It doesn't explicitly narrate every parameter, but the additional clarifications are meaningful.

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

Purpose5/5

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

States a specific verb and resource: renders broker-to-broker flow as an SVG diagram, and clearly differentiates itself from broker_summary by explaining the difference in scope ('who they accumulated it from' vs. 'how much a broker accumulated'). The layout semantics (buyer left, seller right) further pin down what the tool produces.

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

Usage Guidelines5/5

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

Explicitly tells the agent when to use broker_summary instead ('Use broker_summary for per-broker figures') and clarifies what this tool deliberately does not do ('does NOT return a table of numbers'). It also gives precise date selection rules (period preset OR both from/to, from/to override), data_type meaning, and the weekend/holiday expectation.

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

broker_summaryA
Read-only

Broker summary for an IDX stock: which brokers net-bought/sold, in lots and IDR value, with foreign/local/govt classification. This is the core bandarmology signal — TradingView has no equivalent. DATES: omit from/to for the latest completed session. Supply BOTH from and to (YYYY-MM-DD) for a historical window — the server aggregates net flow across it in one request, so a multi-month range is as cheap as one day. For a single past day pass the same date twice. Both ends are required; a half-specified range is rejected because the API would silently return the latest session instead. An empty result for a weekend or public holiday is expected, not an error. SIGNS: sell-side rows carry NEGATIVE netLots and netValueIdr, because that is how Stockbit sends them. Do not negate them again. A row omits netLots or netValueIdr when that figure could not be read — missing on the wire, empty, or in a format this server refuses to guess at. Absent is NOT zero, it means unknown, so do not sum these rows without checking. unreadable on the envelope names the wire keys and counts, per side, how many listed brokers a total over these rows would miss. resolve_names: true adds the securities house to each row as name, joining against the brokers directory so you do not have to. The directory is cached for five minutes, so this is usually free. It is best-effort: if the directory cannot be read the rows and every figure on them are unchanged and names.note says why, and a code the directory does not carry simply has no name — an unresolved code is not a nameless broker.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRange end, YYYY-MM-DD (inclusive). Requires `from`.
fromNoRange start, YYYY-MM-DD. Requires `to`.
limitNoMax brokers per side (default 50; API default 25 truncates)
periodNoPreset window instead of from/to — LATEST (default), YESTERDAY, LAST_7_DAYS, LAST_3_MONTHS, YEAR_TO_DATE. The server aggregates the whole window in ONE request, so YEAR_TO_DATE costs the same as today. Ignored when from/to are given.
symbolYesIDX ticker, e.g. BBRI
date_toNoAlias for `to`.
end_dateNoAlias for `to`.
date_fromNoAlias for `from`.
start_dateNoAlias for `from`.
market_boardNoDefault REGULER — the ordinary order book, and what bandarmology means. ALL folds in negotiated blocks and can be several times larger. NEGO and TUNAI select those boards alone.
investor_typeNoDefault ALL
resolve_namesNoAdd each broker's securities house as `name`, joined from the cached directory.
transaction_typeNoNET (default) nets each broker's buys against its sells; GROSS does not.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare this a safe read, and the description layers on substantial behavior beyond that: the server aggregates multi-date windows in one request, half-specified ranges are rejected, sell-side rows already carry negative signs, absent values mean unknown rather than zero, and name resolution is best-effort with a cache. It also flags the 'unreadable' envelope so the agent understands totals may miss rows.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is long but tightly sectioned (DATES, SIGNS, resolve), front-loaded with the core purpose, and every addition addresses a real failure mode an agent would otherwise hit. No filler or tautology.

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

Completeness5/5

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

For a 13-parameter tool with no output schema, this is unusually complete: it covers date edge cases, sign conventions, missing-data semantics, board selection, limit truncation, and the optional name enrichment behavior. An agent has enough to invoke it correctly and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description goes well beyond it by explaining the date-pair constraint, sign conventions for output rows, market_board 'ALL' being several times larger, default limit vs API truncation, and resolve_names semantics. This gives the agent enough to choose and populate parameters correctly without inspecting the schema alone.

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

Purpose5/5

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

The opening sentence names the verb/resource relationship ('Broker summary for an IDX stock') and enumerates the exact output dimensions: net buys/sells, lots, IDR value, and investor classification. Calling it 'the core bandarmology signal' gives the agent a clear inference target and separates it from generic quote/orderbook tools.

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

Usage Guidelines4/5

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

The description gives strong when-to-use context — bandarmology signal, no TradingView equivalent — and detailed call conventions (latest session if dates omitted, both dates required for history, weekend results are not errors). It does not explicitly name sibling alternatives such as broker_distribution or broker_activity and say when to choose them instead, so it stops short of a 5.

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

cash_balanceA
Read-only

Cash in the trading account, and the buying power that is not the same number. cashIdr is the balance. buyingPowerIdr is what an order can actually spend, which on an Indonesian retail account is routinely LARGER than the cash balance because of the trading limit. Use buying power to judge affordability; quoting cash where buying power was meant understates what the user can do, and the reverse overstates it. settlement breaks the balance into T+0/T+1/T+2 buckets when the balance/cash/info endpoint answered. Its absence with settlementUnavailable set means that second request failed, not that the account has no unsettled cash. Requires the trading session (stockbit-auth trading-login). IN PAPER MODE this reads a LOCAL LEDGER, not the brokerage, so NO trading session and NO PIN are needed however the line above reads — do not send the user to a terminal. The result says "PAPER ACCOUNT"; say so rather than reporting these figures as the user's actual account. PENDING VERIFICATION: this endpoint has not been observed live.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark the tool read-only and non-destructive, and the description adds substantial behavioral context: the cash-vs-buying-power distinction, settlement endpoint failure semantics, the trading-session requirement, paper-mode local-ledger behavior, and the explicit warning that the endpoint is pending verification. This is far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, every sentence earns its place: core distinction, field meaning, settlement edge case, authentication, paper-mode exception, and verification status. The structure front-loads the main purpose and then layers caveats, making the complexity navigable.

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

Completeness5/5

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

This is complete for a zero-parameter read tool: no invocation arguments are needed, and the description explains the meaning of results, failure conditions, authentication requirements, paper-mode behavior, and reliability status. Nothing an agent needs to call or interpret this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so there is no parameter documentation burden. The description still enriches understanding of the returned fields (`cashIdr`, `buyingPowerIdr`, `settlement`), which is useful even though it is not parameter-level semantics.

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

Purpose4/5

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

The description clearly identifies the tool as returning the trading account's cash balance and buying power, and it distinguishes the two concepts with `cashIdr` vs `buyingPowerIdr`. It lacks an explicit verb like 'retrieves' or 'reads', but the resource and meaning are unmistakable.

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

Usage Guidelines4/5

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

It gives concrete application guidance: use buying power to judge affordability, treat settlement absence with `settlementUnavailable` as a failed second request, and in paper mode read the local ledger rather than requiring a session. It does not name sibling tools as alternatives, but it states clear preconditions and exclusions.

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

financialsA
Read-only

Financial statements (structured tables; the large HTML report is stripped). data_type/report_type/statement_type are integer selectors matching Stockbit's UI toggles.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker
data_typeNo
report_typeNo
statement_typeNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive, and the description adds useful behavioral context: the large HTML report is stripped and results are delivered as structured tables. It also explains that the integer selectors mirror Stockbit's UI toggles. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence with no filler. It front-loads the output format and then clarifies the parameter semantics, making every part useful in a compact form.

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

Completeness3/5

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

For a four-parameter read-only tool with no output schema, the description gives the return shape (structured tables) and basic selector semantics, but it lacks actual selector values and default behavior. It is sufficient for a basic symbol-only call but incomplete for correct optional-parameter usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only symbol is described in the schema (25% coverage), so the description partially compensates by stating that data_type, report_type, and statement_type are integer selectors matching Stockbit's UI. However, it does not enumerate valid values or explain what each selector controls, which remains a significant gap.

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

Purpose4/5

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

The description identifies the resource as financial statements and clarifies that the output is structured tables after stripping the HTML report. It is distinguishable from siblings like ratios, keystats, and technicals, though it lacks an explicit verb such as 'retrieves' or 'returns'.

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

Usage Guidelines2/5

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

No when-to-use guidance or alternative routing is provided. The description neither names sibling tools nor states conditions under which financials is preferred over ratios, keystats, or other related tools. Usage context is only implied by the tool name and the phrase 'financial statements'.

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

keystatsB
Read-only

Key statistics for a company (valuation, size, performance metrics).

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already establish readOnlyHint, openWorldHint, and destructiveHint=false, and the description adds no behavioral detail beyond that. It does not mention return format, data range, units, or any operational caveats, so the description carries little transparency burden and adds no extra behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. The parenthetical 'valuation, size, performance metrics' efficiently communicates the core output categories without redundant wording.

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

Completeness3/5

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

The tool is simple with one well-documented parameter and a readOnly annotation, so the description does not need extensive detail. However, with no output schema and several similar sibling tools, the absence of more specific metrics or a differentiation hint leaves a meaningful ambiguity gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the single parameter 'symbol' as an 'IDX ticker,' with 100% schema description coverage. The tool description adds no additional parameter meaning, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description identifies the resource as 'a company' and the nature of the data as 'valuation, size, performance metrics,' which conveys what the tool returns. It lacks an explicit verb like 'retrieves' or 'provides,' and it does not explicitly differentiate itself from similar siblings like financials or ratios, but the parenthetical categories give useful scope.

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

Usage Guidelines2/5

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

No guidance is given about when to use keystats versus related tools such as financials, ratios, or quote. The description implies a data-retrieval purpose but provides no context for selection, no alternatives, and no exclusions.

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

loginA
Idempotent

Open a browser window so the user can sign in to Stockbit. Nothing else here works until they have. ASK THE USER FIRST, then call with confirm: true. This opens a real, visible window on their machine; where the client supports elicitation they are also asked directly. It returns in about a second, BEFORE the login finishes — a person takes minutes and every client has a tool-call timeout. Tell them to sign in in the window that opened, then call status to see whether it worked. Do not call this again while status says a login is in progress. The captured token goes straight to the keychain (or the encrypted file store off macOS). It is never returned here and never shown to you. If the browser is ALREADY signed in to Stockbit, it no longer waits fifteen minutes for a form that will never appear: it reads the credential out of the browser's own session and finishes in seconds, and if there is nothing usable there it signs that profile out and re-opens the login page. A credential read out of the browser that way is PROVEN against Stockbit before status calls it captured — nothing logged in, so its expiry says nothing about whether it works. That proof rotates the token, which stales the browser session the chartbit tools drive; a login that showed a real form is trusted without it. switch_account: true is for signing in as a DIFFERENT account — it clears the browser's Stockbit session first and never reuses what was there. Ask the user before using it; it signs them out of Stockbit in that browser profile. Refuses when STOCKBIT_NO_BROWSER is set (to anything but 0/false/no/off), and names the terminal command instead. It also refuses if a session is already stored, unless force: true (which switch_account implies). This does NOT log in to the trading account: that needs a 6-digit PIN typed at the user's own terminal via stockbit-auth trading-login, and no tool here accepts a PIN.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoLog in again even though a session is already stored.
confirmYesMust be true, and only after asking the user in words.
reap_orphansNoIf the browser exits immediately because something already holds the saved profile, end those processes and retry once. For the case where a previous login left browser processes behind and every login since has failed to open a window. ASK THE USER FIRST. It cannot tell an abandoned process from a working one — a browser that is fine answers the debugging port it was started with, not the new one this checks — so it ends EVERY process holding that profile, including a chart window the chartbit tools left open and are still using.
fresh_profileNoUse a throwaway browser profile instead of the saved one — nothing carried over, so the user re-enters password and OTP. For a profile that is corrupt or held open by another process. To sign in as a different account, use switch_account instead. IT DOES NOT FIX THE CHART TOOLS: the throwaway profile is discarded, so the API session starts working while the saved profile the chartbit tools actually drive stays signed out — every chartbit tool keeps failing until a login runs WITHOUT this. Prefer reap_orphans for a profile merely held open.
switch_accountNoSign the current Stockbit account OUT of the browser profile first, then show a real login form. For logging in as someone else. Implies force.

TDQS

A4.2/5.0
Behavior1/5

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

Although the description discloses timing, token storage, browser-session behavior, proof/rotation, and process termination, it contradicts the annotations. The annotations state destructiveHint=false, yet the description says the tool can sign the profile out, clear the browser's Stockbit session, and with reap_orphans end every process holding the profile, including chart windows still in use. Per the rubric, a direct annotation contradiction forces a score of 1 regardless of otherwise rich disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries necessary safety, sequencing, or side-effect information. It is front-loaded with the core action and the mandatory 'ASK THE USER FIRST' instruction. Despite its length, there is no filler or repetition; 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.

Completeness5/5

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

Given the tool's complexity, multiple boolean parameters, external browser side effects, and no output schema, the description is complete. It covers the async return timing, the token destination, the status check follow-up, environment-variable refusal, non-trading PIN exclusion, and all parameter edge cases. Nothing needed for safe invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, and the description adds substantial meaning beyond the schema: confirm must be user-approved in words, force bypasses an existing stored session, switch_account implies force and signs the user out, fresh_profile does not fix chart tools, and reap_orphans can kill healthy processes. This goes well beyond baseline parameter documentation.

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

Purpose5/5

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

The description opens with a specific action and resource: 'Open a browser window so the user can sign in to Stockbit.' It also clearly separates this from the trading-account login by stating no tool accepts a PIN, which distinguishes it from trading-related siblings. This is unambiguous and immediately usable.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use and when-not-to-use guidance: ask the user first and pass confirm: true, call status afterward, do not call again while a login is in progress, use switch_account for a different account, and use the terminal command for the trading PIN. It also names refusal conditions and the force/switch_account interaction. This is comprehensive alternative-handling.

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

logoutA
DestructiveIdempotent

Clear stored Stockbit credentials from this machine. ASK THE USER FIRST, then call with confirm: true. There is no undo: logging back in means signing in again in a browser (and, for the trading session, re-entering the 6-digit PIN at a terminal). scope picks what to clear — main (market data), trading (the securities session, which is also ended at Stockbit's end), eipo, or all (the default). Any scope covering main also clears the stored WEBSITE session (the browser cookies the chart tools run on) and the shared access-token cache. Both are usable Stockbit credentials on their own, so a logout that left them would not be one. remove_browser_profile: true also deletes the saved browser profile. That profile is a SECOND copy of the session — it holds Stockbit cookies — so on a shared or lost machine, clearing the token without it is not really logging out.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoWhat to clear. Default `all`.
confirmYesMust be true, and only after asking the user in words.
remove_browser_profileNoAlso delete the saved browser profile, which holds Stockbit cookies. Default false.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the destructiveHint and readOnlyHint annotations, the description discloses irreversible side effects, the need to re-enter a PIN for trading, clearing of website cookies and shared token caches, and the separate browser profile copy. This gives the agent a full picture of consequences the annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the purpose is front-loaded, the mandatory user confirmation is highlighted first, and each subsequent sentence explains a necessary consequence or parameter behavior. It is long but tightly packed with safety-critical information.

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

Completeness5/5

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

For a destructive, three-parameter, no-output-schema tool, the description fully covers prerequisites, parameter choices, hidden side effects, and irreversibility. Nothing an agent needs to safely invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While schema coverage is 100%, the description adds significant meaning: scope 'main' also clears website cookies and token cache, 'trading' ends the session at Stockbit, and remove_browser_profile deletes a second copy of credentials. This goes well beyond the schema's short parameter descriptions.

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

Purpose5/5

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

The description opens with the specific, actionable statement 'Clear stored Stockbit credentials from this machine', establishing the exact verb and resource. It further differentiates the tool from siblings like login by describing scopes and destructive effects.

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

Usage Guidelines4/5

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

It gives explicit usage guidance: 'ASK THE USER FIRST, then call with confirm: true' and explains what each scope does. It does not explicitly contrast with sibling login, but the purpose and invocation conditions are clear enough for an agent to decide when to call it.

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

market_moversA
Read-only

The market movers behind Stockbit's own Movers dialog — the market-wide ranking. This is a DIFFERENT endpoint from top_movers, which reads the hotlist, and the difference is not cosmetic: measured 2026-09-01, the hotlist served NINE symbols while this served FIFTY, including structured warrants. Different universes. A symbol in one and not the other is expected, and a disagreement is not evidence that either is wrong. For a market-wide ranking, this is the one to use. view selects the tab, and the vocabulary is CLOSED to the eight members the server was seen to accept: topGainer, topLoser, topValue, topVolume, topFrequency, netForeignBuy, netForeignSell, bigMoneyNetValue. Each was echoed back verbatim on 2026-09-01, against a control value that answers 400 — so this endpoint rejects members it does not know rather than silently serving its default, which is what makes the echo trustworthy. The result's view is that echo: what the server says it SERVED, not what you asked for. The UI's ninth tab, IEP/IEV, is NOT a view — ten spellings of it were refused. It is a field: every row carries iepIev with the indicative equilibrium price and volume. Those are only meaningful during pre-opening (08:45-09:00 WIB) and read zero outside it. limit is honoured, but the service caps the answer at 50 rows however large it is. page is ignored, and the payload's own pagination block reads all zeros on every call, so it is not reported rather than passed through as a fake answer about whether more rows exist. Every row carries readFrom naming the wire key each value came from, unmappedKeys for anything this projection does not recognise, and the raw row. foreign says which session the net-foreign figures are from. foreign.isShown is the service's own flag for whether they mean anything yet: it reads false intraday and true after the ~18:00 WIB broker release on the same day. Foreign figures carrying yesterday's date before that release are correct and unpublished, not stale. An empty list is normal outside trading hours, though this endpoint served 50 rows with the market shut.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoWhich tab. Omitted takes the server's default view — read `view` to see which.
limitNoMax rows. Honoured, but capped at 50 by the service. Omitted takes its default.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral detail beyond that: the server caps `limit` at 50, ignores `page`, returns a `view` echo reflecting what was served, rejects unknown view members with 400, and has meaningful state semantics for `iepIev` and `foreign.isShown`. It even explains when empty results are expected. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but nearly every sentence earns its place by revealing hard-won behavioral facts that are not available from the schema or annotations. It is front-loaded with the core purpose and sibling distinction, then moves into parameter semantics and timing edge cases. Slightly dense, but not padded.

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

Completeness5/5

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

For a tool with no output schema, the description is unusually complete: it covers the full `view` vocabulary, server rejection behavior, limit cap, ignored `page`, zeroed pagination block, foreign session timing, pre-opening semantics, and normal empty results. An agent has everything needed to call this tool correctly and interpret its response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description goes well beyond that by fixing the `view` vocabulary to eight accepted members, warning that ten IEP/IEV spellings were refused, and stating that `limit` is honored but capped at 50. It adds behaviorally important semantics like the echo behavior and the meaning of omitted `view`.

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

Purpose5/5

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

Opens with a specific, unambiguous statement: it is the market-wide ranking behind Stockbit's Movers dialog. It names the sibling it is not (top_movers), explains the operational difference (hotlist vs market-wide, 9 vs 50 symbols), and closes with a direct routing instruction. No ambiguity remains about what resource this tool addresses.

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

Usage Guidelines5/5

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

Explicitly contrasts with top_movers: 'the hotlist served NINE symbols while this served FIFTY' and states 'For a market-wide ranking, this is the one to use.' It also tells the agent when an empty list is normal, and describes the closed vocabulary of `view` values. This gives clear selection criteria versus the sibling.

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

market_sessionA
Read-only

Where the IDX trading day currently is: pre-opening, session 1, the midday break, session 2, post-closing, or shut. Call this BEFORE concluding that an empty movers list, a still order queue or a silent tape means something is broken. Outside 09:00-16:00 WIB (Mon-Fri, excluding IDX holidays) every live feed in this server is legitimately empty. Takes no arguments and is cached for 5 seconds only, because a stale session flag makes every judgement built on it wrong. PENDING VERIFICATION: this response shape has not been observed live.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

On top of readOnlyHint/openWorldHint annotations, the description discloses that the tool is cached for only 5 seconds and explains why staleness matters. The 'PENDING VERIFICATION' note is an unusual but valuable disclosure about reliability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences each carry distinct information: purpose, usage, cache behavior, and confidence status. The most decision-relevant fact (what session it is) is front-loaded, and there is no redundancy.

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

Completeness5/5

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

For a parameterless status tool with no output schema, the description provides the full set of possible return states, timezone/hours, and a caution about stale values. An agent has everything it needs to decide when and how to use this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and the schema already covers this fully; the description simply confirms 'Takes no arguments'. Per the baseline for no parameters, this is sufficient and adds no unnecessary detail.

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

Purpose5/5

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

The description leads with a precise statement of what the tool reports — the current IDX trading session among six enumerated states — and names the resource ('the IDX trading day'). This is specific enough to distinguish it from generic 'status' or 'trading_status' siblings, even without naming them.

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

Usage Guidelines5/5

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

It explicitly instructs when to call it ('BEFORE concluding that an empty movers list, a still order queue or a silent tape means something is broken') and gives operational context about WIB hours and holidays. It also warns about the 5-second cache, which tells the agent to re-call it frequently.

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

newsA
Read-only

News posts, market-wide or for one symbol. There is no separate news endpoint: news IS the stream with category=STREAM_CATEGORY_NEWS, and the Stockbit symbol page's News tab is exactly this call with a symbol. So news routes to the per-symbol stream when given a symbol and to the market-wide one when not, and fixes the category — pass stream a category instead if you want anything else. This is community- and media-written Indonesian text, not market data. Use it for sentiment and as a pointer to a source; never quote a price, a ratio or an earnings figure from a post. Headlines are Indonesian-language and mostly link out to the publisher; the link, image and publisher fields are not named by this projection, so read raw for them. from_date/to_date are YYYY-MM-DD and calendar-checked. Paging is a CURSOR, not an offset: there is no page number or offset. Take nextCursor from the result and send it as last_stream_id to get the rows AFTER the ones you have seen; calling again without it returns the same rows. nextCursor is null when the page is empty or its last row carried no id, which means the walk cannot be continued rather than that it has ended. An empty items with a non-null source is a genuine zero — a quiet symbol or a narrow keyword — and not a reason to retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows. Omitted = Stockbit's own page size.
symbolNoIDX ticker, e.g. BBRI. Omit for market-wide news.
keywordNoFull-text search over headlines and body.
to_dateNoYYYY-MM-DD, inclusive
from_dateNoYYYY-MM-DD, inclusive
last_stream_idNoCursor: the `nextCursor` from the previous page.

TDQS

A5/5.0
Behavior5/5

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

The annotations already declare readOnlyHint true and destructiveHint false, but the description adds substantial behavioral context: this is Indonesian-language community/media content, not market data; the projection drops link/image/publisher fields so `raw` must be read; date parameters are calendar-checked; and pagination is cursor-based with nuanced `nextCursor` semantics. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: purpose, sibling relationship, content caveats, parameter semantics, cursor pagination, and empty-result interpretation. It is front-loaded with the core purpose and routes to the correct sibling early, avoiding buried critical details.

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

Completeness5/5

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

For a tool with no output schema, the description is remarkably complete. It explains returning fields that are absent from the projection (`raw`, `source`, `nextCursor`), how to continue pagination, how to recognize a genuine zero result, and why a null cursor does not mean the stream has ended. An agent has enough context to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, yet the description still adds meaning beyond the schema: `symbol` presence controls per-symbol vs market-wide routing; omitting `limit` uses Stockbit's default page size; `from_date`/`to_date` are inclusive and calendar-validated; and `last_stream_id` is explicitly tied to the `nextCursor` returned from a prior page. The cursor behavior is far richer than the schema's one-line description.

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

Purpose5/5

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

The opening line names the resource ('news posts') and the two scopes ('market-wide or for one symbol') with a concrete verb. It explicitly relates to the sibling `stream` by stating that news is the stream with STREAM_CATEGORY_NEWS, which distinguishes it from adjacent tools.

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

Usage Guidelines5/5

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

The description gives explicit routing rules: use `news` with a symbol for per-symbol news and without one for market-wide news, and direct the agent to `stream` with a custom category for anything else. It also frames appropriate usage as sentiment/pointer content and explicitly warns against quoting prices, ratios, or earnings figures from posts.

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

orderbookA
Read-only

Full order-book depth ladder for a symbol. UNITS, AND THEY ARE MIXED IN ONE RESPONSE. volume here is SHARES (e.g. 3,545,526,000) while technicals' volumeLots for the same symbol and session is LOTS (35,488,071). They reconcile at exactly 100 shares per lot — the IDX lot size — and neither figure is wrong. Worse, this same payload labels its total_bid_offer depth figures lot while carrying volume in shares a few keys away. Two units under similar names in one response is a silent-wrong-answer generator: check which one you are holding before comparing anything, and never compare volume here against volumeLots there without the ×100. market_data[] carries the per-board split (All Market / Regular / Nego / Cash). It is also the answer for anything price_market looks like it should do — that route cannot be called. FOREIGN FLOW HAS NO DATE ON THIS PAYLOAD. fbuy/fsell/fnet arrive with nothing saying which session they are from, and foreign flow publishes at roughly 18:00 WIB, so before that release they are the PREVIOUS session's. price_bands surfaces this as an explicitly null dataAsOf with a note; market_movers carries the date for real as foreign.sessionDate.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker

TDQS

A4/5.0
Behavior5/5

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

The description goes far beyond annotations by disclosing mixed units in one response, the shares-vs-lots reconciliation, stale foreign flow before 18:00 WIB, and the dead price_market route. These are exactly the behavioral traps an agent needs to know and that annotations cannot capture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is crisp and front-loaded, but the rest is a dense, sprawling warning block with capitalized emphasis and repeated caveats. The content is relevant, but it would benefit from structured bullets or headings; it is not concise despite being informative.

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

Completeness4/5

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

With no output schema, the description covers the most dangerous interpretation hazards: units, foreign-flow dating, per-board market_data, and the unavailable price_market route. It does not enumerate the actual order-book fields such as bid/ask levels, but the opening phrase plus warnings provide enough to call and parse the tool cautiously.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter, symbol, described as 'IDX ticker', so schema coverage is 100%. The description adds no additional meaning to the parameter itself, so the baseline of 3 applies.

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

Purpose4/5

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

The opening sentence identifies a specific resource: the full order-book depth ladder for a symbol. It is clear that this is not a quote or summary endpoint, though it does not explicitly contrast itself with sibling tools in the core statement.

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

Usage Guidelines4/5

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

The description gives actionable routing guidance: it says market_data[] is the answer for what price_market should do and that price_market cannot be called. It also points to market_movers as carrying a real foreign-flow date, which helps an agent choose where to look. It stops short of framing explicit when-to-use/not-use rules for orderbook itself.

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

ordersA
Read-only

Orders currently on the book: what is working, what is partially filled, what was rejected. Pass symbol to filter to one stock. request echoes the filter that was actually sent, so an empty result can be told apart from a filter that did not apply. side is buy or sell only when the wire said so in a word this server recognises; sideRaw always carries what it actually said. If side is absent, quote sideRaw rather than guessing the direction of someone's order. Requires the trading session (stockbit-auth trading-login). IN PAPER MODE this reads a LOCAL LEDGER, not the brokerage, so NO trading session and NO PIN are needed however the line above reads — do not send the user to a terminal. The result says "PAPER ACCOUNT"; say so rather than reporting these figures as the user's actual account. PENDING VERIFICATION: this endpoint has not been observed live.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolNoIDX ticker to filter by, e.g. BBRI. Omit for all open orders.

TDQS

A4.1/5.0
Behavior5/5

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

The description substantially enriches the annotations by disclosing that paper mode reads a local ledger rather than the brokerage, that no session or PIN is needed in that mode, that the result contains a 'PAPER ACCOUNT' marker, and that the endpoint is pending verification. These are meaningful behavioral traits beyond the safe-read-only profile conveyed by the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries necessary operational detail, especially given the absence of an output schema. It is front-loaded with the core purpose and then expands into filtering, response-field interpretation, auth, paper mode, and verification status. Mildly, the paper-mode section is dense and could be structured more cleanly, but the content justifies the length.

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

Completeness5/5

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

For a single-parameter, no-output-schema tool, this description is remarkably complete: it explains the order statuses returned, how filtering is reflected in `request`, how to interpret `side` vs `sideRaw`, the authentication requirement, the paper-mode exception, and the unverified status. An agent has enough context to call the tool and interpret its result correctly without additional schemas.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents `symbol` with an IDX ticker example and 'omit for all open orders,' so the description adds little beyond restating 'filter to one stock.' The extra detail about `request`, `side`, and `sideRaw` concerns response fields rather than the input parameter, so it does not raise the parameter-sematics score above the baseline.

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

Purpose4/5

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

The description identifies the resource as open orders and their statuses ('working', 'partially filled', 'rejected'), which makes the tool's purpose clear. It lacks an explicit verb like 'list' or 'retrieve' and does not explicitly contrast it with the sibling `orderbook`, but the status vocabulary makes it clear this concerns user orders rather than market depth.

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

Usage Guidelines4/5

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

It gives concrete usage instructions: pass `symbol` to filter, quote `sideRaw` when `side` is absent, and handle paper mode without sending the user to a terminal. It does not explicitly name alternative tools or state when this should be preferred over siblings, but the context and exclusions are clear enough.

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

patternsA
Read-only

Candlestick patterns on an IDX stock's daily bars — 16 classic formations with the prior trend they were read against. The prior trend is PART of the pattern, not decoration: a hammer and a hanging man are the same candle, as are an inverted hammer and a shooting star, and only what came before them tells the two apart. Set ignore_context to see the raw shapes anyway. confidence scores how closely the candle matches the TEXTBOOK PROPORTIONS. It is not a probability, it is not backtested, and it says nothing about what happened next — use backtest for that question.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNo
barsNoSessions to search (default 120)
fromNo
onlyNoRestrict to these pattern ids
sinceNoOnly the last N sessions
symbolYesIDX ticker, e.g. BBRI
ignore_contextNoReport reversal shapes regardless of prior trend. Default false.
min_confidenceNo0-1, default 0.5

TDQS

A4.6/5.0
Behavior5/5

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

Going well beyond the annotations, the description explains a subtle behavioral trait: same candle shapes can be different patterns depending on prior trend. It also clarifies that `confidence` measures textbook proportionality, not probability or predictive success, and warns it is not backtested. This is valuable behavioral context that the schema and annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: a clear one-line summary is followed by the most important interpretive caveat, then the confidence semantics. Every sentence earns its place, and the most actionable guidance is front-loaded.

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

Completeness4/5

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

Given 8 parameters, no output schema, and a nuanced detection model, the description covers the key decisions an agent needs: what patterns are, how context affects them, what confidence means, and where to go for predictive analysis. It does not describe the full output shape or enumerate the 16 pattern IDs, which would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high at 75%, and the description adds meaningful semantics for `ignore_context` by explaining that it shows raw shapes regardless of prior trend. It also clarifies what `confidence` means, which relates to `min_confidence`. However, the description does not add detail for the undocumented `to` and `from` date parameters, or explain how `bars` and `since` interact.

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

Purpose5/5

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

The description clearly identifies the tool's function: detecting candlestick patterns on an IDX stock's daily bars, listing 16 classic formations and the prior trend used for interpretation. It differentiates itself from the sibling `backtest` by explicitly stating that pattern confidence is not predictive and that predictive questions should go to `backtest`.

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

Usage Guidelines4/5

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

The description gives strong usage context: it explains how prior trend affects pattern meaning, how to override it with `ignore_context`, and explicitly directs users to `backtest` when they care about forward-looking performance. It does not enumerate all alternative sibling tools or state when not to use this tool versus technicals, so it stops short of a 5.

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

portfolioA
Read-only

The user's ACTUAL stock holdings at Stockbit Sekuritas — what they own right now, at what average price, and what it is worth. This is the account, not a watchlist: watchlist is a list of symbols someone is following, this is money at risk. Read it before offering any opinion that touches position sizing, concentration or whether to add. An opinion about BBRI means something different to someone holding 40% of their portfolio in it. totals carries the account-level figures from the summary endpoint. If the summary request fails the holdings are still returned and totalsUnavailable says why — do not report the portfolio as unreadable in that case. LOTS AND SHARES: 1 lot = 100 shares. Each is reported only when a wire key whose name says which one carried it; derived lists any that this server computed from the other. A derived figure is arithmetic, not a reading. Requires the trading session (stockbit-auth trading-login). IN PAPER MODE this reads a LOCAL LEDGER, not the brokerage, so NO trading session and NO PIN are needed however the line above reads — do not send the user to a terminal. The result says "PAPER ACCOUNT"; say so rather than reporting these figures as the user's actual account. PENDING VERIFICATION: this endpoint has not been observed live.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this as readOnly, but the description adds substantial behavioral context beyond that: summary-endpoint failure still returns holdings with `totalsUnavailable`, lots are reported only when a wire key names them, derived figures are arithmetic rather than reads, and the entire endpoint is flagged as "PENDING VERIFICATION: this endpoint has not been observed live." It also discloses that paper mode reads a local ledger instead of the brokerage, which is exactly the kind of behavioral nuance an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is long, every sentence adds distinct value: scope, watchlist contrast, usage guidance, totals behavior, lot conversion, auth requirement, paper-mode caveat, and verification status. It is front-loaded with the core definition and structured with labeled paragraphs that make scanning easy. No filler sentences are present.

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

Completeness5/5

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

For a tool with no input schema and no output schema, the description is remarkably complete. It covers what data is returned, the distinction from watchlist, failure modes, units (lots vs shares), authentication requirements, paper-mode behavior, and the verification status of the endpoint. An agent can call this tool and correctly interpret its results without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema is empty and schema_description_coverage is trivially 100%. With no parameters to document, the description carries no parameter-semantics burden. The baseline 4 applies because there is nothing the description needs to add.

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

Purpose5/5

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

The description opens with a precise definition: "The user's ACTUAL stock holdings at Stockbit Sekuritas — what they own right now, at what average price, and what it is worth." It explicitly distinguishes this from a watchlist, naming the sibling tool and clarifying that this tool represents actual money at risk. The purpose is unambiguous and immediately differentiates it from related tools.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: "Read it before offering any opinion that touches position sizing, concentration or whether to add." It also clarifies when not to use it versus watchlist with a concrete example about BBRI concentration. Paper-mode usage and the trading-session requirement are spelled out, leaving no ambiguity about when this tool should be invoked.

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

positionA
Read-only

ONE symbol's position: how much of it the user holds, at what average price, and what it is worth now. Cheaper than portfolio when the question is about a single stock. holding: null means the account holds none of this symbol. That is a normal answer and the correct one to relay — it is not an error and not a failed lookup. Requires the trading session (stockbit-auth trading-login). IN PAPER MODE this reads a LOCAL LEDGER, not the brokerage, so NO trading session and NO PIN are needed however the line above reads — do not send the user to a terminal. The result says "PAPER ACCOUNT"; say so rather than reporting these figures as the user's actual account. PENDING VERIFICATION: this endpoint has not been observed live.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker, e.g. BBRI

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as read-only, and the description adds substantial behavioral detail beyond that: `holding: null` is a normal non-error result, paper mode reads a local ledger rather than the brokerage, the response may indicate 'PAPER ACCOUNT', and the endpoint is flagged as pending verification. This tells the agent how to interpret the result and what caveats to relay, which is more than the annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then covers null semantics, authentication requirements, paper-mode behavior, and verification status. Given the unusual edge cases involved, every sentence earns its place; there is no filler or repetition that could be removed without losing important guidance.

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

Completeness5/5

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

With one parameter, no output schema, and annotations already indicating a safe read operation, the description covers the important contextual gaps: what the result means, what a null holding means, when authentication is and is not needed, how paper-mode results should be communicated, and the endpoint's unverified status. An agent has enough information to use the tool correctly and interpret its response accurately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents `symbol` as an IDX ticker with the example BBRI. The description adds the conceptual context that the tool is specifically about one symbol's position, but it does not add meaningful parameter-level details beyond what the schema already provides. The baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a precise statement: it reports one symbol's position — quantity held, average price, and current value. It also distinguishes itself from the sibling `portfolio` tool by noting it is cheaper for single-stock questions, so an agent can tell them apart immediately.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool ('when the question is about a single stock') and names the alternative (`portfolio`). It also gives clear conditional guidance: live mode requires a trading session, while paper mode reads a local ledger and requires no session or PIN, with an explicit instruction not to send the user to a terminal. This leaves no ambiguity about the invocation context.

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

position_sizeA
Read-only

How many lots to buy, given what you are willing to lose. Pure arithmetic — it reads no account, checks no buying power, and places nothing. Give entry_price, stop_price (which must be BELOW the entry — IDX retail has no short selling), and EITHER risk_idr OR account_idr with risk_pct. Not both: they can disagree. Lots are floored, never rounded up, so the risk is at most the number you gave. Returns the position value, what is actually at risk after flooring, the round-trip commission, the break-even price with commission included, and 1R/2R/3R targets on the tick grid. It CHECKS that entry and stop sit on the IDX price grid — an off-grid limit is rejected by the exchange rather than rounded — and, if you pass ara and arb from price_bands, that neither is outside today's auto-rejection band. Commission defaults to the published retail rate (0.15% / 0.25%) and feeSource says so; pass fee_buy_pct and fee_sell_pct, or read them from trading_info, for this account's. This is a plan, not a permission. Use order_preview for the real checks — buying power, tradability, and the caps in the trading policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
araNoToday's ceiling, from price_bands.
arbNoToday's floor, from price_bands.
max_lotsNoNever suggest more lots than this.
risk_idrNoRupiah you are willing to lose. Or use account_idr + risk_pct.
risk_pctNoPercent of the account to risk, e.g. 1.
stop_priceYesWhere you would get out. Must be below entry_price.
account_idrNoAccount value, with risk_pct.
entry_priceYesLimit price you would buy at, in IDR.
fee_buy_pctNoBuy commission percent. Default 0.15.
fee_sell_pctNoSell commission percent. Default 0.25.

TDQS

A5/5.0
Behavior5/5

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

Even though annotations already declare readOnlyHint=true and destructiveHint=false, the description adds substantial behavioral context: it has no side effects, performs no account reads, floors lot sizes, checks the IDX price grid, rejects off-grid limits, and does not place orders. It also discloses commission defaults and the `feeSource` behavior. This far exceeds the baseline set by 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and remains information-dense without redundancy. Each sentence contributes a distinct constraint, default, return value, or routing instruction. Given the 10-parameter complexity and absent output schema, the length is justified and well-organized.

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

Completeness5/5

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

With no output schema, the description compensates by enumerating the return contents: position value, actual risk after flooring, round-trip commission, break-even price, and 1R/2R/3R targets. It also covers prerequisites, parameter relationships, grid-check behavior, fee defaults, and the boundary between planning and permission. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description meaningfully enhances parameter understanding. It explains the mutual exclusivity of `risk_idr` versus `account_idr` + `risk_pct`, the requirement that `stop_price` be below `entry_price`, the flooring behavior of lot sizes, the source of `ara`/`arb` from `price_bands`, and the default/override semantics of fee parameters. This goes well beyond the raw schema descriptions.

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

Purpose5/5

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

The description opens with a specific, actionable statement: 'How many lots to buy, given what you are willing to lose.' It clearly identifies the tool as pure arithmetic that 'reads no account, checks no buying power, and places nothing,' and differentiates it from order execution by naming `order_preview` as the real-check alternative. This is a clear verb+resource pairing that distinguishes it from siblings.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use and when-not-to-use guidance: 'This is a plan, not a permission. Use `order_preview` for the real checks — buying power, tradability, and the caps in the trading policy.' It also explains the conditional parameter paths (`risk_idr` OR `account_idr` + `risk_pct`) and points to `price_bands` and `trading_info` for required inputs, leaving no ambiguity about how to select and invoke it.

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

price_bandsA
Read-only

The IDX auto-rejection band (ARA/ARB) and the session's foreign flow for a stock. A stock at its ARA has no seller at any price and one at its ARB has no buyer — "1,200 and rising" means something different when 1,200 IS the ceiling. Costs no extra request: these fields already arrive inside the orderbook response. A field that was not in the payload is reported as null and named in missing, never as zero — zero is a real value for foreign net flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker, e.g. BBRI

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses important behavior: missing fields are reported as null and named in `missing`, never as zero, because zero is a real value for foreign net flow. It also explains the semantic meaning of ARA and ARB, which helps an agent interpret results correctly. This is exactly the kind of nuance annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences: the definition comes first, an illustrative ARA/ARB interpretatoin sentence second, and the null-vs-zero caveat last. Every sentence earns its place and there is no filler.

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

Completeness4/5

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

For a one-parameter, read-only tool with full schema coverage, the description is largely complete and explains the key behavioral gotchas. It could be slightly more explicit about the exact response shape, but it discloses the most important missing-field behavior and where the data comes from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents the single `symbol` parameter as 'IDX ticker, e.g. BBRI' with 100% coverage, so the baseline of 3 applies. The description adds no extra parameter-level detail beyond reinforcing that the data is per-stock.

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

Purpose4/5

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

The description clearly identifies the resource: IDX ARA/ARB auto-rejection bands plus the session's foreign flow for a stock. It is specific and meaningful, but it lacks an explicit action verb like 'get' or 'retrieve'. It also only indirectly distinguishes itself from the orderbook sibling by noting the data comes from the orderbook response.

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

Usage Guidelines4/5

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

The description gives clear context: use this tool to access ARA/ARB and foreign flow data for a stock, and notes that these fields already arrive inside the orderbook response at no extra request cost. It does not explicitly state when to prefer price_bands over orderbook or list exclusions, but the context is still strong.

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

price_chartA
Read-only

Candlestick chart for an IDX stock, ALWAYS rendered as an SVG: daily candles with volume, optional overlays (SMA/EMA/Bollinger) and sub-panels (RSI, MACD), plus support/resistance levels drawn on. Returns the image AND writes a .svg, reporting the path in savedTo. Use technicals for the numbers; this is the picture. annotations draws your own levels, zones, trend lines and markers, which is how you show the evidence behind an analysis. Drawing happens on this render only — nothing is written to the Stockbit account. The result counts yours and this tool's apart. autoLevels is the support/resistance this tool detected itself (show_levels, on by default); annotationsDrawn counts YOUR annotations by kind — level, zone, trend, marker — so you can confirm each one landed. annotationsNotDrawn names the ones that did not, by their index in your array and why: a date outside the plotted window, or a kind that arrived without the fields it needs. It is never silently empty about something that was skipped. Whenever this draws, it also opens the symbol's Stockbit chart in the user's own default browser so they can compare the drawing against the live chart in their own session. stockbitUrl in the result is that page; pass open_in_stockbit: false to skip opening it.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest session, YYYY-MM-DD
barsNoSessions to plot (default 120)
fromNoEarliest session, YYYY-MM-DD
themeNoDefault dark
panelsNoSub-panels below price. Default rsi.
symbolYesIDX ticker, e.g. BBRI
browserNoBrowser to open Stockbit in, by name, e.g. "Edge". Defaults to STOCKBIT_WEB_BROWSER, else the OS default.
overlaysNoPrice overlays. Default sma20 + sma50.
save_pathNoWhere to write the .svg. Defaults to charts/ inside the store (~/.stockbit, or $STOCKBIT_STORE_DIR).
annotationsNoYour own drawings on top of the chart. Same shape chartbit_draw takes.
show_levelsNoDraw support/resistance from pivot clustering. Default true.
show_volumeNoDefault true
open_in_stockbitNoOpen the symbol's Stockbit chart in the user's browser. Default true.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint, openWorldHint, and destructiveHint, and the description adds substantial beyond-annotation context: the tool always writes a .svg and reports savedTo, opens a browser by default, draws only on this render without writing to the Stockbit account, and reports annotationsDrawn/annotationsNotDrawn rather than silently dropping input. This is far more transparent than the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense and front-loaded: purpose first, then usage routing, then side effects and result semantics. Every sentence conveys useful operational information, though a shorter version could integrate the annotation-counting explanation more tightly.

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

Completeness5/5

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

For a tool with 13 parameters and no output schema, the description covers the key missing context: SVG output, savedTo reporting, local file side effect, browser-opening behavior, auto-detected levels versus user annotations, and failure reporting. An agent has enough to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying the roles of `annotations`, `show_levels`/`autoLevels`, and `open_in_stockbit`, and by explaining how annotation failures surface in the result. It does not redundantly re-list every property, so it earns above baseline.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Candlestick chart for an IDX stock, ALWAYS rendered as an SVG.' It clearly distinguishes itself from siblings by saying 'Use `technicals` for the numbers; this is the picture,' which lets an agent pick the right tool without inferring from schema.

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

Usage Guidelines5/5

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

The description explicitly names the main alternative ('Use `technicals` for the numbers; this is the picture') and gives concrete guidance on when to use annotations for user-drawn evidence. It also explains the open_in_stockbit behavior so the agent can decide whether to suppress that side effect.

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

quoteA
Read-only

Real-time quote for an IDX symbol: last price, change, and best bid/offer. Also resolves the symbol's internal company id.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker, e.g. BBRI, or index e.g. IHSG

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is established. The description adds useful behavioral detail by specifying the output components and the side-effect-free resolution of an internal company id, which is beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The primary purpose is front-loaded, and the secondary behavior (internal company id resolution) is appended as a short, useful note.

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

Completeness4/5

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

The tool has one required parameter, no output schema, and simple read-only behavior. The description lists the key returned fields and the extra resolution behavior, which is enough for an agent to call it correctly. It does not discuss error cases or invalid symbols, but these are not critical for a low-risk quote endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage for the single required symbol parameter, including an example ('BBRI') and the IDX/index distinction. The description itself does not add much parameter-level detail, but the schema carries that weight adequately.

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

Purpose5/5

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

The description clearly states the tool provides a real-time quote for an IDX symbol, listing exactly what is returned: last price, change, and best bid/offer. It also mentions the additional behavior of resolving the symbol's internal company id. This differentiates it from siblings like orderbook or price_chart.

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

Usage Guidelines4/5

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

The description gives clear usage context: use this when a current quote snapshot for an IDX symbol is needed. It implies this is not the tool for order depth, historical charts, or fundamentals, though it does not explicitly name alternatives or exclusions.

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

ratiosC
Read-only

Financial ratios for a company.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesIDX ticker

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description only restates the output concept ('financial ratios') without adding behavioral context such as the ratio categories covered, data source, time period, or how open-world results are organized.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is five words and front-loads the essential concept immediately. Every word earns its place, and there is no filler.

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

Completeness2/5

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

With no output schema, the description should explain what the agent will receive; it does not. There is no mention of the ratio set, formatting, or any caveats, leaving an agent to discover the output contract only after invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the symbol parameter is documented as 'IDX ticker', so an agent knows what value to supply. The description adds no extra parameter context, but none is necessary given the complete schema.

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

Purpose3/5

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

The description states the resource ('financial ratios') and the subject ('a company'), so an agent can broadly infer it returns ratio data for a ticker. However, it has no explicit verb like 'calculates' or 'retrieves', and it doesn't clearly differentiate from siblings such as financials or keystats beyond the word 'ratios'.

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

Usage Guidelines2/5

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

No guidance is given about when to choose ratios over financials, technicals, keystats, or quote. There are no exclusions, prerequisites, or conditions, so the agent must guess which tool fulfills a ratio-related request.

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

scanA
Read-only

Run a condition across many IDX stocks at once — alert_check for stocks you have no rules for. COST: bars are the expensive part. Throughput is capped at roughly 6.6 upstream requests a second, so a 20-symbol moving-average screen takes ~15s and anything referencing sma200 takes ~50s. Defaults are set at that honest ceiling; raising max_symbols much past 30 will time out before it finishes. A SECOND scan over an overlapping universe is far cheaper — bar pages are cached for six hours once settled — so sweep broadly once, then iterate on the condition. Misses distinguish condition-false from warming-up and no-data. warming-up means the comparison could not be made: either not enough history yet, or an operand the series does not carry — a response that omits volume leaves it absent rather than zero, and no amount of extra history will settle that. Truncation is always reported with its reason, so a capped sweep never reads as a complete one.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
leftYesCondition left side, e.g. close
rightYesCondition right side, e.g. sma20
panelsNo
reportNoSeries to report for each hit, e.g. ["close", "rsi14"]
symbolsNoExplicit tickers. Omit to use movers or trending.
overlaysNo
universeNoDefault symbols. `watchlist` sweeps your own list — usually the one you want.
max_secondsNoDefault 45
max_symbolsNoDefault 20. See the cost note.
watchlist_idNoWhich watchlist, from the `watchlist` tool. Defaults to your default list.

TDQS

A4.7/5.0
Behavior5/5

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

Even with annotations already declaring readOnlyHint, the description adds substantial behavioral context: rate limits, timing estimates, six-hour bar caching, timeout risks when max_symbols is raised, result miss categories, data-absence semantics for volume, and truncation reporting. This is exactly the kind of operational detail that prevents an agent from misinterpreting scan output or misconfiguring a costly sweep.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose, then organized into clear cost and result-semantics paragraphs. Every sentence earns its place by warning about timeout risk, caching behavior, miss interpretation, or truncation — all critical for correct invocation.

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

Completeness5/5

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

For a complex 11-parameter tool with no output schema, the description supplies what an agent most needs to call it correctly: universe selection hint, cost and timeout ceilings, caching guidance, data-availability caveats, and explicit miss/truncation semantics. Combined with the rich input schema, this is sufficiently complete for safe and effective invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 73%, but the description adds meaning beyond the schema: max_symbols is tied to a concrete timeout/cost ceiling, overlays like sma200 carry disproportionate cost, and left/right are illustrated with examples like close and sma20. The description does not add much for op, panels, or overlays beyond the schema enums, so it does not fully close every parameter gap.

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

Purpose5/5

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

The description opens with a specific action and resource: 'Run a condition across many IDX stocks at once.' It also distinguishes the tool from alert_check by framing scan as 'alert_check for stocks you have no rules for,' giving an agent an immediate way to separate it from a key sibling.

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

Usage Guidelines4/5

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

It clearly positions scan relative to alert_check and gives operational guidance: sweep broadly once, then iterate because of caching. It also notes that the watchlist universe is 'usually the one you want.' However, it does not explicitly contrast scan with other sibling screening tools like screener or technicals, so it stops short of full exclusion guidance.

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

screenerA
Read-only

Stockbit's stock screener — the user's own saved screens, and the results of running one. Call with no arguments to list saved screens; pass template_id (and the type from the listing) to RUN one and get the matching stocks with their metric values. Running a screen is a read: nothing is created, edited or saved. This is IDX-specific in a way no TradingView screener can match — the metric catalogue includes a Bandarmology group built on broker-level flow. Use catalogue to see what can be screened on, or presets for Stockbit's built-in Guru screens.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFrom the listing, e.g. TEMPLATE_TYPE_CUSTOM. Must match the template's own.
limitNoCap the matches returned
presetsNoReturn Stockbit's built-in screens instead
universeNoReturn the index scopes a screen can be limited to
catalogueNoReturn the screenable-metric catalogue instead (large)
template_idNoRun this saved screen. Omit to list them.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already mark the tool as read-only and non-destructive, and the description reinforces this by stating 'Running a screen is a read: nothing is created, edited or saved.' It also adds useful context about the IDX-specific metric catalogue and notes that the `catalogue` payload is large. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage, followed by read-only behavior and mode pointers. It is about five sentences and includes a slightly promotional TradingView comparison that does not directly aid invocation, but the rest of the content earns its place.

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

Completeness4/5

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

For a 6-parameter tool with no output schema, the description covers the core modes: list, run, `catalogue`, and `presets`, and describes the return concept as 'matching stocks with their metric values.' It does not detail pagination, `limit` semantics, or combined-mode behavior, but the schema fills parameter details and annotations cover safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is already documented. The description adds a usage pattern connecting `template_id` and `type`, and mentions that omitting `template_id` lists screens, but this largely mirrors the schema text rather than adding new semantic meaning.

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

Purpose4/5

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

The description clearly identifies the tool as Stockbit's stock screener and states two concrete operations: listing saved screens and running one to get matching stocks with metric values. It does not explicitly distinguish this tool from sibling tools like `scan` or `watchlist`, so it falls just short of a top score.

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

Usage Guidelines4/5

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

The description gives explicit calling patterns: no arguments to list saved screens; pass `template_id` and matching `type` to run one; use `catalogue` to see what can be screened on; use `presets` for built-in screens. It lacks direct when-not-to-use guidance relative to sibling tools, but the mode-based guidance is clear and actionable.

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

seasonalityA
Read-only

Month-by-month seasonal price behaviour for one IDX stock: how it has done in each calendar month across Stockbit's fixed ten-year lookback, in ONE request. year is the END of that lookback, not a number of years — omit it and the current year is sent, because the endpoint rejects the request outright without one. back_year is passed through unchanged. Stockbit's own client sends it and this project has not observed whether it means a start year or a count of years back, so do not read meaning into it; it is accepted so the parameter is reachable, not because its effect is known. PENDING: the response shape is unverified, so nothing is renamed — data is exactly what Stockbit returned. Read the field names out of it rather than assuming any. An empty or null data means Stockbit has no seasonality series for that symbol and year, which is normal for recently listed companies; it is not an error and not a reading of zero. This is a price-history statistic, not a forecast, and it says nothing about why a month was strong.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoEnd year of the ten-year lookback (default: current year)
symbolYesIDX ticker, e.g. BBRI
back_yearNoStockbit's back_year parameter, passed through as given

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, the description reveals non-obvious behavior: the endpoint rejects requests without a year, back_year's meaning is unknown and passed through unchanged, and the response shape is unverified. It also clarifies that empty or null data means Stockbit has no series, not an error or a zero value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but it is dense with important warnings and caveats. The core purpose is front-loaded, and each paragraph addresses a distinct operational concern. It could be tightened slightly, but the length is justified by the amount of non-obvious context.

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

Completeness5/5

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

With no output schema, the description explicitly states that the response shape is unverified, tells the agent to read field names from the raw data, and explains how to interpret empty/null data. Combined with the year and back_year guidance, the agent has everything needed to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema already documents all parameters, the description adds decisive semantics: year is the end of the ten-year lookback, not a count; omitting it sends the current year; back_year must not be interpreted as meaningful; and data is returned raw without renaming. These caveats materially change how an agent should set and interpret parameters.

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

Purpose4/5

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

The first sentence clearly defines the tool's purpose: month-by-month seasonal price behavior for one IDX stock across a fixed ten-year lookback. It also explicitly disclaims being a forecast, which helps set expectations. However, it never names or contrasts sibling tools like technicals or patterns, so differentiation is left to inference.

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

Usage Guidelines4/5

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

The description gives clear context: use this when you need calendar-month seasonal price behavior for one IDX stock. It also provides useful exclusions, such as 'not a forecast' and 'says nothing about why a month was strong.' It lacks explicit 'use instead of X' routing to sibling tools, so it does not fully earn a 5.

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

statusA
Read-only

Is this server working, and what do I run if it is not? Call this FIRST whenever anything looks wrong, and call it after logging in to confirm it took. Reports the version and Node, which of the three sessions are stored (NEVER the tokens themselves), how long the stored market-data token claims it has left, the trading mode and why, the IDX session clock in WIB, and a nextStep naming the single next command. It answers with no session at all — that is the state every new user is in, and the answer is the useful one. Each session also carries a health: ok / failing / expired / not-stored / unknown, derived from what actually happened the last time that credential was used. failing means present and unexpired but REJECTED by Stockbit — revoked, or superseded by another login. That is the case an expiry check cannot see, and it costs no requests. live: true is NOT free and is rarely what you want. It refreshes the market-data token, which ROTATES the refresh-token family and therefore ENDS the user’s Stockbit website session — the one the chart tools run on. Use health instead; only pass live: true if the user explicitly asks to prove the token with a real request. The market block reports the IDX clock in WIB with a UTC sibling on each field, and does not model public holidays; call market_session for that. server.update says whether a newer release of this server exists. It costs ONE request to the npm registry — not to Stockbit, carrying only the package name — cached for a day and made by this tool alone. isOutdated: true matters: npx caches a resolved tree under a version RANGE, so a user can run a build that is weeks old and nothing else will say so. latest and isOutdated are ABSENT when the check could not run, which means unknown, NOT up to date — read update.note. STOCKBIT_NO_UPDATE_CHECK=1 turns the request off.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNoProve the market-data token with one real refresh. This ROTATES the token family and ends the user's Stockbit website session — ask them first. Default false; `health` answers the same question for free.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the readOnly/destructive annotations by explaining the health state machine, that failing means present-but-rejected by Stockbit, that live:true rotates the token family and ends the user's website session, and that absent server.update fields mean unknown rather than current. No annotation contradiction: the annotations describe the default read-only path, and the description explicitly qualifies the live option.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely packed. Each paragraph covers one distinct behavior or caveat, front-loads the primary call guidance, and uses structured markers like live:true, server.update, and STOCKBIT_NO_UPDATE_CHECK. Nothing reads as filler.

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

Completeness5/5

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

Without an output schema, the description compensates by naming the returned blocks — sessions, health, market, server.update, nextStep — and explaining failure semantics, side effects, and environmental controls. An agent has enough to invoke status correctly and interpret the answer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter is already fully documented in the schema, including default value, side effects, and the ask-first caveat. The description reinforces the usage guidance but mostly repeats the schema's live/health trade-off, so it adds little new parameter-level meaning.

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

Purpose5/5

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

The opening question defines the tool as a health/readiness diagnostic, and the second sentence lists exactly what it reports: version, Node, session storage, token lease, trading mode, IDX clock, and nextStep. It also distinguishes itself from siblings by naming market_session as the tool for public-holiday handling.

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

Usage Guidelines5/5

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

The description explicitly says to call this FIRST whenever anything looks wrong and after login to confirm it took. It also gives clear when-not guidance: prefer health over live:true, only pass live:true with explicit user request, and delegate public-holiday logic to market_session. This is ideal routing guidance.

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

strategy_compareA
Read-only

Run every built-in strategy over ONE stock's history and rank them — the bars are fetched once for all nine, so this costs the same as a single backtest. Ranked by return ABOVE buy-and-hold over the same window and costs, not by raw return: over a rising window every long-only strategy shows a profit, and the only question worth asking is whether the trading added anything to owning the stock. Taking the winner of nine on one window is a SELECTION, not a finding. Run backtest with walk_forward on the winner before believing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNo
barsNoSessions of history (default 500)
fromNo
symbolYesIDX ticker, e.g. BBRI
strategiesNoWhich to compare. Default: all nine.
stop_loss_pctNoApplied to every strategy
initial_capitalNo
take_profit_pctNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already state readOnlyHint=true and destructiveHint=false, and the description adds valuable non-obvious behavior: bars are fetched once for all nine strategies so cost equals a single backtest, and results are ranked above buy-and-hold rather than by raw return. It also warns that picking the winner on one window is a selection, not a finding. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three focused sentences, each earning its place: the action/cost, the ranking rationale, and the selection-bias warning. It is front-loaded with the primary behavior and contains no filler or repetition.

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

Completeness4/5

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

The core contract is well covered: what it runs, what it costs, how it ranks, and what to do next. However, there is no output schema and the description does not specify the result structure beyond 'rank them,' so an agent cannot know exactly what fields to expect. For an 8-parameter tool this is mostly but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description reinforces the meaning of `strategies` ('all nine' by default) and explains that costs like stop-loss/take-profit are included in the ranking metric. However, it does not clarify `to`/`from` formats, `initial_capital`, or `stop_loss_pct` defaults. With schema coverage at 50%, the missing parameter semantics are only partially compensated.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Run every built-in strategy over ONE stock's history and rank them.' It clearly differentiates from the sibling `backtest` tool by framing strategy_compare as a comparison/screening tool, and the closing caveat about selection vs. finding reinforces its distinct role.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to take the result seriously: 'Run `backtest` with walk_forward on the winner before believing it.' It also explains that the ranking is by excess return over buy-and-hold, not raw return, which prevents misuse on rising windows. This gives clear selection and follow-up guidance relative to `backtest`.

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

streamA
Read-only

Posts from Stockbit's social stream: news, trading ideas, filed reports, insider posts, charts, polls and predictions. With no symbol this is the market-wide stream; with a symbol it is that company's stream, which is the same feed the Stockbit symbol page shows. This is community- and media-written Indonesian text, not market data. Use it for sentiment and as a pointer to a source; never quote a price, a ratio or an earnings figure from a post. category selects the tab and is sent verbatim: STREAM_CATEGORY_NEWS is the News tab, _REPORTS the filed-research tab, _INSIDER insider posts. STREAM_CATEGORY_LIKED and _SAVED are the signed-in account's own, not the market's, and the three *_WATCHLIST values scope the feed to the user's lists — watchlist_ids narrows that to named lists (ids come from the watchlist tools; they are numeric). report_type only narrows STREAM_CATEGORY_REPORTS. It is sent as given for any other category and Stockbit is free to ignore it there. from_date/to_date are YYYY-MM-DD and are calendar-checked before the request goes out, so a typo (2026-02-30, 20260803) fails loudly instead of quietly returning today. Either end may stand alone; an inverted pair is rejected. Paging is a CURSOR, not an offset: there is no page number or offset. Take nextCursor from the result and send it as last_stream_id to get the rows AFTER the ones you have seen; calling again without it returns the same rows. nextCursor is null when the page is empty or its last row carried no id, which means the walk cannot be continued rather than that it has ended. An empty items with a non-null source is a genuine zero — a quiet symbol or a narrow keyword — and not a reason to retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows. Omitted = Stockbit's own page size (30 on the route observed).
symbolNoIDX ticker, e.g. BBRI. Omit for the market-wide stream.
keywordNoFull-text search over post content.
to_dateNoYYYY-MM-DD, inclusive
categoryNoWire spelling, case-sensitive. Omitted = Stockbit's default feed.
from_dateNoYYYY-MM-DD, inclusive
last_replyNoSecond cursor Stockbit's client sends beside last_stream_id; its role is unverified, so leave it unset.
report_typeNoNarrows STREAM_CATEGORY_REPORTS only.
watchlist_idsNoNumeric watchlist ids, for the *_WATCHLIST categories.
last_stream_idNoCursor: the `nextCursor` from the previous page.

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark this read-only and non-destructive, and the description goes far beyond them: category is sent verbatim, report_type is ignored for non-report categories, date validation fails loudly, the cursor has specific semantics with nextCursor null meaning the walk cannot continue, and empty items with non-null source is a genuine zero not a retry trigger. This is exceptional behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely informative; every sentence covers a distinct behavior or constraint. It is well-organized by topic: content type, category semantics, report_type behavior, date handling, and paging. The most important caveat (not market data) is front-loaded.

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

Completeness5/5

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

This is a high-complexity 10-parameter tool with no output schema, so the description carries the full burden for response semantics. It extensively explains paging, cursor behavior, empty results, and the meaning of nextCursor. Given the complexity, nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 substantial meaning: it maps category enum values to UI tabs, explains watchlist_ids come from watchlist tools and are numeric, states date format and validation failure behavior, and documents the cursor relationship between last_stream_id and nextCursor. This far exceeds what the schema alone provides.

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

Purpose5/5

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

The description states a specific verb and resource: it posts from Stockbit's social stream with concrete content examples (news, trading ideas, reports, charts, polls, predictions). It clearly distinguishes this from market data tools by warning it is community/media-written text, not market data. The symbol/no-symbol distinction further clarifies the two main modes exactly.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: use for sentiment and source pointers, never for quoting prices/ratios/earnings. It explains when to omit vs provide a symbol, how category selects tabs, and how report_type applies only to reports. This is actionable enough for an agent to choose and invoke it correctly.

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

technicalsA
Read-only

Technical indicator readings for an IDX stock, computed from daily bars: SMA/EMA, RSI, MACD, Bollinger Bands, ATR, and support/resistance levels found by pivot clustering. Returns NUMBERS for reasoning — use price_chart when you want the picture. Every reading reported is the latest defined value of its series. Deep history is paged 12 sessions at a time upstream, so a large bars is slow; pagesFetched reports what the query cost.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest session, YYYY-MM-DD
barsNoSessions to analyse (default 200). Ignored if `from` is given.
fromNoEarliest session, YYYY-MM-DD
symbolYesIDX ticker, e.g. BBRI

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context beyond that: data is computed from daily bars, readings are the latest defined value of each series, upstream paging happens 12 sessions at a time, and pagesFetched reports query cost. No contradiction exists between description and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences with no filler: the first defines scope and indicators, the second gives usage guidance and return semantics, and the third covers performance and output metadata. It is appropriately sized and front-loaded with the most important information.

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

Completeness4/5

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

For a 4-parameter read-only tool with no output schema, the description covers the essential selection criteria, return nature ('latest defined value', 'Returns NUMBERS'), and cost signal (pagesFetched). It is slightly light on the exact response envelope, but the schema and annotations cover the invocation side well, making this sufficient for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics around bars by explaining the pagination behavior and performance cost, which complements the schema's note that bars is ignored when from is given. It does not deeply elaborate to/from beyond schema, but the schema already documents those well.

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

Purpose5/5

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

The description states a specific verb-resource pair ('Technical indicator readings for an IDX stock'), enumerates the exact indicators (SMA/EMA, RSI, MACD, Bollinger Bands, ATR, support/resistance), and explicitly contrasts itself with price_chart. An agent can immediately tell what this tool computes and how it differs from visual charting.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: use it when you need numbers for reasoning versus price_chart for a picture. It also warns that deep history is paged and a large bars value is slow, helping agents decide on parameter magnitude. This is strong when-to-use and when-not-to-use guidance.

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

timeframe_alignmentA
Read-only

Whether the daily, weekly and monthly views of a stock agree, and what each one can actually support. Stockbit serves DAILY bars only — weekly and monthly here are resampled from those sessions, not exchange-published candles. There is NO 4H/1H/15m data: the intraday feed is a minutely close-only series for the current session, with no open, high, low or history. About 500 sessions are reachable, which is ~104 weekly and ~24 monthly bars — so a monthly RSI(14) is reported as null rather than computed from a window that has not converged. The limits field says what could not be computed and why; read it.

ParametersJSON Schema
NameRequiredDescriptionDefault
barsNoDaily sessions to fold up (default 500 — monthly needs all of them)
symbolYesIDX ticker, e.g. BBRI

TDQS

A4/5.0
Behavior5/5

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

The description goes far beyond the annotations, disclosing data provenance (daily source, resampled weekly/monthly), absence of 4H/1H/15m and intraday OHLC, the ~500-session reach, and why monthly RSI(14) becomes null. It also directs the agent to read the `limits` field, making failure behavior explicit. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but each sentence carries material data-availability information; there is no filler. It front-loads the core purpose, though the four sentences could be tightened slightly without losing meaning.

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

Completeness4/5

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

For a read-only analysis tool with a 2-parameter schema and no output schema, this description covers almost everything an agent needs: input semantics, data limitations, null behavior, and the `limits` field. It stops short of describing the overall response shape, but the stated outcome is sufficient for selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds useful semantics beyond the schema by explaining that `bars` folds daily sessions and that monthly needs all of them (500). It also introduces `limits` as an output field, giving the agent context on what the parameters affect.

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

Purpose4/5

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

The description opens by framing the tool's purpose as determining whether daily, weekly and monthly views of a stock agree and what each timeframe can support. This is specific to a resource and distinct in intent from sibling price/indicator tools, though it lacks an explicit imperative verb like 'compute' or 'return' and does not name sibling differentiations.

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

Usage Guidelines3/5

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

The description conveys implied usage: use it when time-frame agreement and data support matter, because it clarifies that weekly/monthly are resampled and intraday is unavailable. However, it does not explicitly state when to prefer this tool over siblings like technicals, price_chart, or quote, nor give exclusions.

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

top_moversA
Read-only

Stockbit's HOTLIST — a small curated list, NOT a market-wide ranking. Use market_movers for the market-wide one. This matters because the two look interchangeable and are not. Measured 2026-09-01, every call to this hotlist returned the SAME NINE symbols — at limit 5, 25, 50 and 100 alike. limit is sent and the service ignores it. So the ranking you get is a correct ordering over a nine-symbol universe, not the top of the exchange, and reading it as 'today's top gainers on IDX' overstates it by a wide margin. That also disposes of a reported bug: a contiguous descending run of nine changes is what a correct sort over nine symbols looks like. There is nothing wrong with the ordering; the universe is simply small, and this description is the fix. market_movers reads a different service and returned 50 rows for the same moment, including structured warrants. The two disagreeing is expected and is not evidence that either is wrong. Returns an empty list when the market is closed — that is expected, not an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesWhich hotlist
limitNoSent, but the service ignores it — nine rows come back regardless. Default 25.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnly/openWorld/destructive annotations, the description discloses important behavior: the service ignores limit, always returns the same nine-symbol universe, returns an empty list when the market is closed, and is not buggy despite appearing so. This is rich, non-obvious context that materially changes how an agent should interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and logically organized, but it is longer than needed. The empirical measurement narrative and bug-report digression could be condensed into a few crisp statements without losing the critical warnings.

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

Completeness4/5

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

For a tool with no output schema, the description covers the main behavioral risks: limited universe, ignored limit, empty response on closed market, and sibling expectations. It stops short of describing the exact return row structure, but the mention of nine symbols and descending changes gives enough context for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both parameters, including that limit is ignored. The description adds further semantic weight by explaining that every tested limit value still returned the same nine symbols, making the ignored-limit behavior concrete and hard to miss. It does not add much about the type parameter, but the schema covers it well.

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

Purpose4/5

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

The description clearly identifies the resource as "Stockbit's HOTLIST" and immediately signals it is NOT a market-wide ranking, naming market_movers as the alternative. However, it never explicitly states an action like "returns top gainers/losers/most active," relying partly on the tool name and schema enum for that detail.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: "Use market_movers for the market-wide one." It also tells the agent when an empty list is expected, explains why disagreement with market_movers is normal, and warns against interpreting the hotlist as exchange-wide movers.

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

trading_statusA
Read-only

Whether this server may place an order right now, and why not if it may not. Read it before offering to trade anything. Trading is OFF by default and the user turns it on themselves with stockbit-auth trading-enable; nothing this server does can turn it on, and no argument to any tool can override it. policy.reason is written for the user — relay it rather than paraphrasing. policy.autoConfirmIgnored, when present, means autoConfirm was configured but is not being honoured, and says why. policy.elicitation says whether a person is asked directly before an order: required refuses rather than send when no person can be reached, when-available (the default) asks wherever the client supports it, never does not ask at all. rememberGrant is the live "don't ask again" in THIS server process, if the user made one — it is held in memory, so no file can answer that question and this is the only place it is visible. This tool reads local configuration and makes no request, so it works with no trading session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that the tool reads local configuration and makes no network request, so it works without a trading session. It also explains the semantics of policy.reason, policy.autoConfirmIgnored, policy.elicitation modes, and the in-memory nature of rememberGrant — all valuable behavioral context not captured by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely packed with essential operational details and has a logical structure: core purpose first, then critical precondition, then field-by-field semantics. No sentence is wasted, though the length is higher than average.

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

Completeness4/5

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

Given no output schema, the description does a good job explaining the key response components and their meaning for the agent's decision-making. It omits a full JSON shape or type information, but covers the semantically important parts needed to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is nothing to document. The description instead documents the response fields that an agent will consume, which is the appropriate compensation under this condition.

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

Purpose5/5

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

The first sentence states exactly what the tool reports: whether the server may place an order now and, if not, why. This is a specific verb-plus-resource definition that clearly distinguishes trading_status from generic siblings like status or market_session.

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

Usage Guidelines4/5

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

The description gives strong, explicit usage context: 'Read it before offering to trade anything' and explains that trading is off by default and cannot be enabled by the server or any tool argument. It does not name a specific alternative tool to use instead, but it clearly communicates when this check is required.

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

watchlistA
Read-only

The user's own Stockbit watchlists, and the symbols in one. Call with no arguments to list them; pass id to read a list's contents. This is usually the universe a user means by "my stocks" — scan can sweep it directly with universe=watchlist. Note volume here is in SHARES, while daily bars report volume in LOTS (1 lot = 100 shares). The field is named volumeShares so the two are never compared by accident.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoWatchlist id. Omit to list all watchlists.
limitNoMax symbols (default and cap 500)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and not destructive, and the description adds significant behavioral context: volume is reported in shares rather than lots, and the `volumeShares` field name prevents accidental comparison with daily-bar volume. It also discloses the dual-mode behavior of listing versus reading contents, going well 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence earns its place: it states the resource, gives the two call modes, mentions the direct alternative, and adds a units warning that prevents a real comparison pitfall. The information is front-loaded and well organized.

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

Completeness5/5

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

Given the small parameter surface, no required parameters, and read-only annotations, the description covers everything needed for correct invocation. It explains the output domain (watchlists and their symbols), the volume units caveat, and the relationship to `scan`; there are no significant missing behavioral or return-value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description clarifies that omitting `id` lists watchlists and passing it reads contents, but this is largely already present in the schema's id property description. The `limit` parameter is left entirely to the schema, so the description adds no meaningful new parameter semantics.

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

Purpose5/5

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

The description clearly identifies the resource (the user's own Stockbit watchlists and the symbols in one) and states the action: with no arguments it lists watchlists, and with `id` it reads a list's contents. This is specific enough to distinguish the tool from siblings like `portfolio`, `position`, and `scan`.

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

Usage Guidelines5/5

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

It gives explicit call patterns: no arguments to list, `id` to read contents. It also names the direct alternative, `scan`, and explains when that is relevant by saying it can sweep the watchlist universe with universe=watchlist, which helps an agent choose between the two tools.

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

workflow_listA
Read-only

List the saved multi-step workflows and what each one needs. A workflow runs several tools in one call, always the same way — use it when the user wants a routine (a full look at one stock, a morning sweep, a bandarmology check) rather than a single reading.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true/destructiveHint=false, so the read-only safety profile is covered. The description adds useful domain context (workflows are fixed multi-step routines) but does not clarify other behaviors such as whether output is exhaustive or whether listing workflows has any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first names exactly what is returned, the second explains the concept and when to use it. There is no filler or repeated schema/annotation content.

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

Completeness4/5

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

For a zero-parameter, read-only list tool the description is nearly complete: it states the output and intended use case. It could be slightly stronger by pointing to workflow_run as the execution companion, but that is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema confirms this, so no parameter detail is needed. The description's mention of output ('what each one needs') is the only relevant input/output guidance and is sufficient.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List the saved multi-step workflows and what each one needs.' It also contrasts with single-reading tools, which prevents confusion with the many single-purpose siblings like quote or technicals.

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

Usage Guidelines4/5

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

It explicitly states when to use it: 'use it when the user wants a routine ... rather than a single reading.' It does not name workflow_run as the execution alternative, but the workflow-run explanation makes the intended context clear.

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

workflow_runA
Read-only

Run a saved workflow by name — several tools in one call, the same way every time. Returns each step's output in order, with the time it took. A step that fails ABORTS the run and the result names which step and why, unless that step is marked optional (its error is recorded and the run continues). A capped fan-out reports how many items it skipped, so a partial sweep never reads as a complete one. Use workflow_list first to see names and required inputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWorkflow name from workflow_list, e.g. deep_dive
inputNoInputs for the workflow, e.g. { "symbol": "BBRI" }

TDQS

A4.7/5.0
Behavior5/5

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

The description richly discloses behavior beyond the annotations: it returns each step's output in order with timing, aborts on a failing step unless the step is optional, records optional-step errors and continues, and reports skipped items in capped fan-out scenarios. This is far beyond the minimal readOnlyHint/destructiveHint context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

All four sentences earn their place: the first defines the tool, the second explains return behavior and failure semantics, the third clarifies fan-out behavior, and the fourth gives a usage prerequisite. The most critical information is front-loaded.

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

Completeness5/5

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

With no output schema present, the description carries the burden of explaining the return shape, which it does clearly: step outputs in order, timing, failure details, and skipped-item counts. Combined with the annotation safety profile and complete parameter schemas, an agent has enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear examples for both 'name' and 'input', so the baseline is 3. The description adds value by directing the agent to pull the name from workflow_list and framing 'input' as the workflow's required inputs, which explains the meaning of the nested object beyond the schema's generic example.

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

Purpose5/5

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

The description opens with 'Run a saved workflow by name,' a specific verb and resource, and distinguishes itself from sibling workflow_list by noting it bundles several tools into one call. An agent can immediately tell this executes a workflow rather than listing workflows.

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

Usage Guidelines4/5

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

The description explicitly instructs the agent to 'Use workflow_list first to see names and required inputs,' giving a clear prerequisite and sequencing. It does not go as far as stating explicit alternatives or when not to use the tool, but the context is clear that this is for running a pre-defined multi-step workflow.

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

Tool Schema Changelog

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

  1. 7 tool updatesv1.3.0
    • Changedbandar_detector1 field changed
      • addedInput schema / properties / resolve_names
        Added value: +{
        +  "description": "Add each broker's securities house as `name`, joined from the cached directory.",
        +  "type": "boolean"
        +}
    • Changedbroker_activity7 fields changed
      • addedInput schema / properties / date_from
        Added value: +{
        +  "description": "Alias for `from`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / date_to
        Added value: +{
        +  "description": "Alias for `to`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / end_date
        Added value: +{
        +  "description": "Alias for `to`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Range start, YYYY-MM-DD. Requires `to`.",
        +  "type": "string"
        +}
      • changedInput schema / properties / period / description
        Previous value: -"Window to aggregate over, e.g. LAST_1_DAY, LAST_7_DAYS, YEAR_TO_DATE. Omitted means the server's own default, which this tool cannot report."New value: +"Preset window, resolved here into `from`/`to` and sent as dates — the name itself is refused by this endpoint. Ignored when `from`/`to` are given. Omitted means the server's own default window."
      • addedInput schema / properties / start_date
        Added value: +{
        +  "description": "Alias for `from`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Range end, YYYY-MM-DD (inclusive). Requires `from`.",
        +  "type": "string"
        +}
    • Changedbroker_summary1 field changed
      • addedInput schema / properties / resolve_names
        Added value: +{
        +  "description": "Add each broker's securities house as `name`, joined from the cached directory.",
        +  "type": "boolean"
        +}
    • Changedlogin2 fields changed
      • changedInput schema / properties / fresh_profile / description
        Previous value: -"Use a throwaway browser profile instead of the saved one — nothing carried over, so the user re-enters password and OTP. For a profile that is corrupt or held open by another process. To sign in as a different account, use switch_account instead."New value: +"Use a throwaway browser profile instead of the saved one — nothing carried over, so the user re-enters password and OTP. For a profile that is corrupt or held open by another process. To sign in as a different account, use switch_account instead. IT DOES NOT FIX THE CHART TOOLS: the throwaway profile is discarded, so the API session starts working while the saved profile the chartbit tools actually drive stays signed out — every chartbit tool keeps failing until a login runs WITHOUT this. Prefer reap_orphans for a profile merely held open."
      • addedInput schema / properties / reap_orphans
        Added value: +{
        +  "description": "If the browser exits immediately because something already holds the saved profile, end those processes and retry once. For the case where a previous login left browser processes behind and every login since has failed to open a window.\nASK THE USER FIRST. It cannot tell an abandoned process from a working one — a browser that is fine answers the debugging port it was started with, not the new one this checks — so it ends EVERY process holding that profile, including a chart window the chartbit tools left open and are still using.",
        +  "type": "boolean"
        +}
    • Addedmarket_movers
    • Changedprice_chart5 fields changed
      • changedInput schema / properties / annotations / description
        Previous value: -"Your own drawings on top of the chart"New value: +"Your own drawings on top of the chart. Same shape chartbit_draw takes."
      • addedInput schema / properties / annotations / items / properties / fromDate
        Added value: +{
        +  "description": "Alias for `from_date`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / annotations / items / properties / fromPrice
        Added value: +{
        +  "description": "Alias for `from_price`.",
        +  "type": "number"
        +}
      • addedInput schema / properties / annotations / items / properties / toDate
        Added value: +{
        +  "description": "Alias for `to_date`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / annotations / items / properties / toPrice
        Added value: +{
        +  "description": "Alias for `to_price`.",
        +  "type": "number"
        +}
    • Changedtop_movers1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"Default 25"New value: +"Sent, but the service ignores it — nine rows come back regardless. Default 25."
  2. 39 tool updatesv1.2.2
    • Addedalert_check
    • Addedalert_create
    • Addedalert_delete
    • Addedalert_list
    • Addedanalyze
    • Addedbacktest
    • Addedbandar_detector
    • Addedbroker_activity
    • Addedbroker_distribution
    • Changedbroker_summary11 fields changed
      • addedInput schema / properties / date_from
        Added value: +{
        +  "description": "Alias for `from`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / date_to
        Added value: +{
        +  "description": "Alias for `to`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / end_date
        Added value: +{
        +  "description": "Alias for `to`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Range start, YYYY-MM-DD. Requires `to`.",
        +  "type": "string"
        +}
      • changedInput schema / properties / market_board / description
        Previous value: -"Default REGULER (use for bandarmology)"New value: +"Default REGULER — the ordinary order book, and what bandarmology means. ALL folds in negotiated blocks and can be several times larger. NEGO and TUNAI select those boards alone."
      • changedInput schema / properties / market_board / enum
        Previous value: -[
        -  "REGULER",
        -  "NEGOTIATED",
        -  "CASH"
        -]New value: +[
        +  "REGULER",
        +  "ALL",
        +  "NEGO",
        +  "TUNAI"
        +]
      • addedInput schema / properties / period
        Added value: +{
        +  "description": "Preset window instead of from/to — LATEST (default), YESTERDAY, LAST_7_DAYS, LAST_3_MONTHS, YEAR_TO_DATE. The server aggregates the whole window in ONE request, so YEAR_TO_DATE costs the same as today. Ignored when from/to are given.",
        +  "enum": [
        +    "LATEST",
        +    "YESTERDAY",
        +    "LAST_7_DAYS",
        +    "LAST_3_MONTHS",
        +    "YEAR_TO_DATE"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / start_date
        Added value: +{
        +  "description": "Alias for `from`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Range end, YYYY-MM-DD (inclusive). Requires `from`.",
        +  "type": "string"
        +}
      • changedInput schema / properties / transaction_type / description
        Previous value: -"Default NET"New value: +"NET (default) nets each broker's buys against its sells; GROSS does not."
      • changedInput schema / properties / transaction_type / enum
        Previous value: -[
        -  "NET",
        -  "BUY",
        -  "SELL"
        -]New value: +[
        +  "NET",
        +  "GROSS"
        +]
    • Addedcash_balance
    • Removedintraday_prices
    • Addedlogin
    • Addedlogout
    • Addedmarket_session
    • Addednews
    • Addedorders
    • Addedpatterns
    • Addedportfolio
    • Addedposition
    • Addedposition_size
    • Addedprice_bands
    • Addedprice_chart
    • Removedprice_performance
    • Addedscan
    • Addedscreener
    • Addedseasonality
    • Removedsectors
    • Removedsentiment_stream
    • Addedstatus
    • Addedstrategy_compare
    • Addedstream
    • Addedtechnicals
    • Addedtimeframe_alignment
    • Addedtrading_status
    • Removedtrending
    • Addedwatchlist
    • Addedworkflow_list
    • Addedworkflow_run
  3. 12 tool updatesv0.1.0
    • First observedbroker_summary
    • First observedfinancials
    • First observedintraday_prices
    • First observedkeystats
    • First observedorderbook
    • First observedprice_performance
    • First observedquote
    • First observedratios
    • First observedsectors
    • First observedsentiment_stream
    • First observedtop_movers
    • First observedtrending

TDQS

B3.3/5.0

Scored across 41 tools

Disambiguation3/5

There are several closely related tool families—top_movers vs market_movers, stream vs news, broker_summary vs bandar_detector, and portfolio vs position—whose purposes overlap or nest inside each other. The descriptions do a good job of explaining the differences, but the overlapping surface still creates real selection ambiguity for an agent.

Naming Consistency3/5

The set uses mostly readable snake_case names with some coherent families like alert_* and broker_*, but conventions are mixed: bare verbs (login, scan, analyze), bare nouns (quote, status, patterns), and noun_verb compounds (strategy_compare, workflow_run) all coexist. Compounds like orderbook and keystats also break the underscore pattern used elsewhere.

Tool Count2/5

41 tools is well beyond the range where a tool set is easy to navigate, even for a broad stock-market server. The count reflects a large number of narrow, specialized reads rather than a tightly scoped toolkit, making it heavy and harder for agents to select among.

Completeness2/5

The server covers a lot of market data and analysis ground, but has significant dead ends: there is no order placement or cancellation despite trading_status and position_size implying trading workflows, and referenced tools like brokers, order_preview, and pine_script do not exist in the set. Several resources such as watchlists, screens, and alerts also lack full CRUD coverage.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Real-time financial market data MCP server. Stocks, crypto, technicals, sentiment, FDA calendar. No API keys required.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server exposing Indonesia Stock Exchange (IDX) market data as tools — fundamentals, broker flow, company profiles, and technical analysis via TA-Lib.
    1
    -
  • A
    license
    C
    quality
    B
    maintenance
    Read-only MCP server that exposes Futu OpenD's investment-research quote APIs (stocks, options, futures, financials, news, etc.) as MCP tools, leveraging an already-running OpenD gateway with no separate authentication.
    53
    9
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Exposes TradingView data including quotes, technical ratings, historical OHLCV, and market screening through an MCP server using unofficial libraries.
    -