Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Stockbit MCP

NPM · STOCKBIT-MCP · SCANNED SEP 21

Indonesian exchange (IDX) via your own Stockbit account: quotes, bandarmology, charts. Unofficial.

Available components

+3 this week 91 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to INo-xious/stockbit-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 12 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 15203 tokens (~370/item across 41 items; 41 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
  • Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage97
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 91% of tool parameters carry a description.Partial
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "alert_delete" implies "delete" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Fail
  • An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Stockbit MCP server?

Stockbit MCP runs locally as an npm package, launched with npx -y stockbit-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · stockbit-mcp

# add to Claude Code
claude mcp add ino-xious-stockbit-mcp -- npx -y stockbit-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "ino-xious-stockbit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "stockbit-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "ino-xious-stockbit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "stockbit-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add ino-xious-stockbit-mcp -- npx -y stockbit-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ino-xious-stockbit-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "stockbit-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ino-xious-stockbit-mcp --command npx --arg -y --arg stockbit-mcp
# ~/.hermes/config.yaml
mcp_servers:
  ino-xious-stockbit-mcp:
    command: "npx"
    args: ["-y", "stockbit-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "ino-xious-stockbit-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "stockbit-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add ino-xious-stockbit-mcp -t stdio -c npx -a -y stockbit-mcp
// mcp.json
{
  "mcpServers": {
    "ino-xious-stockbit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "stockbit-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 9 Sept 26 +16
    • Malware scan: unverified → pass security
  • 8 Sept 26 −15
    • Malware scan: pass → unverified security
    • Package version: 1.3.0 → 1.3.1 functional
  • 7 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed npm/stockbit-mcp@1.3.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo INo-xious/stockbit-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/INo-xious/stockbit-mcp/.github/workflows/publish.yml@refs/heads/main
Rekor log index 2755933148
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:7b7670bd98f8e545715b5225c13282f408b1bbbbc42b52577d9a75e6b0dab7029c67b83a56b559e6864425289fd4ee0e348fad98e18ea6d2497a25653

Background: How many MCP packages publish verified provenance →

Dependencies 96 packages
Packages resolved 96
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 41 exposed · ~13,463 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
alert_check ~217

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.

NameTypeReqDescription
dry_runbooleanEvaluate without recording fires, so a check can be repeated. Default false.
symbolstringOnly check rules for this ticker

No output schema declared.

No examples provided.

alert_create ~392

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.

NameTypeReqDescription
cooldown_minutesnumberMinimum minutes between fires. Default 0 (once per bar).
leftstring|numberyesSeries id, price field, or number
namestringyesWhat this alert means, e.g. 'RSI oversold'
notestringFree text for your own reference
opstringyes
overlaysarrayPrice series the condition references
panelsarrayOscillators the condition references
rightstring|numberyes
symbolstringyesIDX ticker, e.g. BBRI

No output schema declared.

No examples provided.

alert_delete ~54

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

NameTypeReqDescription
disable_onlybooleanKeep the rule but stop it firing. Default false.
idstringyesRule id from alert_list

No output schema declared.

No examples provided.

alert_list ~35

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

NameTypeReqDescription
symbolstringOnly rules for this ticker

No output schema declared.

No examples provided.

analyze ~486

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.

NameTypeReqDescription
barsnumberDaily sessions to pull (default 260 ≈ one trading year; 500 also fills the monthly view)
broker_periodstringBroker-flow window (default LAST_7_DAYS). YEAR_TO_DATE costs the same one request.
include_sentimentbooleanFetch the community post count for context (default true). Never scored.
pattern_windowintegerSessions of candlesticks to read (default 10). Must be at least 1.
symbolstringyesIDX ticker, e.g. BBRI

No output schema declared.

No examples provided.

backtest ~660

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.

NameTypeReqDescription
barsnumberSessions of history (default 500, the practical maximum)
commission_buy_pctnumberDefault 0.15
commission_sell_pctnumberDefault 0.25 (includes the 0.1% sale tax)
entry_leftstring|numberEntry condition, left side
entry_opstring
entry_rightstring|number
exit_leftstring|numberExit condition, left side
exit_opstring
exit_rightstring|number
foldsnumberWalk-forward folds, default 3
fromstringEarliest session, YYYY-MM-DD
include_equitybooleanInclude the equity curve, one point per bar. Default false.
include_tradesbooleanInclude the full trade log. Default true.
initial_capitalnumberIDR, default 10,000,000
max_hold_barsnumberForce an exit after this many bars
overlaysarraySeries the conditions reference
panelsarrayOscillators the conditions reference
slippage_pctnumberDefault 0.1
stop_loss_pctnumberPercent below the fill price, e.g. 5
strategystringA preset. Omit to supply entry/exit yourself.
symbolstringyesIDX ticker, e.g. BBRI
take_profit_pctnumberPercent above the fill price
tostringLatest session, YYYY-MM-DD
walk_forwardbooleanAlso run an out-of-sample check. Costs no extra requests.

No output schema declared.

No examples provided.

bandar_detector ~842

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…

NameTypeReqDescription
date_fromstringAlias for `from`.
date_tostringAlias for `to`.
end_datestringAlias for `to`.
fromstringRange start, YYYY-MM-DD. Requires `to`.
investor_typestringDefault ALL
limitnumberMax 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 retur…
market_boardstringDefault REGULER — the ordinary order book, and what bandarmology means. ALL folds in negotiated blocks and can be several times larger.
periodstringPreset 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…
resolve_namesbooleanAdd each broker's securities house as `name`, joined from the cached directory.
start_datestringAlias for `from`.
symbolstringyesIDX ticker, e.g. BBRI
tostringRange end, YYYY-MM-DD (inclusive). Requires `from`.
topnumberBrokers to keep per side (default 5, max 50)
transaction_typestringNET (default) nets each broker's buys against its sells; GROSS does not.

No output schema declared.

No examples provided.

broker_activity ~1,129

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…

NameTypeReqDescription
broker_codestringyesBroker code, 2-4 uppercase letters or digits, e.g. YP
date_fromstringAlias for `from`.
date_tostringAlias for `to`.
end_datestringAlias for `to`.
fromstringRange start, YYYY-MM-DD. Requires `to`.
investor_typesarrayInvestor classes to include, as a list. Also sent as repeated parameters.
limitnumberRows per page. Omitted means the server default.
market_typesarrayBoards to include, as a list. Each value is sent as its own repeated parameter.
pagenumber1-based page. Omitted means the server default.
periodstringPreset 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.
sort_bystringSort 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,…
start_datestringAlias for `from`.
tostringRange end, YYYY-MM-DD (inclusive). Requires `from`.

No output schema declared.

No examples provided.

broker_distribution ~623

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.

NameTypeReqDescription
browserstringBrowser to open Stockbit in, by name, e.g. "Edge". Defaults to STOCKBIT_WEB_BROWSER, else the OS default.
data_typestringDefault VALUE (IDR). VOLUME returns lots (1 lot = 100 shares).
date_fromstringAlias for `from`.
date_tostringAlias for `to`.
end_datestringAlias for `to`.
fromstringWindow start, YYYY-MM-DD. Requires `to`.
investor_typestringDefault ALL
market_boardstringDefault REGULER, matching Stockbit's UI. ALL folds in negotiated blocks and changes the numbers a lot.
open_in_stockbitbooleanOpen the symbol's Stockbit page in the user's browser. Default true.
periodstringPreset window; default LAST_1_DAY. Ignored when from/to are given.
save_pathstringWhere to write the .svg. Defaults to charts/ inside the store (~/.stockbit, or $STOCKBIT_STORE_DIR).
start_datestringAlias for `from`.
symbolstringyesIDX ticker, e.g. BBRI
themestringPalette. Default dark.
tostringWindow end, YYYY-MM-DD (inclusive). Requires `from`.
top_sourcesnumberSource brokers to draw (default 8)
top_targetsnumberCounterparties to draw; the rest merge into an 'others' band (default 12)

No output schema declared.

No examples provided.

broker_summary ~672

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.

NameTypeReqDescription
date_fromstringAlias for `from`.
date_tostringAlias for `to`.
end_datestringAlias for `to`.
fromstringRange start, YYYY-MM-DD. Requires `to`.
investor_typestringDefault ALL
limitnumberMax brokers per side (default 50; API default 25 truncates)
market_boardstringDefault 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.
periodstringPreset 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 toda…
resolve_namesbooleanAdd each broker's securities house as `name`, joined from the cached directory.
start_datestringAlias for `from`.
symbolstringyesIDX ticker, e.g. BBRI
tostringRange end, YYYY-MM-DD (inclusive). Requires `from`.
transaction_typestringNET (default) nets each broker's buys against its sells; GROSS does not.

No output schema declared.

No examples provided.

cash_balance ~237

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

financials ~72

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

NameTypeReqDescription
data_typenumber
report_typenumber
statement_typenumber
symbolstringyesIDX ticker

No output schema declared.

No examples provided.

keystats ~31

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

NameTypeReqDescription
symbolstringyesIDX ticker

No output schema declared.

No examples provided.

login ~734

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.

NameTypeReqDescription
confirmbooleanyesMust be true, and only after asking the user in words.
forcebooleanLog in again even though a session is already stored.
fresh_profilebooleanUse 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…
reap_orphansbooleanIf 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 log…
switch_accountbooleanSign the current Stockbit account OUT of the browser profile first, then show a real login form. For logging in as someone else. Implies force.

No output schema declared.

No examples provided.

logout ~266

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.

NameTypeReqDescription
confirmbooleanyesMust be true, and only after asking the user in words.
remove_browser_profilebooleanAlso delete the saved browser profile, which holds Stockbit cookies. Default false.
scopestringWhat to clear. Default `all`.

No output schema declared.

No examples provided.

market_movers ~547

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, n…

NameTypeReqDescription
limitnumberMax rows. Honoured, but capped at 50 by the service. Omitted takes its default.
viewstringWhich tab. Omitted takes the server's default view — read `view` to see which.

No output schema declared.

No examples provided.

market_session ~130

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

news ~404

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.

NameTypeReqDescription
from_datestringYYYY-MM-DD, inclusive
keywordstringFull-text search over headlines and body.
last_stream_idstringCursor: the `nextCursor` from the previous page.
limitnumberMax rows. Omitted = Stockbit's own page size.
symbolstringIDX ticker, e.g. BBRI. Omit for market-wide news.
to_datestringYYYY-MM-DD, inclusive

No output schema declared.

No examples provided.

orderbook ~311

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`.

NameTypeReqDescription
symbolstringyesIDX ticker

No output schema declared.

No examples provided.

orders ~226

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.

NameTypeReqDescription
symbolstringIDX ticker to filter by, e.g. BBRI. Omit for all open orders.

No output schema declared.

No examples provided.

patterns ~237

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.

NameTypeReqDescription
barsnumberSessions to search (default 120)
fromstring
ignore_contextbooleanReport reversal shapes regardless of prior trend. Default false.
min_confidencenumber0-1, default 0.5
onlyarrayRestrict to these pattern ids
sincenumberOnly the last N sessions
symbolstringyesIDX ticker, e.g. BBRI
tostring

No output schema declared.

No examples provided.

portfolio ~285

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

position ~184

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.

NameTypeReqDescription
symbolstringyesIDX ticker, e.g. BBRI

No output schema declared.

No examples provided.

position_size ~467

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.

NameTypeReqDescription
account_idrnumberAccount value, with risk_pct.
aranumberToday's ceiling, from price_bands.
arbnumberToday's floor, from price_bands.
entry_pricenumberyesLimit price you would buy at, in IDR.
fee_buy_pctnumberBuy commission percent. Default 0.15.
fee_sell_pctnumberSell commission percent. Default 0.25.
max_lotsnumberNever suggest more lots than this.
risk_idrnumberRupiah you are willing to lose. Or use account_idr + risk_pct.
risk_pctnumberPercent of the account to risk, e.g. 1.
stop_pricenumberyesWhere you would get out. Must be below entry_price.

No output schema declared.

No examples provided.

price_bands ~134

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.

NameTypeReqDescription
symbolstringyesIDX ticker, e.g. BBRI

No output schema declared.

No examples provided.

price_chart ~539

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.

NameTypeReqDescription
annotationsarrayYour own drawings on top of the chart. Same shape chartbit_draw takes.
barsnumberSessions to plot (default 120)
browserstringBrowser to open Stockbit in, by name, e.g. "Edge". Defaults to STOCKBIT_WEB_BROWSER, else the OS default.
fromstringEarliest session, YYYY-MM-DD
open_in_stockbitbooleanOpen the symbol's Stockbit chart in the user's browser. Default true.
overlaysarrayPrice overlays. Default sma20 + sma50.
panelsarraySub-panels below price. Default rsi.
save_pathstringWhere to write the .svg. Defaults to charts/ inside the store (~/.stockbit, or $STOCKBIT_STORE_DIR).
show_levelsbooleanDraw support/resistance from pivot clustering. Default true.
show_volumebooleanDefault true
symbolstringyesIDX ticker, e.g. BBRI
themestringDefault dark
tostringLatest session, YYYY-MM-DD

No output schema declared.

No examples provided.

quote ~59

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

NameTypeReqDescription
symbolstringyesIDX ticker, e.g. BBRI, or index e.g. IHSG

No output schema declared.

No examples provided.

ratios ~22

Financial ratios for a company.

NameTypeReqDescription
symbolstringyesIDX ticker

No output schema declared.

No examples provided.

scan ~394

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.

NameTypeReqDescription
leftstring|numberyesCondition left side, e.g. close
max_secondsnumberDefault 45
max_symbolsnumberDefault 20. See the cost note.
opstringyes
overlaysarray
panelsarray
reportarraySeries to report for each hit, e.g. ["close", "rsi14"]
rightstring|numberyesCondition right side, e.g. sma20
symbolsarrayExplicit tickers. Omit to use movers or trending.
universestringDefault symbols. `watchlist` sweeps your own list — usually the one you want.
watchlist_idstringWhich watchlist, from the `watchlist` tool. Defaults to your default list.

No output schema declared.

No examples provided.

screener ~239

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.

NameTypeReqDescription
cataloguebooleanReturn the screenable-metric catalogue instead (large)
limitnumberCap the matches returned
presetsbooleanReturn Stockbit's built-in screens instead
template_idstringRun this saved screen. Omit to list them.
typestringFrom the listing, e.g. TEMPLATE_TYPE_CUSTOM. Must match the template's own.
universebooleanReturn the index scopes a screen can be limited to

No output schema declared.

No examples provided.

seasonality ~291

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.

NameTypeReqDescription
back_yearnumberStockbit's back_year parameter, passed through as given
symbolstringyesIDX ticker, e.g. BBRI
yearnumberEnd year of the ten-year lookback (default: current year)

No output schema declared.

No examples provided.

status ~502

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.

NameTypeReqDescription
livebooleanProve 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 f…

No output schema declared.

No examples provided.

strategy_compare ~214

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.

NameTypeReqDescription
barsnumberSessions of history (default 500)
fromstring
initial_capitalnumber
stop_loss_pctnumberApplied to every strategy
strategiesarrayWhich to compare. Default: all nine.
symbolstringyesIDX ticker, e.g. BBRI
take_profit_pctnumber
tostring

No output schema declared.

No examples provided.

stream ~594

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.

NameTypeReqDescription
categorystringWire spelling, case-sensitive. Omitted = Stockbit's default feed.
from_datestringYYYY-MM-DD, inclusive
keywordstringFull-text search over post content.
last_replystringSecond cursor Stockbit's client sends beside last_stream_id; its role is unverified, so leave it unset.
last_stream_idstringCursor: the `nextCursor` from the previous page.
limitnumberMax rows. Omitted = Stockbit's own page size (30 on the route observed).
report_typestringNarrows STREAM_CATEGORY_REPORTS only.
symbolstringIDX ticker, e.g. BBRI. Omit for the market-wide stream.
to_datestringYYYY-MM-DD, inclusive
watchlist_idsarrayNumeric watchlist ids, for the *_WATCHLIST categories.

No output schema declared.

No examples provided.

technicals ~173

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.

NameTypeReqDescription
barsnumberSessions to analyse (default 200). Ignored if `from` is given.
fromstringEarliest session, YYYY-MM-DD
symbolstringyesIDX ticker, e.g. BBRI
tostringLatest session, YYYY-MM-DD

No output schema declared.

No examples provided.

timeframe_alignment ~189

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.

NameTypeReqDescription
barsnumberDaily sessions to fold up (default 500 — monthly needs all of them)
symbolstringyesIDX ticker, e.g. BBRI

No output schema declared.

No examples provided.

top_movers ~275

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.

NameTypeReqDescription
limitnumberSent, but the service ignores it — nine rows come back regardless. Default 25.
typestringyesWhich hotlist

No output schema declared.

No examples provided.

trading_status ~235

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

watchlist ~144

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.

NameTypeReqDescription
idstringWatchlist id. Omit to list all watchlists.
limitnumberMax symbols (default and cap 500)

No output schema declared.

No examples provided.

workflow_list ~66

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

workflow_run ~152

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.

NameTypeReqDescription
inputobjectInputs for the workflow, e.g. { "symbol": "BBRI" }
namestringyesWorkflow name from workflow_list, e.g. deep_dive

No output schema declared.

No examples provided.

Common questions

What is the Stockbit MCP server?

Stockbit MCP is listed in the public MCP registry as io.github.INo-xious/stockbit-mcp. Indonesian exchange (IDX) via your own Stockbit account: quotes, bandarmology, charts. Unofficial. This page covers its npm package (stockbit-mcp).

Is the Stockbit MCP server safe to use?

Stockbit MCP scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Stockbit MCP server expose?

Stockbit MCP exposes 41 tools: status, login, logout, broker_summary, broker_distribution, and 36 more. Their descriptions and schemas cost roughly 13,463 tokens of context every time the server is loaded.

Is the Stockbit MCP server still maintained?

Stockbit MCP is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Stockbit MCP server under?

Stockbit MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.