Plesk
This Plesk MCP server allows administrators and AI agents to manage Plesk web hosting servers programmatically via API interaction, shell command execution, and file management.
Explore Plesk APIs (
api_list_tags,api_list): Discover and browse available Plesk REST APIs, optionally filtered by tags.Get API Documentation (
api_help): Retrieve detailed usage instructions and expected parameters for any specific Plesk API endpoint.Call Plesk APIs (
api_call): Execute any Plesk REST API call (e.g., managing domains, users, subscriptions, DNS, email, WP Toolkit, etc.) with validated parameters.Execute Shell Commands (
exec): Run shell commands directly on the Plesk server, either in the root context or within a specific subscription's context, with support for environment variables and stdin input.Upload Files (
upload): Upload file content to a temporary location on the Plesk server for use in subsequent operations (e.g., configuration files, scripts).
Additional highlights: supports authentication via API keys or username/password, can manage multiple Plesk servers simultaneously, and runs locally to keep sensitive data within your environment.
Allows administrators to manage their Plesk servers via the Plesk REST API and WP Toolkit REST API, providing capabilities for core administration, shell commands, and file uploads.
Plesk MCP Server
This MCP server for Plesk allows administrators to manage their Plesk servers using various AI agents and apps. It builds on top of Plesk REST API and WP Toolkit REST API, and provides core administration capabilities, as well as ability to manage the server through shell commands and upload files to the server.
The MCP server runs locally on your machine, so important information doesn't leave your environment.
Plesk Requirements
The MCP server is expected to support any sufficiently recent Plesk version (there are no strict limitations) and any OS (Linux or Windows) that Plesk supports. However, it was tested only on Plesk Obsidian 18.0.76, so prefer using a supported Plesk version.
Obviously, API access must not be disabled on the server.
Related MCP server: cPanel MCP Server
MCP Server Requirements
You will need uv Python package manager to run the server. Refer to the official documentation for installation instructions.
Usage
Configure the server in your VS Code mcp.json or equivalent (in other agents or apps) using a configuration like:
{
"servers": {
"plesk": {
"command": "uvx",
"args": [
"plesk-mcp@latest"
],
"env": {
// Base URL of your Plesk server. May include port.
// If you don't have a valid TLS certificate or want to use HTTP,
// add the --insecure flag to the args above.
// However, this is not recommended as you credentials may be leaked as a result.
"PLESK_HOST": "https://plesk.example.net:8443",
// API key (recommended).
// Create via `plesk bin secret_key --create -description 'Plesk MCP'` on the server.
"PLESK_API_KEY": "00000000-0000-0000-0000-000000000000",
// Alternatively, you can use username and password.
"PLESK_USERNAME": "admin",
"PLESK_PASSWORD": "passwd"
}
}
}
}You may want to use env file (e.g. via "envFile" parameter) if your agent or app supports it. This will avoid putting credentials directly in the config file.
See uvx plesk-mcp@latest --help for details on available options and environment variables.
Recommended Usage
For better behavior, it's recommended to use this MCP server in combination with a documentation MCP server. Select either plesk-local-docs-mcp or plesk-remote-docs-mcp. This will allow the agent to get more accurate information about Plesk usage when needed.
You may also attach several Plesk servers at once if needed (e.g. for managing multiple servers).
Here's an example configuration:
{
"servers": {
"plesk-docs": {
"command": "uvx",
"args": [
"plesk-local-docs-mcp@latest"
],
"env": {
"OPENAI_API_KEY": "sk-..."
}
},
"plesk1": {
"command": "uvx",
"args": [
"plesk-mcp@latest"
],
"env": {
"PLESK_HOST": "https://plesk1.example.net:8443",
"PLESK_API_KEY": "00000000-0000-0000-0000-000000000000"
}
},
"plesk2": {
"command": "uvx",
"args": [
"plesk-mcp@latest"
],
"env": {
"PLESK_HOST": "https://plesk2.example.net",
"PLESK_USERNAME": "admin",
"PLESK_PASSWORD": "passwd"
}
}
}
}Development
MCP server run command:
uv run plesk-mcp --log-level debug --insecureBefore commit:
uv run ruff format
uv run ruff check --fix
uv run mypy .
uv run pytestPublish:
uv build --clear
uv publish
mcp-publisher login github
mcp-publisher publishTesting
Using Plesk Docker Image
If you don't have a Plesk instance but want to test this MCP server, you may use Plesk Docker image instead:
docker run -d --rm --tmpfs /tmp --tmpfs /run --tmpfs /run/lock -v /sys/fs/cgroup:/sys/fs/cgroup --cgroupns host -p 80:80 -p 443:443 -p 8880:8880 -p 8443:8443 --name plesk plesk/pleskThe Docker image startup is not instant, so give it a minute or so before trying to connect.
And then configure the MCP server as:
{
"servers": {
"plesk": {
"command": "uvx",
"args": [
"plesk-mcp@latest",
"--insecure"
],
"env": {
"PLESK_HOST": "https://localhost:8443",
"PLESK_PASSWORD": "changeme1Q**"
}
}
}
}Without Plesk Server (Demo Mode)
Alternatively, run in demo mode from sources (with mocked responses):
{
"servers": {
"plesk": {
"command": "uv",
"args": [
"run",
"plesk-mcp"
],
"env": {
"PLESK_HOST": "https://linux.demo.example.net",
"PLESK_API_KEY": "-"
}
}
}
}Automated tests
Unit tests run with uv run pytest (in the project root and in each sub-project). Smoke tests that exercise real services are skipped by default and selected via -m smoke:
# Plesk MCP smoke tests (against a reachable Plesk instance, e.g. from the Docker image described above)
PLESK_HOST=https://localhost:8443 PLESK_PASSWORD='changeme1Q**' PLESK_INSECURE=1 \
uv run pytest -m smokeAvailable Tools
6 toolsapi_callA
Call Plesk API. Do not use any preconceived notions about how to use Plesk API. Instead validate usage with api_help tool.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the API to call. List available with api_list tool. | |
| params | Yes | API call parameters. MUST check expected schema with api_help tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It fails to disclose behavioral traits like whether it is read-only, error handling, or rate limits, only directing to api_help for parameter validation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's generic nature and lack of output schema, the description adequately directs to helper tools for details but lacks behavioral context and return value description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already describes both parameters (name and params). The description adds value by directing to api_list for names and api_help for parameter schema, supplementing the schema coverage of 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states its function: 'Call Plesk API.' It also warns against preconceived notions and directs to api_help, distinguishing it from sibling tools like api_help and api_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (call Plesk API) and not to use preconceived notions, and instructs to validate with api_help tool, providing clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_helpARead-onlyIdempotent
Explain how to call a specific Plesk API.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the API to describe. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint and idempotentHint. The description reinforces a read-only, idempotent operation (explain), and adds context about Plesk API. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately conveys the tool's purpose with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple help tool with one parameter and an output schema, the description is mostly complete. It could mention what the explanation includes, but the output schema likely covers return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter 'name'. The description adds context about 'Plesk API' but does not significantly extend beyond the schema's 'Name of the API to describe.' Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Explain how to call a specific Plesk API' clearly states the verb (Explain) and resource (specific Plesk API), and distinguishes it from siblings like api_call (which executes) or api_list (which lists APIs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for obtaining help on calling an API, but does not explicitly contrast with when to use api_call, api_list, etc. No exclusions or alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_listBRead-onlyIdempotent
List available Plesk APIs.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and idempotent. Description adds no additional behavioral detail (e.g., no mention of rate limits or data shape). This is acceptable given annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is efficient and front-loaded. Could add relevant detail without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple list tool with output schema and annotations; missing description of tags parameter but otherwise complete for a basic operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and description does not explain the 'tags' parameter. The parameter is left ambiguous despite being optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'List available Plesk APIs' with a specific verb and resource. It is distinct from sibling tools like api_call (call API) and api_list_tags (list tags).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., api_list_tags or api_call). Does not mention filtering or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_list_tagsARead-onlyIdempotent
List available Plesk API tags. Start here to explore Plesk APIs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint true. The description does not add further behavioral details beyond confirming a read-only list operation, which is consistent but not additional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, 12 words. Every word serves a purpose, front-loading the function and usage hint. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema, the description is complete. It states what the tool does and its role as an entry point.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema coverage, the baseline is 4. The description does not need to add parameter information, and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List available Plesk API tags' with the added directive 'Start here to explore Plesk APIs' clearly states the tool's function and distinguishes it from siblings like api_list (which likely lists APIs) and api_call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Start here to explore Plesk APIs' provides a clear context for when to use this tool, though it lacks explicit exclusions or alternatives. However, given the tool's simplicity, this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execA
Executes a command on the Plesk server and returns the result.
The command CWD is the home directory of the user
(e.g. /root for root user, or /var/www/vhosts/example.com for a subscription user).
This tool will reject long commands. Keep the total length of the command, stdin, and env vars under about 740 characters.
This tool will fail for subscriptions with no or chrooted shell access (chrootsh).
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | Command to execute. Don't use `bash` wrapper if it is not required for proper operation. NEVER use `bash -lc` for root context to avoid printing banner. ALWAYS use `bash -lc` when running in subscription context to ensure proper environment setup. | |
| subscription | No | ||
| stdin | No | ||
| env | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses key behaviors: command execution, CWD, length limit, and failure for restricted shell access. However, it does not mention security implications, output format details, or timeout behavior, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with two main sentences followed by targeted caveats. Every sentence adds specific, actionable information. It is well-structured and easy to scan, avoiding unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description does not need to detail return values. It covers essential execution context (CWD, length limits, failure cases) for a command execution tool. While more details on parameter interactions would help, the description is sufficiently complete for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only 'command' has a detailed description). The description adds value by explaining CWD, length limits, and shell access constraints, but does not detail the 'subscription', 'stdin', or 'env' parameters. It partially compensates for the low schema coverage but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool executes a command on the Plesk server and returns the result, providing a specific verb and resource. However, it does not explicitly differentiate from sibling tools like api_call or upload, though the distinct function is obvious from context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical usage constraints such as CWD behavior (e.g., '/root' for root user), a character limit of ~740 characters, and failure conditions (no or chrooted shell access). It does not explicitly state when to use this tool versus alternatives, but the constraints themselves guide appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uploadA
Uploads a file with the given content to the Plesk server and returns the file path.
The file will be uploaded to a temporary location returned by this tool and can be used in subsequent commands.
The file is uploaded as 0600 psaadm:psaadm, so make sure to set proper permissions and ownership after moving it.
For example, subscription files should typically have 0644 $user:psacln. Make sure to set both.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Content of the file to upload. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses key behaviors: temporary location, ownership/permissions (0600 psaadm:psaadm), and need to set proper permissions after moving. It does not mention auth or rate limits, but the side effects are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: three sentences front-loading the purpose, then providing usage and permission details without any wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema exists), the description adequately covers what it does, where the file goes, and follow-up steps. It does not specify file size limits or overwrite behavior, but the core usage is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the single parameter 'content' with a clear description. The tool description adds no extra meaning beyond what is in the schema, earning a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool uploads a file to the Plesk server and returns the file path. The verb 'uploads' and resource 'file' are specific, and the tool is distinct from siblings like api_call or exec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context: the file is uploaded to a temporary location and can be used in subsequent commands, with notes on permissions. However, it does not explicitly compare to alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct purpose: API exploration (api_list, api_list_tags, api_help), API invocation (api_call), command execution (exec), and file upload (upload). No overlapping functionality.
All tool names use lowercase with underscores where needed (api_call, api_list, api_list_tags, api_help, exec, upload). The pattern is predictable: API tools prefixed with 'api_', and standalone verbs for other actions.
With 6 tools, the server covers essential operations for Plesk management: API discovery, API calls, shell commands, and file uploads. The count is well-scoped, not excessive or sparse.
The tool surface covers API interaction and server operations thoroughly. A minor gap is the lack of a download tool, but exec can be used to retrieve files, so agents can work around it.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage HepCloud (Turkish cloud) servers and managed PostgreSQL from your AI assistant. OAuth 2.1.
Manage Laravel Forge servers, sites, and deployments from your AI assistant.
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
European cloud hosting. Deploy and manage apps with your favorite AI coding assistant.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to manage Plesk hosting environments through a set of standardized tools for security, health monitoring, DNS, email, backups, and service management.MIT
- AlicenseAqualityDmaintenanceA complete MCP server enabling AI assistants to manage cPanel hosting through natural language, including file, database, email, subdomain, and system operations.161MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage WHM hosting accounts and server administration tasks including account management, server stats, updates, SSL, backups, and email through a secure API.10
- FlicenseBqualityCmaintenanceA comprehensive MCP server for managing cPanel hosting accounts through AI assistants. It supports DNS, email (DKIM/SPF), databases, domains, SSL, PHP, cron jobs, security, Git deployment, and more.10018
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/FlayedOne/plesk-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server