MCP server for administering wg-easy (WireGuard Easy) instances
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add wg-easy-mcp -- npx -y wg-easy-mcp{
"mcpServers": {
"wg-easy-mcp": {
"command": "npx",
"args": ["-y", "wg-easy-mcp"],
"env": {
"WG_EASY_URL": "<wg_easy_url>",
"WG_EASY_USERNAME": "<wg_easy_username>",
"WG_EASY_PASSWORD": "<wg_easy_password>"
}
}
}
}WG_EASY_URLWG_EASY_USERNAMEWG_EASY_PASSWORDMCP Servers overview
# wg-easy-mcp
[](https://github.com/ni-c/wg-easy-mcp/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/wg-easy-mcp)
[](https://www.npmjs.com/package/wg-easy-mcp)
[](https://nodejs.org)
[](LICENSE)
[](https://github.com/ni-c/wg-easy-mcp/pkgs/container/wg-easy-mcp)
[](https://wg-easy-mcp.ni-c.de)
A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for administering [wg-easy](https://github.com/wg-easy/wg-easy) (WireGuard Easy) instances.
Lets MCP clients like Claude Code, Claude Desktop or Codex manage your WireGuard VPN: list, create, update, enable/disable and delete clients, fetch configuration files and QR codes, and inspect the server status — all through the wg-easy v15 REST API.
**📖 Full documentation: [wg-easy-mcp.ni-c.de](https://wg-easy-mcp.ni-c.de)**
<!-- <picture> is resolved against the colour scheme of the page showing it, so GitHub
picks the variant that matches its own theme toggle. npm strips <picture> and
<source> when it sanitises the README and keeps the <img>, which is why that
fallback brings its own dark card instead of relying on a media query. -->
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://wg-easy-mcp.ni-c.de/architecture-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://wg-easy-mcp.ni-c.de/architecture-light.svg">
<img src="https://wg-easy-mcp.ni-c.de/architecture.svg" alt="An MCP client speaks stdio to wg-easy-mcp, which calls the wg-easy v15 REST API over HTTPS with Basic Authentication" width="800">
</picture>
## Requirements
- Node.js ≥ 22
- A running **wg-easy v15+** instance
- **2FA (TOTP) must be disabled** for the account used by this server — the wg-easy API only supports Basic Authentication and does not work with 2FA enabled
> **Note:** The wg-easy REST API is [not yet declared stable](https://wg-easy.github.io/wg-easy/latest/advanced/api/) and may change between releases. This server targets wg-easy v15.
## Configuration
Configuration is provided via environment variables:
| Variable | Required | Description |
| ---------------------- | -------- | --------------------------------------------------------------------------------------- |
| `WG_EASY_URL` | yes | Base URL of the wg-easy web UI, e.g. `https://vpn.example.com:51821` |
| `WG_EASY_USERNAME` | yes | Username of a wg-easy admin account |
| `WG_EASY_PASSWORD` | yes | Password of that account |
| `WG_EASY_INSECURE_TLS` | no | Set to `true` to accept self-signed TLS certificates (scoped to the wg-easy connection) |
> **Use `https://`.** With a plain-`http` URL the Basic Auth credentials and all
> WireGuard private keys travel unencrypted; the server prints a warning unless
> the host is local. For self-signed certificates prefer a proper internal CA
> over `WG_EASY_INSECURE_TLS`.
Without credentials the server still starts and lists its tools (so registries
and inspectors can introspect it), but every tool call fails with setup
instructions instead of reaching the wg-easy API.
## Installation
### Claude Code
```bash
claude mcp add wg-easy -s user \
-e WG_EASY_URL=https://vpn.example.com:51821 \
-e WG_EASY_USERNAME=admin \
-e WG_EASY_PASSWORD=your-password \
-- npx -y wg-easy-mcp
```
### Claude Desktop
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"wg-easy": {
"command": "npx",
"args": ["-y", "wg-easy-mcp"],
"env": {
"WG_EASY_URL": "https://vpn.example.com:51821",
"WG_EASY_USERNAME": "admin",
"WG_EASY_PASSWORD": "your-password"
}
}
}
}
```
### Codex
Add to your `~/.codex/config.toml`:
```toml
[mcp_servers.wg-easy]
command = "npx"
args = ["-y", "wg-easy-mcp"]
env = { WG_EASY_URL = "https://vpn.example.com:51821", WG_EASY_USERNAME = "admin", WG_EASY_PASSWORD = "your-password" }
```
### From source
```bash
git clone https://github.com/ni-c/wg-easy-mcp.git
cd wg-easy-mcp
npm install
npm run build
# then use `node /path/to/wg-easy-mcp/dist/index.js` as the command
```
### Docker
A multi-arch image (`linux/amd64`, `linux/arm64`) with an SBOM and build provenance is published to GitHub Container Registry:
```bash
docker run -i --rm \
-e WG_EASY_URL=https://vpn.example.com:51821 \
-e WG_EASY_USERNAME=admin \
-e WG_EASY_PASSWORD=your-password \
ghcr.io/ni-c/wg-easy-mcp:latest
```
The image talks MCP over stdio, so clients need `docker run -i` (no port is
exposed):
```json
{
"mcpServers": {
"wg-easy": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"WG_EASY_URL",
"-e",
"WG_EASY_USERNAME",
"-e",
"WG_EASY_PASSWORD",
"ghcr.io/ni-c/wg-easy-mcp:latest"
],
"env": {
"WG_EASY_URL": "https://vpn.example.com:51821",
"WG_EASY_USERNAME": "admin",
"WG_EASY_PASSWORD": "your-password"
}
}
}
}
```
## Tools
| Tool | Description |
| ---------------------------------- | ------------------------------------------------------------------------------------------- |
| `list_clients` | List all WireGuard clients with status and traffic statistics |
| `get_client` | Get the full details of a single client |
| `create_client` | Create a new client (`name`, optional `expiresAt`) |
| `update_client` | Update a client; only the provided fields are changed |
| `enable_client` / `disable_client` | Enable or disable a client |
| `delete_client` | Permanently delete a client — two-step, guarded by a confirmation token |
| `get_client_config` | Get the client's WireGuard `.conf` file |
| `get_client_qrcode` | Get the client configuration as a QR code (SVG) |
| `generate_one_time_link` | Generate a one-time config download link (requires one-time links to be enabled in wg-easy) |
| `get_server_info` | Release/update status, general settings and interface configuration (secrets redacted) |
### Safety
- `delete_client` is a two-step operation: the first call returns a random confirmation token (valid for 5 minutes, bound to the client ID) and only a second call with that exact token deletes the client. Unlike a plain `confirm=true` parameter, the token cannot be guessed or pre-supplied by the model or by injected text.
- `get_server_info` redacts secret fields (`privateKey`, `preSharedKey`, `password`, session/TOTP secrets) from the admin API responses.
- Everything the wg-easy API returns carries an explicit **untrusted-data marker** and a 60 000-character budget. Client names, DNS entries and endpoints are free-form strings, so they are marked as data to report rather than instructions to follow, and a single oversized field cannot flood the model's context.
- A `WG_EASY_URL` containing embedded credentials (`user:password@host`) is rejected at startup — they would otherwise be echoed in the startup log and prefixed onto every request.
- Upstream error bodies are truncated and HTML error pages (reverse proxies) are dropped before being returned to the MCP client.
- `WG_EASY_INSECURE_TLS` only relaxes certificate validation for the wg-easy connection — it does not disable TLS verification process-wide.
- Tools carry MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`) so hosts can apply appropriate permission policies.
- Keep in mind that `get_client_config` and `get_client_qrcode` return the client's **private key**, and a `generate_one_time_link` URL allows an unauthenticated config download — treat tool output as sensitive.
The full trust model is in [SECURITY.md](SECURITY.md) and, in prose, at [wg-easy-mcp.ni-c.de/guide/security](https://wg-easy-mcp.ni-c.de/guide/security).
## Development
```bash
npm install
npm run build # compile TypeScript to dist/
npm test # run the vitest test suite
npm run lint # eslint + prettier check
npm run test:coverage
```
CI runs the suite on Node 22 and 24 and adds `npm audit`, CodeQL and a Trivy scan of the container image on both architectures. See [CONTRIBUTING.md](CONTRIBUTING.md).
The documentation site lives in `docs/` with its own manifest:
```bash
cd docs && npm install && npm run dev
```
### Releasing
1. Bump the version in `package.json` and add a `CHANGELOG.md` entry.
2. Commit, then tag and push: `git tag -a vX.Y.Z -m "vX.Y.Z" && git push origin main vX.Y.Z`
The release workflow runs the test suite, publishes to npm (via [trusted publishing](https://docs.npmjs.com/trusted-publishers), no token, with provenance), creates a GitHub release from the changelog entry and updates the entry in the official [MCP Registry](https://registry.modelcontextpWhat people ask about wg-easy-mcp
What is ni-c/wg-easy-mcp?
+
ni-c/wg-easy-mcp is mcp servers for the Claude AI ecosystem. MCP server for administering wg-easy (WireGuard Easy) instances It has 0 GitHub stars and its last recorded update is dated 2026-08-18.
How do I install wg-easy-mcp?
+
You can install wg-easy-mcp by cloning the repository (https://github.com/ni-c/wg-easy-mcp) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is ni-c/wg-easy-mcp safe to use?
+
Our security agent has analyzed ni-c/wg-easy-mcp and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains ni-c/wg-easy-mcp?
+
ni-c/wg-easy-mcp is maintained by ni-c. The last recorded GitHub activity is dated 2026-08-18, with 0 open issues.
Are there alternatives to wg-easy-mcp?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy wg-easy-mcp to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/ni-c-wg-easy-mcp)<a href="https://claudewave.com/repo/ni-c-wg-easy-mcp"><img src="https://claudewave.com/api/badge/ni-c-wg-easy-mcp" alt="Featured on ClaudeWave: ni-c/wg-easy-mcp" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!