# Pane MCP

> Access personal finance data (bank accounts, transactions, balances, spending, investments, crypto) via Pane's hosted MCP server using mcporter. Requires a Pane account and API key.

- Skill: `majiayu000/pane-mcp` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/pane-mcp`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/pane-mcp/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/pane-mcp

---


# Pane MCP

Access a user's linked financial accounts via [Pane](https://pane.money), a hosted MCP server powered by Plaid. Query bank accounts, transactions, balances, spending summaries, recurring payments, investments, liabilities, and crypto holdings. Write persistent annotations to remember context across conversations.

## Setup

The user must have a Pane account with linked financial accounts and an API key from [pane.money/dashboard/connect](https://pane.money/dashboard/connect).

Set the `PANE_API_KEY` environment variable (do not paste the key directly into shell commands):

```bash
# Add to your shell profile (.zshrc, .bashrc, etc.)
export PANE_API_KEY="pane_sk_live_..."
```

Then configure mcporter:

```bash
# Add Pane as an MCP server using the env var
mcporter config add pane --url https://mcp.pane.money --header "Authorization: Bearer $PANE_API_KEY"

# Verify connection
mcporter list pane --schema
```

## Tools

### Financial data (read-only)

**get_accounts** — List linked accounts with balances

```bash
mcporter call pane.get_accounts type=all
mcporter call pane.get_accounts type=checking
```

**get_transactions** — Search and filter transactions

```bash
mcporter call pane.get_transactions search=Starbucks limit:50
mcporter call pane.get_transactions category=FOOD_AND_DRINK start_date=2026-01-01 end_date=2026-01-31
mcporter call pane.get_transactions account_id=<uuid> min_amount:50
```

Parameters: `account_id` (UUID), `start_date`/`end_date` (YYYY-MM-DD), `category` (Plaid category), `search` (max 200 chars), `min_amount`/`max_amount`, `limit` (1-500, default 50), `offset`.

**get_balances** — Current balances with net worth summary (triggers live Plaid refresh)

```bash
mcporter call pane.get_balances type=all
```

Returns per-account balances plus summary: `total_cash`, `total_credit_debt`, `total_investments`, `total_loans`, `total_crypto`, `net_worth`.

**get_spending_summary** — Spending grouped by category, merchant, week, or month

```bash
mcporter call pane.get_spending_summary period=this_month group_by=category
mcporter call pane.get_spending_summary period=last_30d group_by=merchant
mcporter call pane.get_spending_summary start_date=2026-01-01 end_date=2026-01-31 group_by=week
```

Period shortcuts: `last_7d`, `last_30d`, `this_week`, `last_week`, `this_month`, `last_month`, `this_year`. Use either `period` OR `start_date`+`end_date`, not both.

**get_recurring** — Subscriptions, bills, and income streams

```bash
mcporter call pane.get_recurring type=all
mcporter call pane.get_recurring type=subscriptions
```

Returns arrays for subscriptions/bills/income with monthly totals. Frequency conversion: weekly x4.33, biweekly x2.17, monthly x1, annually /12.

**get_investments** — Investment holdings and portfolio value

```bash
mcporter call pane.get_investments
mcporter call pane.get_investments account_id=<uuid>
```

Cached 15 minutes. Returns holdings with symbol, quantity, currentValue, costBasis.

**get_liabilities** — Credit, student loan, and mortgage details

```bash
mcporter call pane.get_liabilities type=all
mcporter call pane.get_liabilities type=credit
```

Cached 1 hour. Returns APRs, payment amounts, due dates.

**get_crypto** — Crypto holdings across exchange accounts and on-chain wallets

```bash
mcporter call pane.get_crypto blockchain=all
mcporter call pane.get_crypto wallet_id=<uuid> blockchain=ethereum
```

Requires crypto feature enabled. Triggers live wallet refresh.

### Annotations (read/write)

Annotations are persistent notes attached to transactions, merchants, accounts, or the user's profile. They appear in future tool results automatically.

**write_annotation** — Save a note

```bash
mcporter call pane.write_annotation scope=profile content="Freelancer, budgets $3k/month for essentials"
mcporter call pane.write_annotation scope=merchant target_id=WeWork content="Business expense — coworking"
mcporter call pane.write_annotation scope=account target_id=<uuid> content="Joint account with partner"
mcporter call pane.write_annotation scope=transaction target_id=<uuid> content="Reimbursable expense"
```

Scopes: `profile` (no target_id), `merchant` (case-insensitive name), `account` (UUID), `transaction` (UUID). Max 2,000 chars, max 50 per target.

**list_annotations** — List saved annotations

```bash
mcporter call pane.list_annotations
mcporter call pane.list_annotations scope=profile limit:10
```

**delete_annotation** — Delete by ID

```bash
mcporter call pane.delete_annotation annotation_id=<uuid>
```

## Resources

```bash
mcporter call pane.read_resource uri=pane://profile     # Text summary: accounts, net worth, income, model notes
mcporter call pane.read_resource uri=pane://accounts    # JSON list of accounts with names and types
mcporter call pane.read_resource uri=pane://insights    # JSON: net worth breakdown, unusual spending, low balance warnings, upcoming bills
```

Start with `pane://profile` for a quick overview, then drill in with tools.

## Privacy scopes

Each account has a privacy scope set by the user. The server enforces these automatically:

| Scope | Balances | Transactions | Merchants |
|-------|----------|-------------|-----------|
| `full` | Visible | Visible | Visible |
| `balances_and_redacted` | Visible | Visible | "Redacted" |
| `balances_only` | Visible | Hidden | Hidden |
| `hidden` | Hidden | Hidden | Hidden |

If transactions return empty for an account that exists, it's privacy-scoped — not missing data.

## Rate limits

30 requests/minute, 1,000/day per user. Prefer `get_spending_summary` over iterating `get_transactions`. Read resources first to plan tool calls.

## Common patterns

**Net worth**: `get_balances type=all` — check `summary.net_worth`

**Monthly spending**: `get_spending_summary period=this_month group_by=category` then `group_by=merchant` for detail

**Subscription audit**: `get_recurring type=subscriptions` — check `total_monthly_subscriptions`

**Transaction search**: `get_transactions search="merchant name"` or `category=FOOD_AND_DRINK min_amount:50`

**Plaid categories**: `FOOD_AND_DRINK`, `TRANSPORTATION`, `ENTERTAINMENT`, `RENT_AND_UTILITIES`, `GENERAL_MERCHANDISE`, `PERSONAL_CARE`, `TRAVEL`, `MEDICAL`, `EDUCATION`, `INCOME`, `TRANSFER_IN`, `TRANSFER_OUT`, `LOAN_PAYMENTS`, `BANK_FEES`

## Notes

- Amounts: positive = debits (spending), negative = credits (income)
- Dates: `YYYY-MM-DD` format, UTC
- Pagination: `limit` + `offset` on `get_transactions` and `list_annotations`
- Errors return `isError: true` — common: rate limit (wait + retry), subscription inactive (402), crypto not enabled
- Annotations are persistent and server-side — never store passwords, full account numbers, or secrets in annotation content
- Prefer `--output json` for machine-readable results

