bitvavo-mcp
Click on "Deploy 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., "@bitvavo-mcp What is my total portfolio value in EUR?"
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.
bitvavo-mcp
An MCP server that exposes a Bitvavo crypto exchange account as read-only tools for Claude (and other MCP clients).
⚠️ Read-only by design. The server only calls Bitvavo endpoints that view information — no trading, no withdrawals. Create your API key with the View information scope only.
What it does
Once connected, Claude can answer questions like:
"What is my portfolio worth right now?"
"How much XRP do I hold and what's my average cost basis?"
"Show me my trade history on BTC-EUR."
"What were my last 5 deposits and withdrawals?"
Related MCP server: CryptoPilot MCP
Tools
Tool | Purpose |
| Verify the connection and credentials, return server time + fee tier |
| List per-asset balances (available + in-order) |
| Total portfolio value in EUR with breakdown |
| 24-hour ticker for one market |
| List tradable markets, filterable by quote / status |
| Your filled trades on a specific market |
| Deposit history, optionally filtered by asset |
| Withdrawal history, optionally filtered by asset |
| Orders that are placed but not yet filled |
| Average-cost P&L per position, with cost basis + unrealized/realized split |
| Import a Bitvavo CSV transaction export into a local SQLite store |
| Query the locally-stored transaction history |
| Historical OHLCV candles for a market (any interval from 1m to 1d) |
| Multi-period trend digest — 24h/7d/30d/90d/1y % changes plus your cost-basis comparison |
Install
You need Node.js 18 or later and a Bitvavo API key + secret with View information scope (create one).
Claude Desktop
Open your Claude Desktop config file:
OS | Path |
macOS |
|
Windows |
|
Linux |
|
Add an entry under mcpServers:
{
"mcpServers": {
"bitvavo": {
"command": "npx",
"args": ["-y", "bitvavo-mcp"],
"env": {
"BITVAVO_API_KEY": "your_api_key",
"BITVAVO_API_SECRET": "your_api_secret"
}
}
}
}Restart Claude Desktop. The Bitvavo tools appear in the tools menu (hammer icon) of any new chat. npx -y downloads the latest published version on first run and caches it locally — no manual install step.
Claude Code
claude mcp add --scope user bitvavo \
-e BITVAVO_API_KEY=your_api_key \
-e BITVAVO_API_SECRET=your_api_secret \
-- npx -y bitvavo-mcpUse --scope local if you only want it active in the current project directory.
From source
If you want to hack on the code:
git clone https://github.com/aderik/bitvavo-mcp.git
cd bitvavo-mcp
npm install
npm run build
cp .env.example .env # then fill in BITVAVO_API_KEY and BITVAVO_API_SECRETPoint Claude Desktop at the built file instead of npx:
{
"mcpServers": {
"bitvavo": {
"command": "node",
"args": ["/absolute/path/to/bitvavo-mcp/dist/server.js"]
}
}
}The .env file is loaded relative to the running script, so credentials are found regardless of which directory Claude spawns the server from. .env is gitignored — never commit it.
Full transaction history via CSV import
Bitvavo's /trades and /orders REST endpoints expose only exchange (Advanced) trades. Transactions made via the Buy/Sell or Convert UI in the Bitvavo app use a separate brokerage backend and do not appear in the API. Staking distributions and rebates aren't in the API either.
To get the complete picture:
Download your transaction CSV from Bitvavo: Account → Transactiegeschiedenis → Exporteren → Volledige geschiedenis → format CSV.
In your Claude chat: "import_transactions van /pad/naar/Volledige geschiedenis.csv" — or call the tool directly.
Run
get_pnlagain — every traded asset (including fully sold-off positions) now shows its realized P&L, sourced from the imported records.
The data lives in ~/.bitvavo-mcp/transactions.db (override with BITVAVO_MCP_DATA_DIR=/some/path). Re-importing the same CSV is idempotent — rows are matched on Bitvavo's transaction_id.
Environment variables
Variable | Required | Purpose |
| yes | API key from https://account.bitvavo.com/user/api |
| yes | The matching secret |
| no | Override the SQLite location (default |
Available Tools
14 toolsget_balanceA
List balances per asset on the Bitvavo account. Each entry has symbol, available (free to use), and inOrder (locked in open orders). Zero balances are filtered out unless include_zero=true.
Inputs: include_zero.
get_candlesA
Historical OHLCV candles for a market (e.g. 'BTC-EUR'). Use this for trend analysis, charts, or computing technical indicators over a custom time window. Interval defaults to 1d, limit to 100 candles. Returned newest-first; each row has timestamp (unix ms), open, high, low, close, volume.
Inputs: market (required), limit, interval.
get_depositsC
Deposit history — fiat (EUR) and crypto. Optionally filter by symbol.
Inputs: symbol.
get_marketsA
List markets available on Bitvavo. By default only EUR-quoted, trading markets. Pass quote=null or status=null to disable a filter.
Inputs: quote, status.
get_open_ordersA
Orders that are placed but not yet (fully) filled. Without a market filter returns open orders across every market on the account.
Inputs: market.
get_pnlA
Profit & loss per asset, using the average-cost method. Walks every asset's trade history to derive an average cost basis, then compares to the latest market price. Returns per-position cost basis, market value, unrealized + realized P&L, plus portfolio totals.
Source priority: locally-imported transactions (via import_transactions) are preferred when available — these include Quick Buy/Sell, Convert, staking and rebate activity that the live API does not expose. When local data is present every traded asset is scanned, so fully-sold positions show their realized P&L too. Without local data, falls back to the live /trades endpoint and only assets with a current non-zero balance are visible.
Inputs: quote.
get_portfolio_valueA
Compute the total portfolio value in quote (default EUR). Sums available + inOrder per asset and multiplies by the latest price on the {asset}-{quote} market. Assets without a direct market against quote are listed separately under unpriced and excluded from the total.
Inputs: quote.
get_tickerA
Live 24-hour ticker for one market (e.g. 'BTC-EUR'). Returns open / high / low / last / volume / bid / ask. Public endpoint.
Inputs: market (required).
get_tradesA
Your own filled trades on a specific market (e.g. 'BTC-EUR'). Newest first. Each trade has timestamp, side, amount, price, fee, feeCurrency.
Inputs: market (required), limit.
get_transactionsA
Query the locally-stored transaction history (populated via import_transactions). Newest first. Without filters returns the most recent 100 rows. Combine currency + type to narrow.
Inputs: to, from, type, limit, +1 more.
get_trendA
Multi-period trend digest for a market: percentage changes over 24h / 7d / 30d / 90d / 1y, plus the high and low within the past year. When you have imported transactions for the base asset, also compares the current price to your average cost basis and reports your unrealized P&L on the position.
Inputs: market (required).
get_withdrawalsA
Withdrawal history — fiat (EUR) and crypto. Optionally filter by symbol.
Inputs: symbol.
import_transactionsA
Import a Bitvavo CSV transaction export into the local SQLite store. Idempotent — rows with a known transaction_id are updated in place. After import, get_pnl uses these records as the canonical source so Quick Buy/Sell, Convert, staking and rebate activity all become visible.
Inputs: file_path (required).
pingA
Verify the connection and credentials against Bitvavo. Calls the public time endpoint and the private account endpoint to confirm the API key/secret are valid. Returns server time, account fee tier, and the remaining rate-limit budget.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Most tools have clearly distinct purposes: ping checks connectivity, get_balance lists balances, get_portfolio_value computes total value, and so on. A few pairs like get_trades vs get_transactions (live vs local) and get_balance vs get_portfolio_value (per-asset vs total) overlap conceptually, but the descriptions clarify the boundaries.
The naming is predominantly verb_noun with get_ prefix for data retrieval, import_transactions for ingestion, and ping for health checks. The deviation from get_ is minor and standard, and all names use snake_case consistently, making the set predictable and readable.
14 tools is well within the ideal 3-15 range and appropriately scoped for a cryptocurrency exchange server. Each tool covers a distinct aspect such as market data, balances, history, or analytics, with no redundant or missing obvious tools.
The server covers market data, balances, deposits/withdrawals, trades, and local transaction history for P&L, which is substantial. However, it lacks core order management operations like place/cancel order or fetching a single order by ID, leaving a notable gap for a trading-focused exchange MCP.
Maintenance
Related MCP Connectors
Read-only access to your own crypto portfolio across 11+ exchanges and 20+ chains: holdings, full history, FIFO cost basis and P&L, fees and income. Ask Claude or ChatGPT about your portfolio; the connector can never trade, move funds or act as a login.
Read-only crypto and traditional portfolio: holdings, PNL, FIFO tax figures and market data.
Read-only access to your Skipo account: balances, deposits, withdrawals, orders, ledger and prices.
Read-only market charts, OHLC, backtests and a view of your connected broker accounts
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with OKX trading accounts through read-only access to retrieve portfolio information, trading positions, order history, and account analytics. Provides secure, local processing of trading data without storing sensitive information or enabling trade execution.562 npm4MIT
- AlicenseAqualityDmaintenanceConnects Claude Desktop to crypto and brokerage portfolio data via Coinbase and SnapTrade, providing read-only tools to inspect accounts, holdings, prices, and provider health.5MIT
- AlicenseNot gradedqualityFmaintenanceProvides Claude with access to blockchain data and market prices via the OKX API, enabling operations like retrieving asset prices, transaction history, and executing swaps.3MIT
- AlicenseNot gradedqualityDmaintenanceProvides read-only access to Trading 212 accounts, enabling AI assistants to retrieve portfolio positions, account summaries, instrument data, and transaction history.32 npm5MIT