Skip to main content
Glama
psonhoang

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.