E*TRADE MCP Server
# E\*TRADE MCP Server
A Model Context Protocol (MCP) server for E\*TRADE's Market API, built with FastMCP.
## Features
This MCP server provides access to E\*TRADE's Market API endpoints:
- **Quote**: Get real-time and delayed quotes for stocks, options, and mutual funds
- **Product Lookup**: Search for securities by symbol or company name
- **Option Chains**: Get option chains with strikes and expirations
- **Option Expire Dates**: Get available expiration dates for options
## Installation
1. Clone this repository
2. Install dependencies:
```bash
pip install -e .
```
3. Copy `.env.example` to `.env` and add your E\*TRADE API credentials:
```bash
cp .env.example .env
```
4. Edit `.env` and add your credentials:
```
ETRADE_CONSUMER_KEY=your_consumer_key_here
ETRADE_CONSUMER_SECRET=your_consumer_secret_here
ETRADE_ENVIRONMENT=sandbox # or 'production'
```
## Getting E\*TRADE API Credentials
1. Go to [E\*TRADE Developer Portal](https://developer.etrade.com/)
2. Sign up or log in with your E\*TRADE account
3. Request a Sandbox consumer key at [https://us.etrade.com/etx/ris/apikey](https://us.etrade.com/etx/ris/apikey)
4. Get your Consumer Key and Consumer Secret
5. Start with the sandbox environment for testing
## Authentication
### One-time Setup (Recommended)
Run the authentication script to get and save your access tokens:
```bash
python authenticate.py
```
This will:
1. Prompt you to visit an E\*TRADE authorization URL
2. Ask you to enter the verification code
3. Save the access tokens to your `.env` file
The MCP server will automatically use these saved tokens.
**Note**: Access tokens expire at midnight US Eastern time, so you'll need to re-authenticate daily.
### Alternative: Manual Authentication
You can also authenticate through the MCP tools:
1. Call `etrade_get_auth_url()` to get the authorization URL
2. Visit the URL in your browser and authorize the application
3. Copy the verification code
4. Call `etrade_authenticate(verifier="YOUR_CODE")` with the verification code
## Usage
### Running the Server
The server runs as an HTTP server on port 8000 with the MCP endpoint at `/mcp`:
```bash
etrade-mcp
```
Or with Python:
```bash
python -m etrade_mcp.server
```
The server will start at `http://localhost:8000` with the MCP endpoint available at `http://localhost:8000/mcp`.
### Connecting to the Server
Configure your MCP client to connect to the HTTP endpoint:
```json
{
"mcpServers": {
"etrade": {
"url": "http://localhost:8000/mcp"
}
}
}
```
### Available Tools
#### `etrade_get_auth_url()`
Get the OAuth authorization URL. This is the first step in authentication.
**Returns**: Authorization URL to visit in browser
#### `etrade_authenticate(verifier: str)`
Complete authentication with the verification code from E\*TRADE.
**Args**:
- `verifier`: Verification code from E\*TRADE
**Returns**: Success message
#### `etrade_get_quote(symbols: str, require_earnings_date: bool = False, skip_mini_options_check: bool = False)`
Get stock quotes for one or more symbols.
**Args**:
- `symbols`: Comma-separated list of symbols (e.g., "AAPL,MSFT,GOOGL")
- `require_earnings_date`: Include next earnings date
- `skip_mini_options_check`: Skip mini options check
**Returns**: Quote data with prices, volume, bid/ask, etc.
#### `etrade_lookup_product(search: str, company: str = None, type: str = None)`
Look up products by symbol or company name.
**Args**:
- `search`: Symbol or partial symbol to search
- `company`: Company name (optional)
- `type`: Security type - EQ, MF, OPTN (optional)
**Returns**: List of matching products
#### `etrade_get_option_chains(symbol: str, ...)`
Get option chains for a symbol with various filters.
**Args**:
- `symbol`: Underlying symbol
- `expiry_year`, `expiry_month`, `expiry_day`: Expiration date filters
- `strike_price_near`: Filter strikes near this price
- `no_of_strikes`: Number of strikes to return
- `include_weekly`: Include weekly options
- `option_category`: STANDARD, ALL, MINI
- `chain_type`: CALL, PUT, CALLPUT
- And more...
**Returns**: Option chain data
#### `etrade_get_option_expire_dates(symbol: str, expiry_type: str = None)`
Get available option expiration dates.
**Args**:
- `symbol`: Underlying symbol
- `expiry_type`: WEEKLY, MONTHLY, QUARTERLY, ALL
**Returns**: List of expiration dates
## Example Usage with MCP Client
```python
# Get authorization URL
auth_url = etrade_get_auth_url()
# Visit the URL, authorize, get verifier code
# Authenticate
etrade_authenticate(verifier="12345")
# Get a quote
quote = etrade_get_quote(symbols="AAPL")
# Look up a product
results = etrade_lookup_product(search="Apple")
# Get option chains
chains = etrade_get_option_chains(
symbol="AAPL",
chain_type="CALL",
price_type="ATNM"
)
# Get expiration dates
dates = etrade_get_option_expire_dates(symbol="AAPL")
```
## API Documentation
For detailed API documentation, see:
- [E\*TRADE API Documentation](https://developer.etrade.com/home)
- [Market Quote API](https://apisb.etrade.com/docs/api/market/api-quote-v1.html)
## Environment Variables
- `ETRADE_CONSUMER_KEY`: Your E\*TRADE consumer key (required)
- `ETRADE_CONSUMER_SECRET`: Your E\*TRADE consumer secret (required)
- `ETRADE_ENVIRONMENT`: `sandbox` or `production` (default: sandbox)
- `ETRADE_SANDBOX_BASE_URL`: Sandbox API URL (default: https://apisb.etrade.com)
- `ETRADE_PROD_BASE_URL`: Production API URL (default: https://api.etrade.com)
## Security Notes
- Never commit your `.env` file or expose your API credentials
- Start with the sandbox environment for testing
- OAuth tokens expire; you'll need to re-authenticate periodically
- Production environment requires additional E\*TRADE account approvals
## Reference
This server is based on E\*TRADE's sample Python client, which is included in the `EtradePythonClient` directory for reference.
## License
MIT
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose with no overlap. Authentication tools handle OAuth flow, option tools retrieve chains and expiration dates, quote tool gets market data, and lookup tool searches for products. An agent can easily distinguish between these functions.
All tools follow a consistent 'etrade_verb_noun' pattern with snake_case throughout. The naming convention is perfectly uniform across all six tools, making them predictable and easy to understand.
Six tools is reasonable for an E*TRADE API server, covering authentication, options data, quotes, and product lookup. While slightly lean, it provides core functionality without being overwhelming or insufficient for the domain.
The server covers authentication, options data retrieval, quotes, and product lookup well. However, there are notable gaps for a trading platform: no tools for account management (balances, positions), order placement (buy/sell), or portfolio analysis, which limits comprehensive trading workflows.