becu-mcp
An MCP server that provides read-only access to your BECU accounts via browser automation, enabling querying of account balances and transaction history conversationally.
README
becu-mcp
An MCP (Model Context Protocol) server that provides read-only access to your BECU accounts via browser automation. Use it with Claude Code or any MCP-compatible client to query account balances and transaction history conversationally.
What it does
Exposes three tools:
| Tool | Description |
|---|---|
get_accounts |
Returns all accounts with current balance, available balance, and YTD interest |
get_balance |
Returns balance details for a single account by index |
get_transactions |
Returns transaction history for an account (date, description, amount, balance) |
Authentication is handled automatically using Playwright to drive a Chromium browser. Sessions are persisted to session.json so subsequent calls run headlessly. If the session expires or MFA is required, a visible browser window opens for you to complete login.
Installation
Prerequisites
- Python 3.11+
- uv or pip
Steps
-
Clone the repository:
git clone https://github.com/jrolstad/becu-mcp.git cd becu-mcp -
Install dependencies:
pip install -r requirements.txt -
Install Playwright's Chromium browser:
playwright install chromium -
Set your BECU credentials using one of the two options below.
Configure with Claude Code
Add the server to your Claude Code MCP settings (~/.claude.json under mcpServers). Credentials can be provided in the MCP config directly (recommended) or via a .env file.
Option A — credentials in MCP config (recommended)
Pass credentials as environment variables in the MCP server entry. This keeps everything in one place and avoids needing a .env file on disk.
{
"mcpServers": {
"becu": {
"type": "stdio",
"command": "python",
"args": ["/path/to/becu-mcp/server.py"],
"env": {
"BECU_USERNAME": "your_username_here",
"BECU_PASSWORD": "your_password_here"
}
}
}
}
Option B — .env file
Create a .env file in the repo directory:
cp .env.example .env
Then edit .env:
BECU_USERNAME=your_username_here
BECU_PASSWORD=your_password_here
The server loads this automatically via python-dotenv on startup. The .env file is gitignored.
Usage
Once connected, you can ask Claude things like:
- "List my BECU accounts with their balances"
- "What are the last 20 transactions from My Checking?"
- "What's the balance on my savings account?"
- "How much YTD interest has the Annual Payments savings account earned?"
Authentication and sessions
- On first run, a Chromium browser window opens and logs in with your credentials.
- If MFA is required, you have 60 seconds to complete it in the browser window.
- After a successful login, cookies are saved to
session.jsonfor future headless runs. - If a session expires, the browser window opens again automatically.
session.jsonis gitignored — do not commit it.
Development
Project structure
becu_client.py # Playwright scraping and HTML parsing logic
server.py # MCP server (FastMCP) — exposes tools to MCP clients
requirements.txt # Python dependencies
.env.example # Credential template
session.json # Persisted browser session cookies (gitignored)
How scraping works
becu_client.py uses Playwright to load pages from onlinebanking.becu.org, then parses the HTML with BeautifulSoup. The BECU pages use a Tablesaw responsive table library that embeds column labels inside each <td> as <b class="tablesaw-cell-label"> elements. The parser extracts these labels to identify each cell's field regardless of column order, making it resilient to layout changes.
Key functions:
_get_page_html()— fetches a page, handles auth/session management_cell_label_and_value()— extracts the field label and value from a tablesaw<td>_parse_currency()— converts"$1,234.56"to1234.56get_accounts()— scrapes the Summary page, deduplicates by account numberget_transactions()— scrapes the Activity page, filters out summary/non-transaction rows
Running locally
python server.py
Or via the MCP CLI:
mcp dev server.py
Adding new tools
- Add a new async function to
becu_client.pythat fetches and parses the relevant BECU page. - Register it as a tool in
server.pyusing the@mcp.tool()decorator. - Reconnect your MCP client to pick up the new tool.
Dependencies
| Package | Purpose |
|---|---|
mcp |
MCP server framework (FastMCP) |
playwright |
Headless browser automation for scraping |
beautifulsoup4 |
HTML parsing |
python-dotenv |
Loading credentials from .env |
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.