Releases: osauer/canary
Release list
v2.3.1
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.3.1
- Releases now fail fast on the paper account, exact-session currency conversion, and broker WhatIf path. A read-only SPY preview runs before the full test suite and proves that its USD notional was converted into the different account base currency using a current typed IBKR FX quote. It never submits an order; the existing one-share paper place, acknowledgement, cancellation, and cancellation-confirmation round-trip remains the final binding release gate.
- Release automation is shorter and clearer without weakening authority. The repository harness prefers typed MCP reads and falls back to the CLI only for uncovered read surfaces, while explicit Codex rules make both the read-only preflight and the sole
make release RELEASE_VERSION=vX.Y.Zpath discoverable. Direct tagging, pushing, GitHub release creation, and registry publication remain owned by the release target.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v2.3.1-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v2.3.1-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/v2/cmd/ibkr@v2.3.1(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Fixed
- The early release preflight can no longer claim FX coverage from a same-currency identity conversion or a preview missing exact-session FX provenance. Its regression fixture now proves both rejection and the absence of any order submission.
- Paper-smoke output no longer prints the connected account, broker order reference, raw broker response, or raw daemon-log tail. Failures retain an allowlisted lifecycle summary while private broker identifiers stay local.
v2.3.0
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.3.0
- Alerts became one inbox, and eight more sources can now reach your phone. Until now only Canary, governance, and order-integrity alerts had a send path, each with its own owner, while Regime, Rulebook, risk policy, Protection, reconciliation, and Data Health were recorded as shadow evidence that could never page (
delivery_active=false,delivery_preference=unapproved) — this supersedes the shadow-commissioning wording in the two entries further down. The fixed nine-producer universe now enters one source-neutral candidate snapshot, inbox, unread cursor, and dispatcher. The daemon decides whether a condition exists, how serious it is, and whether it opened, escalated, or recovered; the app records that decision, decides whether the chosen notification level permits a push, and owns every delivery attempt and receipt. One global notification mode covers the app host and all paired devices — Off (inbox and unread history only), Action required (act and urgent), Watch + action — and eligibility is sampled when an occurrence is first recorded, so turning notifications up later never arms a condition that was suppressed when it was created;observeseverity is always inbox-only. The cutover deliberately does not page a backlog: the first complete snapshot in each account-and-mode scope sets a delivery baseline, and conditions already active at that moment stay visible in the inbox as existing context but are never pushed. The delivery gate is per source, so an unrelated source being unavailable cannot suppress an independently current candidate — but an empty candidate list means "clear" only when the whole expected source set is complete and current, otherwise the snapshot is unknown. Delivery identity is the private tuple of scope, occurrence, and target, reserved before transport, so replayed snapshots, repeated polls, and restarts cannot produce a duplicate push; retryable transport failures wait 1, 5, and 15 minutes and a fourth is terminal, a definite rejection is never retried, and a dead subscription is retired so it cannot keep degrading healthy targets. Payloads carry fixed app copy plus allowlisted severity, kind, destination, display id, and app URL — never producer prose, symbols, account fields, or source errors. A push-service acceptance is reported as exactly that and never as proof that a device displayed or you read the notification. The cutover grants no trading authority: an alert cannot place, modify, or cancel an order, change a freeze or limit, approve a risk policy, or turn a degraded observation into a decision. - Sensors are now explained on their own public page. docs/sensors.md covers the five families — gamma (SPX/SPXW dealer structure with SPY as context), regime (eight broad-market rows into six independent clusters and a lifecycle), canary (that market state against the held portfolio), rulebook (14 advisory discipline checks), and market events (held-name borrow, threshold-list, and halt context) — and states the boundary the surfaces depend on: the daemon is the measurement authority, and CLI, MCP, app, and web read the same typed result rather than re-fetching sources or rebuilding a verdict. Two generated diagrams carry what prose handles badly: how observed sources become sensors, dependent decisions, and downstream alerts, and how freshness actually behaves — proactive refresh while the old value stays authoritative, hard expiry into fail-closed, and the difference between a producer-authored
not_duewindow and a genuine overdue gap. A sensor result is never evidence that delivery is active or that a notification arrived. - Broker-adjacent capabilities now fail closed where the daemon lacks complete authority. This entry supersedes older current-release wording that exempted close/reduce orders from size caps or implied that a platform toggle enabled purge/restore submission. Every equity/ETF and single-leg option order now carries the ordinary notional/quantity cap, and a sell-side apparent exit also needs short/sell-to-open permission under worst-case exposure because the daemon cannot see future manual TWS activity; a genuine blocked exit says to use TWS and reconcile. Purge/restore preview and submission are typed-disabled until exact per-leg portfolio plus account-global working-order authority exists, and option-exercise review mints no token and exposes no Canary submit action until exact option-to-underlying risk policy plus durable one-shot authority are approved. The purge/restore setting controls only its workflow/read surface. Account-base cap evidence is bound to the exact broker session from an explicit currency tag or one consistent allowlisted aggregate-value suffix;
ExchangeRate=1and ledger rows are ineligible. Cross-currency drafts now resolve a fresh exact-session CASH/IDEALPRO quote, bind the quote- and base-currency notionals plus FX provenance into a v4 preview token, refresh the conversion at redemption, and carry that base amount to the first-byte guard; unavailable FX fails closed instead of assuming parity or using the stale display cache. Runtime trading-control updates are human-only in every mode and commit their state plus normalized-origin audit event atomically; semantic no-ops advance neither revision nor audit stream. - Daemon state and decision history now live in one SQLite database.
$XDG_STATE_HOME/ibkr/daemon.dbis the sole live store for runtime settings, risk and alert state, order safety, retained observations, and local decision history. The existingibkr regime history,ibkr rules history,ibkr canary history,ibkr recon equity, and order-history commands read through the daemon instead of opening side files. Original Flex XML statements remain separate broker evidence and are projected transactionally into the database. Do not deletedaemon.db: it is authoritative state, not a rebuildable cache. - The SQLite cutover and upgrade path fails closed. Startup validates the database shape, integrity, write watermark, and private file permissions before serving requests or connecting to the broker. Upgrades operate on a verified candidate and publish it atomically only after validation; backups, the external head watermark, and sealed legacy artifacts remain recovery material rather than live read fallbacks. Future, damaged, rolled-back, or ambiguous state stops startup instead of silently switching to older files.
- The daily brief is now a trading-process artifact on its own tab. Re-conceived from five data-domain sections (Market, Calendar, Portfolio, Risk & limits, Process) into two process movements the daemon composes and every surface renders verbatim: Review — post-trade of the last completed session (session P&L, daily attribution by underlying, process coherence [the rulebook-adherence delta plus a new proposals-offered-vs-acted count from retained proposal outcomes, and overrides used], capital events, the reconcile clock with its one-tap sign-off, and the working-orders end state) — and Ready — pre-trade for today (overnight & market, calendar, risk capacity, and desk readiness). It is a regrouping of facts the daemon already had — row severities and the worst-child rollup are unchanged — with the one new derivation carrying only counts and the covered day to the wire (no proposal keys, symbols, order refs, or tokens). The brief moves off the Monitor tab to its own bottom-tab slot, "Brief" (Monitor · Brief · Alerts · Orders · Settings, Monitor still the default landing and universal fallback), with sunrise (Ready) and history-clock (Review) phase glyphs and sentence-case titles. Process/governance push nudges that used to land on Monitor now land on the Brief tab; the one-tap reconcile sign-off keeps its exact endpoint, evidence, and semantics. VaR and any risk-unit measure stay out of scope (an open operator decision).
- The account header stops shouting the account number. The account id is demoted from an 18px near-black headline to a quiet 12px muted subtitle (tabular figures), and it is now masked by the same eye toggle that hides money values (U•••••NN, last two characters visible) — previously the id was the one sensitive string the eye left in the clear. Money values become the visual headline by the id's demotion; the folded "Detail" toggle regains a readable label; and when the freshness stamp goes stale it takes the id's former weight in red, because staleness outranks identity. The trading-environment pill is operator-decided: live renders no pill at all (the safe default is silent), paper renders a loud red PAPER ("portfolio data is fake"), and an unresolved mode renders a muted "mode?" that fails visible instead of silently resembling live.
- The Monitor tab now separates "needs eyes" from "data is cold." The follow-up trader-panel review (discretionary trader and prop-desk risk manager, same bar as the Alerts pass) caught the Monitor tab running both dishonesty modes at once: the capital tile rendered "OK" while its own values showed a breached block tier and an engaged drawdown latch (the "OK" was plumbing health dressed as a risk verdict, and the "Risk & limits" section header green-lit the lot as "section complete"), while a normal closed weekend inflated four "Count 0" event rows and an idle dealer-gamma cache into DEGRADED noise. The daily brief now carries a fourth row status, attention (orange), derived strictly from values: a breached or latched capital tier, an active policy override, or held-name earnings whose governing rulebook rule cannot be eva...
v2.2.1
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.2.1
- Ghost orders no longer haunt the orders tab. Protective GTC stops that were cancelled or filled while the daemon wasn't listening used to stay "open" in the local order journal forever, showing up as stale "needs reconcile" rows. The daemon now asks the broker for its actual open-order list after each reconnect (and every 30 minutes) and closes journal rows the broker no longer reports as
Closed (reconciled). Broker statements remain authoritative for the final fill-vs-cancel outcome. - A stop that no longer matches its position now defends itself. Sell part of a protected position outside the platform and the app flags the stop in red, explains that triggering it would open the excess in the opposite direction, sends one push notification, and offers a single guided fix: reduce the stop to the shares still held. Nothing adjusts automatically, and the daemon refuses the fix when position evidence is missing or has moved.
- Releases no longer wait on a human for the registry step. The MCP Registry entry is published automatically by a GitHub Actions workflow when the release goes out; the release pipeline now verifies that publish happened instead of prompting for a device code. The interactive login remains only as a fallback when the workflow fails.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v2.2.1-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v2.2.1-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/v2/cmd/ibkr@v2.2.1(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Added
- Broker open-order snapshot reconcile:
reqAllOpenOrders-based sweep that appends terminalreconciled-absentevents for journaled orders absent from a complete snapshot. Fail-safe by construction: no complete snapshot means no action, and only rows in the connected account/mode scope, with a broker PermID, and quiet past a grace window are eligible. The sweep never sends a broker write. The snapshot request is its only wire interaction, and the append-only journal is never rewritten. - Protective-stop mismatch alerts and a guided fix. When a close-only stop no longer matches the position (for example after selling part of it in TWS), the daemon classifies the consequence (full or partial opposite-direction entry on trigger) and the app shows a red critical row with plain-language risk copy plus a single allowed action: reduce the stop to exactly the held quantity through the normal preview-and-confirm flow (flat positions keep Cancel as the offered fix). The daemon enforces the same reduce-only constraint server-side against a fresh positions read at both preview and confirm, failing closed when position evidence is unavailable or changed. A critical push notification fires once per occurrence via the existing alert path, debounced across two polling passes so transient zeroed position reads can never page the trader, and redacted like canary pushes (no symbols or quantities on the wire).
Changed
- The release pipeline's registry leg is verify-first: after the GitHub release is created, it polls the public MCP Registry for the exact released version (about four minutes, reporting the Actions
registry-publishrun status while it waits) and succeeds without operator interaction once the workflow-published entry appears. Only on timeout does it fall back to the previous interactive device-code login and direct publish. Standalonemake registry-publishkeeps its direct login+publish behavior as the manual heal, and the release preflight reminder now notes a browser is needed only if the automated publish fails.
Fixed
- A cancel request no longer downgrades an order's journaled transmit state, so a missed cancel confirmation can no longer wedge the row permanently write-ineligible ("open" yet not cancel-eligible); the cancel simply stays retryable until broker truth arrives.
- Position/order matching now accepts the wire's "STOCK" security-type label as equivalent to "STK". Protective orders journaled without a contract id (hand-previewed drafts, especially non-US routings) previously matched no position and were falsely classified as uncovered, which mislabeled healthy stops as critical and blocked their legitimate modifies. Caught by the paper-account rehearsal on the first real modify attempt.
- Broker open-order snapshots cannot mint phantom journal rows: unmatched openOrder/orderStatus callbacks (e.g. manual TWS orders) are observed but not adopted into the daemon's order journal.
ibkr statusbackground-task line for open orders now leads with the current account/mode count (matching the orders tab) and discloses any off-scope remainder as(+N other scope)instead of silently reporting a different total.
Removed
- The Codex delegation lane (agent development process, no product change): the implementation-lane hook, delegation runner, waiver valve, and lane policy are retired, and agent sessions implement inline again. The lane and its reactivation runbook are archived in
docs/archive/codex-delegation-lane.md.
v2.2.0
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.2.0
- The risk constitution now nudges instead of nagging. Governance follow-ups that used to rely on the operator remembering them — reconcile coming due, a drawdown tier consuming its budget, policy drift between siblings — surface as advisory nudges in the paired app and the daily brief. Everything stays shadow/advisory: no nudge blocks an order, and the monthly governance pulse is acknowledged with one tap on the paired device. Action required: none; nudges activate only under an approved v4 risk policy and stay silent otherwise.
- The regime dashboard's gamma indicator measures the market again. A gateway quirk was silently zeroing every call leg's open interest, which forced the dealer-gamma reading permanently negative — a data artifact, not a market signal. Open-interest capture is now right-aware, and per-leg call OI in
ibkr chainis correct again. - The HYG/SPY credit row now degrades gracefully to the latest official close when a live tick is missing, instead of erroring out and destabilizing regime stage transitions.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v2.2.0-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v2.2.0-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/v2/cmd/ibkr@v2.2.0(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Added
- Risk-governance nudges (advisory/shadow): the daemon derives typed nudge candidates — reconcile due, drawdown tier consumption, sibling policy drift, monthly governance pulse — strictly from active, fully approved, internally consistent v4 policy authority; any unhealthy or pre-v4 posture suppresses candidates with a disclosed typed reason rather than a clean-empty result. Shadow occurrences are timestamped at the first qualifying preview and survive restarts.
nudges.cutover_review: a fixed-shape, paired-device-only acknowledgement for the governance cutover review. The daemon authenticates the paired session, revalidates the canonical policy report at write time, pins the reviewed coverage and report fingerprint into daemon-owned evidence, and keeps identical retries idempotent while conflicting or stale retries fail closed. It acknowledges review only — it cannot submit broker writes, change freeze or limits, or weaken policy.- The paired app delivers nudges through alerts and the governance panel, and
POST /api/governance/cutover-reviewaccepts only an empty body: origin and evidence are fixed server-side, hostile payloads are rejected before the daemon call, and daemon errors return without private text. The daily brief (ibkr brief) renders the monthly governance aggregate.
Security
PATCH /api/settingson the paired-app route now rejects anytrading.*patch with a 400 before the daemon is called (the CLI remains the only trading-settings surface), and assignsoriginserver-side aspaired_device, discarding whatever origin the client body claims.
Fixed
- Per-leg call open interest is no longer zeroed by the gateway's put-side companion tick. The gateway delivers a call-OI and a put-OI tick on the same option-leg subscription — the opposite-right one carrying zero — and last-write-wins left every call leg at OI 0 (observed: all 6,991 journaled SPX call contracts across five weeks, while puts stayed positive). With call legs zeroed, the dealer-GEX profile became put-only, every sweep point went negative, and the regime dashboard's gamma row was pinned to a permanent "wholly short" reading with
no_crossing_in_windowon 100% of computes — a measurement artifact, not a market state.ibkr chainper-leg call OI was corrupted the same way. Open-interest capture is now right-aware: a subscription commits only the tick matching its own call/put right, and the zero companion is discarded. Gamma journal rows recorded before this fix (regime gamma decisions andgamma_signdiagnostics) are artifact data — calibration windows restart at the fix. - The regime dashboard's HYG/SPY row no longer drops to
errorwhen the HYG spot subscribe delivers no tick: the fetcher now falls through to the latest official daily close as banding input at any hour and marks the rowstale(disclosed viafields_missing: hyg_spot_tickand the quality label). An errored row blanked the band, which bypassed red-exit hysteresis and the confirmation latch — a latched red de-confirmed and re-confirmed around every transient gateway blip (8,012 stage transitions in 5 weeks, median dwell 34 seconds, including 2,344 on a closed-market holiday). A stale row keeps its band, so confirmations now hold through fetch failures; a genuinely unavailable close (no spot tick and no usable history) still landserror. Off-hours behavior with a live tick is unchanged: official close, statusok. - Market-data subscribe errors in the daemon's snapshot helpers are now logged with the symbol instead of silently discarded, so gateway farm blips and silent subscribe timeouts are distinguishable in the daemon log.
v2.1.1
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.1.1
- Maintenance release for the release pipeline itself — no functional changes to the CLI, MCP tools, or paired app. The release credential preflight now matches the MCP Registry's short-lived login tokens (about five minutes), so releases no longer gate on a token-validity minimum that could never pass.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v2.1.1-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v2.1.1-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/v2/cmd/ibkr@v2.1.1(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Changed
- The release credential preflight no longer gates on stored MCP Registry JWT validity: registry JWTs live only about five minutes, so the former 30-minute minimum (and its
REGISTRY_TOKEN_MIN_VALID_MINUTESoverride) could never pass, and a start-of-pipeline refresh would expire before the registry leg anyway. The preflight now verifies gh auth and the publish tooling, and fails fast only when the registry leg's automatic device-code login is disabled (MCP_REGISTRY_AUTO_LOGIN=0); the login itself always happens at the registry-publish leg with the operator at a browser.
v2.1.0
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.1.0
- A personal risk constitution now governs capital discipline (advisory/shadow — nothing blocks orders). The operator writes every number into
~/.config/ibkr/policies/risk-policy.toml(no defaults in code): protected equity floor, declared risk capital, a two-tier drawdown ladder measured from a cash-flow-adjusted peak with a latching shadow block, one-shot expiring overrides, and reconciliation tolerances.ibkr policy show --explainrenders the whole contract in plain language. - Broker statements are ingested and reconciled daily. A
[flex]config section fetches IBKR Flex statements on a daily schedule (immutable raw retention), a recon engine matches statement flows against the declared ledger with never-false-match semantics, andibkr reconrenders the report. At policy v3, broker-confirmed flows become the authoritative capital-flow input and a fully clean, fresh report extends the reconcile clock automatically — recurring sign-off chores are retired; exceptions, and only exceptions, require the human.ibkr recon backtestreplays the full statement window (complete flow review plus capital-ladder equity replay) for validation before trust. - Agent sessions now implement through a hook-enforced Codex-only lane (
scripts/codex-implement.sh): planning, review, and integration stay in the orchestrating session, implementation runs headless in an isolated sibling worktree with fail-closed approvals, and inline code edits by agent sessions are deterministically blocked (human-approved break-glass:scripts/waive-inline.sh). Action required: none for CLI/MCP/app users; repo contributors using agent sessions get the new flow automatically.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v2.1.0-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v2.1.0-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/v2/cmd/ibkr@v2.1.0(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Added
- Risk constitution phase 1:
ibkr policy(show/--explain, capital-event, override, reset-drawdown, artefact) over an operator-authoredrisk-policy.toml; capital-event journal with replay; drawdown warn/block ladder where the block latches until a journaled human reset; policy fingerprinting and sibling-policy drift display. All five policy write verbs are human-origin-only at the daemon. - Post-trade truth (phase 3a):
[flex]daily statement ingestion with single-purpose token-file rules;internal/flexstmttyped parser — unknown line types become louduncategorizedexceptions, never actions; recon engine +ibkr recon [--json]; the reconcile verb is report-gated (bare attestation retired) with a one-shot override as the statement-outage valve. - Recon backtest:
ibkr recon backtestreviews every flow in the retained statement window and replays the daily equity series against the recorded peak and drawdown-ladder crossings; the equity comparison is same-day (statement close vs that day's runtime observation) instead of latest-vs-latest. - Risk-policy v3: clean-report auto-extend of the reconcile clock behind a strict same-day equity-divergence gate (new operator-authored key
recon.max_equity_divergence_pct); statement-authoritative cumulative flows with declarations demoted to provisional same-day bridge entries; new non-exceptionconfirmedcategory for broker-confirmed undeclared flows; statement value-date peak correction, exactly once per statement line; declared-vs-statement figures displayed side by side during the transition. Pre-genesis statement flows classify as disclosed, report-id-pinnedbaselinerows — never exceptions, never signature-gated. - Codex delegation runner with a transactional lifecycle (fresh-task/resume/cleanup guards), pinned model/effort/service tier per run, offline-only gates for delegates, and a project execpolicy that prompts on live targets.
- The paired app's monitor tab opens with a daemon-composed daily brief: five sections (market, calendar, portfolio, risk, process) built from existing typed results with per-row disclosed degradation. Viewing stamps the brief once per foreground look with a server-assigned human origin — agent renders never stamp — and a one-tap sign-off submits the reconcile attestation for exactly the report the operator saw. A governance write, not a broker write; the CLI renders the same snapshot.
ibkr app deviceslists paired-device grants, andibkr app devices prune [--keep-days N](default 7) retires stale grants and their push subscriptions while keeping freshly-paired-but-unused devices (activity is the later of created and last-seen). The endpoints answer only local-Mac callers and the relay refuses to forward the device paths, so relayed requests cannot reach them.
Changed
pkg/ibkrconstructors now clone caller-supplied configs — later mutations of the caller's config struct no longer leak into a live client — and stale nil-context doc promises are dropped.- Rulebook policy fingerprint moved to a JSON projection (
rulebook-fp-v3); the rules-decisions journal now records the policy fingerprint with every transition, so journaled verdicts name the policy identity that produced them. - Runtime settings surfaces are single-sourced from the settings registry behind the generated reference — daemon flatten/apply, CLI grammar/help, and generated docs consume one table, parity-gated.
ibkr policy showrenders capital state as plain-language sentences (risk brake, money at risk, ledger check) instead of raw field dumps.- The Canary SPA is split into ES-module feature files behind a drift gate, and the canary engine moved from
internal/cliintointernal/canary; no rendered-output change. - CLI gamma open-interest warnings trust the daemon's session classification instead of reclassifying locally.
- Proposal-outcome deduplication keys are cached; dead outcome fields and unused MCP modes were removed from the proposal surface.
make releasenow preflights credentials before any gate work: gh CLI auth plus the stored MCP Registry JWT's expiry (30-minute minimum,REGISTRY_TOKEN_MIN_VALID_MINUTESoverrides), running the interactive device-code refresh up front instead of stranding at the final registry-publish leg.
Fixed
- Option days-to-expiry calculations were off by one across DST boundaries (both copies of the date math a...
v2.0.0
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v2.0.0
- v2.0.0 is a Go-library major, not a product rewrite. The
ibkrCLI, daemon, MCP tools, and paired app behave the same as v1.15 plus the improvements below; the major bump exists because the publishedpkg/ibkrGo API modernized in one breaking pass (context-first methods, noGetprefixes — details under Changed) and Go-module semver therefore requires the module path to move togithub.com/osauer/ibkr/v2. Action required only for Go developers importing the library: update imports togithub.com/osauer/ibkr/v2/pkg/ibkrand installs togo install github.com/osauer/ibkr/v2/cmd/ibkr@latest. Binary, MCPB, and plugin users are unaffected. - Trading rulebook v2, from the 2026-07-08 dual senior review against a live confirmed-stress tape. The checklist grows from 12 to 14 rules: rule 13
exit_disciplinefences long-option losses at −40% of premium paid (watch) / −60% (act), with classified hedge legs exempt — the hedge is allowed to decay — and an advisory preview warning when a draft would average down into a flagged line (averaging down resets the basis; the fence does not follow it down). Rule 14fx_exposuremakes non-base-currency NLV explicit (watch-only above 60% — a structural breach must inform, not become a permanently lit act). Rules 3/4/12 thresholds are now regime-conditional: the daemon latches the regime lifecycle stage (persisted across restarts, so a bounce mid-stress cannot reset thresholds to calm), buckets it calm / early_warning / confirmed (cash floor −25/0/+10% of NLV; ex-hedge extrinsic budget 10-15/7.5-12/5-10%; hedge band 25-35/30-50/40-70%), and a carried or never-seen stage evaluates BOTH the carried and calm sets and reports the worse verdict — stale regime data can hold or tighten a verdict, never relax it, in either band direction. Partial data may now indict but never acquit: rule 1 reports provable lower-bound breaches ("at least X% of NLV",observed_is_lower_bound) from signed interval arithmetic when deltas are missing, instead of hiding a certain breach behindunknown.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v2.0.0-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v2.0.0-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/v2/cmd/ibkr@v2.0.0(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Added
- Rule 2 hedge-premium tier: option lines classified as rule-12 hedges measure against 15%/25% of NLV instead of the 5%/10% speculative tier, disclosed per offender — the designated hedge no longer tops the premium list every single day (alarm-fatigue fix), while rule 12 gains an act tier at more than twice the band top ("a directional short wearing a hedge's clothing"). The two changes ship atomically: a hedge past twice the band top always keeps an act somewhere.
- Rule 7 now covers short puts spanning an earnings print: watch by default, act when the line's assignment notional reaches 10% of NLV (or a name's spanning short puts together reach 20%) — a gap through the strike is a forced size-up on earnings day.
- Option legs whose greeks tick carried no underlying spot now borrow the same-name stock leg's account mark (disclosed as
stock_leg_mark, quality-gated, never classifying hedge legs), so rules 4 and 6 evaluate pre-market for stock-backed names instead of reporting unknown until the option surface opens. - The rules result's
input_healthgains aregime_stagerow; row notes disclose which regime threshold set applied and why.
Fixed
- Rule 6 (
catalyst_coverage) could assert pass with every option leg's OTM-ness unassessable: legs with no underlying spot were silently skipped, so pre-market the rule passed a book holding an OTM call that expires five days before its name's earnings — a live violation of the never-false-pass invariant, observed 2026-07-08. Such legs are now named unknowns, and the property test covers per-leg nil underlying with healthy positions. - Rule 8 (
earnings_size_freeze) had the same silent-skip shape: names with material greeks gaps were dropped from the sweep entirely, letting the rule pass while rule 1 reported the same name unknown. Gapped names now stay unknown offenders unless earnings are provably beyond the freeze window. - The rules-decisions journal now creates its state directory before appending (matches the order/regime journals); previously a missing
~/.local/state/ibkr/made journaling silently no-op. - Gateway-down reconnect attempts are now paced by an exponential backoff (1s→2s→4s→8s, capped at 15s), and the per-attempt "connection failed" line dropped from Error to Debug. Reconnection is demand-driven — every read handler that finds the connector down triggers one — and a refused dial returns instantly, so a multi-hour outage retried ~2.6×/s and wrote 66,900 identical
connection refusedlines toibkr-daemon.logover a single 7h gateway outage (observed 2026-07-08). The streak resets on a completed handshake and stays exempt on the first attempt, so a fresh drop still reconnects immediately; the 15s cap stays below the CLI's 25sibkr statushandshake wait, so a Gateway→TWS switch still recovers in one invocation.
Changed
- Breaking —
pkg/ibkrGo API, and the module path is nowgithub.com/osauer/ibkr/v2. The published client library dropped its pre-context idioms in one pass; theibkrCLI, daemon, MCP, and app surfaces are unaffected. Accessors lose theGetprefix (CachedPositions,OptionIV,OptionGreeks,OptionUnderlyingPrice,OptionQuoteBidAsk,OptionPrevClose,MarketDataTypeForSymbol,Connection.MarketDataType), andGetMarketDatais nowMarketDataSnapshot— the bare name would collide with theMarketDatatype. The fiveX/XCtxmethod pairs collapsed to one ctx-first method each:FetchHistoricalDailyBars(ctx, symbol, lookbackDays, timeout),FetchHistoricalDailyBarsWhatToShow(ctx, symbol, lookbackDays, whatToShow, timeout),FetchHistoricalDailyBarsWithContract(ctx, contract, lookbackDays, timeout)— timeout ≤ 0 keeps the 45 s default, and a ctx deadline always caps the effective budget — plusConnection.RequestHistoricalData(ctx, …)andConnection.CancelHistoricalData(ctx, reqID). Nil contexts are no longer tolerated (the 21 per-methodctx == nilguards are gone; passcontext.Background()explicitly). The unusedOrderstruc...
v1.15.0
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v1.15.0
-
New advisory trading rulebook:
ibkr rules(and theibkr_rulesMCP tool) evaluates a 12-rule daily discipline checklist against the live book — per-name exposure cap, single option-line premium cap, negative-cash sell-only mode, portfolio extrinsic (theta-rent) budget, expiry runway, earnings catalyst coverage, overwrites spanning earnings, pre-earnings size freeze, red-on-green-tape weakness, winner-trim into strength, a green-day execution nudge, and hedge-band integrity — ranked hardest-first. Earnings dates come from a free per-symbol fetch with manual overrides (ibkr settings set features.rulebook.earnings_overrides), cached last-known-good across restarts. Statuses are pass/info/watch/act/unknown/not_evaluated, and missing inputs always degrade tounknown— a cold daemon or unknown earnings date can never render a false pass. The Canary app shows a compact Rules card beside the portfolio hero with a full-checklist drill-in, and order previews carry advisoryrule_*warnings when a draft would worsen a breached rule; nothing in the rulebook affects submit eligibility or any broker-write gate, andfeatures.rulebook.enabled=falseturns the whole surface off. -
Corrected a long-standing mislabel in account P&L: the
daily_pnl_unrealized/daily_pnl_realizedfields are renamed topnl_unrealized_total/pnl_realized_total. They carry the account's inception-to-now TOTAL unrealized/realized P&L from IBKR's reqPnL stream — not a breakdown of the daily figure, so they never summed todaily_pnl. Theibkr accountCLI now shows them under a "Total P&L (reqPnL stream)" block instead of the misleading "Daily P&L breakdown / of which unrealized/realized". -
ibkr statusnow reports the quote / scanner / history / chain subsystems asreadywhen the market-data farms are actually connected. They were stuck showingdegraded("no market-data farm connection notice observed") for the whole session even while quotes, chains, and gamma worked — a false alarm, now fixed. -
Canary app money metrics no longer flap between currencies and formats across refreshes ("No-stop exposure" flipping €12K↔"3 rows", winner/loser daily P/L flipping $↔€, "Risk over target" flipping $24K↔"--"). The protection panel's theta/day and risk-over-target now render in the account base currency next to no-stop exposure, with an explicit "Mixed"/"Review" disclosure when a one-currency total is genuinely unavailable — never a silent USD label on a sum that isn't USD.
-
Canary app mobile usability pass. Open orders now read like orders instead of journal rows: the status line shows "Pre-submitted · At broker" instead of raw
pre_submitted / broker_acknowledged / ibkr-…internals (full detail moves to the tooltip), the quantity/trail/stop/offset edit boxes carry visible labels, and the order type / TIF line no longer clips. Tapping an alert on the Alerts tab expands its full text in place — it previously activated a detail panel on the hidden Monitor tab, so the tap looked dead and truncated alert text was unreachable.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v1.15.0-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v1.15.0-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/cmd/ibkr@v1.15.0(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Added
-
Trading rulebook engine (
docs/design/trading-rulebook.md): daemon RPCrules.snapshotreturningRulesResult(12RuleRows with observed/threshold/evidence/offenders, hardest-firstranked,breach_counts, result-levelinput_health, per-nameearnings[]provenance, policy fingerprint); pure evaluator ininternal/riskwith a never-false-pass property test; Nasdaq earnings fetcher with last-known-good cache (~/.cache/ibkr/earnings-dates.json, async refresh off the snapshot path, per-symbol failure backoff); runtime settingsfeatures.rulebook.enabledandfeatures.rulebook.earnings_overrides; advisoryrule_*DataWarnings on order previews (reduce/close intents never warn); rules-decisions transition journal;snapshot.rulessibling section +rulesSSE event in the app layer; SPA Rules card with drill-in;hook-behavior-checkmake gate running a 19-case table-driven test of the plugin safety hook, whose read-only allowlist now covers bareibkr orders. -
Trade-proposal snapshots now carry base-currency twins of the money aggregates: per-proposal
theta_per_day_base/risk_excess_notional_baseand counts-leveltheta_per_day_base,risk_reduction_excess_notional_base,base_currency, plustheta_per_day_currencylabeling the existing raw theta sum (omitted when the contributing proposals span currencies). All additive; nil/omitted means unavailable, never zero.
Changed
-
Renamed account-financials fields
daily_pnl_unrealized→pnl_unrealized_totalanddaily_pnl_realized→pnl_realized_totalacrossibkr account --jsonand theibkr_accountMCP tool, and relabeled the corresponding CLI block. These are the reqPnL-stream account totals (inception to now) and stay distinct from the account-updatesunrealized_pnl/realized_pnl— the two total-unrealized measurements come off different gateway feeds and can legitimately differ. -
Decluttered the Canary app's repeated chrome: panel freshness reads "updated now" when fresh (the clock time moved to the tooltip; aged and stale renderings are unchanged), the Market & Portfolio head collapses its two identical regime/canary timestamps into one, the exposure-composition bar shows percentages only in the legend instead of twice, redundant per-row "current signal" chips are gone from the Alerts tab's Current-signal section, the Opportunities hero metric is labeled "Exercises" (the panel is exercise-only, and the count includes not-yet-eligible rows), "Purge all!" lost its exclamation mark, and the brand header is more compact so more of a phone screen shows data.
Fixed
- Tightened rule 1's hedge exemption in the trading rulebook to match what rule 12 actually sizes. A policy-hedge index name with net-short delta is exempted from the per-name concentration cap only up to the short delta-dollars of its rule-12-classified hedge legs (long puts with delta present); short stock or short calls in a hedge symbol, and any residual short beyond the sized legs, count toward concentration as usual, with the siz...
v1.14.2
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v1.14.2
- Tightened the agent-facing trading contract for CLI, MCP, hooks, and docs so live and paper broker writes use one connected-gateway gate instead of stale origin-only policy text.
- Made local order and opportunity read/preview surfaces safer for agentic workflows by separating local-journal evidence, preview-token minting, and submit eligibility.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v1.14.2-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v1.14.2-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/cmd/ibkr@v1.14.2(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Changed
- Updated trading status to report
gateway_unavailableand keepcan_preview=false/can_write=falsewhile TWS or IB Gateway is disconnected or still handshaking. - Aligned CLI and MCP order-preview routing fields, replacement previews, and trailing-stop trigger-method support across help text, schemas, generated docs, and skill guidance.
- Updated the Claude/Codex hook policy to allow read-only help/piped reads while gating broker-adjacent writes through current trading readiness.
Fixed
- Fixed stale live-agent policy drift so agent-origin live broker writes are governed by the same daemon authorization path as other origins.
- Fixed opportunity exercise preview output so blocked previews do not imply a usable submit token.
- Fixed open-order and order-status outputs to disclose account/mode scope and local-journal limitations instead of looking like a complete broker statement.
v1.14.1
The data flows out. Orders don't go in.
ibkr is a read-only interface to your Interactive Brokers account, reachable from a Go library, a shell CLI, a stdio MCP server (Claude Desktop, Cursor, Continue, Zed), and a Claude Code plugin. Hand it to an assistant, a cron job, a notebook, or your own service.
What's new in v1.14.1
- Added a bounded local order-history read surface for recent order-review forensics. It groups the daemon's local order journal by current account/mode, supports date and event limits, and keeps the warning explicit: this is not an IBKR Activity Statement, Flex export, commission ledger, or broker-grade audit.
- Cleaned up the public site around the Claude Desktop path: the guided install moved higher on the homepage, duplicate setup pages now point readers to canonical pages, and the noisy setup-card block was reduced to the handful of pages most likely to help.
Claude Desktop MCPB
Download ibkr.mcpb from the Assets section below or from:
https://github.com/osauer/ibkr/releases/latest/download/ibkr.mcpb
Open the .mcpb file with Claude Desktop, drag it into Claude Desktop, or use Settings -> Extensions -> Advanced settings -> Install Extension. The bundle carries the local ibkr binary for macOS and Linux. Windows is not supported outside WSL because the daemon uses Unix-only primitives.
Shell and generic MCP install
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh | sh
ibkr setup claude-desktopThe first command picks the right binary for your platform, verifies its SHA-256, installs it to ~/.local/bin/ibkr, and adds that directory to your PATH if needed. On macOS it also clears the Gatekeeper quarantine flag. The second command writes the legacy MCP server entry into Claude Desktop's config; fully quit Claude Desktop and reopen.
If you only want the shell tool, stop after the first command and try:
ibkr account
ibkr quote AAPL
ibkr positions --by underlyingPrerequisite: a running IB Gateway 10.37+ or TWS (paper or live) on the same machine. The daemon auto-discovers it across the four standard ports.
See the README for the full feature menu and the troubleshooting matrix. Read-only by construction; the Safety section walks through the four guards.
⚠️ Broker-write capable build (ibkr-trading-* tarballs)
Everything above — the installer, the MCPB bundle, and the plain ibkr-v1.14.1-* tarballs — is read-only by construction: order transmission is not compiled in.
The ibkr-trading-v1.14.1-* tarballs are different: that binary can place, modify, and cancel orders with your broker once you configure the trading gates ([trading] mode plus a pinned gateway endpoint and account, cross-checked against the connected session; every write still needs a submit-eligible preview token). Only download it if you intend to trade through ibkr. Before enabling anything, read SECURITY.md and the trading preview guide, start against a paper account, and verify with ibkr trading status. Each release's order pipeline is exercised by an automated paper-trading round-trip before tagging.
Paranoid? Inspect the installer before running it
curl -fsSL https://raw.githubusercontent.com/osauer/ibkr/main/install.sh -o install.sh
less install.sh
sh install.shDoing something custom?
go install:go install github.com/osauer/ibkr/cmd/ibkr@v1.14.1(or@latest).- Different install dir:
IBKR_INSTALL_DIR=/usr/local/bin sh install.sh. The installer won't touch your shell rc when you override; manage PATH yourself. - Manual download: pick a tarball or
.mcpbfrom the Assets section below. Verify againstSHA256SUMS. - Cursor / Continue / Zed / other local MCP clients: see Pick your path in the README for the JSON snippet (config file path differs per client).
- Claude Code:
/plugin marketplace add osauer/ibkrthen/plugin install ibkr@ibkrinside any session.
Windows isn't supported. The daemon uses Unix-only primitives (setsid, flock, AF_UNIX sockets). WSL works.
Added
- Added
ibkr orders historyand the read-only MCPibkr_orders_historytool, with grouped-order limits, per-order event sampling, current account/mode filtering, and generated schema/docs updates.
Changed
- Updated the Claude/Codex skill, hooks, and settings allowlists so order-history reads are permitted while broker-write guardrails stay unchanged.
- Moved the homepage install section above the product-tour sections and narrowed "Popular setup paths" to a short set of canonical pages.
Fixed
- Removed stale guardrail examples that mentioned the nonexistent
ibkr orders statuscommand. - Ignored local
reports/artifacts so private trading-review pages are not accidentally swept into release work.