pterodactyl-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PTERODACTYL_API_KEY | Yes | The Client API key (ptlc_...) from the Pterodactyl panel. Never logged, never audited, never included in an error message. | |
| PTERODACTYL_AUDIT_LOG | No | Path to the append-only JSONL audit trail. Relative paths are resolved against the process's working directory. Default: ~/.pterodactyl-mcp/audit.jsonl. | ~/.pterodactyl-mcp/audit.jsonl |
| PTERODACTYL_PANEL_URL | Yes | Panel base URL, e.g. https://panel.example.com. No trailing slash, no /api/client suffix — that's appended internally. Must be http:// or https://. | |
| PTERODACTYL_READ_ONLY | No | When true, every mutating tool refuses outright. Recommended for the day-to-day profile. Default: false. | false |
| PTERODACTYL_ALLOW_KILL | No | The kill power signal refuses unless this is true (risks world corruption — it does not save before terminating). Default: false. | false |
| PTERODACTYL_AUTO_BACKUP | No | Take a backup automatically before any file write, file delete, or kill; abort the operation if the backup fails. Default: true. | true |
| PTERODACTYL_ALLOW_DELETE | No | File and backup deletion refuse unless this is true. Default: false. | false |
| PTERODACTYL_MAX_MUTATIONS | No | Mutating tool calls allowed per process lifetime; refuses once exhausted. Restart the process to reset the budget. Default: 20. | 20 |
| PTERODACTYL_DEFAULT_SERVER | No | Server short identifier (e.g. 1a2b3c4d) used when a tool call omits its server argument. | |
| PTERODACTYL_MAX_READ_BYTES | No | Default largest file ptero_read_file will return; refuses larger files. Default: 524288 (512 KiB). Per-call max_bytes can override, hard-capped at 4194304. | 524288 |
| PTERODACTYL_ALLOWED_SERVERS | No | Comma-separated allowlist of server short IDs a mutating call may target. If unset and PTERODACTYL_DEFAULT_SERVER is also unset, the guard fails closed: every mutating call is refused. | |
| PTERODACTYL_PROTECTED_PATHS | No | Comma-separated glob patterns that write/delete tools refuse to touch. Default: world/**, world_nether/**, world_the_end/**, server.properties, ops.json, whitelist.json, banned-*.json. Setting to empty string does not disable protection. | world/**, world_nether/**, world_the_end/**, server.properties, ops.json, whitelist.json, banned-*.json |
| PTERODACTYL_UNPROTECTED_PATHS | No | Comma-separated globs carved back out of PTERODACTYL_PROTECTED_PATHS. A path that matches one of these is not refused by the protected-path check. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ptero_list_serversA | List the game servers this Pterodactyl API key can access, with their short identifiers, node, primary allocation and resource limits. Use this first when you do not already know a server identifier, or when a call fails with "not found" — every other ptero_* tool takes that identifier as its This does NOT report whether a server is running: Results are paginated by the panel (50 per page). Pass |
| ptero_get_serverA | Get the full configuration of one server: name, node, panel lifecycle status, resource limits, feature limits, every network allocation (ip/port/notes, and which is primary), SFTP host and port, Docker image and the resolved startup command. Use this to answer "how is this server configured", "what ports does it have", "how much memory is it allowed", or "what is it running". This is static configuration. It does NOT tell you whether the server is up or what it is currently consuming — use ptero_get_server_resources for that. For the ports alone, ptero_list_allocations is narrower. Note that a port being allocated does not mean a service actually bound to it; confirm that in the console log or the relevant plugin config file. |
| ptero_get_server_resourcesA | Get the live power state and current resource usage of a server: whether it is running, memory and disk in use, CPU percentage, network bytes in and out, and process uptime. Use this to answer "is the server up?", "what is the memory doing?" or "how long has it been up?". This is the tool that reports running vs offline — ptero_get_server reports panel lifecycle status, which is a different thing. Figures are cached by the panel for about 20 seconds, so calling repeatedly in quick succession returns identical numbers; that is the cache, not a frozen server. |
| ptero_get_console_logA | Connect to the server's live console websocket and return the backlog it hands back on connect (the node's ring buffer, ~150 most recent lines by default) plus whatever new lines stream in during the collection window, then disconnect. Pterodactyl has no "give me the last N lines" request over REST — this websocket round trip is the only way to read console output, and what you get is a live snapshot, not a query over history. The buffer rolls over quickly: roughly an hour after boot the plugin startup lines are already gone from it. For boot-time or plugin-load output, use After calling
|
| ptero_send_console_commandA | Send a command to the server console via the panel's command endpoint (the panel forwards it to the running process). This confirms DISPATCH ONLY — it does NOT return the command's output. Wings does not correlate console output with the command that produced it, so there is no request/response shape to report here, faked or otherwise: the output is asynchronous. Call ptero_get_console_log immediately afterwards (a window_seconds of 3-5 is usually enough) to read what the command did. Do not use this to stop, restart or kill the server. A command like The panel answers with HTTP 502 when the target server is offline, since console commands require a running server — that is reported back as an actionable error telling you to start the server with ptero_set_power_state first. |
| ptero_list_filesA | List one directory on the game server, relative to the server root. Returns each entry's name, full server-relative Use this to find out what is actually on disk before reading or changing anything: which plugins are installed ( The This is not recursive: it lists one level. To go deeper, call it again with a child directory's |
| ptero_read_fileA | Read a text file from the game server, relative to the server root. Returns the contents plus the file size. THIS IS THE WAY TO GET FULL BOOT-TIME OUTPUT. Read Other good uses: plugin configuration ( Size guard: the tool first checks the size in the directory listing and REFUSES to fetch anything larger than Binary files (jars, region files, images) are not readable this way; use ptero_list_files to inspect them by size and date instead. |
| ptero_write_fileA | Write a text file on the game server. The body you pass REPLACES the file entirely — this is not an append and not a patch. There is no partial write. ALWAYS call ptero_read_file on the same path first and build the new content from what is actually there. Writing a config from memory silently drops every setting you did not happen to include. Creating a NEW file runs immediately. OVERWRITING an existing file is treated as destructive: the first call returns status "needs_confirmation" with a preview (path, current size, new size) and a confirmation_token, and an automatic backup is taken before the write actually happens. Show that preview to the human and only call again with the token once they have agreed. Protected paths (PTERODACTYL_PROTECTED_PATHS — by default the world directories, server.properties, ops.json, whitelist.json and banned-*.json) are refused outright. The file content itself is never written to the audit log; only its sha256 and length are. |
| ptero_upload_fileA | Upload a file from the machine running this MCP server to the game server, BYTE FOR BYTE. This is the tool for binaries — plugin jars, zips, datapack archives, images, region files — anything ptero_write_file cannot carry because that tool is text-only and would corrupt non-UTF-8 bytes. You pass a PATH, not content: It uploads exactly one file and does not unpack anything: a Creating a NEW remote file runs immediately. OVERWRITING an existing one is destructive: the first call returns status "needs_confirmation" with a preview (remote path, current size, new size) and a confirmation_token, and an automatic backup is taken before the upload happens. Show that preview to the human and only call again with the token once they have agreed. Protected paths (PTERODACTYL_PROTECTED_PATHS) are refused outright, and files larger than 64 MiB are refused before anything is read or sent. VERIFY AFTERWARDS. The panel hands out a short-lived signed URL and the node answers the upload with an empty 200 — that confirms receipt and nothing more. It does not tell you the file landed at the size you sent, and it never tells you whether the server will accept it. Call ptero_list_files on The file content is never written to the audit log — only its sha256 and length — and neither is the signed upload URL. |
| ptero_rename_fileA | Rename a file or directory — and, because This is the safe way to take a plugin or config out of service: rename it rather than deleting it, and it can be renamed back. Prefer this over ptero_delete_file whenever the change might need undoing. Both the source and the destination are checked against PTERODACTYL_PROTECTED_PATHS, so a rename cannot be used to move something out of a protected directory. No backup is taken (nothing is destroyed) and no confirmation is required, but the call is counted against PTERODACTYL_MAX_MUTATIONS and audited. It does not create directories and it does not overwrite: if |
| ptero_copy_fileA | Duplicate a file or directory in place. THE PANEL CHOOSES THE NAME OF THE COPY — you cannot specify it. Copying The obvious use is a hand-rolled safety net before editing a config: copy it, then ptero_write_file the original. For anything bigger than a single file, a real backup (ptero_create_backup) is better — it is off-server and restorable. The source path is checked against PTERODACTYL_PROTECTED_PATHS. No confirmation and no automatic backup (nothing is overwritten), but the call is counted against PTERODACTYL_MAX_MUTATIONS and audited. Note the copy consumes disk quota. |
| ptero_delete_fileA | Permanently delete one or more files or directories. THIS IS IRREVERSIBLE WITHOUT A BACKUP — the panel has no trash and no undo. Deleting a directory deletes everything under it. Prefer ptero_rename_file (rename it out of the way) whenever the change might need undoing. Every guardrail applies:
The first call does NOT delete anything. It returns status "needs_confirmation" with a preview listing the root, the exact files and the count, plus a single-use token that expires in 120 seconds. THAT PREVIEW IS FOR THE HUMAN: put it in your reply, let them read the list, and only call again with the confirmation_token once they have said yes. Do not round-trip the token automatically — the whole point is that a person sees what is about to be destroyed. Use dry_run=true if you only want to check what a delete would resolve to. |
| ptero_set_power_stateA | Send a power signal to the server.
Power actions are rate-limited to one per 30 seconds regardless of signal, to stop restart loops — a second power call inside that window is refused, naming how long to wait. Set |
| ptero_list_backupsA | List a server's backups: uuid, name, size, whether each one completed successfully, whether it is locked against deletion, and its created/completed timestamps. Use this to find a rollback point before or after a risky change, or to check whether a backup started with |
| ptero_create_backupA | Take a backup of the server right now. Safe. The natural thing to do BEFORE any file write, delete, or power kill — it gives you a rollback point. By default ( The panel enforces a per-server backup-count limit; creation fails with an actionable error when the server is full — the fix is |
| ptero_delete_backupA | Permanently delete one backup. IRREVERSIBLE — there is no undo and no confirmation from the panel beyond this tool. Requires |
| ptero_get_backup_download_urlA | Get a signed, short-lived URL for downloading one backup archive directly from storage. Use this when the human wants to pull a backup down outside the panel. The URL grants access to the archive to whoever holds it, expires quickly, and is never written to the audit log — treat it as a bearer credential: do not store it, paste it into a chat log you will keep, or reuse it after it expires (request a fresh one instead). |
| ptero_list_schedulesA | List a server's scheduled tasks (the panel's Schedules feature): cron timing, whether each is active or currently running, whether it only fires while the server is online, last/next run time, and the ordered tasks each run executes (command/power/backup, with their payload and delay). Use this to find out what automation is already configured — e.g. a nightly restart or an automatic backup — before assuming a state change was manual, or before adding a new schedule by hand through the panel to avoid a clash. This is read-only: creating, editing, or deleting schedules is not exposed by this server. Use the panel UI for that. |
| ptero_list_allocationsA | List the network allocations (ip:port pairs) assigned to this server, and which one is the default/primary. Use this to find out which port a particular service is meant to use — for example, which port Geyser/Bedrock should bind to — before checking whether it actually bound, which you confirm separately via the console log or This is read-only: adding, removing, or repointing allocations is not exposed by this server. |
| ptero_get_startup_variablesA | Get the resolved startup command, the raw (unsubstituted) command template, the Docker image, and every user-viewable egg variable — name, env-var name, description, current and default values, whether it's editable, and its validation rule string. Use this to see how the server is configured to start — e.g. which jar file, memory flags, or Geyser toggle are set — before troubleshooting a boot failure or explaining current configuration. Hidden (non-user-viewable) variables are never returned by the panel and so never appear here. This tool is read-only: it cannot change a variable, and this server does not currently expose a tool that does — that has to be done through the panel UI. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Every tool targets a distinct resource and action: server listing, configuration, live resources, console, power, files, backups, schedules, and startup variables are all cleanly separated. Potentially confusing pairs like ptero_get_server vs ptero_get_server_resources and ptero_get_console_log vs ptero_read_file are explicitly differentiated in their descriptions.
All tools follow a uniform ptero_ prefix followed by a verb_noun pattern (list_servers, get_server, write_file, set_power_state, create_backup, get_backup_download_url). The convention is perfectly consistent across all 20 tools with no mixed styles or vague verbs.
At 20 tools, the server is on the heavy side for its scope, covering server info, power, console, files, backups, schedules, allocations, and startup variables. The count is justified by the breadth of the domain, but it feels dense compared to typical well-scoped servers.
Core workflows are well covered: full file CRUD (list/read/write/upload/rename/copy/delete), backup lifecycle (list/create/delete/download), power control, console read/write, and configuration introspection. However, schedules are read-only with no create/edit/delete, and startup variables and allocations cannot be mutated, leaving notable gaps for agents that need to modify server configuration.