ecp-mcp-server
Connects Bitbucket to browse repositories and manage per-app deploy webhooks.
Connects GitHub to browse repositories and manage per-app deployment webhooks.
Connects GitLab to browse repositories and manage per-app deployment webhooks.
Manages SSL certificates via Let's Encrypt and self-signed certificates for domains.
Manages MongoDB databases, users, privileges, document browsing/editing, and backups.
Manages MySQL databases, users, privileges, row browsing/editing, and backups.
Manages Nginx configuration, domains, DNS, and redirects.
Manages PHP versions and php.ini configuration.
Manages PostgreSQL databases, users, privileges, row browsing/editing, and backups.
Provides one-click WordPress installation and blueprint-based WordPress scaffolding.
Click on "Deploy 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., "@ecp-mcp-server List my databases and their sizes."
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.
ecp-mcp-server
An MCP server for ECP (Epic Control Panel) — manage a hosting account's apps, domains, databases, files, PHP, SSL, and more conversationally through Claude Code, Claude Desktop, or any other MCP-compatible client.
It talks to ECP's own API (the same one ECP's web UI uses) as the hosting account you configure it with — nothing about this project modifies EHM or ECP themselves.
What it can do
~200 tools across:
Apps — detect an app's stack/runtime/commands, deploy, create from git/upload, pull the latest commits for git apps (and manage their saved git login), manage domains and PHP version, tail logs, custom commands
Domains / DNS — add/remove domains and subdomains, DNS records, claim a domain's DNS zone held by another install (TXT challenge), redirects, port maps
Files — browse, read/write, move/copy/rename/delete, compress/extract
Databases — MySQL, MongoDB, MSSQL, and PostgreSQL: create/delete DBs and users, privileges, browse/edit rows or documents, backups
PHP / SSL / System — available PHP (lsphp) versions, Let's Encrypt/self-signed/uploaded certificates, WAF on/off, disk usage, log cleanup, account settings
Supervisor / Crontab — manage long-running processes and scheduled jobs
asdf — language runtime version management
Git integrations — connect GitHub/GitLab/Bitbucket, browse repos, manage per-app deploy webhooks
Managed WordPress — full install, status/event history, cache mode and purge, security status, XML-RPC toggle, admin password reset, one-time wp-admin login
Resource monitoring / notifications — resource status, current-cycle bandwidth use
storage.bd — backup config and job status
cPanel import — discover and import sites from a cPanel server over SSH
Shell — run a command in the account's container and get its exit code and output, with your approval for every command (see Security notes)
What it deliberately does not do: start a local file backup or restore. Those need a live browser connection for progress; use ECP's own web UI.
Related MCP server: cPanel MCP Server
Requirements
Node.js 18+
An ECP hosting account (username + password)
Some tools need a recent ECP:
ecp_shell_execand cPanel import need ECP 2.0.3+, DNS claim needs 2.0.4+, and theecp_apps_git_*tools,ecp_files_upload_limitandecp_resource_bandwidth_usageneed 2.0.5+ (bandwidth also needs EHM 2.0.8+). On an older ECP these tools return a 404 error.For
ecp_shell_exec: an MCP client that supports elicitation (form mode)
Install
npx ecp-mcp-serveror install globally:
npm install -g ecp-mcp-serverYou don't need to do either manually if you're adding it to an MCP client below — the client runs it for you.
Configure
This server is configured entirely through environment variables — no config file needed. See .env.sample for the full list. The essentials:
Variable | Required | Description |
| yes | Your ECP instance's own API base URL, e.g. |
| yes | The hosting account to log in as. One server instance manages one account. |
| yes | That account's password. |
| no |
|
| no | Dev-only escape hatch for a self-signed ECP instance. Never set this for a real account — see the comment in |
Use it
Claude Code
claude mcp add ecp-mcp-server \
--scope user \
-e ECP_API_BASE_URL=https://yourdomain.com:2324/api \
-e ECP_ACCOUNT_USERNAME=youraccount \
-e ECP_ACCOUNT_PASSWORD=yourpassword \
-- npx ecp-mcp-serverRestart Claude Code (MCP servers load at session start), then just ask — "list my apps," "check disk usage," "show me the last few notifications."
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"ecp": {
"command": "npx",
"args": ["ecp-mcp-server"],
"env": {
"ECP_API_BASE_URL": "https://yourdomain.com:2324/api",
"ECP_ACCOUNT_USERNAME": "youraccount",
"ECP_ACCOUNT_PASSWORD": "yourpassword"
}
}
}
}Other MCP clients
This is a standard stdio MCP server (@modelcontextprotocol/sdk) — any compliant client can spawn npx ecp-mcp-server with the env vars above and use it.
Security notes
Worth understanding before you point this at an account you care about:
Scope: one server instance = one hosting account, authenticated exactly as that account (same permissions, same rate limits as logging into ECP's web UI yourself). It cannot reach any other account.
Destructive/security-sensitive actions require
confirm: trueas an explicit tool argument (dropping a table, deleting a file, granting privileges, etc.) — this makes the intent unambiguous in both your MCP client's approval prompt and the audit log below. Don't run this with your client's "auto-approve all tools" setting on.Local audit log: every tool call is appended to a local file (
ECP_MCP_AUDIT_LOG_PATH, defaults toaudit.lognext to the installed package) with secrets redacted — since ECP itself doesn't currently keep a durable record of actions taken this way.Credentials live only in the environment variables you provide and in-process memory — never written to disk beyond what you configure.
Shell commands need your approval for each command.
ecp_shell_execruns a command as the account user, with the same reach as ECP's browser terminal. Before anything runs, the server shows you the exact command through an MCP elicitation prompt. Declining runs nothing. Theconfirm: truepattern above isn't enough here, because the AI fills in that argument itself and could be steered by text it reads. If your client can't show elicitation prompts, the tool refuses to run. Commands are non-interactive and are killed after their timeout (max 300s). Every command is recorded in the audit log.
Development
git clone https://github.com/EpicLabs23/ecp-mcp-server.git
cd ecp-mcp-server
npm install
cp .env.sample .env # fill in your own values
npm run build
npm run inspect # opens the MCP Inspector to test tools manuallyLicense
MIT
Available Tools
194 toolsecp_apps_create_from_gitA
Create an app by cloning a git repo. Either set provider+repo_full_name (clone via a connected git account, see ecp_git_* tools) or repo_url (+ optional repo_username/repo_password for a private repo). Note: the clone runs in the background - this tool returns once the clone STARTS, not once it finishes. For a large repo, check ecp_apps_directory_tree afterward before assuming the files are all there.
Inputs: app_dir (required), app_name (required), branch, provider, +5 more.
ecp_apps_create_from_uploadC
Register an app whose files were already uploaded to app_dir.
Inputs: app_dir (required), app_name (required), domain, deploy_type.
ecp_apps_deleteA
Delete an app: stops its supervisor process (if any) and removes its files. Irreversible.
Inputs: id (required), confirm (required).
ecp_apps_deploy_stepB
Run one step of an app's deploy lifecycle. action='start'|'stop'|'restart'|'remove' manage the app's supervisor process and return a real result. action='install'|'build' run a command in the background via app_root_directory (install_command/build_command) but this tool CANNOT show you their output - check ecp_apps_tail_logs or the app's own state afterward. action='configure' pins an asdf runtime version (stack_version) for the app and also returns no output.
Inputs: action (required), app_name (required), app_root_directory (required), app_id, +6 more.
ecp_apps_directory_treeB
Browse the account's directory tree (used to pick a location for a new app, or to sanity-check where a git clone landed).
Inputs: directory.
ecp_apps_flush_logsB
Clear an app's supervisor-managed process log.
Inputs: app_name (required).
ecp_apps_getA
Get one app's details by id.
Inputs: id (required).
ecp_apps_listB
List all apps on this hosting account.
Inputs: no named parameters.
ecp_apps_save_custom_commandB
Save a named custom command for an app (does not run it - see the blocked command-execution phase in the plan for why 'run' isn't exposed yet).
Inputs: app_id (required), commands (required).
ecp_apps_tail_logsC
Tail an app's supervisor-managed process log (only meaningful after a 'start' deploy step).
Inputs: app_name (required), byte_count.
ecp_apps_update_domainC
Point an app at a domain: creates the nginx server block and updates the app's domain record.
Inputs: id (required), domain (required).
ecp_apps_update_static_domainB
Point a static-site app at a domain: creates the nginx static block and updates the app's domain record.
Inputs: id (required), domain (required).
ecp_asdf_installA
Install a plugin version (takes time). This tool cannot show install output - check ecp_asdf_list_installed_versions afterward to confirm it succeeded.
Inputs: name (required), confirm (required), version (required).
ecp_asdf_list_all_versionsC
List all available versions for a plugin (e.g. nodejs).
Inputs: name (required).
ecp_asdf_list_installed_versionsC
List installed versions for a plugin.
Inputs: name (required).
ecp_asdf_plugin_listA
List asdf plugins currently installed on this account's container.
Inputs: no named parameters.
ecp_asdf_plugin_list_allB
List all asdf plugins available to install (e.g. nodejs, python, ruby).
Inputs: no named parameters.
ecp_asdf_set_globalC
Set the global default version for a plugin.
Inputs: name (required), version (required).
ecp_asdf_uninstallA
Uninstall a plugin version. Breaks anything still configured to use it. This tool cannot show output - check ecp_asdf_list_installed_versions afterward.
Inputs: name (required), confirm (required), version (required).
ecp_backup_list_snapshotsA
List local restic snapshots of this account's host paths (separate from storage.bd's own backups).
Inputs: no named parameters.
ecp_crontab_addA
Schedule a cron job. cron_expression is a standard 5-field schedule (e.g. '0 3 * * *'). The command runs unattended, repeatedly, as this account's own system user - review carefully before confirming.
Inputs: command (required), confirm (required), cron_expression (required).
ecp_crontab_listB
List this account's scheduled cron jobs.
Inputs: no named parameters.
ecp_crontab_removeA
Remove a scheduled cron job. Must match an existing entry's cron_expression and command exactly (see ecp_crontab_list).
Inputs: command (required), confirm (required), cron_expression (required).
ecp_db_connection_infoA
Get the static host/port connection info for each database engine, for apps running in this account's own container.
Inputs: no named parameters.
ecp_db_services_statusA
Check whether Postgres/MSSQL/Mongo are enabled/configured/reachable for this account (MySQL is always available - it's EHM's own DB engine, not an optional one).
Inputs: no named parameters.
ecp_dns_add_recordC
Add a DNS record to a domain's zone.
Inputs: name (required), type (required), domain (required), ttl, +5 more.
ecp_dns_delete_recordA
Delete a DNS record from a domain's zone. record must match the existing record (name/type/content) closely enough for the DNS provider to identify it.
Inputs: domain (required), record (required), confirm (required).
ecp_dns_list_recordsC
List DNS records for a domain's zone.
Inputs: domain (required).
ecp_domains_add_domainC
Add an additional (addon) domain to this account.
Inputs: domain (required), dns_server.
ecp_domains_add_subdomainB
Add a subdomain of a domain this account already owns.
Inputs: domain (required), subdomain (required).
ecp_domains_deleteA
Delete a domain from this account. Cannot delete the primary domain. Irreversible.
Inputs: domain (required), confirm (required).
ecp_domains_list_additionalA
List additional (addon) domains only, excluding the primary domain.
Inputs: no named parameters.
ecp_domains_list_allA
List every domain (primary + additional) on this account.
Inputs: no named parameters.
ecp_domains_remove_redirectB
Remove a domain's redirect.
Inputs: domain (required).
ecp_domains_set_redirectC
Redirect a domain to another URL (e.g. www -> apex).
Inputs: domain (required), redirect_type (required), redirect_target (required).
ecp_files_add_fileC
Create a new empty file.
Inputs: file_name (required), destination (required).
ecp_files_add_folderC
Create a new folder.
Inputs: destination (required), folder_name (required).
ecp_files_change_permissionC
chmod a file (e.g. new_permission: '644').
Inputs: file_name (required), new_permission (required), current_directory (required).
ecp_files_compressC
Compress one or more files/folders into an archive.
Inputs: file_paths (required), output_filename (required), current_directory (required).
ecp_files_copyC
Copy one file/folder to a destination.
Inputs: file_path (required), destination (required).
ecp_files_copy_multipleC
Copy multiple files/folders to a destination.
Inputs: file_paths (required), destination (required).
ecp_files_deleteA
Delete a single file or folder. Irreversible.
Inputs: confirm (required), file_path (required).
ecp_files_delete_multipleC
Delete multiple files/folders. Irreversible.
Inputs: confirm (required), file_paths (required).
ecp_files_directory_treeA
Get the directory tree including files (for browsing/editing, unlike ecp_apps_directory_tree which is folders only).
Inputs: directory, hidden_files.
ecp_files_extractB
Extract an archive into a destination directory.
Inputs: file_path (required), destination (required).
ecp_files_is_directory_existsB
Check whether a directory exists.
Inputs: directory (required).
ecp_files_listC
List files/folders in a directory.
Inputs: directory, hidden_files.
ecp_files_moveC
Move one file/folder to a destination.
Inputs: file_path (required), destination (required).
ecp_files_move_multipleC
Move multiple files/folders to a destination.
Inputs: file_paths (required), destination (required).
ecp_files_readC
Read a text file's content.
Inputs: file_path (required).
ecp_files_renameC
Rename a file or folder within a directory.
Inputs: new_name (required), file_name (required), current_directory (required).
ecp_files_writeB
Overwrite a text file's content (creates it if it doesn't exist). Can break a running app if it's a config/env/source file - review the current content first.
Inputs: confirm (required), file_path (required), file_content (required).
ecp_git_authorize_urlA
Get the OAuth authorize URL to connect a git provider. Open it in a browser to complete the connection - this tool can't complete OAuth itself.
Inputs: provider (required).
ecp_git_disconnect_providerC
Disconnect a connected git provider.
Inputs: confirm (required), provider (required).
ecp_git_list_connectionsA
List this account's connected git accounts.
Inputs: no named parameters.
ecp_git_list_providersA
List git providers (GitHub/GitLab/Bitbucket) enabled for this install.
Inputs: no named parameters.
ecp_git_list_reposA
Browse repos available via a connected git provider (for picking one to deploy from).
Inputs: provider (required), page, search.
ecp_git_webhook_capabilitiesC
Get what webhook features the app's git provider supports.
Inputs: app_id (required).
ecp_git_webhook_createA
Create a deploy webhook for an app: runs commands automatically whenever a matching push arrives. Review each command carefully before confirming.
Inputs: app_id (required), confirm (required), provider (required), commands, +1 more.
ecp_git_webhook_deleteB
Delete an app's deploy webhook. Irreversible.
Inputs: app_id (required), confirm (required).
ecp_git_webhook_deliveriesA
List an app's webhook delivery history (for debugging why a push didn't deploy).
Inputs: app_id (required).
ecp_git_webhook_getB
Get an app's git deploy-webhook config and status.
Inputs: app_id (required).
ecp_git_webhook_rotate_secretC
Rotate an app's deploy-webhook secret (invalidates the old one).
Inputs: app_id (required), confirm (required).
ecp_git_webhook_updateC
Update an app's deploy-webhook branch filter and/or commands. Review each command carefully before confirming.
Inputs: app_id (required), confirm (required), provider (required), commands, +1 more.
ecp_mongo_assign_user_to_databaseA
Grant a MongoDB user readWrite access to a database (both must already belong to this account). MongoDB only supports whole-database readWrite here - no read-only or per-collection grants like MySQL/Postgres. Security-sensitive - review carefully before confirming.
Inputs: confirm (required), db_name (required), db_username (required).
ecp_mongo_backup_to_storage_bdB
Back up a MongoDB database to the account's storage.bd tenant.
Inputs: db_name (required).
ecp_mongo_browse_documentsC
Browse documents in a collection. Connects as the given db_username/password, which must be a user this account owns.
Inputs: db_name (required), password (required), db_username (required), collection_name (required), +5 more.
ecp_mongo_create_collectionC
Create a collection in a database.
Inputs: db_name (required), collection_name (required).
ecp_mongo_create_databaseA
Create a MongoDB database. db_name gets the account's own prefix applied automatically. db_username must already exist (see ecp_mongo_create_user).
Inputs: db_name (required), db_username (required).
ecp_mongo_create_userA
Create a MongoDB user. db_username gets the account's own prefix applied automatically. Grants readWrite on this account's default database - MongoDB here has no read-only role option, unlike MySQL/Postgres's granular privilege grants.
Inputs: password (required), db_username (required).
ecp_mongo_database_sizesA
Get size of each MongoDB database.
Inputs: no named parameters.
ecp_mongo_delete_databaseB
Delete a MongoDB database. Irreversible.
Inputs: confirm (required), db_name (required).
ecp_mongo_delete_documentB
Delete a document, identified by id. Irreversible.
Inputs: id (required), confirm (required), db_name (required), password (required), +2 more.
ecp_mongo_delete_userB
Delete a MongoDB user. Irreversible.
Inputs: confirm (required), db_username (required).
ecp_mongo_drop_collectionA
Drop (delete) a collection entirely. Irreversible.
Inputs: confirm (required), db_name (required), collection_name (required).
ecp_mongo_insert_documentC
Insert a document into a collection.
Inputs: confirm (required), db_name (required), document (required), password (required), +2 more.
ecp_mongo_list_collectionsA
List collections in a database (metadata only, no document data).
Inputs: db_name (required).
ecp_mongo_list_databasesA
List this account's MongoDB databases.
Inputs: no named parameters.
ecp_mongo_list_usersB
List additional MongoDB users on this account.
Inputs: no named parameters.
ecp_mongo_restore_from_storage_bdA
Restore a MongoDB database from a storage.bd snapshot, overwriting its current content. Irreversible.
Inputs: confirm (required), db_name (required), snapshot_id (required).
ecp_mongo_update_documentC
Update a document, identified by id.
Inputs: id (required), values (required), confirm (required), db_name (required), +3 more.
ecp_mongo_update_user_passwordC
Change a MongoDB user's password.
Inputs: password (required), db_username (required).
ecp_mssql_backup_to_storage_bdC
Back up a MSSQL database to the account's storage.bd tenant.
Inputs: db_name (required).
ecp_mssql_browse_rowsC
Browse rows in a table. Connects as the given db_username/password, which must be a user this account owns.
Inputs: db_name (required), password (required), table_name (required), db_username (required), +5 more.
ecp_mssql_change_database_ownerC
Change a database's owning user (both must already belong to this account).
Inputs: db_name (required), db_username (required).
ecp_mssql_create_databaseA
Create a MSSQL database. db_name gets the account's own prefix applied automatically. Creates the login together with the database.
Inputs: db_name (required), password (required), db_username (required).
ecp_mssql_create_database_userB
Create an additional MSSQL user. db_username gets the account's own prefix applied automatically.
Inputs: password (required), db_username (required).
ecp_mssql_database_sizesA
Get size of each MSSQL database.
Inputs: no named parameters.
ecp_mssql_delete_databaseB
Delete a MSSQL database. Irreversible.
Inputs: confirm (required), db_name (required).
ecp_mssql_delete_rowC
Delete a row from a table, identified by primary_key. Irreversible.
Inputs: confirm (required), db_name (required), password (required), table_name (required), +2 more.
ecp_mssql_delete_userB
Delete a MSSQL user. Irreversible.
Inputs: confirm (required), db_username (required).
ecp_mssql_drop_tableC
Drop (delete) a table entirely. Irreversible.
Inputs: confirm (required), db_name (required), table_name (required).
ecp_mssql_grant_privilegesA
Grant privileges to a user on a database. Note: MSSQL's privilege model here is coarser than MySQL/Postgres - only these 5 DML permissions, applied schema-wide (SCHEMA::dbo), not per-table. Security-sensitive - review carefully before confirming.
Inputs: confirm (required), db_name (required), privileges (required), db_username (required).
ecp_mssql_insert_rowC
Insert a row into a table.
Inputs: values (required), confirm (required), db_name (required), password (required), +2 more.
ecp_mssql_list_columnsA
List a table's columns (metadata only, no row data).
Inputs: db_name (required), table_name (required).
ecp_mssql_list_databasesB
List this account's MSSQL databases.
Inputs: no named parameters.
ecp_mssql_list_db_usersB
List additional MSSQL users on this account.
Inputs: no named parameters.
ecp_mssql_list_privilegesA
List a MSSQL user's privileges on a database. Note: MSSQL's privilege model here is coarser than MySQL/Postgres - only these 5 DML permissions, applied schema-wide (SCHEMA::dbo), not per-table.
Inputs: db_name (required), db_username (required).
ecp_mssql_restore_from_storage_bdA
Restore a MSSQL database from a storage.bd snapshot, overwriting its current content. Irreversible.
Inputs: confirm (required), db_name (required), snapshot_id (required).
ecp_mssql_revoke_privilegesA
Revoke privileges from a user on a database. Note: MSSQL's privilege model here is coarser than MySQL/Postgres - only these 5 DML permissions, applied schema-wide (SCHEMA::dbo), not per-table.
Inputs: confirm (required), db_name (required), privileges (required), db_username (required).
ecp_mssql_table_sizesC
Get size of each table in a MSSQL database.
Inputs: db_name (required).
ecp_mssql_truncate_tableB
Delete all rows from a table. Irreversible.
Inputs: confirm (required), db_name (required), table_name (required).
ecp_mssql_update_rowC
Update a row in a table, identified by primary_key.
Inputs: values (required), confirm (required), db_name (required), password (required), +3 more.
ecp_mysql_backup_to_storage_bdB
Back up a MySQL database to the account's storage.bd tenant.
Inputs: db_name (required).
ecp_mysql_browse_rowsB
Browse rows in a table. Connects as the given MySQL user (db_username/password), which must be a user this account owns.
Inputs: db_name (required), password (required), table_name (required), db_username (required), +5 more.
ecp_mysql_change_db_userA
Reassign a database to be owned by a different MySQL user (both must already belong to this account).
Inputs: db_name (required), db_username (required).
ecp_mysql_create_databaseA
Create a MySQL database. db_name gets the account's own prefix applied automatically.
Inputs: db_name (required), db_username.
ecp_mysql_create_db_userB
Create an additional MySQL user. db_username gets the account's own prefix applied automatically.
Inputs: password (required), db_username (required).
ecp_mysql_database_sizesA
Get size (in bytes) of each MySQL database.
Inputs: no named parameters.
ecp_mysql_delete_databaseA
Delete a MySQL database. Irreversible.
Inputs: confirm (required), db_name (required).
ecp_mysql_delete_db_userB
Delete an additional MySQL user. Irreversible.
Inputs: confirm (required), db_username (required).
ecp_mysql_delete_rowA
Delete a row from a table, identified by primary_key. Irreversible.
Inputs: confirm (required), db_name (required), password (required), table_name (required), +2 more.
ecp_mysql_drop_tableB
Drop (delete) a table entirely. Irreversible.
Inputs: confirm (required), db_name (required), table_name (required).
ecp_mysql_export_databaseA
Export a MySQL database as a .sql dump (returned as text - large databases will produce a large result, consider ecp_mysql_backup_to_storage_bd instead for anything beyond a quick look).
Inputs: db_name (required).
ecp_mysql_grant_privilegesA
Grant privileges (e.g. ['SELECT','INSERT']) to a MySQL user on a database. Security-sensitive - review carefully before confirming.
Inputs: confirm (required), db_name (required), privileges (required), db_username (required).
ecp_mysql_import_databaseA
Import a .sql dump into an existing MySQL database, overwriting its content. Irreversible - pass the full SQL as text.
Inputs: confirm (required), db_name (required), sql_content (required).
ecp_mysql_insert_rowC
Insert a row into a table.
Inputs: values (required), confirm (required), db_name (required), password (required), +2 more.
ecp_mysql_list_columnsA
List a table's columns (metadata only, no row data).
Inputs: db_name (required), table_name (required).
ecp_mysql_list_databasesA
List this account's MySQL databases.
Inputs: no named parameters.
ecp_mysql_list_db_usersA
List additional MySQL users on this account (beyond the account's own default user).
Inputs: no named parameters.
ecp_mysql_list_privilegesA
List a MySQL user's privileges on a database.
Inputs: db_name (required), db_username (required).
ecp_mysql_restore_from_storage_bdA
Restore a MySQL database from a storage.bd snapshot, overwriting its current content. Irreversible.
Inputs: confirm (required), db_name (required), snapshot_id (required).
ecp_mysql_revoke_privilegesC
Revoke privileges from a MySQL user on a database.
Inputs: confirm (required), db_name (required), privileges (required), db_username (required).
ecp_mysql_table_sizesB
Get size of each table in a MySQL database.
Inputs: db_name (required).
ecp_mysql_truncate_tableB
Delete all rows from a table. Irreversible.
Inputs: confirm (required), db_name (required), table_name (required).
ecp_mysql_update_rowC
Update a row in a table, identified by primary_key.
Inputs: values (required), confirm (required), db_name (required), password (required), +3 more.
ecp_network_domain_port_mapsB
List port mappings for one domain.
Inputs: domain (required).
ecp_network_port_mapsB
List all port mappings on this account.
Inputs: no named parameters.
ecp_network_update_port_mapsC
Update a port mapping and its nginx config. Can affect site routing.
Inputs: domain (required), host_port (required), guest_port (required), https, +1 more.
ecp_nginx_get_confB
Read the raw nginx config for a domain.
Inputs: domain_name (required).
ecp_nginx_list_domainsA
List domains that have an nginx config on this container.
Inputs: no named parameters.
ecp_nginx_set_confA
Overwrite the raw nginx config for a domain. Malformed content can break the site - verify the config is valid before writing.
Inputs: confirm (required), domain_name (required), file_content (required).
ecp_notifications_clear_allB
Delete all notifications. Irreversible.
Inputs: confirm (required).
ecp_notifications_deleteC
Delete one notification. Irreversible.
Inputs: id (required), confirm (required).
ecp_notifications_listC
List this account's notifications.
Inputs: unread.
ecp_notifications_mark_all_readA
Mark all notifications read.
Inputs: no named parameters.
ecp_notifications_mark_readB
Mark one notification read.
Inputs: id (required).
ecp_oneclick_blueprint_appsB
List available one-click app blueprints (fetched from the public EH blueprints catalog).
Inputs: no named parameters.
ecp_oneclick_create_databaseA
Create a MySQL user + database in one step, for use during a one-click app install. If user creation fails (e.g. already exists), database creation is still attempted - check ecp_mysql_list_db_users/ecp_mysql_list_databases afterward if unsure.
Inputs: db_name (required), db_pass (required), db_user (required).
ecp_oneclick_get_blueprintA
Get a blueprint's definition, including the install commands it expects to run (for you to review/run yourself - see note on why this MCP server doesn't run them automatically).
Inputs: name (required), version (required).
ecp_oneclick_install_wordpressA
Scaffold a WordPress app: creates the app directory, nginx server block, and patches wp-config.php for HTTPS. Does NOT install WordPress itself - see ecp_oneclick_get_blueprint and run its install commands yourself afterward.
Inputs: domain (required), app_dir (required), app_name (required), php_version (required).
ecp_php_get_iniC
Get php.ini values for a PHP version.
Inputs: version (required).
ecp_php_installA
Install a PHP version (apt-get, takes time). This tool cannot show install output - check ecp_php_installed_versions afterward to confirm it succeeded.
Inputs: confirm (required), version (required).
ecp_php_installed_packagesC
List installed PHP extensions for a version.
Inputs: version (required).
ecp_php_installed_versionsA
List PHP versions installed on this account's container.
Inputs: no named parameters.
ecp_php_set_iniB
Overwrite php.ini for a PHP version. Can break every app using that version if malformed.
Inputs: confirm (required), version (required), file_content (required).
ecp_php_uninstallA
Uninstall a PHP version. Breaks any app still configured to use it. This tool cannot show uninstall output - check ecp_php_installed_versions afterward.
Inputs: confirm (required), version (required).
ecp_postgres_backup_to_storage_bdB
Back up a Postgres database to the account's storage.bd tenant.
Inputs: db_name (required).
ecp_postgres_browse_rowsB
Browse rows in a table. Connects as the given db_username/password, which must be a user this account owns.
Inputs: db_name (required), password (required), table_name (required), db_username (required), +5 more.
ecp_postgres_change_database_ownerA
Change a database's owning user (both must already belong to this account).
Inputs: db_name (required), db_username (required).
ecp_postgres_create_databaseA
Create a Postgres database. db_name gets the account's own prefix applied automatically. db_username must already exist (see ecp_postgres_create_database_user).
Inputs: db_name (required), db_username (required).
ecp_postgres_create_database_userA
Create an additional Postgres user. db_username gets the account's own prefix applied automatically.
Inputs: password (required), db_username (required).
ecp_postgres_database_sizesA
Get size of each Postgres database.
Inputs: no named parameters.
ecp_postgres_delete_databaseB
Delete a Postgres database. Irreversible.
Inputs: confirm (required), db_name (required).
ecp_postgres_delete_rowA
Delete a row from a table, identified by primary_key. Irreversible.
Inputs: confirm (required), db_name (required), password (required), table_name (required), +2 more.
ecp_postgres_delete_userC
Delete a Postgres user. Irreversible.
Inputs: confirm (required), db_username (required).
ecp_postgres_drop_tableC
Drop (delete) a table entirely. Irreversible.
Inputs: confirm (required), db_name (required), table_name (required).
ecp_postgres_export_databaseA
Export a Postgres database as a .sql dump (returned as text - large databases will produce a large result, consider ecp_postgres_backup_to_storage_bd instead for anything beyond a quick look).
Inputs: db_name (required).
ecp_postgres_grant_privilegesA
Grant privileges to a user on a database. Applied per-table (all tables in the public schema) plus default privileges for future tables. Security-sensitive - review carefully before confirming.
Inputs: confirm (required), db_name (required), privileges (required), db_username (required).
ecp_postgres_import_databaseA
Import a .sql dump into an existing Postgres database, overwriting its content. Irreversible - pass the full SQL as text.
Inputs: confirm (required), db_name (required), sql_content (required).
ecp_postgres_insert_rowD
Insert a row into a table.
Inputs: values (required), confirm (required), db_name (required), password (required), +2 more.
ecp_postgres_list_columnsB
List a table's columns (metadata only, no row data).
Inputs: db_name (required), table_name (required).
ecp_postgres_list_databasesA
List this account's Postgres databases.
Inputs: no named parameters.
ecp_postgres_list_db_usersA
List additional Postgres users on this account.
Inputs: no named parameters.
ecp_postgres_list_privilegesB
List a Postgres user's privileges on a database. Applied per-table (all tables in the public schema) plus default privileges for future tables.
Inputs: db_name (required), db_username (required).
ecp_postgres_restore_from_storage_bdA
Restore a Postgres database from a storage.bd snapshot, overwriting its current content. Irreversible.
Inputs: confirm (required), db_name (required), snapshot_id (required).
ecp_postgres_revoke_privilegesA
Revoke privileges from a user on a database. Applied per-table (all tables in the public schema) plus default privileges for future tables.
Inputs: confirm (required), db_name (required), privileges (required), db_username (required).
ecp_postgres_table_sizesA
Get size of each table in a Postgres database.
Inputs: db_name (required).
ecp_postgres_truncate_tableB
Delete all rows from a table. Irreversible.
Inputs: confirm (required), db_name (required), table_name (required).
ecp_postgres_update_rowC
Update a row in a table, identified by primary_key.
Inputs: values (required), confirm (required), db_name (required), password (required), +3 more.
ecp_resource_statusA
Get this account's resource/quota status (e.g. disk or CPU pressure, suspension warnings).
Inputs: no named parameters.
ecp_resource_status_dismissC
Dismiss a resource-status warning banner.
Inputs: resource_type (required).
ecp_ssl_apply_certificateA
Apply an already-generated certificate to a domain's nginx config, without regenerating it. Can break HTTPS for that domain if misapplied.
Inputs: domain (required), confirm (required), certificate_name (required).
ecp_ssl_available_certificatesB
List certificates available for a domain (pass certificate_name: 'lets_encrypt' or 'self_signed').
Inputs: domain, certificate_name.
ecp_ssl_request_lets_encryptA
Issue a new Let's Encrypt certificate for a domain (does not apply it to nginx - see ecp_ssl_update_lets_encrypt or ecp_ssl_apply_certificate).
Inputs: domain (required).
ecp_ssl_request_self_signedA
Generate a new self-signed certificate for a domain (does not apply it to nginx).
Inputs: domain (required).
ecp_ssl_update_lets_encryptB
Issue and apply a Let's Encrypt certificate to a domain's nginx config. Can break HTTPS for that domain if it fails partway.
Inputs: domain (required), confirm (required).
ecp_ssl_update_self_signedA
Generate and apply a self-signed certificate to a domain's nginx config. Can break HTTPS for that domain if it fails partway.
Inputs: domain (required), confirm (required).
ecp_storage_bd_get_configA
Get this account's storage.bd backup config (client_id only - the secret is never returned).
Inputs: no named parameters.
ecp_storage_bd_job_statusA
Check whether a storage.bd backup/restore job is currently running for this account.
Inputs: no named parameters.
ecp_storage_bd_set_configA
Set this account's storage.bd backup credentials (client_id as '<tenant_id>.<install_id>', client_secret).
Inputs: confirm (required), client_id (required), client_secret (required).
ecp_supervisor_add_processC
Register a new supervised (auto-restarting) process.
Inputs: name (required), command (required), directory (required), autostart, +1 more.
ecp_supervisor_list_processesA
List all supervised processes on this account.
Inputs: no named parameters.
ecp_supervisor_process_infoA
Get status/info for one supervised process.
Inputs: app_name (required).
ecp_supervisor_remove_processA
Remove a supervised process. Irreversible (config is deleted, not just stopped).
Inputs: confirm (required), app_name (required).
ecp_supervisor_restart_processC
Restart a supervised process.
Inputs: app_name (required).
ecp_supervisor_start_processC
Start a supervised process.
Inputs: app_name (required).
ecp_supervisor_stop_processC
Stop a supervised process.
Inputs: app_name (required).
ecp_system_check_for_updateA
Check whether an ECP/system update is available.
Inputs: no named parameters.
ecp_system_disk_usageC
Get disk, container-temp-file, and database usage/quota for this account.
Inputs: no named parameters.
ecp_system_get_configB
Get this account's ECP config key/values.
Inputs: no named parameters.
ecp_system_set_configC
Update ECP config key/values for this account.
Inputs: config (required), confirm (required).
ecp_system_updateA
Update account/hosting settings (hosting_environment, hosting_version) or ECP password. Requires the account's own current password. Account-wide impact - review carefully.
Inputs: confirm (required), ecp_password (required), hosting_version, hosting_environment.
ecp_whoamiA
Get the profile of the hosting account this MCP server is authenticated as.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 194 tools
Most tools are clearly distinct by resource area and action, and the descriptions carefully call out subtle differences (e.g. ecp_apps_directory_tree vs ecp_files_directory_tree, ecp_ssl_request vs ecp_ssl_update vs ecp_ssl_apply). A few near-duplicates exist—ecp_files_copy vs ecp_files_copy_multiple and ecp_files_move vs ecp_files_move_multiple—but they are rare and understandable.
The ecp_<area>_<verb>_<noun> pattern is followed almost everywhere, making names very predictable. Minor deviations include ecp_network_port_maps (noun-first), ecp_network_domain_port_maps, and ecp_files_is_directory_exists (awkward verb phrase), but these do not undermine the overall uniformity.
194 tools is an extreme count for a single MCP server. Even accounting for the broad hosting-panel domain (files, four database engines, SSL, nginx, git, supervisor, cron, notifications, backups), this volume creates a massive selection surface and will overwhelm agents. The count alone warrants the lowest score.
The tool surface is remarkably comprehensive: apps, domains, DNS, nginx, files, four database engines with user/privilege/backup/restore operations, SSL, supervisor, crontab, asdf, git webhooks, notifications, and storage. The only notable gap is the explicitly blocked ability to run custom commands directly (ecp_apps_save_custom_command mentions 'run' isn't exposed yet), which is a stated intentional limitation rather than an oversight.
Related MCP Connectors
Agent-first web hosting: deploy sites, apps, databases and domains over MCP.
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Skills, agents and memory in the cloud, plus a gateway to your other MCP servers.
Related MCP Servers
AlicenseCqualityBmaintenanceEnables natural language interaction with a Panelica hosting panel to manage domains, SSL, databases, services, and more through any MCP client.404340 npm2MIT- AlicenseAqualityDmaintenanceA complete MCP server enabling AI assistants to manage cPanel hosting through natural language, including file, database, email, subdomain, and system operations.161MIT
- AlicenseBqualityCmaintenanceA 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.10026ISC
- AlicenseCqualityDmaintenanceConnect any MCP-compatible AI agent to the full Hostinger platform. Manage VPS, domains, DNS, hosting, WordPress, email, ecommerce, and more through natural language.1000MIT