easypanel-mcp-server
This server provides an MCP interface to fully control an Easypanel instance via AI tools like Claude Code, Cursor, and Claude Desktop, using 57 typed tools across 15 categories plus raw access to ~347 tRPC procedures.
Project Management: List, get, create, and delete projects.
Service Management: Inspect, create, rename, destroy, deploy, start, stop, and restart services; get errors, exposed ports, notes, and set resource limits (CPU/memory).
Deploy & GitHub Integration: Configure GitHub or Docker image sources, enable/disable auto-deploy, and list/inspect deploy actions.
Environment Variables: Read (with sensitive value masking), safely add/update, or delete individual env vars without wiping others.
Logs & Monitoring: Fetch runtime and build logs, get system/Docker/service stats, and capture live Docker events.
Container Operations: List running containers and execute arbitrary commands inside them.
Domain Management: List, add, remove domains, and set the primary domain (HTTPS via Let's Encrypt).
Database Management: Create, inspect, and destroy databases (Postgres, MySQL, MariaDB, MongoDB, Redis).
Volumes & Ports: List/create named volumes, bind mounts, and host port mappings (TCP/UDP).
Docker Compose: Create, inspect, and deploy Compose services.
Server Maintenance: Prune Docker system, clean unused images, restart the panel, or reboot the server.
Infrastructure & Users: List panel users, SSL certificates, and cluster nodes.
Raw tRPC Access: Call any of ~347 Easypanel tRPC procedures directly for advanced features (Traefik, Cloudflare Tunnel, backups, branding, etc.).
Safety Features: Confirmation guard for destructive actions, optional read-only mode, sensitive value masking, secret redaction from error messages, input validation, and option to disable raw access entirely.
Allows managing Docker-based deployments including setting Docker image sources and retrieving Docker stats for monitoring.
Allows managing GitHub source deployment for Easypanel services, including setting source to a GitHub repository, enabling/disabling automatic deployments, and tracking deployment actions.
Click on "Install 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., "@easypanel-mcp-serverlist all projects"
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.
easypanel-mcp-server
MCP Server for full Easypanel control via Claude Code, Cursor and Claude Desktop.
What is this
easypanel-mcp-server connects Claude Code, Cursor and Claude Desktop directly to your Easypanel instance β a modern Docker-based server control panel β through the Model Context Protocol.
Instead of switching between your editor and the Easypanel dashboard, you control everything from inside Claude: deploy from GitHub, update env vars, read live logs, exec into containers, manage domains, databases, volumes and ports, set resource limits, run Docker maintenance and monitor your server β all in natural language.
It maps the Easypanel tRPC API to 57 typed tools across 15 categories, plus a single trpc_raw escape hatch that reaches any of Easypanel's ~347 procedures (43 namespaces) for everything not covered by a dedicated tool. Every destructive action is gated behind an explicit confirmation, every response opens with a context banner so Claude always knows what it is touching, and an optional read-only mode lets you connect safely to a production panel.
π API reference: docs/easypanel-api.md β architecture, the 43 namespaces, confirmed procedures mapped tool-by-tool, and how to discover new ones.
Related MCP server: Claude MCP Server Ecosystem
Prerequisites
Easypanel instance running and accessible
API token β generate at Easypanel β Settings β API β Generate Token
Node.js β₯ 18 and Claude Code, Cursor or Claude Desktop
Quick start
Option A β npx (no install needed)
Add .mcp.json to your project root:
{
"mcpServers": {
"easypanel-mcp": {
"command": "npx",
"args": ["-y", "easypanel-mcp-server"],
"env": {
"EASYPANEL_URL": "https://your-panel.example.com",
"EASYPANEL_TOKEN": "your-api-token"
}
}
}
}Option B β local build
git clone https://github.com/helbertparanhos/easypanel-mcp-server
cd easypanel-mcp-server
npm install && npm run build{
"mcpServers": {
"easypanel-mcp": {
"command": "node",
"args": ["/ABSOLUTE/PATH/easypanel-mcp-server/dist/index.js"],
"env": {
"EASYPANEL_URL": "https://your-panel.example.com",
"EASYPANEL_TOKEN": "your-api-token"
}
}
}
}Cursor β reuse env vars across projects
In Cursor Settings β Tools & MCPs β Environment Variables, set:
EASYPANEL_URL=https://your-panel.example.comEASYPANEL_TOKEN=your-api-token
Then your .cursor/mcp.json uses references that apply automatically to every project:
{
"mcpServers": {
"easypanel-mcp": {
"command": "npx",
"args": ["-y", "easypanel-mcp-server"],
"env": {
"EASYPANEL_URL": "${EASYPANEL_URL}",
"EASYPANEL_TOKEN": "${EASYPANEL_TOKEN}"
}
}
}
}Environment variables
Variable | Required | Default | Description |
| β | β | Panel URL, no trailing slash (e.g. |
| β | β | API token (Easypanel β Settings β API β Generate Token) |
| β |
| Set to |
| β | (enabled) | Set to |
Adding context to a project
Place this in your project's CLAUDE.md so Claude knows which Easypanel project and service it should operate on by default:
## Easypanel
Project: `my-project` | Service: `my-api` | Branch: `main`
Repo: `owner/repo`No folder copying needed β one MCP install serves all your projects.
Use cases
"Deploy my app" β Claude lists projects, inspects the current service, triggers
deploy_service, then watcheslist_actionsuntil it completes.
"Why is my service down?" β Claude calls
get_service_error,get_service_logsandget_build_logs, and canexec_in_containerto inspect files/env live.
"Add DATABASE_URL to staging" β Claude reads current env vars with
get_env_vars, adds only the new key withset_env_var(never wipes others), and reminds you to redeploy.
"Give this service 512MB and half a core" β Claude calls
set_service_resources(reads current limits and merges your change) and reminds you to restart.
"Persist /app/data and expose port 5432" β Claude calls
create_mount(named volume) andcreate_port, both applied on the next deploy.
"My disk is full" β Claude runs
get_storage_stats, thencleanup_docker_imagesorprune_docker(with confirmation) to reclaim space.
"Show me the Traefik dashboard config" β for anything without a dedicated tool, Claude uses
trpc_rawto call the procedure directly.
Available tools (57)
Category | Tools |
Projects |
|
Services |
|
Deploy / GitHub |
|
Env Vars |
|
Logs |
|
Containers |
|
Domains |
|
Databases |
|
Volumes / Mounts |
|
Ports |
|
Compose |
|
Monitoring |
|
Maintenance |
|
Server / Infra |
|
Raw access |
|
β οΈ = requires confirm: "CONFIRMO". For exec_in_container, create_mount, create_port and trpc_raw the confirmation is conditional (only for destructive commands, sensitive host-path bind mounts, privileged ports < 1024, and write mutations respectively).
Full tool descriptions with parameters are in llms.txt. For the underlying tRPC API, see docs/easypanel-api.md.
trpc_raw β reach any of the ~347 procedures
Covering every Easypanel procedure with a typed tool isn't practical, so anything without a dedicated tool is reachable directly:
// read (default)
{ "procedure": "certificates.listCertificates" }
{ "procedure": "traefik.getDashboard" }
// write β requires isMutation:true AND confirm:"CONFIRMO"
{ "procedure": "branding.updateSettings", "input": { /* ... */ },
"isMutation": true, "confirm": "CONFIRMO" }Useful namespaces only reachable via trpc_raw: traefik.*, branding.*, cloudflareTunnel.*, box.*, middlewares.*, notifications.*, volumeBackups.*, databaseBackups.*, wordpress.*, git.*, update.*.
Safety features
Context banner
Every response that touches a specific project/service starts with:
[Contexto ativo: projeto="my-project" | serviΓ§o="my-api"]Claude always knows what it is modifying before taking any action.
Confirmation guard
Destructive or production-impacting actions return BLOQUEADO until they receive confirm: "CONFIRMO":
{
"status": "BLOQUEADO",
"acao": "stop_service",
"alvo": "serviΓ§o \"api\" (usuΓ‘rios perderΓ£o acesso)",
"instrucao": "Para confirmar, passe o parΓ’metro: confirm: \"CONFIRMO\"",
"aviso": "β οΈ Esta aΓ§Γ£o pode ser IRREVERSΓVEL. Confirme apenas se tiver certeza."
}This gates project/service deletion, stop/rename, env/domain removal, database destruction, the global server ops (prune_docker, restart_panel, reboot_server), and β conditionally β dangerous container commands, sensitive bind mounts, privileged ports and raw mutations.
Read-only mode
Set MCP_ACCESS_MODE=readonly to block every write at the source (client.mutate), covering both curated tools and trpc_raw. Reads remain available β perfect for a production panel you only want to inspect.
Raw escape-hatch controls
trpc_raw validates the procedure name (namespace.procedure, no path/query injection), requires the input to be an object (β€ 50KB), and demands CONFIRMO for any mutation. Set EASYPANEL_RAW_DISABLED=1 to turn it off entirely.
Secret redaction
list_users strips apiToken, twoFactorSecret and password fields before returning β only id, email, admin, twoFactorEnabled and createdAt reach the model.
Safe env vars (read-modify-write)
set_env_var and delete_env_var read the current state, apply only the requested change, and write back. The Easypanel API replaces the entire env string on every update β without this protection it is easy to accidentally wipe all variables at once.
Sensitive value masking
get_env_vars masks values whose key matches *SECRET*, *PASSWORD*, *TOKEN*, *KEY* by default. Pass include_values: true to reveal.
Token never leaks
HTTP errors and WebSocket failures are logged to stderr and surfaced to the model as a generic message β the bearer token (sent in the WebSocket query string, as Easypanel requires) never reaches the model context.
Input validation
projectName / serviceName are validated against ^[a-z0-9][a-z0-9_-]*$ before being used to build a Docker service name or WebSocket query (defense-in-depth against target confusion / parameter injection). Ports are validated as integers 1β65535; resource values must be positive numbers.
Companion skill /ep
Install the workflow skill for guided deploy operations in Claude Code:
mkdir -p ~/.claude/skills/ep
cp skill/SKILL.md ~/.claude/skills/ep/SKILL.mdThen use /ep for an interactive deploy workflow without needing to remember tool names.
How it works
The Easypanel panel talks to its backend over tRPC (/api/trpc/<router>.<procedure>), not a public REST API. This server uses the same endpoints:
Reads are tRPC queries; writes are tRPC mutations β see
docs/easypanel-api.md.Live logs, container exec and Docker events use the panel's WebSocket channels (
/ws/serviceLogs,/ws/containerShell,/ws/dockerEvents) β the same ones the UI uses β so they work without the licensed Advanced Logs (Loki).A few input schemas (mounts, ports, resources) were validated against a live Easypanel and are documented in the API reference.
Known limitations
WordPress / Box service types β not exposed as dedicated tools; reach them via
trpc_raw(e.g.wordpress.inspectService,box.createService).trpc_rawreads bypass read-only mode β read-only blocks writes only. A raw read can return sensitive data; useEASYPANEL_RAW_DISABLED=1in untrusted environments.Cluster tools β
list_nodesreturns the local node only on single-server setups (no Swarm cluster).Docker events are real-time only (no history) β an idle server may return an empty window.
Testing without Claude
npx @modelcontextprotocol/inspector dist/index.jsOpens a browser UI where you can call any tool manually and inspect the response.
Comparison with similar packages
Feature | easypanel-mcp-server | easypanel-mcp (sitp2k) |
Curated tools | 57 | ~15 |
Raw access to all ~347 procedures | β
( | β |
Auth method | Bearer token | Email + password |
Confirmation guard | β | β |
Read-only mode | β | β |
Container exec + live logs (WebSocket) | β | β |
Volumes / ports / compose / resources | β | β |
Server maintenance (prune / reboot) | β | β |
Safe env update (read-modify-write) | β | β |
Secret redaction & value masking | β | β |
Companion Claude skill | β | β |
Known limitations documented | β | β |
π€ Contributing
Contributions are welcome! See CONTRIBUTING.md for how to add tools, report bugs and open PRs.
π€ Author
Created by Helbert Paranhos from Strat Academy.
If this project was useful, consider giving it a β and following Strat Academy for more AI automation content.
π License
MIT Β© Helbert Paranhos / Strat Academy
See LICENSE for details.
Maintenance
Latest Blog Posts
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/helbertparanhos/easypanel-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server