Ib suite
Read-only Interactive Brokers toolchain index and onboarding. Use when orienting across the ib-suite skills, running first-run setup (venv + live/paper config), or deciding which IB skill to run and in what order: ib-sync ingestion, live account/positions/daily-P&L/options overviews, Flex trade or dividend history, or the offline ib-analyze report. It runs nothing itself — the sub-skills do the work and never place, modify, or cancel an order.From its SKILL.md
npx -y skills add luyangkk/ib-suite --skill ib-suiteAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
11.9 KB, ~3.1k tokens by cl100k_base, as published. Nobody here has run it
ib-suite — Interactive Brokers read-only toolchain
This directory is a read-only IB (Interactive Brokers) diagnostics toolchain:
pull account data from IB, land it in a local data lake, and turn it into a
graded portfolio-diagnostics report. Nothing here ever places, modifies, or
cancels an order. Ingestion connects with readonly=True; analysis never
touches the network.
This SKILL.md is the entry point. It does not run anything itself — it tells you (and OpenClaw) which sub-skill to run, in what order, and how the pieces fit.
0. First-run setup
Before running any sub-skill, make sure a config exists. This index owns
onboarding; the sub-skills stay gated until config.yaml is present.
- Detect. If
.ib-suite/config.yamlalready exists, config is ready — skip to §2. Otherwise continue.test -f .ib-suite/config.yaml && echo "config ready" || echo "needs setup" - Ensure the venv (only if missing):
test -d {baseDir}/.venv || bash {baseDir}/scripts/setup_venv.sh - Ask the user one question: connect to live (real account, port 4001)
or paper (simulated, port 4002)? Default is live — every connection
in this toolchain is
readonly=True, so live is read-only too. - Generate the config with the chosen mode (defaults to live):
It refuses to overwrite an existing config unless you add{baseDir}/.venv/bin/python {baseDir}/scripts/init_config.py \ --mode live --out .ib-suite/config.yaml--force. - Report back: the config path and the resulting mode/port. Remind the
user to start IB Gateway with Read-Only API enabled before
/ib-sync, and thatib-trade-historyandib-dividend-incomeshare one Flex token but keep separate per-window Query ID maps in ignored local config (flex.tokenwithflex.trade_history_query_ids/flex.dividend_query_ids); never echo either credential. - Proceed to §2 and run
/ib-sync→/ib-analyze.
Runtime config and data stay workspace-local under <workspace>/.ib-suite/
(gitignored); the skill dir ships only code and config.example.yaml.
1. Directory overview
| Component | What it is | Runs a command? | Network? |
|---|---|---|---|
| ib-common | Shared pip-installable package (config / schema / storage / metrics / charts). Not a skill. | No | No |
| ib-gateway | Read-only ingestion skill → /ib-sync | Yes | Yes (IB Gateway / Flex) |
| ib-account-overview | Read-only account financial overview skill → /ib-account-overview | Yes | Yes (IB Gateway) |
| ib-positions-overview | Read-only enriched positions overview skill → /ib-positions-overview | Yes | Yes (IB Gateway) |
| ib-daily-pnl | Read-only daily (today's) P&L breakdown skill → /ib-daily-pnl | Yes | Yes (IB Gateway) |
| ib-trade-history | Read-only Flex Query execution-history skill → /ib-trade-history | Yes | Yes (Flex Web Service) |
| ib-dividend-income | Read-only Flex-only paid/expected dividend-income skill → /ib-dividend-income | Yes | Yes (Flex Web Service) |
| ib-options-overview | Read-only option positions and Greeks overview skill → /ib-options-overview | Yes | Yes (IB Gateway) |
| ib-portfolio-analyst | Offline diagnostics skill → /ib-analyze | Yes | No |
skills/ib-suite/
SKILL.md # <- you are here (index / router)
scripts/setup_venv.sh # shared venv bootstrap (installs ib-common editable)
ib-common/ # shared library (installed editable into .venv)
ib-gateway/ # /ib-sync : IB/Flex -> local data lake
ib-account-overview/ # /ib-account-overview: IB account -> financial overview (no persistence)
ib-positions-overview/ # /ib-positions-overview: IB positions -> enriched, ranked overview (no persistence)
ib-daily-pnl/ # /ib-daily-pnl: IB live P&L -> today's realized/unrealized, ranked (no persistence)
ib-trade-history/ # /ib-trade-history: Flex executions -> stdout JSON (no persistence)
ib-dividend-income/ # /ib-dividend-income: Flex dividends -> stdout JSON (no account-data persistence)
ib-options-overview/ # /ib-options-overview: IB live options -> Greeks and risk overview (no persistence)
ib-portfolio-analyst/ # /ib-analyze: data lake -> report.md + charts
Scope. In: read-only sync, snapshots, Parquet history, and P0–P3 findings across account health, concentration, P&L attribution, trade review, portfolio risk, pre-trade simulation, and Flex-only dividend income. Out (hard boundary): order placement/modification/cancellation, live WhatIf margin checks, real-time market data, and any write path to IB. Do not add these under the banner of "completeness".
2. Run guide
Dependency direction: ib-common ← ib-gateway (produces data) ← ib-portfolio-analyst (consumes data).
setup_venv.sh -> ib-gateway /ib-sync -> ib-portfolio-analyst /ib-analyze
(install ib-common) (write data lake) (read lake -> report)
-
Setup once (or after dependency changes). Bootstraps the shared
.venvand installsib-common(editable) plus runtime deps. Idempotent.bash {baseDir}/scripts/setup_venv.sh # config.yaml is created by "0. First-run setup" (writes .ib-suite/config.yaml)Runtime data lives outside the skill dir. Keep the real
config.yamland the data lake under the workspace, e.g.<workspace>/.ib-suite/config.yamland<workspace>/.ib-suite/data/(setstorage.root: .ib-suite/data). The skill directory ships only code andconfig.example.yaml; reinstalling the skill must never overwrite user data. Entry scripts take explicit--config/--outand don't depend on the current working directory. -
Ingest (ib-gateway, online). Start IB Gateway (paper 4002 / live 4001) with API access, then run
/ib-sync. Writesdata/snapshots/<account>/<ts>.jsonand appendsdata/timeseries/positions_history.parquet. See ib-gateway/SKILL.md. -
Analyze (ib-portfolio-analyst, offline). Run
/ib-analyzeagainst a snapshot to producereport.md+.html/.pngcharts. See ib-portfolio-analyst/SKILL.md.
Which skill do I run?
| You want to… | Run |
|---|---|
| Refresh account/position data from IB | ib-gateway → /ib-sync |
| See account equity, margin, liquidity & P&L right now | ib-account-overview → /ib-account-overview |
| List every position, ranked, with the most concentrated name | ib-positions-overview → /ib-positions-overview |
| See how the account did today and which names drove it | ib-daily-pnl → /ib-daily-pnl |
| List historical fills, commission, realized P&L and win/loss statistics | ib-trade-history → /ib-trade-history |
| See paid/expected dividends, tax, attribution, annual income and yield | ib-dividend-income → /ib-dividend-income |
| Configure shared Flex credentials or dividend query fields | ib-dividend-income → /ib-dividend-income setup guide |
| Inspect option holdings, IV, Greeks, expiry exposure, and concentration | ib-options-overview → /ib-options-overview |
| Produce a diagnostic report from existing data | ib-portfolio-analyst → /ib-analyze |
| Test any skill without IB | its tests/ fixtures (see §5) |
Note on optional inputs. /ib-sync v1 lands only the account snapshot and
positions. Daily bars, executions, and dividends are optional JSON arrays
(matching the DailyBar / Execution / Dividend schema, e.g. exported from a
Flex report) that you pass to /ib-analyze directly; the corresponding report
sections appear only when their data is supplied.
3. Sub-skill module spec
Every functional sub-skill directory (ib-gateway, ib-portfolio-analyst, and
any future one) MUST follow this contract:
SKILL.mdwith valid frontmatter. Requiredname+description, andmetadata.openclaw(requires.bins,requires.config,os) so OpenClaw can discover and gate it.nameMUST equal the directory name (lowercase, stable).descriptionstates the read-only boundary. Start with "Read-only", say what it does and when it triggers, and stay narrow enough to avoid mis-firing.scripts/holds the deterministic entry logic. Useargparse; validate required args; exit non-zero with an actionable message on failure. Commands inSKILL.mduse the{baseDir}placeholder and.venv/bin/python— never absolute or hardcoded user paths.- Network/IB access hides behind an injectable factory (
client_factory,http_get) sotests/run fully offline againstfixtures/. - Reuse
ib-common, don't fork it. Types come fromib_common.schema(pydantic v2); reuseFinding,grade(),thresholds, storage helpers, andrender()for charts. New diagnostic modules live inib_analyst/, exposeanalyze(...) -> list[Finding]with a module-levelDIMconstant and an optionalbuild_chart(...) -> plotly.Figure, and are wired intoanalyze.py'srun(). New thresholds MUST also be added toib-common/config.example.yamlunderthresholds:. from __future__ import annotationsat the top of every module; type-annotate functions; docstring public functions.
4. Invocation
As OpenClaw slash commands (primary). Once discovered, the sub-skills expose
/ib-sync, /ib-account-overview, /ib-positions-overview, /ib-daily-pnl,
/ib-trade-history, /ib-dividend-income, /ib-options-overview, and
/ib-analyze. Gating is driven by each skill's metadata.openclaw (python3
on PATH, a config.yaml, and a supported OS).
As direct scripts (for automation / other systems). Call the entry scripts with the shared interpreter; they print structured, parseable results (dicts / output paths) to stdout and return non-zero on failure:
# ingest
{baseDir}/.venv/bin/python {baseDir}/ib-gateway/scripts/ib_sync.py --config .ib-suite/config.yaml
# historical Flex executions (default: latest 7 calendar days)
{baseDir}/.venv/bin/python {baseDir}/ib-trade-history/scripts/trade_history.py \
--config .ib-suite/config.yaml
# Flex-only dividend income (inclusive dates are required)
{baseDir}/.venv/bin/python {baseDir}/ib-dividend-income/scripts/dividend_income.py \
--config .ib-suite/config.yaml \
--start-date 2026-01-01 \
--end-date 2026-07-19
# analyze (bars/executions/dividends optional)
{baseDir}/.venv/bin/python {baseDir}/ib-portfolio-analyst/scripts/analyze.py \
--config .ib-suite/config.yaml \
--snapshot data/snapshots/<account>/<ts>.json \
--out data/runs/$(date +%Y%m%dT%H%M%S)
As a library. import ib_common (installed editable) for config/schema/
storage/metrics/charts. ib-trade-history and ib-dividend-income share the
Flex token but keep separate per-window Query ID maps (flex.token with
flex.trade_history_query_ids / flex.dividend_query_ids) in ignored
local config. The dividend skill requires numeric windows and its standalone
field/window guide is
ib-dividend-income/flex-query-setup.md.
Never hardcode or echo tokens, Query IDs, account numbers, or user paths.
What ships with it: 29 files
161.8 KB alongside SKILL.md, 23 of them executable
ib-common/
- config.example.yaml2.5 KB
- ib_common/charts/__init__.pyruns0 B
- ib_common/charts/render.pyruns929 B
- ib_common/config.pyruns3.6 KB
- ib_common/dividend_income.pyruns49.6 KB
- ib_common/flex.pyruns4.1 KB
- ib_common/__init__.pyruns0 B
- ib_common/metrics/__init__.pyruns0 B
- ib_common/metrics/returns.pyruns1.7 KB
- ib_common/metrics/risk.pyruns1.7 KB
- ib_common/redaction.pyruns596 B
- ib_common/schema.pyruns19.8 KB
- ib_common/storage.pyruns1.7 KB
- pyproject.toml1.1 KB
- requirements.txt58 B
- tests/fixtures/config_minimal.yaml105 B
- tests/fixtures/config_options_market_data.yaml152 B
- tests/fixtures/snapshot_sample.json661 B
- tests/test_charts.pyruns460 B
- tests/test_config.pyruns4.6 KB
- tests/test_dividend_income.pyruns52.2 KB
- tests/test_flex.pyruns2.8 KB
- tests/test_metrics_returns.pyruns636 B
- tests/test_metrics_risk.pyruns839 B
- tests/test_schema.pyruns4.6 KB
- tests/test_storage.pyruns1.3 KB
scripts/
- init_config.pyruns2.4 KB
- setup_venv.shruns1.1 KB
- tests/test_init_config.pyruns2.5 KB