Yodlee Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Yodlee Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
[See the demo live on Hugging Face](https://huggingface.co/spaces/ashishmerani/yodlee-mcp-server-main)
A Gradio-based MCP (Model Context Protocol) server that connects Claude Desktop to Yodlee banking data, with text-to-speech audio summaries powered by ElevenLabs and OpenAI TTS.
<div align="center"> <a href="https://www.loom.com/share/376d6e442a5f41da9f831e44b8c18784"> <img src="https://cdn.loom.com/sessions/thumbnails/376d6e442a5f41da9f831e44b8c18784-35fddb873ae0ce24.jpg" alt="Yodlee MCP Server Demo" width="600"> </a> </div>
This application serves as a bridge between Claude Desktop and the Yodlee financial data API. It exposes 7 MCP tools that allow Claude to:
The application includes a Gradio web UI for interactive exploration and testing, while also functioning as an MCP server for Claude Desktop integration.
When used via Claude Desktop, the following tools are available:
| Tool | Description |
|---|---|
list_available_users() | List all test user accounts |
get_current_user() | Get the currently active user |
switch_user(login_name) | Switch to a different user account |
get_accounts(login_name?, account_type?) | Get linked financial accounts |
get_transactions(login_name?, from_date?, to_date?, category_type?) | Get transaction history |
get_spending_summary(login_name?, from_date?, to_date?) | Get spending by category |
generate_audio_summary(login_name?, from_date?, to_date?, custom_script?) | Generate audio summary |
The web interface provides 5 tabs:
#### 📊 Accounts Tab
#### 💳 Transactions Tab
#### 📈 Spending Summary Tab
#### 🎧 Audio Summary Tab
#### 🎬 Demo Video Tab
Use the Active User dropdown in the header to switch between test accounts. Each user has different linked accounts and transaction histories.
⚠️ Important: The Yodlee sandbox only contains historical test data from 2013-01-01 to 2014-12-31.
git clone https://github.com/ashishmerani/yodlee-mcp-server.git
cd yodlee-mcp-serverpython -m venv venv
source venv/bin/activate # On macOS/Linux
# or
.\venv\Scripts\activate # On Windowspip install -r requirements.txtThis installs:
gradio[mcp]>=6.0.0 - Web UI framework with MCP support (the [mcp] extra is required for Claude Desktop integration)requests>=2.31.0 - HTTP client for API callspython-dotenv>=1.0.0 - Environment variable managementelevenlabs>=2.0.0 - ElevenLabs text-to-speech API clientopenai>=1.0.0 - OpenAI text-to-speech API clientNote for zsh users (macOS default shell): If installing packages directly with extras likepip install gradio[mcp], you must quote the package name to prevent shell interpretation of square brackets: ``bash pip install "gradio[mcp]"`This is not needed when usingpip install -r requirements.txt` since the shell doesn't parse the file contents.
Copy the example environment file:
cp .env.example .envThen edit .env with your actual credentials (see Configuration section below).
YODLEE_CLIENT_IDYODLEE_CLIENT_SECRETsbMemuser1, sbMemuser2, etc.)YODLEE_LOGIN_NAMEShttps://sandbox.api.yodlee.com/ysl.env.exampleThe ElevenLabs API is optional. Without it, the app runs in "demo mode" using a pre-generated audio sample.
ELEVENLABS_API_KEYiP95p4xoKVk53GoZ742B): Natural, conversational American malecjVigY5qzO86Huf0OWal): Smooth, professional tonepFZP5JQG7iQjIQuC4Bku): Warm British femaleOpenAI TTS is an alternative to ElevenLabs. You can configure one or both providers.
model.request scope for TTS accessOPENAI_API_KEYalloy, echo, fable, onyx, nova, shimmerOPENAI_TTS_VOICECreate a .env file in the project root with the following variables:
# Yodlee Sandbox API Credentials (Required)
YODLEE_CLIENT_ID=your_client_id_here
YODLEE_CLIENT_SECRET=your_client_secret_here
YODLEE_LOGIN_NAMES=user1,user2,user3
YODLEE_BASE_URL=https://sandbox.api.yodlee.com/ysl
# ElevenLabs Text-to-Speech (Optional - Provider 1)
ELEVENLABS_API_KEY=your_elevenlabs_api_key_here
ELEVENLABS_VOICE_ID=iP95p4xoKVk53GoZ742B
# OpenAI Text-to-Speech (Optional - Provider 2)
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_TTS_VOICE=onyx| Variable | Required | Description |
|---|---|---|
YODLEE_CLIENT_ID | Yes | Your Yodlee API client ID |
YODLEE_CLIENT_SECRET | Yes | Your Yodlee API secret key |
YODLEE_LOGIN_NAMES | Yes | Comma-separated list of test user login names |
YODLEE_BASE_URL | Yes | Yodlee API base URL (use sandbox URL for testing) |
ELEVENLABS_API_KEY | No | ElevenLabs API key for real-time audio generation |
ELEVENLABS_VOICE_ID | No* | Voice ID for ElevenLabs TTS (*Required if using ElevenLabs) |
OPENAI_API_KEY | No | OpenAI API key for real-time audio generation |
OPENAI_TTS_VOICE | No* | Voice name for OpenAI TTS (*Required if using OpenAI) |
Each TTS provider operates independently. You can configure one, both, or neither:
| Provider | API Key Status | Button Behavior |
|---|---|---|
| ElevenLabs | Not configured | Plays pre-generated ElevenLabs sample |
| ElevenLabs | Configured | Generates real-time audio via ElevenLabs API |
| OpenAI | Not configured | Plays pre-generated OpenAI sample |
| OpenAI | Configured | Generates real-time audio via OpenAI API |
python app.pyYou should see output like:
============================================================
Starting Yodlee MCP Server...
============================================================
This server exposes 7 MCP tools:
1. list_available_users - List available Yodlee test users
2. get_current_user - Get the current active user
3. switch_user - Switch to a different test user
4. get_accounts - Get linked financial accounts
5. get_transactions - Get transaction history
6. get_spending_summary - Get spending by category
7. generate_audio_summary - Generate audio spending summary (ElevenLabs TTS)
Available test users: ...user1, ...user2, ...user3
Gradio UI: http://localhost:7860
MCP endpoint: Available when mcp_server=True
============================================================To use this MCP server with Claude Desktop, you need to configure Claude to connect to the Gradio MCP endpoint. This allows Claude to access the 7 Yodlee tools directly from the chat interface.
The mcp-remote package is required to bridge Claude Desktop with the Gradio MCP server:
npm install -g @modelcontextprotocol/mcp-remoteThe configuration file is located at:
~/Library/Application Support/Claude/claude_desktop_config.jsonIf the file doesn't exist, create it with an empty JSON object {}.
Before editing the configuration, find the paths to node and mcp-remote on your system:
which node
which mcp-remoteNote the paths returned — you'll need them for the configuration.
Open the configuration file in a text editor and add (or merge) the following configuration:
{
"mcpServers": {
"yodlee-mcp-gradio": {
"command": "/path/to/node",
"args": [
"/path/to/mcp-remote",
"http://127.0.0.1:7860/gradio_api/mcp/",
"--transport",
"http-only"
]
}
}
}Replace the placeholder paths with your actual paths:
/path/to/node → The path from which node (e.g., /usr/local/bin/node)/path/to/mcp-remote → The path from which mcp-remote (e.g., /usr/local/bin/mcp-remote)Example for macOS:
{
"mcpServers": {
"yodlee-mcp-gradio": {
"command": "/usr/local/bin/node",
"args": [
"/usr/local/bin/mcp-remote",
"http://127.0.0.1:7860/gradio_api/mcp/",
"--transport",
"http-only"
]
}
}
}Note: If you already have other MCP servers configured, add theyodlee-mcp-gradioentry to your existingmcpServersobject rather than replacing the entire file.
⚠️ Important: The Gradio MCP server must be running before Claude Desktop can connect to it.
python app.pyKeep this terminal window open while using Claude Desktop.
After saving the configuration file:
Cmd + Q or right-click the dock icon → Quit"Server disconnected" or connection errors:
python app.py)http://127.0.0.1:7860/gradio_api/mcp/ is accessible in your browserTools not appearing:
mcp-remote is installed globally (npm list -g @modelcontextprotocol/mcp-remote)"Command not found" errors:
ls /path/to/node python yodlee_client.pyThis runs a self-test that verifies:
python audio_generator.pyThis tests the ElevenLabs integration and saves a test audio file.
# Install pytest if not already installed
pip install pytest
# Run all tests
pytest tests/
# Run specific test file
pytest tests/yodlee_mcp/test_utils.pytests/conftest.pysample-gradio/
├── app.py # Main entry point
├── yodlee_client.py # Yodlee API client
├── audio_generator.py # ElevenLabs TTS integration
├── requirements.txt # Python dependencies
├── .env.example # Example environment configuration
├── sample_audio_summary_elevenlabs.mp3 # Pre-generated ElevenLabs demo audio
├── sample_audio_summary_openai.mp3 # Pre-generated OpenAI demo audio
├── generate_openai_sample.py # Utility to generate OpenAI sample
├── audio_outputs/ # Generated audio files (gitignored)
├── yodlee_mcp/ # Core package
│ ├── __init__.py
│ ├── config.py # Configuration and constants
│ ├── utils.py # Utility functions
│ ├── client_manager.py # Client session management
│ ├── mcp_tools.py # MCP tool implementations
│ └── gradio_ui.py # Gradio interface (includes OpenAI TTS)
└── tests/ # Unit tests
├── conftest.py
└── yodlee_mcp/
├── test_config.py
├── test_utils.py
├── test_client_manager.py
└── test_mcp_tools.py"Missing required credentials" error
.env.env file is in the project root directory"Authentication failed" error
YODLEE_CLIENT_ID and YODLEE_CLIENT_SECRET are correct"No transactions found" or empty results
2013-01-01 to 2014-12-31Audio generation fails (ElevenLabs)
ELEVENLABS_API_KEY: App works in demo mode (this is expected)ELEVENLABS_VOICE_ID is set when using ElevenLabsAudio generation fails (OpenAI)
OPENAI_API_KEY: App works in demo mode (this is expected)model.request scopeOPENAI_TTS_VOICE is set to a valid voice name"Character quota exceeded" error
See LICENSE file for details.
Powered by [Yodlee API](https://developer.yodlee.com), [Gradio](https://gradio.app), [ElevenLabs](https://elevenlabs.io), and [OpenAI](https://openai.com)
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.