etrade_get_option_chains
Retrieve option chains for stocks to analyze available strikes and expiration dates for calls and puts using E*TRADE market data.
Instructions
Get option chains for a symbol.
Args: symbol: Underlying stock symbol (e.g., "AAPL") expiry_year: Expiration year (4-digit, e.g., 2024) expiry_month: Expiration month (1-12) expiry_day: Expiration day (1-31) strike_price_near: Strike price near this value no_of_strikes: Number of strikes to return include_weekly: Include weekly options skip_adjusted: Skip adjusted options option_category: STANDARD, ALL, or MINI chain_type: CALL, PUT, or CALLPUT price_type: ATNM (at the money) or ALL
Returns: Option chain data with available strikes and expiration dates
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | ||
| expiry_year | No | ||
| expiry_month | No | ||
| expiry_day | No | ||
| strike_price_near | No | ||
| no_of_strikes | No | ||
| include_weekly | No | ||
| skip_adjusted | No | ||
| option_category | No | ||
| chain_type | No | ||
| price_type | No |
Implementation Reference
- etrade_mcp/server.py:146-177 (handler)The primary MCP tool handler for 'etrade_get_option_chains', registered via @mcp.tool() decorator. Handles input parameters and delegates to MarketClient.get_option_chains.@mcp.tool() def etrade_get_option_chains(symbol: str, expiry_year: Optional[int] = None, expiry_month: Optional[int] = None, expiry_day: Optional[int] = None, strike_price_near: Optional[float] = None, no_of_strikes: Optional[int] = None, include_weekly: bool = False, skip_adjusted: bool = False, option_category: Optional[str] = None, chain_type: Optional[str] = None, price_type: Optional[str] = None) -> dict: """ Get option chains for a symbol. Args: symbol: Underlying stock symbol (e.g., "AAPL") expiry_year: Expiration year (4-digit, e.g., 2024) expiry_month: Expiration month (1-12) expiry_day: Expiration day (1-31) strike_price_near: Strike price near this value no_of_strikes: Number of strikes to return include_weekly: Include weekly options skip_adjusted: Skip adjusted options option_category: STANDARD, ALL, or MINI chain_type: CALL, PUT, or CALLPUT price_type: ATNM (at the money) or ALL Returns: Option chain data with available strikes and expiration dates """ client = get_market_client() return client.get_option_chains( symbol, expiry_year, expiry_month, expiry_day, strike_price_near, no_of_strikes, include_weekly, skip_adjusted, option_category, chain_type, price_type )
- etrade_mcp/market.py:72-147 (helper)Core helper method in MarketClient that constructs the API request to E*TRADE's optionchains endpoint and returns the JSON response.def get_option_chains(self, symbol: str, expiry_year: Optional[int] = None, expiry_month: Optional[int] = None, expiry_day: Optional[int] = None, strike_price_near: Optional[float] = None, no_of_strikes: Optional[int] = None, include_weekly: bool = False, skip_adjusted: bool = False, option_category: Optional[str] = None, chain_type: Optional[str] = None, price_type: Optional[str] = None) -> Dict[str, Any]: """ Get option chains for a symbol Args: symbol: Underlying symbol expiry_year: Expiration year (4-digit) expiry_month: Expiration month (1-12) expiry_day: Expiration day (1-31) strike_price_near: Strike price near value no_of_strikes: Number of strikes include_weekly: Include weekly options skip_adjusted: Skip adjusted options option_category: Option category (STANDARD, ALL, MINI) chain_type: Chain type (CALL, PUT, CALLPUT) price_type: Price type (ATNM, ALL) Returns: Option chains response data """ url = f"{self.base_url}/v1/market/optionchains.json" params = {"symbol": symbol} if expiry_year: params["expiryYear"] = expiry_year if expiry_month: params["expiryMonth"] = expiry_month if expiry_day: params["expiryDay"] = expiry_day if strike_price_near: params["strikePriceNear"] = strike_price_near if no_of_strikes: params["noOfStrikes"] = no_of_strikes if include_weekly: params["includeWeekly"] = "true" if skip_adjusted: params["skipAdjusted"] = "true" if option_category: params["optionCategory"] = option_category if chain_type: params["chainType"] = chain_type if price_type: params["priceType"] = price_type response = self.session.get(url, params=params) response.raise_for_status() return response.json() def get_option_expire_dates(self, symbol: str, expiry_type: Optional[str] = None) -> Dict[str, Any]: """ Get option expiration dates for a symbol Args: symbol: Underlying symbol expiry_type: Expiry type (WEEKLY, MONTHLY, QUARTERLY, ALL) Returns: Expiration dates response data """ url = f"{self.base_url}/v1/market/optionexpiredate.json" params = {"symbol": symbol} if expiry_type: params["expiryType"] = expiry_type response = self.session.get(url, params=params) response.raise_for_status() return response.json()
- etrade_mcp/server.py:40-64 (helper)Helper function that provides the singleton authenticated MarketClient instance used by the tool handler.def get_market_client() -> MarketClient: """Get market client (requires authentication)""" global _market_client if _market_client is None: # Try to load access token from environment access_token = os.getenv("ETRADE_ACCESS_TOKEN") access_token_secret = os.getenv("ETRADE_ACCESS_TOKEN_SECRET") if access_token and access_token_secret: # Create session from stored tokens auth = get_auth() from rauth import OAuth1Session session = OAuth1Session( auth.consumer_key, auth.consumer_secret, access_token=access_token, access_token_secret=access_token_secret ) _market_client = MarketClient(session, auth.base_url) else: raise ValueError( "Not authenticated. Please run authenticate.py to get access tokens, " "or use etrade_get_auth_url and etrade_authenticate tools." ) return _market_client
- etrade_mcp/server.py:14-14 (registration)Initialization of the FastMCP server instance where all @mcp.tool() decorators register their tools.mcp = FastMCP("E*TRADE Market API")