mirror of
https://github.com/0xrsydn/idx-cli.git
synced 2026-11-07 09:45:36 +00:00
feat(cli,mcp): idx stocks broker and get_broker_summary
`idx stocks broker SYMBOL` shows the top 10 buyers and sellers of a stock by lots for the latest session with trades, one `--date`, or a `--from`/`--to` range, filtered by `--investor` and `--board`. The MCP server exposes the same as get_broker_summary. - Range and filter parsing lives in idx-core (BrokerRange::from_args, FromStr for the filters), so both frontends accept the same input. - Without dates, the latest session is found by walking back over weekdays; offline, uncached days are skipped. - Table output lists foreign and state-owned brokers, and says when the source rounded figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3syn2fN2LNo5pvTSqc6eh
This commit is contained in:
parent
7c8151a3a6
commit
860d4daf77
25 changed files with 939 additions and 13 deletions
|
|
@ -9,9 +9,10 @@ use idx_core::config::CoreConfig;
|
|||
use idx_core::investor::{ImportSource, Investor};
|
||||
use serde_json::{Value, json};
|
||||
|
||||
const TOOLS: [&str; 11] = [
|
||||
const TOOLS: [&str; 12] = [
|
||||
"analyze_stock",
|
||||
"compare_stocks",
|
||||
"get_broker_summary",
|
||||
"get_company",
|
||||
"get_investor_holdings",
|
||||
"get_ownership_changes",
|
||||
|
|
@ -247,6 +248,16 @@ fn live_tools_wrap_data_with_freshness() {
|
|||
assert_fetched(&analysis[kind]);
|
||||
}
|
||||
|
||||
let brokers = client.ok(
|
||||
"get_broker_summary",
|
||||
json!({"symbol": "BBCA", "date": "2026-10-16"}),
|
||||
);
|
||||
assert_fetched(&brokers);
|
||||
assert_eq!(brokers["source"], "ipot");
|
||||
assert_eq!(brokers["data"]["buyers"][0]["code"], "MG");
|
||||
assert_eq!(brokers["data"]["sellers"][0]["name"], "MANDIRI SEKURITAS");
|
||||
assert_eq!(brokers["data"]["foreign_net_value"], -2_300_000_000_000_i64);
|
||||
|
||||
let compared = client.ok("compare_stocks", json!({"symbols": ["BBCA", "BBRI"]}));
|
||||
assert_eq!(compared["reports"].as_array().unwrap().len(), 2);
|
||||
assert_eq!(compared["failures"], json!([]));
|
||||
|
|
@ -273,6 +284,14 @@ fn errors_carry_cli_codes() {
|
|||
("compare_stocks", json!({"symbols": []})),
|
||||
("get_company", json!({"symbol": "BBCA", "sections": []})),
|
||||
("analyze_stock", json!({"symbol": "BBCA", "kinds": []})),
|
||||
(
|
||||
"get_broker_summary",
|
||||
json!({"symbol": "BBCA", "date": "2026-10-16", "from": "2026-10-12"}),
|
||||
),
|
||||
(
|
||||
"get_broker_summary",
|
||||
json!({"symbol": "BBCA", "date": "2026-10-16", "board": "dark"}),
|
||||
),
|
||||
] {
|
||||
let (is_error, body) = client.call(tool, arguments);
|
||||
assert!(is_error, "{tool}: {body}");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue