feat(mcp): add idx-mcp, a stdio MCP server over idx-core

Phase 4 of docs/DESIGN.md. Eleven grouped tools (quotes, history, screen,
company, analysis, compare, shareholders, investor holdings, search,
ownership changes, status); ownership_sync is listed only with
--allow-sync. Live results keep the Fetched envelope, errors use the CLI's
{error, code, message} body, and investor tools on an empty database
point at the sync path.

idx-core gains Period/Interval FromStr, Investor::status, a ticker
filter on changes, and Display for ErrorCode (now used by the CLI too).
CLI output and goldens are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
hermes 2026-10-14 18:19:04 +00:00
commit cda12fe2db
18 changed files with 1546 additions and 38 deletions

31
crates/idx-mcp/Cargo.toml Normal file
View file

@ -0,0 +1,31 @@
[package]
name = "idx-mcp"
description = "MCP server for Indonesian stock market (IDX) market, financial, and ownership data"
version.workspace = true
edition.workspace = true
# rmcp requires 1.88.
rust-version = "1.88"
license.workspace = true
repository.workspace = true
homepage.workspace = true
readme = "../../README.md"
keywords = ["idx", "stocks", "indonesia", "mcp", "finance"]
categories = ["finance"]
include = ["/Cargo.toml", "/LICENSE", "/src/**"]
[[bin]]
name = "idx-mcp"
path = "src/main.rs"
[dependencies]
idx-core.workspace = true
clap.workspace = true
rmcp = { version = "3.5", default-features = false, features = ["server", "macros", "transport-io"] }
schemars = "1"
serde.workspace = true
serde_json.workspace = true
tokio = { version = "1", features = ["macros", "rt-multi-thread", "io-std"] }
[dev-dependencies]
# Tests drive the binary with the mock provider; release builds exclude it.
idx-core = { workspace = true, features = ["testing"] }