Skip to content

KB / mcp

MCP tool: option_chain

Last verified

option_chain returns the full option chain for a symbol — calls and puts by expiration, with strike, bid, ask, last, volume, open interest, implied volatility, and the five Greeks (delta, gamma, theta, vega, rho). It wraps GET /api/v1/trading/options/chain/{symbol}, which is Schwab-backed and requires the auth service to be holding a valid token.

Signature

option_chain(
  symbol: str,                    # underlying ticker, e.g. "SPY"
  expiration: str | None = None,  # filter to one expiration (YYYY-MM-DD); omit for all
  strike_count: int = 50,         # strikes around ATM (5–100, default 50)
) -> str                          # JSON-serialised dict

Validation (mcp/mcp_server/tools/public.py:option_chain):

Returns

{
  "symbol": "SPY",
  "underlying_price": 538.20,
  "expirations": {
    "2026-06-20": {
      "calls": [
        {
          "strike": 540.0,
          "bid": 4.20, "ask": 4.30, "last": 4.25,
          "volume": 12_340, "open_interest": 88_120,
          "iv": 0.142,
          "delta": 0.48, "gamma": 0.012, "theta": -0.18, "vega": 0.42, "rho": 0.08
        },
        ...
      ],
      "puts":  [ ... same shape ... ]
    },
    "2026-07-18": { "calls": [...], "puts": [...] }
  },
  "as_of": "2026-05-26T10:14:33-04:00"
}

as_of is ET ISO 8601 with offset (Law 1). Greeks come straight from Schwab — they’re not re-computed on the platform.

Behaviour

Examples

Full chain, ATM-focused

Operator: "Show me SPY options."
Agent: option_chain(symbol="SPY")

Returns all expirations with the default 50 strikes around ATM each.

Single expiration

Operator: "What do SPY weeklies look like for next Friday?"
Agent: option_chain(symbol="SPY", expiration="2026-06-06")

Wide-net read for IV term structure

Agent: option_chain(symbol="SPY", strike_count=20)
  -> 20 strikes per expiration across all listings.
  -> Read IV at ATM for each expiration; build the term structure.

When to use

When NOT to use

See also