Skip to main content
Glama
PaulNorton

Personal Capital MCP Connector

by PaulNorton
README.md
## Personal Capital MCP Connector

### File structure
```
personal-capital-connector/
├── pyproject.toml
└── src/personal_capital_connector/
    ├── __init__.py
    ├── __main__.py
    ├── auth.py      # session + preference persistence, 2FA flow
    ├── client.py    # API wrapper + data formatters
    ├── server.py    # FastMCP server with 5 tools
    └── cli.py       # CLI entry point
```

### 5 tools exposed to Claude

| Tool | What it answers |
|------|----------------|
| `list_accounts` | "What's my Chase credit card balance?" / "Show my savings accounts" |
| `get_net_worth` | "What's my net worth?" / "How much do I owe vs own?" |
| `get_transactions` | "What did I spend at restaurants last month?" |
| `get_asset_allocation` | "What am I holding in my 401k?" / "Which funds am I most concentrated in?" |
| `check_auth_status` | "Is my Empower session still valid?" |

### `get_transactions` parameters

Query a date range or a lookback window, filter, and page through results.

| Parameter | Default | Notes |
|---|---|---|
| `days` | 30 | Lookback from today. Ignored when `start_date` is set. |
| `start_date` / `end_date` | — | ISO `YYYY-MM-DD`. `start_date` alone runs through today. |
| `search` | — | Substring match on description, original description, or merchant. Comma-separated terms are ORed: `"avis, hertz, national"`. |
| `account` | — | Substring of the account name, e.g. `"delta"`. |
| `category` | — | Substring of the Personal Capital category, e.g. `"travel"`. |
| `min_amount` / `max_amount` | 0 | Absolute-value bounds. `max_amount=0` means no cap. |
| `limit` / `offset` | 100 / 0 | Page through results. The header always reports the full match count. |
| `oldest_first` | false | Sort ascending by date. |

Amounts are signed: **money out is negative, money in is positive.** The header shows the net,
gross in, and gross out for everything matched — not just the rows on the current page.

```
Transactions — 2026-03-01 to 2026-03-31
3 of 271 matched
Matched total: net $17,746.50  (in $377,693.19 / out $359,946.69)

2026-03-31      5,516.08  Brokeragelink - Contribution  [Amazon 401(k) Plan]  (Retirement Contributions)
...
268 more. Re-run with offset=3 to continue.
```

### Prerequisites
Install uv: https://docs.astral.sh/uv/

### To get started

**Step 1 — Authenticate once (interactive 2FA):**
```bash
uv run --directory {full path to this directory} personal-capital-connector auth
```
Your session is saved to `~/.config/personal-capital-connector/session.json` (chmod 600). Re-run this any time your session expires.

Your email and 2FA choice are saved next to it in `prefs.json`, so the next login is two keystrokes:

```
Using saved preferences from ~/.config/personal-capital-connector/prefs.json.
Press Enter to accept a default, or type '-' to forget it.

Empower email [paul@example.com]:
Empower password:

2FA required. How do you want to receive the code?
  1) SMS
  2) Email
Choice [2, saved]:
```

Press Enter to accept a default, type a new value to replace it, or type `-` to forget it — the answer you give after `-` is used for that login but not saved.

Manage the same preferences without logging in:

```bash
personal-capital-connector prefs                        # show what is saved
personal-capital-connector prefs --email you@email.com  # change the email
personal-capital-connector prefs --2fa sms              # change the 2FA method
personal-capital-connector prefs --clear email          # forget one (email or 2fa)
personal-capital-connector prefs --clear                # forget both
```

Clearing preferences never touches your session.

Once your preferences are saved, `-y` takes them all without asking:

```bash
personal-capital-connector auth -y
```

That leaves only the password, and the 2FA code when one is needed. Anything with no saved value is still prompted for. `--email` and `--2fa` override a saved value for one run, and `--no-remember` logs in without reading or writing preferences at all.

**Step 2 — Add to Claude Desktop's MCP settings** (e.g. `~/Library/Application Support/Claude/claude_desktop_config.json`):
```json
{
  "mcpServers": {
    "personal-capital": {
      "command": "{full path to uv}",
      "args": [
        "run",
        "--directory",
        "{full path to this directory}",
        "personal-capital-connector"
      ]
    }
  }
}
```

**Step 3 — Restart Claude** and start asking questions.

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: authentication status, account listing, net worth summary, transaction history, and investment allocation. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., check_auth_status, list_accounts, get_net_worth). The conventions are uniform and predictable.

Tool Count5/5

With 5 tools, the set is well-scoped for a personal finance data connector. Each tool earns its place, covering essential read operations without being bloated or sparse.

Completeness5/5

The tools provide comprehensive coverage for reading personal finance data: authentication, accounts, net worth, transactions, and asset allocation. No obvious gaps for a read-only connector.

Maintenance

ActivityMaintained
ResponsivenessNo issues