mullvad-mcp
The mullvad-mcp server provides full control over Mullvad VPN through any MCP-compatible AI client (e.g. Claude Desktop, Cursor) by wrapping the Mullvad CLI into structured tools.
Connection Control
connect— Connect to the VPN, optionally specifying a country, city, or hostnamedisconnect— Disconnect from the VPNreconnect— Disconnect and reconnect, optionally to a new location
Status & Diagnostics
get_status— Retrieve current connection state, relay details, protocol, and IP addressescheck_leak— Queryam.i.mullvad.netto verify traffic is correctly exiting through Mullvad
Server Selection
list_countries— List all available countries with city and server countslist_cities— List available cities within a given countrylist_servers— List servers with optional filters by country, city, or Mullvad-owned onlyset_location— Set your preferred relay location by country, city, or hostname
Account & Device Management
get_account_info— View masked account number and subscription expiry dateget_device_info— List all devices registered to your Mullvad account
Settings & Configuration
get_settings— Retrieve all current settings (kill switch, DNS, tunnel, relay, obfuscation)set_killswitch— Enable or disable lockdown mode (blocks all traffic when VPN is disconnected)set_daita— Enable or disable DAITA (Defence Against AI-guided Traffic Analysis)set_multihop— Enable or disable multihop with optional entry country/cityset_dns— Use Mullvad default DNS (with optional blocking of ads, trackers, malware, adult content, gambling, social media) or set custom DNS serversset_protocol— Configure WireGuard options such as quantum-resistant key exchange and IPv6set_obfuscation— Set obfuscation/anti-censorship mode (auto, off, udp2tcp, shadowsocks, quic, etc.)
Provides tools for controlling Mullvad VPN, including connection management, server selection, account info, and settings like kill switch, DAITA, multihop, DNS, protocol, and obfuscation, as well as leak checking.
Allows configuration of WireGuard protocol options such as quantum resistance and IPv6 within the VPN settings.
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
Verify:
mullvad --version
Python 3.11+
uv package manager — install uv
Related MCP server: Proton-MCP
Installation
git clone https://github.com/your-username/mullvad-mcp.git
cd mullvad-mcp
uv syncClient 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
Tool | Description |
| Connect to VPN, optionally specifying country/city/hostname |
| Disconnect from VPN |
| Reconnect, optionally to a new location |
Status & Diagnostics
Tool | Description |
| Current connection state, server, protocol, IPs |
| Query am.i.mullvad.net to verify VPN protection |
Server Selection
Tool | Description |
| All available countries with server counts |
| Cities for a given country |
| Servers with filters (country, city, owned_only) |
| Set preferred location by country, city, or hostname |
Account Management
Tool | Description |
| Masked account number, expiry date |
| Devices registered to the account |
Settings
Tool | Description |
| All current settings as a structured object |
| Enable/disable lockdown mode |
| Enable/disable DAITA (traffic analysis defence) |
| Enable/disable multihop with optional entry location |
| Set DNS: default (with blocking options) or custom IPs |
| Configure WireGuard options (quantum resistance, IPv6) |
| Set 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)thenset_dns(block_ads=True).
Environment Variables
Variable | Default | Description |
| Auto-detected | Override path to the |
|
| CLI 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
Available Tools
18 toolscheck_leakA
Check if your connection is protected by Mullvad VPN.
Queries am.i.mullvad.net to verify whether traffic exits through a Mullvad server. Use this to confirm the VPN is working correctly.
Returns: Dict with your visible IP, country, city, whether traffic exits through a Mullvad server, the exit hostname, and a leak_detected boolean (True means traffic is NOT going through Mullvad).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully carries the burden. It explains the query to am.i.mullvad.net, describes the return dict including the leak_detected boolean, and implies a network request.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact paragraphs with clear structure: first sentence defines purpose, then explains query, then lists return fields. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema, the description fully covers the tool's behavior and output. No additional information needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so baseline is 4. The description adds meaning beyond the schema by explaining the tool's function and return values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks if the connection is protected by Mullvad VPN by querying am.i.mullvad.net. It is distinct from sibling tools like get_status or connect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to confirm the VPN is working correctly,' providing a clear context. No exclusion or alternative guidance, but the purpose is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connectA
Connect to Mullvad VPN.
Optionally set the relay location before connecting. If no location parameters are provided, connects using the currently configured relay.
Args: country: Two-letter country code (e.g. "se", "us"). city: Three-letter city code (e.g. "got", "nyc"). hostname: Specific server hostname (e.g. "se-got-wg-004").
Returns: Current VPN status after the connect attempt, including connection state, relay hostname, country, city, and IP addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ||
| city | No | ||
| hostname | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It states it connects and returns status, but does not mention side effects like interrupting an existing connection, required permissions, or rate limits. This is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient: a one-sentence purpose followed by clear Args and Returns sections. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, parameters, and return value (aided by output schema). However, it lacks behavioral context such as what happens if already connected or whether connection is persistent. Sibling tools like set_location suggest a need for clearer differentiation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema coverage, the description adds meaning by listing three parameters in Args with format examples (e.g., 'se' for country), and explains that default behavior uses currently configured relay if no location params are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Connect to Mullvad VPN' as the primary action, with optional location setting. It is a specific verb-resource pair that distinguishes itself from sibling tools like disconnect, get_status, and set_location.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when connecting to VPN, but does not explicitly state when to use this tool versus alternatives like set_location (which sets location without connecting) or reconnect. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnectA
Disconnect from Mullvad VPN.
Idempotent — returns current status even if already disconnected.
Returns: Current VPN status after the disconnect attempt.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses idempotency and the return value (current status after disconnect attempt). It is transparent about the core behavior, though could mention error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with two short sentences and a return line. Every sentence provides essential information, and the action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, output schema exists), the description covers purpose, behavior (idempotent), and return value. It is complete for practical use, though it omits potential error states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, and schema coverage is 100%. Baseline is 3, and the description adds no parameter information because none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Disconnect from Mullvad VPN', using a specific verb and resource. It distinguishes itself from siblings like connect and get_status by the action of disconnecting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes that the tool is idempotent, implying it can be safely called even when already disconnected. However, it does not explicitly contrast with alternatives like reconnect or get_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_infoA
Get Mullvad account information.
Returns: Dict with masked account number (last 4 digits visible), expiry date, and device name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the return value format (dict with masked account number, expiry, device name), which is helpful. However, it does not mention any preconditions (e.g., being logged in) or side effects, leaving some behavioral gaps. With no annotations, more detail would be better.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that state the purpose and return value. No wasted words, front-loaded with the verb 'Get'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema in structured form), the description covers the essential: what it returns. It could mention whether it requires an active session, but overall it's adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so schema coverage is 100%. The description does not need to add parameter info. Baseline for 0 parameters is 4, and the description adds no redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get Mullvad account information', which is a specific verb and resource. It naturally distinguishes from sibling tools like get_device_info and get_status, which cover different data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit when-to-use or when-not is given, the simplicity of the tool (no parameters, straightforward read operation) makes its usage obvious. No sibling tool overlaps in purpose, so guidance is not critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_infoA
Get information about devices registered to the Mullvad account.
Returns:
Dict with a devices list of device names registered
on the account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the return format (dict with devices list of device names), which is the key behavioral output. Without annotations, the description sufficiently covers the read-only nature and expected result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences: the first states the purpose, the second the return format. No unnecessary words, highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no parameters and a clear output schema described, the description is complete. It lacks any mention of authentication or error handling, but these are not critical for such a basic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100%. The description does not need to add parameter details, and the baseline score of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves information about devices registered to a Mullvad account, specifying the resource and action. It distinguishes from siblings like get_account_info by focusing on devices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives; usage is implied by the name and description. There are no exclusions or recommended contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settingsA
Get all current Mullvad VPN settings as a structured object.
Returns:
Dict with keys: killswitch, dns, tunnel, relay,
and anti_censorship, each containing the relevant settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the return structure but does not mention that the tool is read-only, has no side effects, or any behavioral traits beyond the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: one sentence stating the purpose followed by a list of return keys. No unnecessary words, and front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, an output schema, and no annotations, the description is mostly complete. It lists the return keys, though it could explicitly mention that the tool has no side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (0 params), so baseline is 4. The description does not need to add parameter semantics, and it does not contradict anything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves all current Mullvad VPN settings as a structured object, listing the specific keys (killswitch, dns, etc.), which distinguishes it from sibling tools like get_account_info or get_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives. It implies it is for reading all settings, but lacks guidance on when not to use it or comparison with set_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
Get current Mullvad VPN connection status.
Returns: Dict with connection state, relay details, protocol, IP addresses, country, city, and whether traffic is locked down.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses that the tool returns a dict with specific fields (connection state, relay details, etc.), implying a read-only operation without side effects. This provides good transparency for a simple getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The purpose is front-loaded, and the return details are listed clearly. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 0-parameter getter, the description completely explains the tool's purpose and output. There is no output schema provided, but the description lists the return fields, making it self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the description needs no parameter details. The schema coverage is 100% (empty schema), and the description does not repeat any param info. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets the current Mullvad VPN connection status. It uses a specific verb ('Get') and resource ('connection status'), and distinguishes itself from sibling tools like 'get_settings' or 'get_account_info'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description implies it's for checking current connection status, but does not mention when not to use it or suggest alternative tools for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_citiesA
List available cities for a given country.
Args: country: Two-letter country code (e.g. "se", "us", "de").
Returns:
Dict with a cities key containing a list of dicts,
each with name, code, coordinates, and server_count.
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return format in detail (Dict with cities, each with name, code, coordinates, server_count). No annotations, but description covers behavior adequately for a read-only list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: one sentence plus structured Args/Returns. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully complete for a simple list tool: input parameter fully explained, output format described, and sibling context clarifies scope. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but description adds meaning by specifying 'Two-letter country code' with examples (e.g., 'se', 'us', 'de'), adding significant value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'List available cities for a given country', which clearly defines the verb and resource. It distinguishes from siblings like list_countries and list_servers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies input as two-letter country code, but does not provide explicit 'when to use vs alternatives' guidance. Context from sibling tools makes it clear, but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_countriesA
List all available Mullvad VPN countries with server counts.
Returns:
Dict with a countries key containing a list of dicts,
each with name, code, city_count, and server_count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description carries full burden. It discloses return structure but not authentication requirements, side effects, or rate limits, leaving gaps for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded purpose, no wasted words. Return format clearly specified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple list tool with no parameters and output schema implied. Could be improved by mentioning related tools (list_cities, list_servers) for context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100%. Baseline of 4 for zero-parameter tools applies, and description adds no param info (unnecessary).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all available Mullvad VPN countries with server counts' with specific verb and resource. Distinguishes from siblings like list_cities and list_servers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like list_cities or list_servers. The simple nature implies lightweight listing, but lacks context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_serversA
List available Mullvad VPN servers with optional filters.
Args:
country: Filter by two-letter country code (e.g. "se").
city: Filter by three-letter city code (e.g. "got").
Requires country to also be set.
owned_only: If True, only show Mullvad-owned servers.
Returns:
Dict with a servers key containing a list of server dicts,
each with hostname, country, city, ips,
provider, ownership, and protocol.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ||
| city | No | ||
| owned_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses the return format (dict with 'servers' key, each server dictionary structure) and implies a read-only operation. It does not mention side effects, authentication, or rate limits, but for a list operation, this is largely sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description uses a clear docstring style with Args and Returns sections, is concise (no redundant information), and every sentence adds value. It is front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with 3 parameters, an output schema exists, and the description includes return format. It covers filters, constraints, and output structure without missing essential details like pagination or rate limits (which are likely not needed for this simple list).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains all three parameters (country, city, owned_only) with examples and adds a critical constraint (city requires country), providing semantics the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'List available Mullvad VPN servers with optional filters,' clearly identifying the verb (list), resource (servers), and context (Mullvad VPN). It distinguishes from siblings like list_cities and list_countries by focusing on servers with detailed fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides parameter constraints (city requires country) but lacks explicit guidance on when to use this tool vs. alternatives such as connect, get_status, or list_cities. No when-not-to-use or comparative advice is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconnectA
Reconnect to Mullvad VPN.
Disconnects and reconnects, optionally to a new relay location.
Args: country: Two-letter country code (e.g. "se", "us"). city: Three-letter city code (e.g. "got", "nyc"). hostname: Specific server hostname (e.g. "se-got-wg-004").
Returns: Current VPN status after the reconnect attempt.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ||
| city | No | ||
| hostname | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states the tool 'Disconnects and reconnects' and returns the current VPN status. With no annotations, this effectively communicates the mutation and outcome, though it lacks details on failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a clear structure: brief intro, Args list with examples, and Returns. It is well-organized and front-loaded, though the Args section could be more succinct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description properly notes the return value. It covers the core behavior and parameters, but lacks details on error handling or constraints, which are not critical for a simple reconnect action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides concrete examples for each parameter (e.g., 'se', 'got', 'se-got-wg-004'), adding critical format context beyond the input schema's type-only definitions. This helps an agent use the parameters correctly despite 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Reconnect to Mullvad VPN' and explains that it disconnects and reconnects optionally to a new relay location. This directly distinguishes it from sibling tools like 'connect' and 'disconnect' which handle individual actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (to reconnect with optional location change) but does not explicitly contrast with alternatives like 'connect' or 'disconnect'. No guidance on when not to use it is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_daitaA
Enable or disable DAITA (Defence Against AI-guided Traffic Analysis).
DAITA adds padding to WireGuard traffic to defeat traffic analysis.
Args: enabled: True to enable, False to disable.
Returns: Current tunnel settings after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains that DAITA adds padding to WireGuard traffic to defeat traffic analysis, which gives some behavioral context. It also states the return value. However, with no annotations provided, the description carries the full burden of disclosing side effects, permissions, or rate limits, which are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with three short paragraphs. The first sentence states the purpose, followed by a brief explanation of DAITA, then parameter and return descriptions. Every sentence adds value with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle tool with one parameter and an output schema, the description is nearly complete. It explains the feature, parameter, and return value. However, it lacks usage guidelines or notes on when to use this tool, which would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema defines 'enabled' as a boolean with no description. The tool's description adds semantic meaning: 'True to enable, False to disable.' This compensates for the 0% schema description coverage and clarifies the parameter's effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: enabling or disabling DAITA. The verb 'set' is implied by the name, and the description specifies the action. It distinguishes from sibling tools like set_dns or set_killswitch by focusing on the DAITA feature, but it does not explicitly contrast with other settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to enable or disable DAITA versus using other tools or under what circumstances the feature should be toggled. There is no mention of prerequisites, context, or alternatives, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_dnsA
Configure DNS settings.
Args: mode: "default" for Mullvad DNS (with optional blocking), or "custom" to use your own DNS servers. servers: List of DNS server IPs when mode is "custom". block_ads: Block ad domains (default DNS mode only). block_trackers: Block tracker domains (default DNS mode only). block_malware: Block malware domains (default DNS mode only). block_adult_content: Block adult content domains (default DNS mode only). block_gambling: Block gambling domains (default DNS mode only). block_social_media: Block social media domains (default DNS mode only).
Returns: Current DNS settings after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | default | |
| servers | No | ||
| block_ads | No | ||
| block_trackers | No | ||
| block_malware | No | ||
| block_adult_content | No | ||
| block_gambling | No | ||
| block_social_media | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states that the tool returns 'Current DNS settings after the change', indicating a mutation with a response. It does not disclose side effects, required permissions, or whether changes are reversible, but it does clarify the behavior of each parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args and Returns sections, using clear bullet-style text. It is fairly concise given the number of parameters, though some redundancy exists (e.g., repeating 'block' in each parameter name in the description).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters and no annotations, the description covers all parameters, their conditions, and the return value. The output schema is present, but the description still clarifies the return behavior. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description's Args section explains each parameter's purpose and conditions (e.g., 'servers' only when mode is custom, blocking options only in default mode). This adds critical meaning beyond the schema's type and default values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Configure DNS settings' and distinguishes between 'default' and 'custom' modes, listing specific blocking options. This verb+resource pair is distinct from sibling tools like set_daita or set_killswitch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two modes (default vs custom) and their associated parameters, implying usage contexts. However, it does not explicitly state when to use this tool over alternatives, nor does it provide prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_killswitchA
Enable or disable the kill switch (lockdown mode).
When enabled, all network traffic is blocked unless the VPN is connected.
Args: enabled: True to enable, False to disable.
Returns:
Dict with enabled boolean confirming the new state.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains the core effect (blocks traffic) and the return value. Does not cover potential side effects like persistence or permissions, but the key behavioral trait is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences plus structured Args/Returns. Front-loaded with purpose, then logical explanation, and specific parameter info. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle tool, the description covers the effect, parameter, and return. Could mention prerequisites (e.g., VPN connection state) or idempotency, but the presence of an output schema reduces the need for full return specification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explicitly explains the single parameter 'enabled' with True/False mapping, compensating for the schema's 0% coverage. Adds meaning beyond the schema's type-only specification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Enable or disable' and the specific resource 'kill switch (lockdown mode)'. Unique among siblings, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context by explaining the effect of enabling (blocks all traffic unless VPN connected) but lacks explicit guidance on when to use versus alternatives like connect/disconnect or set_daita. No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_locationA
Set preferred VPN connection location.
Args: country: Two-letter country code (e.g. "se") or "any" for automatic. city: Three-letter city code (e.g. "got"). hostname: Specific server hostname (e.g. "se-got-wg-004").
Returns: Current relay constraints after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes | ||
| city | No | ||
| hostname | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It states that the tool sets location and returns current relay constraints, but it does not mention side effects, permission requirements, or rate limits. The behavior is adequately described for a simple setter, but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line summary followed by parameter explanations and a return note. Every sentence adds value with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters and no annotations, the description covers the purpose, parameter details, and return value. It could potentially mention that setting location affects the VPN connection state, but it is sufficiently complete for a straightforward configuration tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description compensates fully by explaining each parameter with examples and format hints (e.g., 'Two-letter country code (e.g. "se") or "any" for automatic.'). This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Set preferred VPN connection location.' It uses a specific verb+resource combination and distinguishes it from sibling tools like set_dns or set_killswitch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not provide guidance on when to use it versus alternatives or when not to use it. The context of setting a VPN location is implied, but no explicit usage context or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_multihopB
Enable or disable multihop (chained VPN connections).
When enabled, traffic is routed through an entry server before reaching the exit server, adding an extra layer of privacy.
Args: enabled: True to enable, False to disable. entry_country: Two-letter country code for the entry server. entry_city: Three-letter city code for the entry server.
Returns: Current relay constraints after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | ||
| entry_country | No | ||
| entry_city | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the behavioral change (adding an extra privacy layer) and states the return value, but omits details like immediate effect, impact on existing connections, or authorization needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two paragraphs and an Args/Returns section. No redundant information, though the Args section partially duplicates schema structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Missing pointers to sibling tools that list valid country/city codes. Also fails to clarify that entry_country and entry_city are only relevant when enabled is true. The return value description is somewhat vague ('current relay constraints').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It lists parameter purposes (enabled, entry_country, entry_city) but lacks validation hints or references to sibling tools (list_cities, list_countries) that provide valid values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Enable or disable multihop (chained VPN connections)' and explains what multihop does, distinguishing it from sibling tools like set_location or set_protocol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lacks guidance on when to use this tool over alternatives. No explicit conditions, prerequisites, or context for choosing multihop among many similar settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_obfuscationA
Set anti-censorship / obfuscation mode.
Controls how Mullvad disguises VPN traffic to bypass censorship.
Args: mode: One of "auto", "off", "wireguard-port", "udp2tcp", "shadowsocks", "quic", or "lwo".
Returns: Current anti-censorship settings after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states that the tool sets the mode and returns settings, without mentioning side effects (e.g., connection disruption), prerequisites (e.g., being connected), or error handling. For a mutation tool, this is insufficient transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with a clear structure: a title line, a one-sentence explanation, and formatted Args/Returns sections. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic function, parameter, and return value, which is adequate for a simple tool. However, it lacks usage context, such as when to apply (e.g., while connected) or potential side effects. Given the output schema exists, the return is documented externally, but behavioral completeness is still missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% coverage for parameter descriptions, but the description lists the allowed values for the 'mode' parameter (auto, off, wireguard-port, etc.), adding valuable information beyond the schema. However, it does not explain what each mode does, which would further enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: setting anti-censorship/obfuscation mode for disguising VPN traffic. It mentions the specific resource ('anti-censorship / obfuscation mode') and verb ('Set'), distinguishing it from sibling tools like set_daita or set_protocol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lacks explicit guidance on when to use this tool versus alternatives. While the purpose is clear, it does not provide conditions (e.g., only when connected) or mention when not to use it. Siblings like set_dns or set_location are different, but no comparative guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_protocolA
Configure WireGuard tunnel protocol options.
Note: Mullvad CLI 2026.1 is WireGuard-only. This tool configures WireGuard-specific options like quantum resistance and IPv6.
Args: quantum_resistant: Enable quantum-resistant key exchange ("on" or "off"). ipv6: Enable IPv6 in the tunnel ("on" or "off").
Returns: Current tunnel settings after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| quantum_resistant | No | ||
| ipv6 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the action ('Configure') and the return value, but does not disclose any side effects, prerequisites (e.g., must be connected), error behavior, or whether changes are reversible. This is a significant gap for a configuration tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a note, args list, and returns section. It is concise but could be slightly tighter (e.g., avoiding repetition of 'on' or 'off' in each arg). Overall, it is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional parameters) and no annotations, the description covers the purpose and parameters adequately. However, it lacks details about validation, default behavior, and post-change effects, which are important for an agent to use the tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining each parameter's purpose and expected values ('on' or 'off'). This adds meaning beyond the bare schema, making it clear what each parameter does and what values to use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Configure[s] WireGuard tunnel protocol options' and specifies the two parameters, quantum resistance and IPv6. It distinguishes from sibling tools by noting that Mullvad CLI 2026.1 is WireGuard-only, so this tool is specifically for WireGuard protocol settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context that the tool is for WireGuard-specific options and mentions the CLI version as WireGuard-only. It does not explicitly exclude alternative tools or provide when-not-to-use guidance, but the purpose is clear enough for an agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct aspect of VPN management: connection, settings, status, info, and listings. There is no overlap in functionality.
All tool names follow a consistent verb_noun pattern with underscores, making them predictable and easy to understand. Examples include check_leak, get_status, set_dns, list_countries.
18 tools is slightly above the ideal range of 3-15, but each tool covers a necessary function for a comprehensive VPN configuration surface, so the count is still reasonable.
The set covers core VPN operations (connect, disconnect, status, settings) and advanced features (DAITA, multihop, obfuscation). Minor gaps like account login/logout or device management are not critical for the primary use case.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
The OpenRouter MCP server plugs OpenRouter into the AI tools you already use. Once connected, your assistant can pull live OpenRouter data (models, prices, your credits, rankings, and docs) and send quick test messages, all without leaving your editor.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP of MCPs. Automatic discovery and configure MCP servers on your local machine. Integration with Claude and Cursor.53Apache 2.0
- AlicenseNot gradedqualityDmaintenanceMCP server for the Proton privacy suite — Mail, Pass, Drive, Calendar, and VPN. 36 tools for Claude and other MCP-compatible AI agents.18MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets Claude Desktop and Claude Code control your PC — take screenshots, click, type, manage windows, and more.MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that enables Claude to control your computer, similar to Anthropic's computer use but easy to set up locally.327356MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/oresam-xyz/mullvad-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server