The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Personal Finance MCP listing page.
Unofficial. This project is not affiliated with, endorsed by, or sponsored by Plaid Inc. "Plaid" is a trademark of Plaid Inc. This is a self-hosted client that talks to Plaid's API using credentials you supply.
A self-hosted, read-only MCP server that connects your banks, credit cards, loans, and brokerage accounts (via Plaid) to an MCP client like Claude Code. Ask questions about your own finances in plain English — no third-party aggregator (Monarch, Mint, etc.) involved.
Example session (illustrative):
All 9 tools are read-only. Each returns {<data>: [...], "warnings": [...]} so one broken bank doesn't break the whole query.
| Tool | What it does |
|---|---|
list_accounts | Every account across every linked bank, with balances |
get_balances | Live current + available balances (optionally filtered by account) |
get_transactions | Transactions in a date range (up to 2 years back) |
search_transactions | Keyword search across merchant / name / counterparty |
get_recurring_transactions | Detected recurring inflow + outflow streams |
get_liabilities | Credit cards, student loans, mortgages with APRs and payment details |
get_investment_holdings | Current holdings with symbol + security metadata |
get_investment_transactions | Buy / sell / dividend history in a date range |
get_institutions_status | Health of each linked bank (surfaces re-auth needs) |
Requires Python 3.11+, a Plaid account (free Trial plan), and an MCP client.
client_id and production secret.Run once per bank you want to connect:
Open http://localhost:8765, click Link a bank, complete Plaid Link. The terminal prints a line like PLAID_TOKEN_CHASE=access-prod-xxx... — paste it into .env and repeat for each bank.
Try "list my accounts" to confirm.
For a deployment you can use from anywhere:
docker build -t personal-finance-mcp . && docker run --rm -p 8000:8000 --env-file .env personal-finance-mcp.env.example, expose /mcp over HTTPS, gate it with auth.Gate the endpoint. An exposed MCP endpoint with your tokens leaks every linked account. Use OAuth 2.1, Cloudflare Access, or bind to a private network only.
.env is gitignored.Before each deploy:
.env never committed: git log --all -- .env returns nothinggit log -S'access-prod-' --all returns only placeholdersHORIZON=1 (or similar) set in deployment env, blocking link_helper.py thereget_institutions_status() every few weeks for re-auth needsTool returns empty despite real data. Plaid products weren't enabled when you linked the bank. Re-link with Transactions + Liabilities + Investments active. The tool surfaces PRODUCTS_NOT_SUPPORTED in warnings when this is the cause.
get_institutions_status() shows re_auth_required. The bank's Plaid session expired. Run link_helper.py in update mode — your existing access token stays the same. See docs/DEPLOYMENT.md.
Plaid Link shows a bank as "unsupported" (common with Amex). Usually an INSTITUTION_REGISTRATION_REQUIRED issue — OAuth banks need per-institution registration in the Plaid dashboard first. See docs/TROUBLESHOOTING.md.
More issues: docs/TROUBLESHOOTING.md.
SecretStr token redaction, 5-minute per-Item health cache, response shaping, structured error mapping.HORIZON=1 is set.Deeper dive (including why /transactions/get over /transactions/sync): docs/ARCHITECTURE.md.
See CONTRIBUTING.md. Scope is deliberately narrow: read-only, single-tenant, Plaid-backed.