plaid-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@plaid-mcpwhat did I spend on food last month?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
plaid-mcp
Talk to your bank accounts in natural language. plaid-mcp is a local
Model Context Protocol server that gives
any MCP-aware agent (Claude Code, Claude Desktop, Codex CLI, Cursor, Gemini
CLI, Hermes, OpenClaw…) read-only SQL access to your bank, credit-card,
brokerage, and mortgage data via Plaid.
$ claude
> what did I spend on food last month?
→ plaid_query(sql=...)
→ "You spent $487 on food in April, down from $612 in March.
Top three merchants: Whole Foods ($143), Tartine ($89), DoorDash ($72)."
> am I behind on any credit-card payments?
→ plaid_query(sql=...)
→ "No. Your Chase Sapphire next payment is $1,243 due May 28
(statement closed May 1, 14 days remaining)."Everything runs locally. Your Plaid access tokens, transactions, and
holdings live in a SQLite file at ~/.plaid-mcp/data.db — never uploaded
anywhere, never seen by Anthropic or any LLM provider.
Why?
Plaid hands you a firehose of structured financial data — transactions, balances, holdings, liabilities — but reasoning over it in any useful way takes either a custom dashboard or a finance-app subscription that re-sells your own data back to you. LLMs are great at this kind of analytical query if you put a clean schema in front of them; the challenge is wiring it up without leaking access tokens or building a backend.
plaid-mcp is the wiring. Link your banks once, run sync on a cron,
expose a single plaid_query tool to your agent. The agent gets a
documented set of views (vw_plaid_transactions, vw_plaid_holdings,
vw_plaid_liabilities_mortgage, …) with Plaid's sign conventions
already flipped to the right direction, and writes SQL against them.
Quick start (Claude Desktop)
There's no fully no-terminal path — you'll open Terminal twice — but most of the work happens in two ordinary apps: Plaid's website and Claude Desktop. Plan on ~15 minutes including Plaid's signup.
1. Install plaid-mcp
Open Terminal and run:
pipx install git+https://github.com/yuechen/plaid-mcp(No pipx? On macOS: brew install pipx && pipx ensurepath, then
restart Terminal. On other OSes:
pipx install guide.)
2. Get free Plaid credentials
Sign up at dashboard.plaid.com and verify your email.
Apply for the free Trial plan at dashboard.plaid.com/trial-plan. Approval is usually quick. (See Plaid plans below if you'd rather start with sandbox/fake-bank testing.)
Once approved, open the Dashboard's Keys tab and copy your
client_idand your production secret.
3. Save your credentials
Create the file ~/.plaid-mcp/.env with these three lines, pasting
the values from step 2:
PLAID_CLIENT_ID=paste-your-client-id-here
PLAID_SECRET=paste-your-production-secret-here
PLAID_ENV=productionEasiest way: open Terminal, run mkdir -p ~/.plaid-mcp && open
~/.plaid-mcp, then create the .env file in the Finder window that
pops up (Cmd-N → save as .env). Or use your editor of choice.
plaid-mcp auto-loads this file every time it runs — you only do
this once.
4. Link your bank
plaid-mcp linkYour browser opens to a Plaid-hosted page. Pick your bank, sign in (handle any 2FA / OAuth prompts), and you're done. Run the command again for each additional institution you want to connect.
5. Connect it to Claude Desktop
Open Claude Desktop.
Claude → Settings → Developer → Edit Config. (This opens
claude_desktop_config.jsonin your text editor.)Find the path to the installed
plaid-mcpbinary — in Terminal:which plaid-mcpCopy what it prints.
Paste this into the JSON file (replacing the path with what
whichshowed you):{ "mcpServers": { "plaid": { "command": "/paste/the/path/from/which/here", "args": ["serve"] } } }If the file is empty (
{}), replace it with the block above.If the file already has a
"mcpServers"block, just add the"plaid"entry inside it.If the file has other top-level keys (e.g. a
"preferences"block — some Claude builds store more than just MCP config in this file), add"mcpServers"as a new top-level sibling of whatever's already there. Don't nest it inside another key.
Save and quit + reopen Claude Desktop (not just close the window — fully quit so it re-reads the config).
6. Try it
In Claude Desktop, open a new chat and ask something like:
What did I spend on food last month?
Claude will call the plaid_query tool. The first time, it'll ask
you to approve the tool — say yes and you're off.
Want to try it with fake data first?
If you'd rather kick the tires with fake banks before applying for Plaid's Trial plan, use sandbox mode instead. It's free, instant (no application), and lets you exercise the whole pipeline against Plaid's test institutions with realistic synthetic data.
Two changes versus the steps above:
In step 2, copy your
sandboxsecret from the Keys tab (the row labeled "Sandbox", not "Production") — sandbox access is on by default, no application needed.In step 3 (
~/.plaid-mcp/.env), use these values instead:PLAID_CLIENT_ID=paste-your-client-id-here PLAID_SECRET=paste-your-sandbox-secret-here PLAID_ENV=sandbox
When you run plaid-mcp link and Plaid's institution picker opens,
search for First Platypus Bank (or any other "test" institution
in the list). When it prompts for a username and password, use:
Field | Value |
Username |
|
Password |
|
If the sandbox prompts you for an MFA code (phone or device
verification), the canonical answer is 1111 — Plaid's sandbox
always accepts that as the correct one-time code, regardless of
which "phone number" it claims to be sending to.
You'll get a fake but realistic set of accounts, transactions,
holdings, and a mortgage to play with. Once you're satisfied, apply
for the Trial plan and swap the three .env values to point at
production — no other changes needed.
Keeping your data fresh
plaid-mcp syncs on demand (Claude can pull fresh data mid-conversation
by calling the plaid_sync tool). If you want a background refresh
running quietly in the background, open Terminal and run:
plaid-mcp sync --daemonLeave it running in a Terminal window or tmux. It syncs everything every 30 minutes.
Using a different MCP client?
plaid-mcp serve speaks the standard Model Context Protocol over
stdio, so it works with Claude Code, Codex CLI, Cursor,
Gemini CLI, and any other MCP-aware tool. Each has its own config
file location, but the JSON block (command + args: ["serve"])
above is the same.
If you use Claude Code specifically, also drop the bundled skill into your global skills directory so the agent knows when to use the finance tools without prompting:
git clone https://github.com/yuechen/plaid-mcp /tmp/plaid-mcp
cp -r /tmp/plaid-mcp/skills/plaid ~/.claude/skills/plaidWhat the agent sees
A single tool, plaid_query(sql: str). The tool description embeds the
full schema (views, columns, types) plus a dozen worked SQL examples
(spending by category, net-worth breakdown, top merchants in a window,
unrealized-gain leaders, …). The agent picks a query, runs it, and
gets back JSON rows.
Hard-enforced safety net:
The connection is opened read-only (
?mode=ro) — DDL/DML can't reach the data even if the agent tries.Output is capped at 1000 rows.
5-second statement timeout.
The agent only sees the curated
vw_plaid_*views, not the rawplaid_*tables — Plaid's positive-is-outflow amount convention is flipped intoinflow/outflow/directioncolumns so the agent can't get it wrong.
What it knows
Plaid product | What you get |
Accounts | Balances, account types, mask, institution, last-refresh time |
Transactions | 24 months of history, merchant enrichment, PFC categories |
Investments | Holdings (with cost basis where available), trades, dividends |
Liabilities | Credit-card statement state, mortgage details |
plaid-mcp does not and will not include:
Auth / Identity — full routing numbers and PII. Not needed for the read-only analytics use case.
Money movement — no transfers, no payments, no payouts.
Adding either is a deliberate code change requiring a fork.
One thing to know about transaction history. Plaid pulls up to 24 months of transactions, but the window is bound to the Item at first link time and can't be extended retroactively. If you link Chase today, then unlink and re-link 6 months from now, you'll lose the original 24-month window and start over from Plaid's default 90-day backstop. Use
plaid-mcp relink(Plaid Link's update mode) instead of unlink+link whenever possible — it re-authenticates the same Item and preserves history.
Configuration
All config is via env vars (or a .env file in the working directory).
Variable | Default | Notes |
| — | Required. |
| — | Required. |
|
|
|
|
| Where the SQLite file lives. |
| auto | Fernet key for at-rest access-token encryption. Auto-generated and stored at |
|
| Seconds between syncs when running |
Architecture
┌──────────────────────────────────────────────────────┐
│ Your AI agent │
│ (Claude Code / Desktop / Codex / …) │
└────────────────────────┬─────────────────────────────┘
│ MCP / stdio
▼
┌──────────────────────┐
│ plaid-mcp serve │ ← read-only SQLite connection
│ (FastMCP server) │
└──────────┬───────────┘
│ SELECT only
▼
┌──────────────────────┐
│ ~/.plaid-mcp/data.db │
│ plaid_* tables │
│ vw_plaid_* views │
└──────────▲───────────┘
│ INSERT/UPDATE
│
┌──────────┴───────────┐ ┌──────────────────┐
│ plaid-mcp sync │ ──────► │ Plaid API │
│ (one-shot or daemon) │ └──────────────────┘
└──────────────────────┘
▲
│ encrypted access_token
┌──────────┴───────────┐ ┌──────────────────┐
│ plaid-mcp link │ ──────► │ Plaid Hosted │
│ (opens plaid.com URL,│ poll │ Link │
│ polls for finish) │ ◄────── │ (browser → bank) │
└──────────────────────┘ └──────────────────┘Three loosely-coupled commands:
plaid-mcp link— calls Plaid's/link/token/createwith Hosted Link, opens the returnedplaid.comURL in your browser, polls/link/token/getuntil you've finished, exchanges the public_token, encrypts the access_token, stores it, and runs an initial sync.plaid-mcp sync— pulls fresh data from Plaid for all linked items. Idempotent. Run from cron or with--daemonfor an in-process loop.plaid-mcp serve— speaks the MCP protocol over stdio. Opens the SQLite DB read-only and exposesplaid_query,plaid_sync, andplaid_statustools.
CLI reference
plaid-mcp link # link a NEW institution
plaid-mcp relink <item-id> # re-auth an existing institution (update mode)
plaid-mcp unlink <item-id> # permanently remove an institution
plaid-mcp items # list linked institutions
plaid-mcp sync # one-shot sync of all items
plaid-mcp sync --daemon # background loop
plaid-mcp sync --item <item-id> # sync just one item
plaid-mcp status # show sync staleness + errors
plaid-mcp serve # MCP server on stdio<item-id> accepts the full UUID or any unique leading prefix
(plaid-mcp items shows the short forms).
When to use relink vs link
Situation | Command |
Adding your first bank, or a different institution |
|
|
|
|
|
You no longer want a bank connected |
|
relink runs Plaid Link in update mode — same access_token,
same plaid_item_id, same 24-month transaction-history window. A
naive plaid-mcp link after an error would create a duplicate Item
with only 90 days of history and silently lose your past data.
Driving link / relink / unlink from your AI agent
The MCP server exposes every connection-management operation as a tool so the agent can drive the whole flow from chat — you never have to drop to the terminal:
Tool | What it does |
| Add a new institution. Returns a |
| Re-auth an existing institution (update mode). Same browser flow. |
| Finalize after the user finishes in the browser. Polls up to 60s; re-call if the result is |
| Permanently remove an institution. Tool enforces confirmation — a call without |
| Query / refresh / inspect the local cache. |
Typical chat exchange:
You: Why don't I see any Chase transactions for the last week? Agent: (calls
plaid_status) Looks like Chase needs a re-auth —ITEM_LOGIN_REQUIRED. Want me to fix it? You: Yes please. Agent: (callsplaid_relink) I've opened Plaid Link in your browser. Sign in to Chase and let me know when you're done. You: Done. Agent: (callsplaid_link_complete) Re-authed Chase Sapphire Preferred and synced 23 new transactions. What did you want to check?
Plaid plans — which one do I need?
Plaid has four account modes. Two are relevant to plaid-mcp users:
Sandbox (default — kick the tires)
Cost: $0 forever.
What it gets you: Fake "test" institutions (First Platypus Bank, Houndstooth Bank, etc.) with realistic data — accounts, transactions, holdings, mortgages. Log in with
user_good/pass_good.What it doesn't get you: Your actual money.
Setup: Create a Plaid Dashboard account, copy the
client_idand the sandbox secret from the "Keys" tab, setPLAID_ENV=sandbox.Hosted Link works here: Yes, fully. No approvals needed.
Trial plan (free, real banks — what most personal users want)
In April 2026 Plaid replaced the old "Limited Production" tier with a
free Trial plan for new US and Canada teams. This is the right path
if you want plaid-mcp to know about your real Chase / Wells Fargo /
Fidelity / Amex / Cap One accounts.
Cost: $0 up to 10 linked institutions ("Items"). Beyond that you upgrade to a paid plan.
What it gets you: Live production data. Most OAuth institutions (Chase, Bank of America, Wells Fargo, Amex, Cap One, Citi…) are available before full Production approval. Same SDK, same endpoints — the only difference is
PLAID_ENV=productionand a different secret.Setup:
Create a Plaid Dashboard account at dashboard.plaid.com and verify your email.
From the Dashboard homepage, click Apply for Trial plan (or go directly to dashboard.plaid.com/trial-plan). Fill in the short form — Plaid asks what you're building, your contact info, etc. Approval is usually fast (minutes to a day).
Once approved, the "Keys" tab will show a production secret. Copy it. Set in your shell:
export PLAID_CLIENT_ID=... export PLAID_SECRET=<production secret> export PLAID_ENV=productionRun
plaid-mcp link. Pick your real bank. Done.
Hosted Link works here: Yes. Plaid removed the "ask your account manager to enable Hosted Link" gate, so the same
plaid-mcp linkcommand works without any extra setup.OAuth banks work here: Yes. Hosted Link runs on
plaid.com, so Plaid handles every OAuth redirect server-side — you don't need a domain, HTTPS endpoint, orredirect_uriregistration.
Production (paid — for hobbyists who outgrow Trial)
If you link more than 10 institutions, Plaid will ask you to upgrade.
Paid plans are usage-based (current pricing).
Nothing in plaid-mcp changes; same env vars, same code.
Limited Production (legacy — don't use)
The old free-tier-with-strings-attached for teams created before April 2026. New users should apply for the Trial plan instead. If your account predates April 2026, switching to the Trial plan is a separate application in the Dashboard.
Known limitations
Transaction history is fixed at first-link time. See the callout in What it knows. Plaid won't let us back-fill once an Item exists. Always prefer
relinkoverunlink + linkfor the same institution.Brokerage/bank acquisitions can create stranded data. If an institution is acquired and re-issues a new
plaid_item_id, your old Item will start failing withINSTITUTION_NOT_RESPONDINGor similar. There's no automatic migration — unlink the dead Item and link the new one. The old transactions stay in the local cache unless youplaid-mcp unlink(which cascade-deletes them) — that's usually the right call, but worth knowing.No Fernet key rotation. The encryption key at
~/.plaid-mcp/key(or$PLAID_MCP_KEY) is single-use. If you replace it, every previously linked institution becomes unrecoverable and must berelink-ed. Back up the key file alongside the DB, or set$PLAID_MCP_KEYfrom a password manager.Sandbox only ships with credential-flow test banks. OAuth-only banks (Amex, Cap One, etc.) work fully in production via Hosted Link but aren't reachable in sandbox testing — you'll only see the classic test institutions there.
No webhook receiver yet. Data refresh is poll-based via
plaid-mcp sync(cron or--daemon). The agent can also pull on demand by calling theplaid_syncMCP tool mid-conversation. Webhooks are on the roadmap; they require a public URL on your end.
License
MIT. See LICENSE.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/yuechen/plaid-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server