# schwab-data-sweep > Collect a single Schwab MCP data snapshot (accounts, quotes, indicators, option chains) with a five-minute cache so trading agents can reuse consistent inputs. Use whenever an options persona needs fresh risk, market, or chain data before recommending trades. - Author: Jason Kölker - Repository: jkoelker/zephyr - Version: 20251126153449 - Stars: 1 - Forks: 0 - Last Updated: 2026-02-08 - Source: https://github.com/jkoelker/zephyr - Web: https://mule.run/skillshub/@@jkoelker/zephyr~schwab-data-sweep:20251126153449 --- --- name: schwab-data-sweep description: Collect a single Schwab MCP data snapshot (accounts, quotes, indicators, option chains) with a five-minute cache so trading agents can reuse consistent inputs. Use whenever an options persona needs fresh risk, market, or chain data before recommending trades. --- # Schwab Data Sweep Reliable trade proposals in this workspace start from the same broker payloads. This skill centralizes that workflow so every persona reuses the identical snapshot and cache policy. ## Inputs - `primary_symbol` (string): Underlying or index to analyze. Prefix indices/volatility products with `$` (e.g., `$SPX`, `$VIX`, `$VIX1D`) to avoid equity substitutions. - `additional_symbols` (list, optional): Extra tickers for quotes (e.g., the wheel watchlist or hedge ETFs). Keep the list tight to minimize MCP latency. - `include_option_chain` (bool, default true): Fetch option chain data for `primary_symbol`. - `indicators` (list, optional): Indicator payloads to compute. Supported values: `atr`, `rsi`, `expected_move`, `historical_volatility`. - `force_refresh` (bool, default false): Ignore cached payloads even if they are younger than five minutes. ## Outputs Structured dictionary stored in memory for the calling agent: - `timestamp`: ISO string + broker timezone from `mcp__schwab__get_datetime`. - `account`: Payload from `mcp__schwab__get_account_with_positions()`. - `quotes`: Map of symbol → quote (from `mcp__schwab__get_quotes()`). - `historical`: Optional OHLCV data (from `mcp__schwab__get_price_history_every_day()` for 1M window). - `option_chain`: Optional option chain snapshot (when requested). - `indicators`: Any computed indicators with metadata about lookback and parameters. ## Instructions 1. **Cache Check** - Maintain a per-symbol cache keyed by `primary_symbol` + sorted `additional_symbols`. - Reuse the existing snapshot when `force_refresh` is false and the cached timestamp is ≤5 minutes old. - When reusing, surface the original Schwab timestamp so downstream persona messaging reflects the data age. 2. **Authentication Guardrail** - Call `mcp__schwab__get_account_numbers()` once per session if the MCP client indicates an unauthenticated state. Abort and return a `BLOCK` flag if authentication fails. 3. **Account & Capital Snapshot** - Run `mcp__schwab__get_account_with_positions()` to capture net liquidity, cash, buying power, and open option positions. - Derive helper metrics (wheel exposure %, margin headroom, overlapping SPX structures) for persona-specific reporting, but keep raw payloads intact in the output. 4. **Market Quotes** - Assemble the quote request list: `{primary_symbol} ∪ additional_symbols ∪ {$VIX, $VIX1D}` when indices are relevant. - Use `mcp__schwab__get_quotes(symbols=...)` with `fields="QUOTE,FUNDAMENTAL"` when single-name data is required for event checks. - Normalize timestamps (store both the broker timezone and Eastern Time equivalent for later formatting). 5. **Historical Context** - Call `mcp__schwab__get_price_history_every_day(primary_symbol, period_type="MONTH", period="ONE_MONTH")` to support ATR/expected-move math. - Skip when the persona explicitly disables historical pulls to reduce latency. 6. **Indicator Bundle** - For each indicator requested, call the matching Schwab MCP function: - `atr` → `mcp__schwab__atr(symbol=primary_symbol, interval="DAY", length=14)` - `rsi` → `mcp__schwab__rsi(symbol=primary_symbol, interval="DAY", length=14)` - `expected_move` → `mcp__schwab__expected_move(symbol=primary_symbol, interval="DAY")` - `historical_volatility` → `mcp__schwab__historical_volatility(symbol=primary_symbol, period=30)` - Store both the numeric result and the parameters used so personas can echo them in final outputs. 7. **Option Chain Snapshot** - When `include_option_chain` is true, call `mcp__schwab__get_option_chain(symbol=primary_symbol, include_quotes="true", strike_count=40)`. - Cache the option chain alongside its Schwab timestamp; note in the output when the chain comes from outside regular trading hours. 8. **Packaging & Return** - Combine all payloads into the output dictionary and persist it in the cache with the broker timestamp. - Return the object plus a `cache_metadata` block containing: `source_timestamp`, `eastern_timestamp`, `cache_expires_at`, and `force_refresh_used` flag. ## Usage Notes - Personas should call this skill exactly once per planning cycle, then reference the cached snapshot for prerequisite checks, sizing, and proposal outputs. - When a user asks for “updated marks” or more than five minutes have elapsed, set `force_refresh=true`. - If a required symbol is missing from Schwab (e.g., delisted or after-hours only), return a `FLAG` status with guidance instead of silently omitting the data. ## Examples ```yaml # 0DTE iron condor sweep primary_symbol: $SPX additional_symbols: [$VIX, $VIX1D] indicators: [atr, rsi, expected_move] include_option_chain: true ``` ```yaml # Wheel candidate sweep for a single-name equity primary_symbol: AAPL additional_symbols: [$VIX] indicators: [atr, rsi, historical_volatility] include_option_chain: true ```