Skip to main content
Glama
bitvavo-mcp

bitvavo-mcp

by aderik

bitvavo-mcp

License: MIT npm version

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

ping

Verify the connection and credentials, return server time + fee tier

get_balance

List per-asset balances (available + in-order)

get_portfolio_value

Total portfolio value in EUR with breakdown

get_ticker

24-hour ticker for one market

get_markets

List tradable markets, filterable by quote / status

get_trades

Your filled trades on a specific market

get_deposits

Deposit history, optionally filtered by asset

get_withdrawals

Withdrawal history, optionally filtered by asset

get_open_orders

Orders that are placed but not yet filled

get_pnl

Average-cost P&L per position, with cost basis + unrealized/realized split

import_transactions

Import a Bitvavo CSV transaction export into a local SQLite store

get_transactions

Query the locally-stored transaction history

get_candles

Historical OHLCV candles for a market (any interval from 1m to 1d)

get_trend

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

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

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-mcp

Use --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_SECRET

Point 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:

  1. Download your transaction CSV from Bitvavo: Account → Transactiegeschiedenis → Exporteren → Volledige geschiedenis → format CSV.

  2. In your Claude chat: "import_transactions van /pad/naar/Volledige geschiedenis.csv" — or call the tool directly.

  3. Run get_pnl again — 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

BITVAVO_API_KEY

yes

API key from https://account.bitvavo.com/user/api

BITVAVO_API_SECRET

yes

The matching secret

BITVAVO_MCP_DATA_DIR

no

Override the SQLite location (default ~/.bitvavo-mcp/)

Available Tools

14 tools
get_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

    A3.7/5.0

    Scored across 14 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables 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.
      5
      62 npm
      4
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Connects Claude Desktop to crypto and brokerage portfolio data via Coinbase and SnapTrade, providing read-only tools to inspect accounts, holdings, prices, and provider health.
      5
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides read-only access to Trading 212 accounts, enabling AI assistants to retrieve portfolio positions, account summaries, instrument data, and transaction history.
      32 npm
      5
      MIT