Skip to main content
Glama

DirectAdmin MCP Server

ci version license

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”

ssl_reissue_domain

“The hostname cert expired, renew it”

ssl_reissue_server

“Customer 203.0.113.44 is locked out of CSF”

csf_unblock_ip / firewall_unblock_everywhere

“Is that IP blocked? Why? Tell the customer.”

ip_block_reason

“List users over quota”

users_list_all + users_get_usage

“Restart php-fpm74”

services_restart (needs ENABLE_SERVICE_CONTROL=true)

Anything else in /api/*

da_list_endpoints → da_api

Write-shaped calls (delete, deny, restart, reissue, unblock, but also add, set, update, import, deploy, …) 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_KEY

Generate 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=true

Claude 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.py

Put 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/health

The 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=true

This 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=true

ssl_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=true

csf_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 (303 curated tools + 320 swagger ops).

Module

Tools (prefix)

Notes

SSL

ssl_*

Domain + hostname ACME, reissue, upload

CSF

csf_*, firewall_*

Plugin; needs ENABLE_CSF=true

BFM

bfm_*

Native panel blocks

Accounts

users_*, resellers_*, admins_*

New API + CMD_API_ACCOUNT_*

Packages

packages_*

User / reseller packages

System

system_*, license_*, maintenance_*

Version, OS updates, usage

Services

services_*

start/stop/restart/reload/logs

Settings

hostname_*, da_config_*, timezone_*, email_server_*

directadmin.conf

Auth

login_keys_*, login_urls_*, mfa_*, sessions_*

Prefer scoped keys

Security

modsecurity_*, clamav_*, security_txt_*, redis_*

WAF / AV

Data

db_*, fm_*, email_*, dns_*, ips_*, backups_*, domains_*, ftp_*, cron_*

Admin day-2

Build

cb_*, plugins_*, wp_*, git_*, cpanel_*

CustomBuild / apps

Pro Pack

unit_*, nginx_set_template, imapsync_*, propack_inventory

Unit + templates; no web terminal

CloudLinux

cl_*

Opt-in (ENABLE_CLOUDLINUX=false by default)

Policy

policy_status

Live ENABLE_* flags; approval-token required?

Audit

audit_search, audit_recent, window_now

Who did what, when, in-window?

Escape hatches

da_ping, da_list_endpoints, da_describe_endpoint, da_api, da_legacy

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

DA_URL

required

https://host:2222

DA_USERNAME / DA_LOGIN_KEY

required

Login key, not the password

DA_IMPERSONATE

empty

Default login-as; prefer per-tool impersonate=

DA_SSL_VERIFY

true

Verify the panel certificate

MCP_HOST / PORT

127.0.0.1 / 8888

HTTP bind

MCP_AUTH_TOKEN

empty

Required for HTTP in production

MCP_ALLOWED_CIDRS

empty

Optional client allow-list

TOOL_ALLOWLIST / TOOL_DENYLIST

empty / da_execute

Reduce blast radius

REQUIRE_CONFIRM

true

Destructive tools need confirm=true

ENABLE_CSF

true

CSF plugin calls

ENABLE_EXECUTE

false

/api/execute passthrough

RATE_LIMIT_PER_MINUTE

60

Per client identity

AUDIT_LOG

logs/audit.jsonl

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, and validate inputs (validate_ip, validate_domain, validate_username). @log_tool_call itself gates the call on confirm=true when needs_confirm() says so — no per-tool guard_confirm to remember.

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

server.py

Claude Desktop, Cursor, local agents

SSE

main.py → /sse

Older remote MCP clients

HTTP health / tool list

main.py

/health (liveness), /ready (panel), /mcp/tools

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.

Available Tools

303 tools
admins_createB

Create another admin account.

Args: username: New admin. email: Contact email. password: Initial password. notify: Send welcome email. confirm: Required.

Inputs: email (required), password (required), username (required), notify, +1 more. Returns: result

admins_listA

List all admin accounts.

Inputs: no named parameters. Returns: result

admin_usageB

Current admin's resource usage.

Inputs: no named parameters. Returns: result

audit_recentA

Last N audit events (newest first). Same log as audit_search.

Inputs: limit. Returns: result

backups_admin_listA

List admin-level backups / backup settings.

Inputs: no named parameters. Returns: result

backups_admin_nowC

Kick an admin-level backup now.

Args: who: all | or a username. where: Destination the panel understands. confirm: Required.

Inputs: who, where, confirm. Returns: result

backups_createA

Create a backup for one user.

Args: username: Account to back up. where: Backup destination the panel understands (local / ftp / …). confirm: Required.

Inputs: username (required), where, confirm. Returns: result

backups_restoreB

Restore a user from a local backup file.

Args: username: Account to restore into. file: Backup filename as listed by the panel. confirm: Required.

Inputs: file (required), username (required), confirm. Returns: result

bfm_ip_reasonA

Why Brute Force Monitor listed this IP (service, user, attempts, log line).

Returns operator reason and customer_message (en + bg) you can paste to the client. Prefer ip_block_reason when you also need the CSF/LFD side.

Args: ip: IPv4 or IPv6 to explain.

Inputs: ip (required). Returns: result

bfm_listA

List Brute Force Monitor state (blocked IPs, failed logins).

For one IP use bfm_ip_reason — that is the 'why was this blocked' view.

Args: blocked_only: Hint for the client; the panel still returns the full JSON.

Inputs: blocked_only. Returns: result

bfm_skip_ipC

Add an IP to the BFM skip / never-block list.

Args: ip: Address to skip. confirm: Required.

Inputs: ip (required), confirm. Returns: result

bfm_unblock_ipA

Remove an IP from DirectAdmin Brute Force Monitor blocks.

Use together with csf_unblock_ip — an IP is often listed in BOTH places.

Args: ip: IPv4 or IPv6 to unblock. confirm: Required.

Inputs: ip (required), reason, confirm, idempotency_key. Returns: result

cb_actionsB

Available CustomBuild actions.

Inputs: no named parameters. Returns: result

cb_killB

Kill a running CustomBuild job.

Args: confirm: Required.

Inputs: confirm. Returns: result

cb_logsC

CustomBuild log names.

Inputs: no named parameters. Returns: result

cb_optionsC

CustomBuild options (options.conf).

Inputs: no named parameters. Returns: result

cb_options_updateC

Patch CustomBuild options.

Args: values: Options object. confirm: Required.

Inputs: values (required), confirm. Returns: result

cb_removalsD

Software CustomBuild can remove.

Inputs: no named parameters. Returns: result

cb_runC

Start a CustomBuild run (build / update / rewrite).

Args: payload: Run arguments (action, software, …). confirm: Required.

Inputs: confirm, payload. Returns: result

cb_softwareC

Installed / available software.

Inputs: no named parameters. Returns: result

cb_stateC

CustomBuild current state.

Inputs: no named parameters. Returns: result

cb_updatesC

Available CustomBuild updates.

Inputs: no named parameters. Returns: result

cb_versionsC

Component versions.

Inputs: no named parameters. Returns: result

clamav_killA

Kill a running ClamAV scan.

Args: pid: Process id from clamav_status. confirm: Required.

Inputs: pid (required), confirm. Returns: result

clamav_scanB

Start a ClamAV scan.

Args: payload: Scan options as the panel expects. confirm: Required.

Inputs: confirm, payload. Returns: result

clamav_statusD

ClamAV status / start a scan (GET).

Inputs: no named parameters. Returns: result

cl_cagefs_disableC

Disable CageFS for one user. The account leaves the cage.

Args: username: Account. confirm: Required.

Inputs: username (required), confirm. Returns: result

cl_cagefs_enableC

Enable CageFS for one user.

Args: username: Account. confirm: Required.

Inputs: username (required), confirm. Returns: result

cl_lve_getB

LVE limits for one user.

Args: username: DirectAdmin account.

Inputs: username (required). Returns: result

cl_lve_setA

Set LVE limits for one user (CPU/RAM/IO/processes).

Only numeric values, percents, or 'unlimited'. This is the CloudLinux equivalent of Pro Pack cgroups throttle.

Args: username: Account. speed: CPU (e.g. 100% or 200). pmem: Physical memory (e.g. 1024 or 1G-style numbers the plugin accepts as digits). io: Disk IO. nproc: Max processes. ep: Entry processes. iops: IOPS. confirm: Required.

Inputs: username (required), ep, io, iops, +4 more. Returns: result

cl_lve_usersB

List LVE users / current limits (LVE Manager action=users).

Inputs: no named parameters. Returns: result

cl_php_selector_getA

Read CloudLinux PHP Selector for a user (plugin).

On non-CL boxes use domains_set_php (DirectAdmin PHP selector) instead.

Args: username: Account.

Inputs: username (required). Returns: result

cl_php_selector_setB

Set CloudLinux PHP Selector version for a user.

Args: username: Account. version: alt-php version the plugin understands (e.g. 8.2, 8.3, native). confirm: Required.

Inputs: version (required), username (required), confirm. Returns: result

cl_statusA

Detect CloudLinux / LVE Manager on this box.

Reads the plugin list and pings LVE Manager. Does not change anything.

Inputs: no named parameters. Returns: result

cpanel_import_check_remoteC

Check a remote cPanel server before import.

Args: payload: Host / credentials body.

Inputs: payload (required). Returns: result

cpanel_import_tasksD

cPanel import tasks.

Inputs: no named parameters. Returns: result

cron_createC

Create a cron job.

Args: minute: Cron minute (0-59 or *). hour: Cron hour. day_of_month: Day of month. month: Month. day_of_week: Day of week. command: Command to run (no shell metachar redirection from untrusted input). impersonate: Owning user. confirm: Required.

Inputs: hour (required), month (required), minute (required), command (required), +4 more. Returns: result

cron_deleteA

Delete a cron job by its panel id / select key.

Args: job_id: Id from cron_list (select0 value). impersonate: Owning user. confirm: Required.

Inputs: job_id (required), confirm, impersonate. Returns: result

cron_listA

List cron jobs for the current (or impersonated) user.

Args: impersonate: Owning user.

Inputs: impersonate. Returns: result

csf_allow_ipA

Whitelist an IP in CSF (csf -a / temporary allow).

Allowed IPs bypass closed ports but LFD can still block them unless ignored.

Args: ip: IPv4, IPv6, or CIDR. comment: Note stored with the rule. temporary: Use a TTL instead of a permanent allow. ttl_seconds: Lifetime when temporary=true. confirm: Required.

Inputs: ip (required), comment, confirm, temporary, +1 more. Returns: result

csf_deny_ipA

Block an IP in CSF (csf -d / temporary deny).

Args: ip: IPv4, IPv6, or CIDR. comment: Note stored with the rule. temporary: Use a TTL instead of a permanent deny. ttl_seconds: Lifetime when temporary=true. confirm: Required.

Inputs: ip (required), comment, confirm, temporary, +1 more. Returns: result

csf_disableA

Disable CSF (csf -x). Dangerous — the host is unprotected until re-enabled.

Blocked unless ENABLE_CSF_DISABLE=true. Prefer csf_unblock_ip instead.

Args: confirm: Required.

Inputs: confirm. Returns: result

csf_enableC

Enable CSF (csf -e).

Args: confirm: Required.

Inputs: confirm. Returns: result

csf_flush_tempC

Flush all CSF temporary allow/deny rules (csf -tf).

Args: confirm: Required.

Inputs: confirm. Returns: result

csf_ignore_ipB

Add an IP to csf.ignore so LFD never blocks it.

Args: ip: IPv4, IPv6, or CIDR. comment: Note. confirm: Required.

Inputs: ip (required), comment, confirm. Returns: result

csf_ip_reasonA

Why CSF/LFD listed this IP (list + LFD comment). Safe to show an operator.

Parses csf -g via the plugin. Typical comment: lfd: (sshd) Failed SSH login … 8 in the last 3600 secs. Pair with bfm_ip_reason or use ip_block_reason for both + a customer text.

Args: ip: IPv4 or IPv6.

Inputs: ip (required). Returns: result

csf_remove_allowC

Remove an IP from the CSF allow list (csf -ar).

Args: ip: Address to remove. confirm: Required.

Inputs: ip (required), confirm. Returns: result

csf_restartC

Restart CSF, and optionally LFD.

Args: also_lfd: Restart both csf and lfd (csf -ra). confirm: Required.

Inputs: confirm, also_lfd. Returns: result

csf_search_ipA

Search CSF/iptables/LFD for an IP (csf -g). Shows why it is blocked.

Args: ip: IPv4 or IPv6 address.

Inputs: ip (required). Returns: result

csf_statusA

Best-effort CSF plugin landing / status page (HTML or structured).

Inputs: no named parameters. Returns: result

csf_unblock_ipA

Unblock an IP in CSF/LFD (permanent deny + temporary ban).

This is the primary 'unlock from firewall' action. It:

  1. Runs the plugin Quick Unblock (action=kill) — csf -dr + csf -tr + drop states

  2. Also sends qrm when the plugin supports it

  3. Optionally adds a temporary allow so the next connection is not re-banned

Pair with bfm_unblock_ip if DirectAdmin Brute Force Monitor also listed the IP.

Args: ip: IPv4 or IPv6 to unblock. also_allow: After unblock, temporarily whitelist the IP. allow_ttl_seconds: TTL for the optional temporary allow (default 1h). comment: Note stored next to the allow rule. confirm: Required.

Inputs: ip (required), reason, comment, confirm, +3 more. Returns: result

da_apiA

Call any documented DirectAdmin New API endpoint.

Use this for operations that do not yet have a dedicated curated tool. The path must exist in the bundled swagger. /api/execute is blocked unless ENABLE_EXECUTE=true.

Args: method: GET POST PUT PATCH DELETE path: Template from da_list_endpoints (keep {placeholders}). path_params: Values for {placeholders}. query: Query string parameters. body: JSON body for non-GET requests. impersonate: Optional user to act as. confirm: Required for destructive methods / paths.

Inputs: path (required), method (required), body, query, +3 more. Returns: result

da_config_activeA

Currently applied directadmin.conf (merged).

Inputs: no named parameters. Returns: result

da_config_defaultC

Default directadmin.conf values.

Inputs: no named parameters. Returns: result

da_config_localC

Local overrides in directadmin.conf.

Inputs: no named parameters. Returns: result

da_config_local_patchC

Patch selected directadmin.conf keys.

Args: values: Partial local config. confirm: Required.

Inputs: values (required), confirm. Returns: result

da_config_local_updateB

Replace local directadmin.conf overrides (PUT).

Args: values: Full local config object as the panel expects. confirm: Required.

Inputs: values (required), confirm. Returns: result

da_describe_endpointA

Show parameters for one New API operation.

Args: method: HTTP method. path: Path template, e.g. /api/domain-tls/{domain}/provision-certs

Inputs: path (required), method (required). Returns: result

da_legacyA

Call a legacy CMD_API_* / CMD_* endpoint.

Only commands that start with CMD_API_ or CMD_ are accepted.

Args: command: e.g. CMD_API_SHOW_ALL_USERS or /CMD_API_SSL method: GET or POST data: Form fields. json=yes is added automatically. impersonate: Optional user. confirm: Required for POST.

Inputs: command (required), data, method, confirm, +1 more. Returns: result

da_list_endpointsA

List New API operations bundled with this server (from official swagger).

Args: prefix: Path prefix filter, e.g. /api/domain-tls or /api/users. method: Optional HTTP method filter (GET/POST/…).

Inputs: method, prefix. Returns: result

da_pingA

Connectivity check — hits /api/version.

Inputs: no named parameters. Returns: result

db_change_user_passwordC

Change a database user password.

Args: dbuser: Name. password: New password. confirm: Required.

Inputs: dbuser (required), password (required), confirm. Returns: result

db_checkD

Check a database.

Args: database: Name.

Inputs: database (required). Returns: result

db_createC

Create a database.

Args: payload: Create body (name, charset, …). confirm: Required.

Inputs: payload (required), confirm. Returns: result

db_create_userC

Create a database user.

Args: payload: User body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

db_create_with_userB

Create a database and a user in one call.

Args: payload: Combined create body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

db_deleteC

Drop a database.

Args: database: Name. confirm: Required.

Inputs: database (required), confirm. Returns: result

db_delete_userC

Drop a database user.

Args: dbuser: Name. confirm: Required.

Inputs: dbuser (required), confirm. Returns: result

db_getC

Details for one database.

Args: database: Database name.

Inputs: database (required). Returns: result

db_infoC

Database server info.

Inputs: no named parameters. Returns: result

db_kill_processC

Kill a database process.

Args: process_id: Process id. confirm: Required.

Inputs: process_id (required), confirm. Returns: result

db_listA

List databases visible to the current/impersonated account.

Inputs: no named parameters. Returns: result

db_optimizeC

Optimize a database.

Args: database: Name. confirm: Required.

Inputs: database (required), confirm. Returns: result

db_processesB

Show process list (admin).

Inputs: no named parameters. Returns: result

db_repairC

Repair a database.

Args: database: Name. confirm: Required.

Inputs: database (required), confirm. Returns: result

db_server_configB

SQL server connection settings used by the panel.

Inputs: no named parameters. Returns: result

db_server_config_testA

Test the configured SQL connection.

Inputs: no named parameters. Returns: result

db_server_config_updateC

Update SQL server settings.

Args: values: Config object. confirm: Required.

Inputs: values (required), confirm. Returns: result

db_user_getD

One database user.

Args: dbuser: DB username.

Inputs: dbuser (required). Returns: result

db_usersA

List database users.

Inputs: no named parameters. Returns: result

dns_admin_listA

List DNS zones (admin).

Inputs: no named parameters. Returns: result

dns_record_addA

Add a DNS record.

Args: domain: Zone. record_type: A | AAAA | CNAME | MX | TXT | NS | SRV | CAA … name: Record name (use @ or the domain for the apex). value: Record value. ttl: TTL seconds. confirm: Required.

Inputs: name (required), value (required), domain (required), record_type (required), +2 more. Returns: result

dns_record_deleteC

Delete a DNS record.

Args: domain: Zone. record_type: Type. name: Name. value: Value (required by most DA versions). confirm: Required.

Inputs: name (required), domain (required), record_type (required), value, +1 more. Returns: result

dns_zone_getB

Get records for a zone.

Args: domain: Zone name.

Inputs: domain (required). Returns: result

domain_pointers_createC

Add a domain pointer / alias.

Args: domain: Existing parent domain. from_domain: New hostname that should point at the parent. alias: True = alias (same site), False = pointer (redirect). impersonate: Owning user. confirm: Required.

Inputs: domain (required), from_domain (required), alias, confirm, +1 more. Returns: result

domain_pointers_deleteB

Remove a domain pointer.

Args: domain: Parent domain. pointer: Pointer hostname. impersonate: Owning user. confirm: Required.

Inputs: domain (required), pointer (required), confirm, impersonate. Returns: result

domain_pointers_listA

List domain pointers (aliases) for a domain.

Args: domain: Parent domain. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

domains_createA

Create an additional domain on the current (or impersonated) user.

Args: domain: FQDN to add. bandwidth: MB or 'unlimited'. quota: MB or 'unlimited'. ssl: Enable SSL for the domain. cgi: Enable CGI. php: Enable PHP. impersonate: Owning user (admin should set this). confirm: Required.

Inputs: domain (required), cgi, php, ssl, +4 more. Returns: result

domains_deleteC

Delete a domain from an account.

Args: domain: Domain to remove. impersonate: Owning user. confirm: Required.

Inputs: domain (required), confirm, impersonate. Returns: result

domains_list_userA

List domains owned by a user (admin) or the current account.

Args: username: Optional account. Empty = current session (CMD_API_SHOW_DOMAINS).

Inputs: username. Returns: result

domains_set_phpB

Set the PHP version selector for a domain.

Args: domain: Domain. php1_select: Selector index from the panel (often '1', '2', … mapping to php versions). impersonate: Owning user. confirm: Required.

Inputs: domain (required), php1_select (required), confirm, impersonate. Returns: result

email_autoresponders_listB

List autoresponders on a domain.

Args: domain: Domain. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

email_forwarder_createC

Create an email forwarder.

Args: domain: Domain. user: Local part (source). destination: Destination address or comma-separated list. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), destination (required), confirm, +1 more. Returns: result

email_forwarder_deleteC

Delete a forwarder.

Args: domain: Domain. user: Local part. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), confirm, impersonate. Returns: result

email_forwarders_listB

List forwarders on a domain.

Args: domain: Domain. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

email_logsA

Global email logs (admin).

Inputs: no named parameters. Returns: result

email_logs_summaryC

Email log summary.

Inputs: no named parameters. Returns: result

email_logs_userB

Current/impersonated user email logs.

Inputs: no named parameters. Returns: result

email_mobileconfigB

Apple mobileconfig for the current email account.

Inputs: no named parameters. Returns: result

email_outbound_filterC

Outbound email filter settings.

Inputs: no named parameters. Returns: result

email_outbound_filter_updateC

Update outbound email filter.

Args: values: Filter object. confirm: Required.

Inputs: values (required), confirm. Returns: result

email_pop_createA

Create a mailbox (user@domain).

Args: domain: Domain. user: Local part only (before @). password: Mailbox password. quota_mb: 0 = unlimited. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), password (required), confirm, +2 more. Returns: result

email_pop_deleteC

Delete a mailbox.

Args: domain: Domain. user: Local part. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), confirm, impersonate. Returns: result

email_pop_listA

List POP/IMAP accounts on a domain.

Args: domain: Domain. full: Use action=full_list (quota + usage) when true. impersonate: Owning user.

Inputs: domain (required), full, impersonate. Returns: result

email_pop_modifyA

Change mailbox password and/or quota.

Args: domain: Domain. user: Local part. password: New password (empty = leave unchanged). quota_mb: New quota; -1 = leave unchanged, 0 = unlimited. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), confirm, password, +2 more. Returns: result

email_server_configC

Global email / exim configuration.

Inputs: no named parameters. Returns: result

email_server_config_updateC

Update global email configuration.

Args: values: Config object. confirm: Required.

Inputs: values (required), confirm. Returns: result

email_vacation_deleteC

Delete a vacation message.

Args: domain: Domain. user: Local part. confirm: Required.

Inputs: user (required), domain (required), confirm. Returns: result

email_vacation_getC

One vacation message.

Args: domain: Domain. user: Local part.

Inputs: user (required), domain (required). Returns: result

email_vacation_listC

Vacation / autoresponder list for a domain.

Args: domain: Domain.

Inputs: domain (required). Returns: result

email_vacation_setB

Create/update a vacation message.

Args: domain: Domain. user: Local part. values: Vacation body. confirm: Required.

Inputs: user (required), domain (required), values (required), confirm. Returns: result

firewall_unblock_everywhereA

Unblock an IP in CSF and DirectAdmin Brute Force Monitor.

This is the 'customer is locked out' button. It does not disable the firewall.

Args: ip: IPv4 or IPv6. also_allow: Also add a temporary CSF allow (1 hour). confirm: Required.

Inputs: ip (required), reason, confirm, also_allow, +1 more. Returns: result

fm_chmodC

Change permissions.

Args: payload: Paths + mode. confirm: Required.

Inputs: payload (required), confirm. Returns: result

fm_copyC

Copy files.

Args: payload: Source/destination body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

fm_disk_usageC

Disk usage for a path.

Args: path: Path.

Inputs: path. Returns: result

fm_listB

List a directory.

Args: path: Absolute path inside the account home.

Inputs: path. Returns: result

fm_mkdirC

Create a directory.

Args: path: New directory path. confirm: Required.

Inputs: path (required), confirm. Returns: result

fm_moveC

Move files.

Args: payload: Source/destination body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

fm_removeC

Move paths to trash (or delete, depending on panel settings).

Args: paths: List of paths. confirm: Required.

Inputs: paths (required), confirm. Returns: result

fm_search_filesB

Search file names.

Args: query: Filename fragment. path: Root to search.

Inputs: query (required), path. Returns: result

fm_search_textC

Search file contents.

Args: query: Text. path: Root to search.

Inputs: query (required), path. Returns: result

fm_trashA

List trash.

Inputs: no named parameters. Returns: result

fm_treeB

Directory tree.

Args: path: Starting path.

Inputs: path. Returns: result

ftp_createB

Create an FTP account.

Args: domain: Domain. user: FTP username (local part). password: FTP password. path_type: domain | ftp | user | custom custom_path: Required when path_type=custom. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), password (required), confirm, +3 more. Returns: result

ftp_deleteC

Delete an FTP account.

Args: domain: Domain. user: FTP username. impersonate: Owning user. confirm: Required.

Inputs: user (required), domain (required), confirm, impersonate. Returns: result

ftp_listA

List FTP accounts for a domain.

Args: domain: Domain. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

git_deployC

Trigger a git deploy.

Args: uuid: Application uuid. confirm: Required.

Inputs: uuid (required), confirm. Returns: result

git_fetchC

Fetch remotes for a git application.

Args: uuid: Application uuid.

Inputs: uuid (required). Returns: result

git_getC

One git application.

Args: uuid: Application uuid.

Inputs: uuid (required). Returns: result

git_listB

List git applications on a domain.

Args: domain: Domain.

Inputs: domain (required). Returns: result

git_webhookA

Create or rotate the deploy webhook for a git application.

Args: username: Owning user. uuid: Application uuid. confirm: Required — webhook URLs are secrets.

Inputs: uuid (required), username (required), confirm. Returns: result

hostname_changeB

Change the server hostname.

Args: hostname: New FQDN. confirm: Required. Reissue the hostname SSL afterwards with ssl_reissue_server.

Inputs: hostname (required), confirm. Returns: result

imapsync_cancelB

Cancel a running IMAP migration.

Args: migration_id: Id from imapsync_migrations. confirm: Required.

Inputs: migration_id (required), confirm. Returns: result

imapsync_exportC

Export mail from this box to a remote IMAP server.

Args: payload: Panel imapsync export body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

imapsync_importB

Import mail from a remote IMAP server into this box.

Args: payload: Panel imapsync import body (host, user, password, dest). confirm: Required. Passwords in the payload are redacted in logs.

Inputs: payload (required), confirm. Returns: result

imapsync_migrationsC

IMAP migration tasks.

Inputs: no named parameters. Returns: result

inventory_getA

Look up one server in the hops inventory.

Args: server_id: id from inventory_list.

Inputs: server_id (required). Returns: result

inventory_listB

Fleet catalog on the hops host (no secrets). Who has CloudLinux, which profile.

Inputs: no named parameters. Returns: result

inventory_thisC

The DirectAdmin box this MCP process is wired to.

Inputs: no named parameters. Returns: result

ip_block_reasonA

Why this IP is blocked — CSF/LFD and Brute Force Monitor together.

This is the tool to call when the operator (or the customer) asks "защо е блокиран". Read-only. Returns:

  • operator_reason: technical (lists, LFD comment, BFM log line)

  • customer_message.en / .bg: paste-ready, no host paths

If there is no recorded reason, says so instead of inventing one.

Args: ip: IPv4 or IPv6.

Inputs: ip (required). Returns: result

ips_addC

Add an IP to the admin IP manager.

Args: ip: Address to add. netmask: Netmask (IPv4) or prefix hint. confirm: Required.

Inputs: ip (required), confirm, netmask. Returns: result

ips_admin_listB

Admin-level IP list (CMD_API_IP_MANAGER).

Inputs: no named parameters. Returns: result

ips_assignC

Assign an IP to a reseller/user.

Args: ip: Address. username: Destination account. confirm: Required.

Inputs: ip (required), username (required), confirm. Returns: result

ips_getB

Details for one IP.

Args: ip: Address.

Inputs: ip (required). Returns: result

ips_listA

List IPs visible to this reseller/admin.

Inputs: no named parameters. Returns: result

ips_removeC

Remove an IP from the admin IP manager.

Args: ip: Address to remove. confirm: Required.

Inputs: ip (required), confirm. Returns: result

license_getC

DirectAdmin license details.

Inputs: no named parameters. Returns: result

license_proofC

License proof document.

Inputs: no named parameters. Returns: result

license_update_keyC

Install a new license key.

Args: key: License key. confirm: Required.

Inputs: key (required), confirm. Returns: result

login_historyA

Current account login history.

Inputs: no named parameters. Returns: result

login_keys_commandsC

Commands a login key can be restricted to.

Inputs: no named parameters. Returns: result

login_keys_createB

Create a login key. Prefer IP-restricted, command-restricted keys.

Args: payload: Create body as documented by /api/login-keys/keys (name, expires, ips, commands, …). confirm: Required.

Inputs: payload (required), confirm. Returns: result

login_keys_deleteC

Delete a login key.

Args: key_id: Key id. confirm: Required.

Inputs: key_id (required), confirm. Returns: result

login_keys_getC

Get one login key.

Args: key_id: Key id.

Inputs: key_id (required). Returns: result

login_keys_historyC

Usage history for a login key.

Args: key_id: Key id.

Inputs: key_id (required). Returns: result

login_keys_listA

List login keys on the current account.

Inputs: no named parameters. Returns: result

login_keys_updateC

Update a login key.

Args: key_id: Key id. payload: Patch body. confirm: Required.

Inputs: key_id (required), payload (required), confirm. Returns: result

login_url_one_shotC

Create a one-shot panel login URL (POST /api/login/url).

Args: payload: Optional body the panel expects.

Inputs: payload. Returns: result

login_urls_createC

Create a login URL.

Args: payload: Create body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

login_urls_deleteC

Delete a login URL.

Args: url_id: URL id. confirm: Required.

Inputs: url_id (required), confirm. Returns: result

login_urls_listA

List one-time / login-as URLs.

Inputs: no named parameters. Returns: result

maintenance_checkB

Run a maintenance check.

Args: task: Task id from maintenance_list.

Inputs: task (required). Returns: result

maintenance_fixC

Apply a maintenance fix.

Args: task: Task id. confirm: Required.

Inputs: task (required), confirm. Returns: result

maintenance_listC

Maintenance tasks / health checks the panel exposes.

Inputs: no named parameters. Returns: result

messages_getC

Read one message.

Args: message_id: Message id.

Inputs: message_id (required). Returns: result

messages_listC

Message center list.

Inputs: no named parameters. Returns: result

mfa_disableC

Disable MFA.

Args: payload: Usually includes the current password / OTP. confirm: Required.

Inputs: confirm, payload. Returns: result

mfa_enableC

Enable multi-factor authentication on the current account.

Args: payload: Panel-specific body (otp, password, …). confirm: Required.

Inputs: confirm, payload. Returns: result

mfa_generate_secretA

Generate a new TOTP secret (enrolment).

Inputs: no named parameters. Returns: result

mfa_recovery_codesB

List MFA recovery codes.

Inputs: no named parameters. Returns: result

modsecurity_all_configsB

All ModSecurity per-host configs.

Inputs: no named parameters. Returns: result

modsecurity_audit_entryD

One ModSecurity audit entry.

Args: entry_id: Optional entry identifier (query).

Inputs: entry_id. Returns: result

modsecurity_audit_summaryC

ModSecurity audit log summary.

Inputs: no named parameters. Returns: result

modsecurity_globalC

Global ModSecurity configuration.

Inputs: no named parameters. Returns: result

modsecurity_global_updateC

Update global ModSecurity configuration.

Args: values: Config object. confirm: Required.

Inputs: values (required), confirm. Returns: result

modsecurity_host_configC

ModSecurity config for one hostname.

Args: hostname: vhost name.

Inputs: hostname (required). Returns: result

modsecurity_user_configsB

Current user's ModSecurity configs.

Inputs: no named parameters. Returns: result

nginx_set_templateB

Apply a Pro Pack Nginx CMS template (WordPress, Drupal, FastCGI cache, …).

Args: domain: Domain. template: wordpress | wordpress_cache | drupal | joomla | magento | laravel | default | none impersonate: Owning user. confirm: Required.

Inputs: domain (required), template (required), confirm, impersonate. Returns: result

packages_reseller_listB

List reseller packages (legacy), or one package.

Args: package: Optional package name.

Inputs: package. Returns: result

packages_reseller_new_apiC

Reseller packages via the New API.

Args: package: Optional package name for /api/reseller-packages/{package}.

Inputs: package. Returns: result

packages_user_deleteC

Delete a user package.

Args: package: Package name. confirm: Required.

Inputs: package (required), confirm. Returns: result

packages_user_listA

List user packages, or show one package.

Args: package: Optional package name.

Inputs: package. Returns: result

packages_user_saveA

Create or overwrite a user package.

Args: name: Package name. bandwidth: MB or unlimited. quota: MB or unlimited. vdomains: Domain limit or unlimited. nemails: Mailbox limit or unlimited. mysql: Database limit or unlimited. php: ON | OFF ssl: ON | OFF cgi: ON | OFF confirm: Required.

Inputs: name (required), cgi, php, ssl, +6 more. Returns: result

phpmyadmin_ssoB

Create a phpMyAdmin SSO session.

Args: database: Optional database name for database-scoped SSO.

Inputs: database. Returns: result

plugins_activateC

Activate a plugin.

Args: plugin_id: Plugin id. confirm: Required.

Inputs: plugin_id (required), confirm. Returns: result

plugins_deactivateC

Deactivate a plugin.

Args: plugin_id: Plugin id. confirm: Required.

Inputs: plugin_id (required), confirm. Returns: result

plugins_deleteC

Uninstall a plugin.

Args: plugin_id: Plugin id. confirm: Required.

Inputs: plugin_id (required), confirm. Returns: result

plugins_install_urlB

Install a plugin from a URL.

Args: url: https URL to a .tar.gz plugin. confirm: Required.

Inputs: url (required), confirm. Returns: result

plugins_listA

Installed plugins (user-facing list).

Inputs: no named parameters. Returns: result

plugins_manager_listB

Plugin manager inventory (admin).

Inputs: no named parameters. Returns: result

plugins_updateC

Update a plugin from its update_url.

Args: plugin_id: Plugin id. confirm: Required.

Inputs: plugin_id (required), confirm. Returns: result

policy_statusA

Show which optional capabilities are on.

A denied tool means the matching ENABLE_* flag is false. Do not try to bypass it. Ask the operator to flip the flag on the host if they want that class of action.

Inputs: no named parameters. Returns: result

profile_settingsB

Current profile settings.

Inputs: no named parameters. Returns: result

profile_settings_updateC

Patch profile settings.

Args: values: Partial settings object.

Inputs: values (required). Returns: result

propack_inventoryA

Map every Pro Pack feature to the curated tool that covers it.

Modern licenses include Pro Pack. Web Terminal is intentionally not wrapped.

Inputs: no named parameters. Returns: result

redirects_createA

Create a site redirect.

Args: domain: Domain. path: Source path (e.g. /old). destination: Target URL. redirect_type: 301 | 302 | 303. impersonate: Owning user. confirm: Required.

Inputs: path (required), domain (required), destination (required), confirm, +2 more. Returns: result

redirects_listA

List site redirects for a domain.

Args: domain: Domain. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

redis_disableC

Disable Redis.

Args: confirm: Required.

Inputs: confirm. Returns: result

redis_enableB

Enable Redis for the current/impersonated user.

Args: confirm: Required.

Inputs: confirm. Returns: result

redis_statusA

Per-user Redis status.

Inputs: no named parameters. Returns: result

resellers_convert_to_userC

Demote a reseller to a regular user.

Args: username: Reseller to demote. confirm: Required.

Inputs: username (required), confirm. Returns: result

resellers_createB

Create a reseller from a reseller package.

Args: username: New reseller. email: Contact email. password: Initial password. domain: Primary domain. package: Reseller package name. ip: shared | sharedreseller | assign. notify: Send welcome email. confirm: Required.

Inputs: email (required), domain (required), package (required), password (required), +4 more. Returns: result

resellers_get_configC

Reseller configuration.

Args: username: Reseller name.

Inputs: username (required). Returns: result

resellers_get_usageB

Combined reseller + owned-users usage.

Args: username: Reseller name.

Inputs: username (required). Returns: result

resellers_listA

List all reseller accounts.

Inputs: no named parameters. Returns: result

search_resourcesC

Search panel resources (domains, dbs, emails, …).

Args: q: Query.

Inputs: q (required). Returns: result

security_txt_statusC

security.txt status.

Inputs: no named parameters. Returns: result

services_getA

Details for one service.

Args: service: Service name (e.g. httpd, exim, dovecot, named, proftpd).

Inputs: service (required). Returns: result

services_listA

List managed services (httpd, exim, dovecot, named, …).

Inputs: no named parameters. Returns: result

services_logsB

Read a service log.

Args: service: Service name. cursor: Pagination cursor from a previous response. limit: Max lines. level: Optional log level filter.

Inputs: service (required), level, limit, cursor. Returns: result

services_reloadC

Reload a service configuration.

Args: service: Service name. confirm: Required.

Inputs: service (required), confirm. Returns: result

services_restartC

Restart a service.

Args: service: Service name. confirm: Required.

Inputs: service (required), confirm. Returns: result

services_startC

Start a service.

Args: service: Service name. confirm: Required.

Inputs: service (required), confirm. Returns: result

services_stopC

Stop a service.

Args: service: Service name. confirm: Required.

Inputs: service (required), confirm. Returns: result

services_watchdogC

Toggle the service watchdog.

Args: service: Service name. enabled: True to watch, False to stop watching. confirm: Required.

Inputs: enabled (required), service (required), confirm. Returns: result

session_getA

Current session (who am I, level, selected domain).

Inputs: no named parameters. Returns: result

session_login_asA

Switch the session into another account (login-as).

Prefer the impersonate= argument on individual tools — it does not mutate the long-lived session.

Args: username: Account to impersonate. confirm: Required.

Inputs: username (required), confirm. Returns: result

session_login_as_returnA

Leave a login-as session and return to the admin.

Inputs: no named parameters. Returns: result

session_login_as_usersB

Search users available for login-as.

Args: q: Query. limit: Max rows.

Inputs: q, limit. Returns: result

session_reseller_configA

Current reseller config (when logged in as reseller/admin).

Inputs: no named parameters. Returns: result

sessions_destroyC

Destroy one other session.

Args: public_id: Session public id. confirm: Required.

Inputs: public_id (required), confirm. Returns: result

sessions_destroy_all_otherB

Destroy every other session (force logout everywhere else).

Args: confirm: Required.

Inputs: confirm. Returns: result

sessions_listB

List active sessions for this account.

Inputs: no named parameters. Returns: result

session_stateC

Session UI state.

Inputs: no named parameters. Returns: result

session_switch_domainB

Switch the active domain in the session.

Args: domain: Domain to select.

Inputs: domain (required). Returns: result

session_user_configC

Current account user.conf.

Inputs: no named parameters. Returns: result

session_user_usageC

Current account usage.

Inputs: no named parameters. Returns: result

ssl_acme_dns_providersA

List ACME DNS-01 providers the panel knows about (Cloudflare, …).

Inputs: no named parameters. Returns: result

ssl_admin_flagsA

Read admin_ssl_* and letsencrypt_* flags from directadmin.conf.

These control the automatic Admin SSL poller (install-to-missing, replace-expired, cert-on-create). Change them with da_config_local_patch.

Inputs: no named parameters. Returns: result

ssl_admin_listA

List every user/domain certificate the Admin SSL page shows.

This is the Admin Level → Admin SSL overview (CMD_ADMIN_SSL?json=yes). It is not in the New JSON API. Requires Pro Pack and a login key that is allowed to run CMD_ADMIN_SSL.

Use this to see which customer domains are missing, expired, or valid before calling ssl_admin_reissue.

Inputs: no named parameters. Returns: result

ssl_admin_reissueA

Request Let's Encrypt certificates for selected customer domains.

This is the Admin SSL icon action: POST CMD_ADMIN_SSL action=multiple. The panel queues ACME in the background (dataskq) — no impersonation. Prefer this when an operator says “reissue SSL for these clients” from the Admin SSL page.

For a single domain on a modern panel, ssl_reissue_domain (New API, impersonate the owner) is more precise.

Args: domains: Customer domain names as listed by ssl_admin_list (max 50). wildcard: Request *.domain (dns-01). Default is http-01 / per-host. confirm: Required.

Inputs: domains (required), reason, confirm, wildcard, +1 more. Returns: result

ssl_create_csrC

Create a CSR for a domain certificate slot (commercial CA flow).

Args: domain: Domain. cert_id: Certificate id. common_name: CN, defaults to the domain. impersonate: Owning user.

Inputs: domain (required), cert_id (required), common_name, impersonate. Returns: result

ssl_delete_domain_certA

Delete one certificate from a domain.

Args: domain: Domain. cert_id: Certificate id from ssl_list_domain_certs. update_acme_skiplist: Let ACME manage this name again after delete. impersonate: Owning user. confirm: Required.

Inputs: domain (required), cert_id (required), confirm, impersonate, +1 more. Returns: result

ssl_get_cert_filesA

Download certificate + chain + key files for a domain cert id.

The private key is returned by DirectAdmin — treat the response as secret.

Args: domain: Domain. cert_id: Certificate id. impersonate: Owning user.

Inputs: domain (required), cert_id (required), impersonate. Returns: result

ssl_get_domain_acme_configA

Read ACME (Let's Encrypt / ZeroSSL) configuration for a domain.

Args: domain: Fully-qualified domain. impersonate: Optional user to act as.

Inputs: domain (required), impersonate. Returns: result

ssl_install_self_signedA

Install a self-signed certificate on a domain (lab / placeholder only).

Args: domain: Domain. cert_id: Certificate id. dns_names: SANs. Defaults to [domain]. key_type: rsa2048 | rsa4096 | ec256 | ec384 overwrite: Replace existing material. impersonate: Owning user. confirm: Required.

Inputs: domain (required), cert_id (required), confirm, key_type, +3 more. Returns: result

ssl_list_domain_certsA

List TLS certificates installed on a user domain.

Args: domain: Fully-qualified domain (example.com). impersonate: Optional user to act as (admin login-as).

Inputs: domain (required), impersonate. Returns: result

ssl_reissue_domainA

Reissue / provision the Let's Encrypt (or configured ACME) certificate for a domain.

This is the primary 'renew/reissue SSL' action. It calls POST /api/domain-tls/{domain}/provision-certs (or the dry-run sibling). DirectAdmin must have ACME enabled for the domain — use ssl_get_domain_acme_config first if you are unsure. For hostname/server certs use ssl_reissue_server.

Args: domain: Fully-qualified domain to reissue. impersonate: User that owns the domain (recommended for admin). dry_run: If true, validate only — do not hit the CA. confirm: Required unless dry_run is true.

Inputs: domain (required), reason, confirm, dry_run, +2 more. Returns: result

ssl_reissue_domain_legacyA

Fallback Let's Encrypt request via legacy CMD_API_SSL (older DirectAdmin).

Use ssl_reissue_domain first. This exists for panels that predate /api/domain-tls.

Args: domain: Domain to issue. wildcard: Include *.domain (needs DNS challenge). entries: Extra hostnames (www, mail, …). Defaults to domain + www.domain. keysize: secp384r1 | ecdsa | 4096 | 2048 encryption: sha256 impersonate: Owning user. confirm: Required.

Inputs: domain (required), confirm, entries, keysize, +3 more. Returns: result

ssl_reissue_serverB

Force-obtain / reissue the DirectAdmin hostname TLS certificate.

Calls POST /api/server-tls/obtain. Use this when the panel hostname cert is expired or the hostname changed.

Args: confirm: Required.

Inputs: reason, confirm, idempotency_key. Returns: result

ssl_server_acme_configA

Read ACME configuration used for the server hostname certificate.

Inputs: no named parameters. Returns: result

ssl_server_certificateA

Read the current hostname certificate metadata.

Inputs: no named parameters. Returns: result

ssl_server_enableA

Enable TLS on the DirectAdmin service itself.

Args: force: Force the switch even if a cert looks incomplete. confirm: Required.

Inputs: force, confirm. Returns: result

ssl_server_filesA

Download the hostname certificate and key (secret).

Inputs: no named parameters. Returns: result

ssl_server_statusA

Hostname / DirectAdmin service TLS status (not a user domain).

Inputs: no named parameters. Returns: result

ssl_server_upload_filesB

Replace the hostname certificate with uploaded PEM files.

Args: certificate: PEM cert (+ optional chain). key: PEM private key. force: Allow an invalid cert. confirm: Required.

Inputs: key (required), certificate (required), force, confirm. Returns: result

ssl_set_domain_acme_configA

Update ACME settings for a domain before issuing or reissuing a cert.

Args: domain: Fully-qualified domain. enabled: Whether ACME auto-management is on. provider: '' | letsencrypt | letsencrypt-staging | zerossl key_type: rsa2048 | rsa4096 | ec256 | ec384 prefer_wildcard: Request *.domain when DNS challenge is available. dns_provider: Optional DNS plugin name (cloudflare, …) for DNS-01. skip_dns_names: Names that ACME should ignore. dns_environment: Provider env vars (tokens are redacted in logs). impersonate: Optional user to act as. confirm: Must be true — writes ACME secrets.

Inputs: domain (required), confirm, enabled, key_type, +6 more. Returns: result

ssl_set_server_acme_configA

Update ACME settings for the DirectAdmin hostname certificate.

Args: account: ACME account email. enabled: Enable ACME for the hostname. provider: '' | letsencrypt | letsencrypt-staging | zerossl key_type: rsa2048 | rsa4096 | ec256 | ec384 additional_domains: Extra names on the hostname cert. dns_provider: Optional DNS-01 provider. dns_environment: Provider secrets. confirm: Required.

Inputs: account (required), confirm, enabled, key_type, +4 more. Returns: result

ssl_upload_cert_filesA

Replace a domain certificate with uploaded PEM files.

Args: domain: Domain. cert_id: Certificate id. certificate: PEM certificate body. key: PEM private key. chain: Optional intermediate PEM list. force: Allow a certificate that fails validation. dry_run: Validate only. impersonate: Owning user. confirm: Required unless dry_run.

Inputs: key (required), domain (required), cert_id (required), certificate (required), +5 more. Returns: result

subdomains_createA

Create a subdomain.

Args: domain: Parent domain. subdomain: Left-most label only (e.g. 'shop', not shop.example.com). impersonate: Owning user. confirm: Required.

Inputs: domain (required), subdomain (required), confirm, impersonate. Returns: result

subdomains_deleteA

Delete a subdomain.

Args: domain: Parent domain. subdomain: Label to remove. contents: Also delete files under the subdomain document root. impersonate: Owning user. confirm: Required.

Inputs: domain (required), subdomain (required), confirm, contents, +1 more. Returns: result

subdomains_listA

List subdomains of a domain.

Args: domain: Parent domain. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

system_cpuC

CPU information.

Inputs: no named parameters. Returns: result

system_diskC

Filesystem usage.

Inputs: no named parameters. Returns: result

system_global_usage_historyC

Global resource usage history for one user.

Args: user: Username.

Inputs: user (required). Returns: result

system_global_usage_latestB

Latest global resource usage.

Inputs: no named parameters. Returns: result

system_infoB

High-level panel info (/api/info).

Inputs: no named parameters. Returns: result

system_loadB

1/5/10 minute load averages.

Inputs: no named parameters. Returns: result

system_memoryC

Memory information.

Inputs: no named parameters. Returns: result

system_packages_historyB

History of OS package upgrade tasks.

Inputs: no named parameters. Returns: result

system_packages_update_runB

Apply OS package upgrades.

Args: packages: Optional package name list. Empty = all pending. confirm: Required.

Inputs: confirm, packages. Returns: result

system_packages_updatesB

Available OS package upgrades.

Inputs: no named parameters. Returns: result

system_packages_update_testA

Dry-run OS package upgrade.

Args: packages: Optional package name list. Empty = all pending.

Inputs: packages. Returns: result

system_resource_usage_historyC

Historical resource usage.

Inputs: no named parameters. Returns: result

system_resource_usage_latestA

Latest per-user resource usage snapshot.

Inputs: no named parameters. Returns: result

system_restart_directadminC

Restart the DirectAdmin service.

Args: confirm: Required.

Inputs: confirm. Returns: result

system_services_overviewC

Services occupancy snapshot (not the systemd list).

Inputs: no named parameters. Returns: result

system_set_update_channelA

Change the DirectAdmin update channel.

Args: channel: current | stable | beta | alpha (panel-dependent). confirm: Required.

Inputs: channel (required), confirm. Returns: result

system_update_directadminB

Update DirectAdmin itself to the latest build on the current channel.

Args: confirm: Required.

Inputs: confirm. Returns: result

system_uptimeB

Host uptime.

Inputs: no named parameters. Returns: result

system_versionB

DirectAdmin version and update channel.

Inputs: no named parameters. Returns: result

ticket_requestsC

Ticket requests queue.

Inputs: no named parameters. Returns: result

tickets_listD

Support tickets.

Inputs: no named parameters. Returns: result

timezone_currentA

Current server timezone.

Inputs: no named parameters. Returns: result

timezone_listB

Available timezones.

Inputs: no named parameters. Returns: result

timezone_setC

Set server timezone.

Args: timezone: IANA name, e.g. Europe/Sofia. confirm: Required.

Inputs: timezone (required), confirm. Returns: result

unit_createB

Create an empty Nginx Unit application stub (then edit JSON in the panel).

Args: domain: Domain. name: Application name (saved as domain_name). impersonate: Owning user. confirm: Required.

Inputs: name (required), domain (required), confirm, impersonate. Returns: result

unit_deleteC

Delete one or more Nginx Unit applications.

Args: domain: Domain. names: Application names. impersonate: Owning user. confirm: Required.

Inputs: names (required), domain (required), confirm, impersonate. Returns: result

unit_listA

List Nginx Unit applications and routes for a domain (CMD_UNIT).

Args: domain: Domain that owns the Unit apps. impersonate: Owning user.

Inputs: domain (required), impersonate. Returns: result

users_change_creatorC

Move a user to a different reseller/creator.

Args: username: User to move. new_creator: Destination reseller/admin. confirm: Required.

Inputs: username (required), new_creator (required), confirm. Returns: result

users_change_passwordA

Change another account's password (admin).

Args: username: Target account. Empty / current user uses /api/change-password. new_password: New password. confirm: Required.

Inputs: username (required), new_password (required), confirm. Returns: result

users_convert_to_resellerB

Promote a user account to reseller.

Args: username: User to promote. confirm: Required.

Inputs: username (required), confirm. Returns: result

users_createA

Create a user from a package (legacy CMD_API_ACCOUNT_USER).

Args: username: New username (usually 3–16 alphanumeric). email: Contact email. password: Initial password (prefer sending a login-key later). domain: Primary domain. package: Existing user package name. ip: shared | sharedreseller | a free IP. notify: Email the welcome message. confirm: Required.

Inputs: email (required), domain (required), package (required), password (required), +4 more. Returns: result

users_deleteB

Permanently delete a user/reseller/admin account.

Args: username: Account to delete. confirm: Required.

Inputs: username (required), confirm. Returns: result

users_existsB

Check whether an account name already exists (admin).

Args: username: Candidate username.

Inputs: username (required). Returns: result

users_get_configB

Get user.conf style configuration (limits, domains, suspended flag).

Args: username: Account name.

Inputs: username (required). Returns: result

users_get_usageC

Get live usage + limits for a user.

Args: username: Account name.

Inputs: username (required). Returns: result

users_listA

List users owned by the current reseller, or by reseller if given.

Args: reseller: Optional reseller username.

Inputs: reseller. Returns: result

users_list_allA

List every user on the server (admin).

Inputs: no named parameters. Returns: result

users_login_historyB

Login history for a specific user.

Args: username: Account name.

Inputs: username (required). Returns: result

users_modifyA

Customize limits on an existing user (CMD_API_MODIFY_USER).

Empty strings leave that field unchanged. Use 'unlimited' or a number.

Args: username: Account. bandwidth: Bandwidth MB or unlimited. quota: Disk MB or unlimited. vdomains: Domain limit or unlimited. nemails: Mailbox limit or unlimited. mysql: Database limit or unlimited. php: ON | OFF ssl: ON | OFF ssh: ON | OFF confirm: Required.

Inputs: username (required), php, ssh, ssl, +6 more. Returns: result

users_suspendC

Toggle suspend/unsuspend for an account (DirectAdmin toggle).

Args: username: Account. confirm: Required.

Inputs: username (required), confirm. Returns: result

users_unsuspendC

Unsuspend an account (same toggle endpoint as users_suspend).

Args: username: Account. confirm: Required.

Inputs: username (required), confirm. Returns: result

web_protect_listB

Directory password-protection list.

Inputs: no named parameters. Returns: result

widgets_listC

Dashboard widgets.

Inputs: no named parameters. Returns: result

window_nowA

Is the maintenance window open right now? Reads still work when it is closed.

Inputs: no named parameters. Returns: result

wp_deleteC

Remove a WordPress location from the manager.

Args: location_id: Location id. confirm: Required.

Inputs: location_id (required), confirm. Returns: result

wp_getC

WordPress instance details.

Args: location_id: Location id.

Inputs: location_id (required). Returns: result

wp_installC

Install WordPress.

Args: payload: Install body (domain, path, title, admin user, …). confirm: Required.

Inputs: payload (required), confirm. Returns: result

wp_install_quickC

Quick WordPress install.

Args: payload: Quick-install body. confirm: Required.

Inputs: payload (required), confirm. Returns: result

wp_locationsB

List WordPress installations.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 303 tools

    Disambiguation3/5

    The heavy prefixing (ssl_, dns_, email_, users_, csf_) keeps most tools clearly separated, but several near-duplicates exist: users_suspend vs users_unsuspend, email_autoresponder_list vs email_vacation_list, and the ssl_reissue_domain vs ssl_reissue_omain_legacy pair. Descriptions usually clarify intent, but with 303 tools an agent can easily misselect.

    Naming Consistency4/5

    Names overwhelmingly follow a consistent snake_case prefix_action pattern such as ssl_list_domain_certs, users_create, dns_record_add, services_restart. Minor deviations like search_resources, policy_status, system_cpu, and prop_inventory break the strict pattern but do not make navigation chaotic.

    Tool Count1/5

    303 tools is far beyond any reasonable agent-facing surface; even for a broad control panel like DirectAdmin this is extreme. Most endpoints are thin wrappers and are supplemented by generic da_api/da_legacy escape hatches, so the count could be drastically reduced.

    Completeness4/5

    The curated surface covers most core lifecycles: accounts, DNS records, email, SSL, firewall, databases, backups, files, system services, packages, plugins, WordPress, and CloudLinux. Minor gaps exist (git create/delete, unit editing, file upload/download, some automation config), but the da_api/da_legacy tools provide a workaround for uncovered endpoints.

    Maintenance

    ActivityStale
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      A 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.
      31
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      A 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.
      100
      26
      ISC
    • A
      license
      B
      quality
      C
      maintenance
      MCP 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.
      42
      35 npm
      4
      MIT