schwab-mcp
by psonhoang
README.md
# schwab-mcp
A local MCP server exposing the Charles Schwab Individual Trader API
(accounts, quotes, orders, transactions) as MCP tools, built on
[schwabdev](https://github.com/tylerebowers/Schwab-API-Python).
See `CLAUDE.md` for architecture/conventions.
## Setup
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
cp .env.example .env
# fill in SCHWAB_CLIENT_ID, SCHWAB_CLIENT_SECRET, SCHWAB_REDIRECT_URI
python scripts/authorize.py # one-time interactive browser login
```
Re-run `scripts/authorize.py` whenever the refresh token expires (every 7
days, per Schwab's policy).
## Connecting to Claude Desktop
Claude Desktop launches MCP servers as a separate process without your
shell's environment, so pass credentials explicitly via `env` rather than
relying on `.env` discovery. Edit (or create)
`~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"schwab": {
"command": "/Users/edhac/Workspace/schwab-mcp/.venv/bin/python",
"args": ["-m", "schwab_mcp.server"],
"env": {
"SCHWAB_CLIENT_ID": "your-client-id",
"SCHWAB_CLIENT_SECRET": "your-client-secret",
"SCHWAB_REDIRECT_URI": "https://127.0.0.1",
"SCHWAB_TOKEN_PATH": "~/.schwab-mcp/tokens.db"
}
}
}
}
```
Then fully quit and reopen Claude Desktop. Run `scripts/authorize.py`
manually first (Claude Desktop can't complete the interactive browser login
itself) — the server will raise a clear error on startup if the token db is
missing or the refresh token has expired, telling you to do this.
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues