calagopus-mcp
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., "@calagopus-mcp Which servers use the Project Zomboid egg?"
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.
calagopus-mcp
A Model Context Protocol server for a running Calagopus panel — users, servers, nodes, nests and eggs, database hosts, database agent hosts and templates, locations, mounts, roles, backups and system health.
Read-only out of the box. Creating records and changing a server's power state are opt-in, off by default, and every one of them requires an explicit two-phase confirmation.
Built and verified against Calagopus 1.2.0.
What it can do
Ask things like:
"How many servers are on node X, and how much memory is still unallocated?"
"Which servers use the Project Zomboid egg?"
"Find the account for someone@example.com and list what they own."
"Is the panel clock in sync and are all migrations applied?"
"What database agent hosts are configured, and what's left on them?"
Related MCP server: pterodactyl-mcp
Safety
Read side
Property | How it is enforced |
Single-panel. Cannot be redirected to another host. | Tools take API paths; a full URL is rejected, and |
Secrets stay behind. | Values under |
Bounded output. | Responses are summarised by default and hard-capped at |
Write side
Writes are off unless you turn them on, and there are only two switches:
CALAGOPUS_ALLOW_CREATE=true # create nests, locations, nodes, servers, eggs
CALAGOPUS_ALLOW_POWER=true # start / stop / restart / kill ONE serverSix things hold, in layers:
Not registered means not reachable. With both flags off, no mutating tool is advertised at all. There is no tool to call and no error path to argue past — the model simply cannot see one.
Two-phase confirmation on every change. A tool called without
confirm_tokenchanges nothing: it resolves the real target from the panel, renders what would happen, and returns a token. Only a second call carrying that token executes.Tokens are bound to their arguments. A token is a fingerprint of the operation and every argument. A token issued for "stop server A" will not execute "stop server B", or "kill server A", or the same action with an edited limit. It is single-use and expires (5 minutes by default). This is what makes the preview meaningful: what you read is the only thing that token can do.
No bulk anything. Power actions take one server UUID — not a list. The panel does expose
POST /nodes/{node}/servers/poweraccepting{"type": "all"}, i.e. power-cycle every server on a node in one request. This server never calls it; the route is absent from the write allowlist. Restarting five servers means five previews and five confirmations.killis its own tier. It additionally requiresacknowledge_data_loss: true, because it SIGKILLs the container with no graceful shutdown and no world save. The preview says so in capitals.A transport-level allowlist.
client.tswill only POST to nine exact route patterns, checked at the point of request. There is no DELETE or PATCH method on the client at all, so nothing can be deleted or modified — only created, plus power state. A wiring mistake cannot reach a route nobody reviewed.
Every executed mutation is logged to stderr with a timestamp, the operation and the resolved target.
Scope it further with the API key itself: grant only the permissions you want
reachable. The read tools need admin *.read; creates need the matching
*.create; power needs the server permissions control.start, control.stop
and control.restart.
What a change looks like
// 1. No confirm_token — nothing is sent to the panel.
{ "server": "95b3a3a4-...", "action": "stop" }
→ {
"status": "preview_only",
"nothing_was_changed": true,
"action": "STOP server \"Zomboid\" (95b3a3a4-...)",
"target": { "name": "Zomboid", "current_status": "running",
"node": "Integrated Node", "owner": "BerdiiNN" },
"warnings": ["Asks the server to shut down gracefully, ... Players are disconnected."],
"confirm_token": "cfm_...", "token_expires": "..."
}
// 2. Same arguments plus the token — now it happens.
{ "server": "95b3a3a4-...", "action": "stop", "confirm_token": "cfm_..." }
→ { "status": "executed", ... }Setup
npm install && npm run buildCreate an API key in the panel under Account → API Keys and grant it the admin read permissions you want. Then register the server with your client.
Claude Code:
claude mcp add calagopus --env CALAGOPUS_URL=https://panel.example.com --env CALAGOPUS_API_KEY=c7sp_xxx -- node /absolute/path/to/calagopus-mcp/dist/index.jsClaude Desktop / any MCP client, in mcpServers:
{
"mcpServers": {
"calagopus": {
"command": "node",
"args": ["/absolute/path/to/calagopus-mcp/dist/index.js"],
"env": {
"CALAGOPUS_URL": "https://panel.example.com",
"CALAGOPUS_API_KEY": "c7sp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}For running the server or the smoke test by hand, a .env beside package.json
is read at startup (see .env.example). Anything already in the environment
wins, so an MCP client's own config is never overridden by a stale local file.
Environment
Variable | Default | Purpose |
| (required) | Panel base URL. A trailing |
| (required) | API key, |
|
| Per-request timeout. |
|
| Cap on a single tool result. |
|
| Stop redacting secret-looking fields. |
|
| Accept self-signed certificates. Process-wide — use only against a lab panel. |
|
| Register the create tools. |
|
| Register the server power tool. |
|
| How long a confirmation token stays valid. |
Tools
36 read tools, plus 6 write tools when enabled. Start with
calagopus_panel_info.
Orientation
calagopus_panel_info · calagopus_search · calagopus_get_system_health ·
calagopus_list_endpoints · calagopus_get
Users — calagopus_list_users · calagopus_get_user ·
calagopus_get_user_servers · calagopus_get_user_activity ·
calagopus_list_roles · calagopus_get_activity
Servers — calagopus_list_servers · calagopus_get_server ·
calagopus_get_server_resource (allocations, variables, backups, databases,
database_instances, mounts, available_mounts, logs, install_logs)
Nodes — calagopus_list_nodes · calagopus_get_node ·
calagopus_get_node_resource (servers, allocations, available_allocations,
allocation_ips, backups, mounts, capacity, database_hosts,
database_agent_hosts, transfers, system_overview, system_stats, system_logs,
resources) · calagopus_list_locations · calagopus_list_mounts
Nests & eggs — calagopus_list_nests · calagopus_list_eggs ·
calagopus_get_egg · calagopus_get_egg_variables ·
calagopus_get_egg_servers · calagopus_list_egg_repositories ·
calagopus_list_egg_configurations
Databases — calagopus_list_database_hosts ·
calagopus_get_database_host · calagopus_list_database_agent_hosts ·
calagopus_get_database_agent_host ·
calagopus_get_database_agent_host_resource (instances, capacity, config,
system_overview, system_stats) · calagopus_list_database_agent_templates
Backups & SSO — calagopus_list_backup_configurations ·
calagopus_list_system_backup_policies · calagopus_list_oauth_providers ·
calagopus_list_extensions
Create (needs CALAGOPUS_ALLOW_CREATE) — calagopus_create_nest ·
calagopus_create_location · calagopus_create_node ·
calagopus_create_server · calagopus_install_egg_from_repository ·
calagopus_import_egg
Power (needs CALAGOPUS_ALLOW_POWER) — calagopus_server_power
calagopus_create_server previews more than it is asked to: it resolves the
node, egg and owner by name, and checks the egg's declared variables so a
missing required value shows up in the preview rather than as a rejected create.
summary vs full
List tools return a trimmed projection plus a pagination block. Raw panel
records are big — a server inlines its whole node, owner and egg (~15 KB each),
and an egg carries its install script and upstream copy (~13 KB) — so a page of
25 in full detail would be several hundred KB of context. Pass detail: "full"
on a single-record tool when you genuinely need the scripts or every field.
Not covered by a dedicated tool?
calagopus_list_endpoints searches the panel's live OpenAPI document, so it
reflects that panel's version including routes added by extensions. Feed a path
you find into calagopus_get:
calagopus_list_endpoints { filter: "backup-configurations" }
calagopus_get { path: "/api/admin/backup-configurations/<uuid>/stats" }Interpreting errors
Errors come back in-band with a hint. The one worth recognising:
500 … error sending request for url (http://…) — the panel is healthy but could not reach the daemon behind that endpoint. The node or database agent is offline, still booting, or has the wrong URL configured. Panel-stored records (
calagopus_get_node,calagopus_list_servers, …) still read fine; only the livesystem_*,capacity,resources,transfersand log facets need the daemon up.
A 403 names the exact admin permission the key is missing.
Testing
scripts/smoke.mjs connects over real stdio MCP, lists the tools, and calls
every one of them against a live panel — discovering UUIDs from earlier calls so
per-record tools run with real identifiers. It fails if any tool is left
unexercised.
CALAGOPUS_URL=http://localhost:8000 CALAGOPUS_API_KEY=c7sp_xxx npm run smokeFacets that need a wings daemon or database agent are counted as skipped rather than failed when that daemon is unreachable.
scripts/safety.mjs is the suite that matters for the write side. It launches
the server three times — read-only, create-enabled, power-enabled — and asserts
the guard rails: that no mutating tool exists by default, that a dry run changes
nothing, that a token is refused against a different server, a different action,
or on a second use, that kill demands acknowledgement, that no bulk power tool
exists, and that the read-side escape hatch has no method or body argument.
npm run safety # guard rails only, no writes
SAFETY_LIVE=1 npm run safety # also creates a real nest + location, named mcp-safety-*
npm test # both suitesWithout SAFETY_LIVE, the suite performs no writes at all — it stops at
previews. SAFETY_LIVE=1 additionally creates a real nest and location, and
spends one token on a real start to prove replay protection; the records it
creates stay behind, because this server cannot delete them by design. Remove
them from the panel yourself.
Layout
src/
index.ts stdio wiring and conditional tool registration
config.ts environment parsing and validation
client.ts HTTP client, POST allowlist, error typing, hints
confirm.ts two-phase confirmation tokens
format.ts redaction, per-resource projections, size cap
tools/
common.ts shared arg shapes, result rendering, error guard, twoPhase
system.ts users.ts servers.ts nodes.ts eggs.ts databases.ts raw.ts
create.ts create tools (gated on CALAGOPUS_ALLOW_CREATE)
power.ts power tool (gated on CALAGOPUS_ALLOW_POWER)Adding a read resource is normally: a projection in format.ts, and a
registerTool call in the matching tools/*.ts. Adding a write also means
adding its route to POST_ALLOWLIST in client.ts and a case to
scripts/safety.mjs.
License
MIT
Available Tools
36 toolscalagopus_getGET any panel API pathARead-only
Escape hatch: issue a raw authenticated GET against any path on the configured panel and return the JSON verbatim. Use it for endpoints the dedicated tools do not cover — find paths with calagopus_list_endpoints first. Only GET is possible; this server cannot create, modify or delete anything.
Inputs: path (required), query.
calagopus_get_activityGet the panel-wide admin activity logARead-only
Panel-wide admin audit log, most recent first. Optionally scope to one user with user. Requires activity.read.
Inputs: page, user, detail, search, +1 more.
calagopus_get_database_agent_hostGet a database agent hostARead-only
Fetch one database agent host by UUID.
Inputs: database_agent_host (required), detail.
calagopus_get_database_agent_host_resourceGet a database agent host sub-resourceARead-only
Fetch one facet of a database agent host: the database instances running on it, its remaining capacity, its agent config, or live system overview/stats. The instances, capacity and system_* facets need the agent to be reachable.
Inputs: resource (required), database_agent_host (required), page, detail, +2 more.
calagopus_get_database_hostGet a database hostARead-only
Fetch one database host by UUID. Set databases: true to list the databases currently provisioned on it instead.
Inputs: database_host (required), page, detail, search, +2 more.
calagopus_get_eggGet an eggARead-only
Fetch one egg. detail: "full" includes the install script, config files, startup parsing rules and the upstream repository copy — that is ~13 KB, so prefer the summary unless you need the scripts.
Inputs: egg (required), nest (required), detail.
calagopus_get_egg_serversList servers using an eggARead-only
List every server created from one egg. Use this before changing an egg to see the blast radius.
Inputs: egg (required), nest (required), page, detail, +2 more.
calagopus_get_egg_variablesGet an egg's variablesARead-only
List the environment variables an egg declares: name, env var, default value, validation rules, and whether the user may see or edit each one.
Inputs: egg (required), nest (required), page, search, +1 more.
calagopus_get_nodeGet a nodeARead-only
Fetch one node by UUID, including its location and backup configuration.
Inputs: node (required), detail.
calagopus_get_node_resourceGet a node sub-resourceARead-only
Fetch one facet of a node: the servers on it, its allocations (all, free, or just the IPs), backups, mounts, capacity headroom, attached database hosts, in-flight transfers, or live system overview/stats/logs from the wings daemon. The system_* facets require the node to be online.
Inputs: node (required), resource (required), page, detail, +2 more.
calagopus_get_serverGet a serverARead-only
Fetch one server by UUID (full or short), or by external ID. detail: "full" adds the complete egg, node and owner records plus the startup command and every limit.
Inputs: server (required), by, detail.
calagopus_get_server_resourceGet a server sub-resourceARead-only
Fetch one facet of a server: its allocations, egg variables, backups, databases, database instances, mounts, or its console and install logs.
Inputs: server (required), resource (required), page, lines, +3 more.
calagopus_get_system_healthGet system healthARead-only
Health detail: clock offsets against NTP, applied vs pending database migrations, and per-node reachability. Use nodes: true for the node-by-node view.
Inputs: nodes.
calagopus_get_userGet a userARead-only
Fetch one user by UUID, or by the external ID carried over from a billing system or a Pterodactyl/Pelican migration.
Inputs: user (required), by, detail.
calagopus_get_user_activityGet a user's activity logARead-only
Audit trail for one user: logins, server actions, API key use. Requires users.activity.
Inputs: user (required), page, detail, search, +1 more.
calagopus_get_user_serversList a user's serversARead-only
List the servers owned by one user. Answers 'what does this customer actually have' without paging the whole server list.
Inputs: user (required), page, detail, search, +1 more.
calagopus_list_backup_configurationsList backup configurationsARead-only
List backup configurations — the S3 / Restic / PBS / Kopia targets that locations, nodes and servers back up to. Credentials inside them are redacted unless CALAGOPUS_ALLOW_SECRETS is set.
Inputs: page, detail, search, per_page.
calagopus_list_database_agent_hostsList database agent hostsARead-only
List database agent hosts — machines running the Calagopus database agent, which provisions containerised database instances from templates. Shows the agent URL and its memory/disk budget. Requires database-agent-hosts.read.
Inputs: page, detail, search, per_page.
calagopus_list_database_agent_templatesList database agent templatesARead-only
List the templates the database agent provisions instances from: engine type, docker images, and the CPU/memory/disk each instance gets. Requires database-agent-templates.read.
Inputs: page, detail, search, per_page, +1 more.
calagopus_list_database_hostsList database hostsARead-only
List the external database servers the panel hands out user databases on, with their type, public host/port and deployment state. Connection credentials are redacted unless CALAGOPUS_ALLOW_SECRETS is set. Requires database-hosts.read.
Inputs: page, detail, search, per_page.
calagopus_list_egg_configurationsList egg configurationsARead-only
List reusable egg configuration presets (shared startup/stop/script blocks eggs can inherit).
Inputs: page, detail, search, per_page.
calagopus_list_egg_repositoriesList egg repositoriesARead-only
List the git repositories eggs are synced from, and when each last synced. Pass repository to list the eggs available in one of them.
Inputs: page, detail, search, per_page, +1 more.
calagopus_list_eggsList eggsARead-only
List eggs (server templates). Omit nest to get every egg on the panel grouped by nest; pass a nest UUID to page through just that nest's eggs. The summary drops the install script and the upstream repository copy — ask for a single egg with detail 'full' when you need those. Requires eggs.read.
Inputs: nest, page, detail, search, +1 more.
calagopus_list_endpointsList panel API endpointsARead-only
Search this panel's live OpenAPI spec for endpoints. Use it when no dedicated tool covers what you need, then call calagopus_get with the path you find. Reflects the panel's actual version, including routes added by extensions.
Inputs: limit, filter, method.
calagopus_list_extensionsList installed extensionsARead-only
List the backend extensions installed on the panel, with their version and enabled state.
Inputs: no named parameters.
calagopus_list_locationsList locationsARead-only
List the locations nodes are grouped into, with the backup configuration each one inherits.
Inputs: page, detail, search, per_page.
calagopus_list_mountsList mountsARead-only
List host-path mounts that can be attached to eggs, nodes and servers.
Inputs: page, detail, search, per_page.
calagopus_list_nestsList nestsARead-only
List nests — the groups eggs are organised into (Minecraft, Source, Rust, ...). Requires nests.read.
Inputs: page, detail, search, per_page.
calagopus_list_nodesList nodesARead-only
List the wings nodes attached to the panel, with their location, public URL, SFTP endpoint and memory/disk allocation limits. Requires nodes.read.
Inputs: page, detail, search, per_page.
calagopus_list_oauth_providersList OAuth providersARead-only
List configured SSO/OAuth providers and their role mappings. Client secrets are redacted unless CALAGOPUS_ALLOW_SECRETS is set.
Inputs: page, detail, search, per_page.
calagopus_list_rolesList admin rolesARead-only
List roles and the admin/server permission sets they grant. Useful for working out why a user can or cannot do something.
Inputs: page, detail, search, per_page.
calagopus_list_serversList serversARead-only
List game servers across the whole panel. search matches the server name, UUID and owner. Each record names its node, owner, egg and primary allocation. Requires servers.read.
Inputs: page, detail, search, per_page.
calagopus_list_system_backup_policiesList system backup policiesBRead-only
List scheduled panel-wide backup policies and what each one targets (locations, nodes, servers).
Inputs: page, detail, search, per_page.
calagopus_list_usersList panel usersARead-only
List user accounts on the Calagopus panel, newest page first. Use search to match a username, email or name. Requires the users.read admin permission.
Inputs: page, detail, search, per_page.
calagopus_panel_infoPanel overviewARead-only
Start here. Returns the panel version and host, the record counts (users, servers, nodes, eggs, database hosts, ...), and — unless you turn them off — CPU/memory/disk figures and clock/migration health. One call to orient yourself before drilling in.
Inputs: include_health, include_system.
calagopus_searchSearch across the panelARead-only
Search users, servers, nodes and eggs in one call and get the matches side by side. Use this when you have a name, email, IP or partial UUID and do not yet know what kind of thing it is.
Inputs: query (required), limit, types.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Every tool targets a specific resource/action pair; even similar names such as get_database_agent_host and get_database_agent_host_resource are clearly separated by the resource versus resource-facet distinction. With 36 tools, there is no pair that appears to duplicate another.
Tool names overwhelmingly follow a consistent calagopus_ + verb + noun pattern (list_*, get_*). A few exceptions—calagopus_panel_info, calagopus_search, and calagopus_get—break the verb-noun pattern, but they are minor and the overall convention is predictable.
36 tools is above the 25-tool threshold for a focused tool set. While the Calagopus domain is broad, the large number of narrow getters and listers makes the surface heavy and more likely to confuse an agent, even though each tool individually seems justified.
The read-only surface covers most of the panel domain: users, servers, nodes, eggs, locations, mounts, OAuth, roles, activity, backups, and database infrastructure. The raw GET escape hatch plus OpenAPI discovery helps cover edge cases, though a few single-resource getters such as get_mount or get_nest are missing, and there are no mutations by design.
Maintenance
Related MCP Connectors
Manage FadeHost game servers, Discord bots and VPS: console, stats, backups, logs, lifecycle.
Manage Vozora VPS servers, SSH keys, firewalls, DNS and usage from an AI agent.
Manage HepCloud (Turkish cloud) servers and managed PostgreSQL from your AI assistant. OAuth 2.1.
Manage VeriTeknik servers, DNS, backups and support tickets from your AI assistant.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables natural language management of Pebblehost Minecraft servers, including server status, control, console commands, file management, and backups.MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to safely manage Pterodactyl game servers, covering status, console, files, backups, and power operations with built-in guardrails.201MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets AI clients manage game servers hosted on a Calagopus panel: list and inspect servers, read logs and files, edit configs, run console commands and power actions, and search, install, update, or remove plugins and mods from Modrinth and CurseForge. Every action is bounded by the user's panel API key and server permissions, with read-only/destructive hints and token-efficient tool responses.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage, configure, and operate game servers hosted on Pterodactyl panels, including power actions, console commands, file operations, plugin installation, and backups. It also supports Cloudflare challenge bypass and automatic request pacing for reliable panel automation.1MIT