Schwab Model Context Protocol Server

by jkoelker
Verified
# Schwab Model Context Protocol Server This is a server that implements the Model Context Protocol (MCP) for the Schwab API using [schwab-py](https://github.com/alexgolec/schwab-py) and the MCP [python-sdk](https://github.com/modelcontextprotocol/python-sdk). ## Features - Expose Schwab API functionality through Model Context Protocol - Get account information and positions - Retrieve stock quotes and price history - Get market information and movers - Fetch option chains and expiration data - Access order and transaction history - Modify account state with special tools (requires `--jesus-take-the-wheel` flag) - Designed to integrate with Large Language Models (LLMs) ## Installation ```bash # Install with all dependencies uv add -e . # Install development dependencies uv add -e .[dev] ``` ## Usage ### Authentication The first step is to authenticate with the Schwab API and generate a token: ```bash # Authenticate and generate a token uv run schwab-mcp auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --callback-url YOUR_CALLBACK_URL ``` You can set these credentials through environment variables to avoid typing them each time: - `SCHWAB_CLIENT_ID` - `SCHWAB_CLIENT_SECRET` - `SCHWAB_CALLBACK_URL` (defaults to https://127.0.0.1:8182) By default, the token is saved to `~/.local/share/schwab-mcp/token.yaml` (platform-specific). You can specify a different path: ```bash uv run schwab-mcp auth --token-path /path/to/token.yaml ``` Both yaml and json token formats are supported and will be inferred from the file extension. ### Running the Server After authentication, you can run the server: ```bash # Run the server with default token path uv run schwab-mcp server --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --callback-url YOUR_CALLBACK_URL # Run with a custom token path uv run schwab-mcp server --token-path /path/to/token.json --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --callback-url YOUR_CALLBACK_URL # Run with account modification tools enabled uv run schwab-mcp server --jesus-take-the-wheel --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --callback-url YOUR_CALLBACK_URL ``` Token age is validated - if older than 5 days, you will be prompted to re-authenticate. > **WARNING**: Using the `--jesus-take-the-wheel` flag enables tools that can modify your account state. Use with caution as this allows LLMs to cancel orders and potentially perform other actions that change account state. ## Available Tools The server exposes the following MCP tools: ### Date and Market Information 1. `get_datetime` - Get the current datetime in ISO format 2. `get_market_hours` - Get market hours for a specific market 3. `get_movers` - Get movers for a specific index 4. `get_instruments` - Search for instruments with a specific symbol ### Account Information 5. `get_account_numbers` - Get mapping of account IDs to account hashes 6. `get_accounts` - Get information for all linked Schwab accounts 7. `get_accounts_with_positions` - Get accounts with position information 8. `get_account` - Get information for a specific account 9. `get_account_with_positions` - Get specific account with position information 10. `get_user_preferences` - Get user preferences for all accounts including nicknames ### Orders 11. `get_order` - Get details for a specific order 12. `get_orders` - Get orders for a specific account ### Quotes 13. `get_quotes` - Get quotes for specified symbols ### Price History 14. `get_advanced_price_history` - Get advanced price history for a specific symbol 15. `get_price_history_every_minute` - Get price history with minute frequency 16. `get_price_history_every_five_minutes` - Get price history with five minute frequency 17. `get_price_history_every_ten_minutes` - Get price history with ten minute frequency 18. `get_price_history_every_fifteen_minutes` - Get price history with fifteen minute frequency 19. `get_price_history_every_thirty_minutes` - Get price history with thirty minute frequency 20. `get_price_history_every_day` - Get price history with daily frequency 21. `get_price_history_every_week` - Get price history with weekly frequency ### Options 22. `get_option_chain` - Get option chain for a specific symbol 23. `get_advanced_option_chain` - Get advanced option chain for a specific symbol 24. `get_option_expiration_chain` - Get option expiration information for a symbol ### Transactions 25. `get_transactions` - Get transactions for a specific account 26. `get_transaction` - Get details for a specific transaction ### Account Modification Tools (Requires `--jesus-take-the-wheel` flag) 27. `cancel_order` - Cancel a specific order ## Security Warning The `--jesus-take-the-wheel` flag enables LLMs to perform actions that can modify your account state, including: - Canceling orders - Other actions that may have financial implications (more tools to be added in future releases) Only use this flag in controlled environments and understand the risks involved. ## Development ```bash # Type check uv run pyright # Format code uv run ruff format . # Lint uv run ruff check . # Run tests uv run pytest ``` ## License This project is available under the MIT License.