MCP Hub
Back to servers

mullvad-mcp

MCP server for controlling Mullvad VPN through Claude Desktop, Cursor, Windsurf, and any MCP-compatible client. Connect, disconnect, switch locations, check for leaks, manage settings — all via natural language.

glama
Updated
Apr 25, 2026

mullvad-mcp

An MCP (Model Context Protocol) server for controlling Mullvad VPN through any MCP-compatible client — Claude Desktop, Cursor, Windsurf, and more.

All VPN interaction goes through the mullvad CLI. No direct API calls, no config file parsing, no credentials needed.

Prerequisites

  • Mullvad VPN app installed with the CLI available in your PATH
  • Python 3.11+
  • uv package manager — install uv

Installation

git clone https://github.com/your-username/mullvad-mcp.git
cd mullvad-mcp
uv sync

Client Configuration

Claude Desktop

Add to ~/.config/claude-desktop/claude_desktop_config.json (Linux) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "mullvad": {
      "command": "uv",
      "args": ["--directory", "/path/to/mullvad-mcp", "run", "mullvad-mcp"]
    }
  }
}

Cursor

Add to .cursor/mcp.json in your project or ~/.cursor/mcp.json globally:

{
  "mcpServers": {
    "mullvad": {
      "command": "uv",
      "args": ["--directory", "/path/to/mullvad-mcp", "run", "mullvad-mcp"]
    }
  }
}

Generic MCP Client (stdio)

{
  "mcpServers": {
    "mullvad": {
      "command": "uv",
      "args": ["--directory", "/path/to/mullvad-mcp", "run", "mullvad-mcp"],
      "transport": "stdio"
    }
  }
}

Available Tools

Connection Control

ToolDescription
connectConnect to VPN, optionally specifying country/city/hostname
disconnectDisconnect from VPN
reconnectReconnect, optionally to a new location

Status & Diagnostics

ToolDescription
get_statusCurrent connection state, server, protocol, IPs
check_leakQuery am.i.mullvad.net to verify VPN protection

Server Selection

ToolDescription
list_countriesAll available countries with server counts
list_citiesCities for a given country
list_serversServers with filters (country, city, owned_only)
set_locationSet preferred location by country, city, or hostname

Account Management

ToolDescription
get_account_infoMasked account number, expiry date
get_device_infoDevices registered to the account

Settings

ToolDescription
get_settingsAll current settings as a structured object
set_killswitchEnable/disable lockdown mode
set_daitaEnable/disable DAITA (traffic analysis defence)
set_multihopEnable/disable multihop with optional entry location
set_dnsSet DNS: default (with blocking options) or custom IPs
set_protocolConfigure WireGuard options (quantum resistance, IPv6)
set_obfuscationSet anti-censorship mode (auto/off/udp2tcp/shadowsocks/etc)

Example Interactions

Connection

"Connect me to Sweden"

→ Calls connect(country="se") — sets relay to Sweden and connects.

Status Check

"Am I leaking?"

→ Calls check_leak() — queries am.i.mullvad.net and reports whether traffic exits through Mullvad.

Server Selection

"What cities are available in Germany?"

→ Calls list_cities(country="de") — returns Berlin, Frankfurt, etc. with server counts.

Settings

"Enable the kill switch and block ads"

→ Calls set_killswitch(enabled=True) then set_dns(block_ads=True).

Environment Variables

VariableDefaultDescription
MULLVAD_CLI_PATHAuto-detectedOverride path to the mullvad binary
MULLVAD_CLI_TIMEOUT10CLI command timeout in seconds

How It Works

All tools call the mullvad CLI via subprocess. The CLI handles authentication natively — no API keys or secrets are needed. Output is parsed into structured dicts so LLMs can reason about the results.

Resources

License

MIT

Reviews

No reviews yet

Sign in to write a review