DirectAdmin MCP Server
Provides tools for reissuing Let's Encrypt SSL certificates for domains and the server hostname, configuring ACME, and managing certificate-related operations.
Provides tools for interacting with Redis, likely for security or data-related management in the panel context.
Enables interaction with the DirectAdmin New JSON API defined by the bundled Swagger spec, allowing discovery of endpoints and execution of API operations.
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., "@DirectAdmin MCP ServerReissue the Let's Encrypt cert for shop.example.com"
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.
DirectAdmin MCP Server
A production Model Context Protocol control plane for DirectAdmin. An AI agent (helpdesk, owner, or emergency sysadmin) talks to this process; the process talks to the panel. Every call is authenticated as a named hashed token, authorised by a profile (readonly / helpdesk / operator / break-glass), optionally confirmed, logged as structured JSON, rate-limited, and refused outside a maintenance window. SSL reissue and CSF/BFM unlock are first-class helpdesk actions — they are not the whole product.
The intended layout is an ops host, not an install on every DirectAdmin
server. Bind a read-only listener for inspection and a separate write
listener for approved changes (SSL reissue, CSF/BFM unlock). Per-server
facts such as CloudLinux and the policy profile live in inventory.json
on that host.
It covers the DirectAdmin New JSON API
(320 operations from the official swagger) and the legacy CMD_API_*
admin calls the New API still does not replace (create user, DNS, backups, BFM).
Read docs/agent.md and docs/tokens.md before pointing a model at production.
┌────────────┐ stdio / SSE ┌─────────────────────────┐ HTTPS ┌──────────────┐
│ Claude / │ ────────────► │ directadmin-mcp-server │ ──────► │ DirectAdmin │
│ Cursor / │ │ confirm · audit.jsonl │ key │ :2222 + CSF │
│ any MCP │ ◄──────────── │ │ │ │
└────────────┘ └─────────────────────────┘ └──────────────┘What you can ask
You say | Tool |
“Reissue the Let's Encrypt cert for shop.example.com” |
|
“The hostname cert expired, renew it” |
|
“Customer 203.0.113.44 is locked out of CSF” |
|
“Is that IP blocked? Why? Tell the customer.” |
|
“List users over quota” |
|
“Restart php-fpm74” |
|
Anything else in |
|
Destructive calls (delete, deny, restart, reissue, unblock, …)
require confirm=true. The model must get an explicit go-ahead.
Related MCP server: cPanel MCP Server
Requirements
Python 3.10+ (3.12 recommended) or Docker
DirectAdmin with API access and a login key (not the main password)
For CSF tools: the ConfigServer Security & Firewall DirectAdmin plugin
Network path from the MCP host to
https://your-panel:2222
Quick start (stdio — Claude Desktop / Cursor)
git clone https://github.com/OpenIaaS/directadmin-mcp-server.git
cd directadmin-mcp-server
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.sample .env
# edit .env — DA_URL, DA_USERNAME, DA_LOGIN_KEYGenerate a login key in Admin Level → Account Manager → Login Keys. Restrict
it to this machine's IP. Put the key in .env:
DA_URL=https://panel.example.com:2222
DA_USERNAME=admin
DA_LOGIN_KEY=...
DA_SSL_VERIFY=trueClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"directadmin": {
"command": "/absolute/path/to/directadmin-mcp/.venv/bin/python",
"args": ["/absolute/path/to/directadmin-mcp/server.py"],
"env": {
"DA_URL": "https://panel.example.com:2222",
"DA_USERNAME": "admin",
"DA_LOGIN_KEY": "your-login-key"
}
}
}
}Cursor / other MCP clients use the same command + args + env shape.
HTTP / SSE mode (remote assistant)
python -c "import secrets; print(secrets.token_urlsafe(48))" # MCP_AUTH_TOKEN
# put the token in .env, keep MCP_HOST=127.0.0.1
python main.pyPut Caddy or nginx in front with TLS. Clients send
Authorization: Bearer <MCP_AUTH_TOKEN> to /sse.
Do not put the token in the query string.
Docker (loopback only):
cp .env.sample .env # fill DA_* and MCP_AUTH_TOKEN
docker compose up -d --build
curl -sS http://127.0.0.1:8888/healthThe image runs as UID 10001, drops all capabilities, and uses a read-only root filesystem. See SECURITY.md.
SSL reissue
Admin SSL icon (all customer domains, Pro Pack, not in the New API):
ssl_admin_list
ssl_admin_reissue domains=["shop.example.com","blog.example.com"] confirm=trueThis is CMD_ADMIN_SSL action=multiple — the same action as Admin Level →
Admin SSL. The login key must be allowed to run that command.
One domain (New API, DirectAdmin 1.660+ / current Evolution):
ssl_get_domain_acme_config domain=shop.example.com impersonate=alice
ssl_reissue_domain domain=shop.example.com impersonate=alice confirm=true
ssl_reissue_domain domain=shop.example.com dry_run=true
ssl_reissue_server confirm=truessl_reissue_domain is POST /api/domain-tls/{domain}/provision-certs.
ssl_reissue_server is POST /api/server-tls/obtain.
On older panels the same intent is ssl_reissue_domain_legacy (CMD_API_SSL
Let's Encrypt request). Always impersonate the owning user when you are
logged in as admin — domain TLS is a user-level resource.
Related: ssl_list_domain_certs, ssl_set_domain_acme_config,
ssl_upload_cert_files, ssl_create_csr, ssl_install_self_signed,
ssl_acme_dns_providers.
CSF / firewall unblock
CSF is not in the New JSON API. These tools POST to the official plugin
/CMD_PLUGINS_ADMIN/csf/. The plugin must be installed.
An IP is often blocked in two places (LFD and DirectAdmin BFM). Use the combined tool when a customer is locked out:
csf_search_ip ip=203.0.113.44
bfm_ip_reason ip=203.0.113.44
ip_block_reason ip=203.0.113.44
firewall_unblock_everywhere ip=203.0.113.44 confirm=true
csf_unblock_ip ip=203.0.113.44 also_allow=true confirm=true
bfm_unblock_ip ip=203.0.113.44 confirm=truecsf_unblock_ip runs the plugin Quick Unblock (action=kill → csf -dr +
csf -tr + drop states). also_allow=true adds a 1-hour temporary allow so
the next handshake is not immediately re-banned.
Other CSF tools: csf_allow_ip, csf_deny_ip, csf_ignore_ip,
csf_flush_temp, csf_restart, csf_enable, csf_disable, csf_status.
csf_disable is denied by default (TOOL_DENYLIST + ENABLE_CSF_DISABLE=false). Unlock customers with firewall_unblock_everywhere instead.
Tool map
Curated tools are grouped by module. Everything else is reachable with
da_api / da_legacy. Playbooks: docs/agent.md,
docs/operations.md, docs/ssl.md,
docs/csf.md, docs/propack.md,
docs/cloudlinux.md, docs/hardening.md,
docs/audit.md, docs/tokens.md.
Inventory: docs/tools.json (273 curated tools + 320 swagger ops).
Module | Tools (prefix) | Notes |
SSL |
| Domain + hostname ACME, reissue, upload |
CSF |
| Plugin; needs ENABLE_CSF=true |
BFM |
| Native panel blocks |
Accounts |
| New API + CMD_API_ACCOUNT_* |
Packages |
| User / reseller packages |
System |
| Version, OS updates, usage |
Services |
| start/stop/restart/reload/logs |
Settings |
| directadmin.conf |
Auth |
| Prefer scoped keys |
Security |
| WAF / AV |
Data |
| Admin day-2 |
Build |
| CustomBuild / apps |
Pro Pack |
| Unit + templates; no web terminal |
CloudLinux |
| Opt-in ( |
Policy |
| Live |
Audit |
| Who did what, when, in-window? |
Escape hatches |
| Full swagger |
da_api only accepts paths that exist in the bundled
tools/api_spec.json (exported from
https://demo.directadmin.com:2222/static/swagger.json). /api/execute is
blocked unless ENABLE_EXECUTE=true.
Configuration
See .env.sample. Important knobs:
Variable | Default | Purpose |
| required |
|
| required | Login key, not the password |
| empty | Default login-as; prefer per-tool |
|
| Verify the panel certificate |
|
| HTTP bind |
| empty | Required for HTTP in production |
| empty | Optional client allow-list |
| empty / | Reduce blast radius |
|
| Destructive tools need |
|
| CSF plugin calls |
|
|
|
|
| Per client identity |
|
| Redacted JSON lines |
Security
Read SECURITY.md. Short version:
Login key + IP restriction on the DirectAdmin side
Bearer token + loopback bind + TLS proxy on the MCP side
Confirm gate, allow/deny tool lists, no wildcard CORS
Secrets never written to logs
Docker: non-root,
cap_drop: ALL, read-only root
If a token or key leaks, rotate both immediately. A login key that was pasted into a chat is burned.
Development
pip install -r requirements-dev.txt
pytest -q
ruff check .Adding a curated tool: create a function in tools/, decorate with
@mcp.tool() + @log_tool_call, validate inputs (validate_ip,
validate_domain, validate_username), and call guard_confirm if the
call mutates state.
The generic catalog picks up new swagger paths when you replace
tools/api_spec.json with a fresh export from your own panel
(/static/swagger.json).
Compatibility
Transport | File | When |
stdio |
| Claude Desktop, Cursor, local agents |
SSE |
| Older remote MCP clients |
HTTP health / tool list |
|
|
Tested against the official New API swagger (info.version = 1.0, 269 paths /
320 operations). Legacy calls follow
docs.directadmin.com/developer/api/legacy-api.html.
License
MIT. Use it, modify it, and ship it with your panel tooling.
This repository is an independent implementation, first published by OpenIaaS in August 2026. A 2025 MIT release (omryatia/directadmin-mcp) supplied the original layout — entrypoints and module names. That starting point is preserved as a derivative-work notice in LICENSE. As of 20 August 2026 it is a small fraction of the tree: about one in twenty of the original unique code lines still appear verbatim; the Python sources are roughly three and a half times larger, and the domain tools (SSL, CSF, policy, audit) are new.
With thanks to the DirectAdmin community — the documentation, the forum, and the operators who have been running these boxes for 23+ years.
This server cannot be installed
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 Servers
- AlicenseBqualityDmaintenanceA local MCP server for managing WHM and cPanel servers through AI clients, supporting server health, account, DNS, email, database, SSL, bandwidth, disk, cron, and service-management tools across multiple WHM accounts.31MIT
- AlicenseAqualityDmaintenanceA complete MCP server enabling AI assistants to manage cPanel hosting through natural language, including file, database, email, subdomain, and system operations.161MIT
- FlicenseBqualityCmaintenanceA comprehensive MCP server for managing cPanel hosting accounts through AI assistants. It supports DNS, email (DKIM/SPF), databases, domains, SSL, PHP, cron jobs, security, Git deployment, and more.10015
- AlicenseNot gradedqualityDmaintenanceMCP server for EasyPanel that enables AI agents to manage servers, projects, services, databases, and domains via 40 curated tools or raw tRPC access to all 347 API procedures.474MIT
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Provision and manage a VPS for AI agents over MCP: register, order, get root, control the server.
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/OpenIaaS/directadmin-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server