Skip to main content
Glama
fastpanel-mcp

fastpanel-mcp

fastpanel-mcp

Talk to your FastPanel 2 server from Claude, Cursor, or any MCP-compatible client. Create sites, provision databases, attach SSL, harden nginx configs — through natural language, with production-grade safety rails.

License: MIT Node MCP Version

Keywords: FastPanel, MCP, Model Context Protocol, Claude Code, Claude Desktop, server management, hosting automation, nginx, Let's Encrypt, DevOps, LLM ops, AI sysadmin.

Read this in other languages: English · Русский · Українська · Español · Deutsch


What you get

Ask an LLM, get real infra changes on your FastPanel server:

You: "Create a new site foo.example.com under user www-root, PHP 8.4, no database, and attach our wildcard SSL cert. Also enable HTTP/2 and HTTP/3."

LLM (~30 seconds, 5 tool calls later): Site id 53 is live at https://foo.example.com with HTTP/2, HTTP/3, wildcard TLS, and an auto-provisioned HTTPS redirect.

You: "Show me the nginx config for site 1 — check if it blocks .env, .git, and other sensitive paths. If not, add hardening."

LLM: Reads the config, notes that .env and .htaccess are served as static files (security gap), edits the frontend to add deny rules for dotfiles + sensitive extensions + framework files, previews the diff via dry_run, then deploys it. .env now returns 404; .well-known/acme-challenge still works.

You: "What sites are running on this server, who owns them, and which ones don't force HTTPS?"

LLM: Queries sites_list and reports the 5 sites without https_redirect: true.

Related MCP server: MCP CWP Server

Features

  • 39 tools covering sites, email domains & mailboxes, databases (incl. SSH dump/import), users, DNS zones, SSL certificates, system load, queue, site logs, backup plans, host-level diagnostics, file upload/deploy into a site's web root, and raw nginx/apache/php.ini configs.

  • Dual-token safety model. Read operations use a read-only token; mutating operations require a separate write token (FASTPANEL_WRITE_TOKEN). Unset the write token and every write tool fails closed.

  • confirm: true required on every write. Accidental LLM outputs cannot mutate state.

  • dry_run: true previews the exact HTTP body the server would receive — passwords redacted as ***, no network call fired.

  • Compact response mode on sites_list to avoid overflowing LLM context on large panels.

  • stderr audit log for every executed write, with passwords redacted.

  • MCP tool annotations (readOnlyHint / destructiveHint / idempotentHint / openWorldHint) so clients and policy scanners classify each tool correctly instead of treating read-only diagnostics as destructive.

  • nginx -t auto-validation with rollback — site_configuration_update validates the live config after applying and reverts a broken edit automatically when SSH is configured.

  • Tested against a live FastPanel 2 panel with 35+ sites in production.

Why this exists

FastPanel publishes no OpenAPI spec. The endpoints and payload shapes in this server were reverse-engineered from the panel's Angular SPA bundle and live DevTools captures, including non-obvious quirks like:

  • List endpoints require filter[limit]=…&filter[type]=… wrapped params — bare ?limit=… is silently ignored.

  • Site creation is a two-step wizard (POST /api/master/domain probe → PUT /api/master), not a conventional POST /api/sites.

  • The backend field in site configuration is PHP-FPM pool config when handler=php_fpm, but an Apache VirtualHost block when handler=fcgi.

  • SSL attach/detach flows through PUT /api/sites/{id} (site-side) not POST /api/sites/{id}/certificate (there is no such endpoint).

These are documented in the tool descriptions so the LLM doesn't have to rediscover them.

Requirements

  • Node.js 20 or newer

  • A FastPanel 2 installation reachable over HTTPS

  • Root SSH on the panel host to create API tokens (one-time)

Install

git clone https://github.com/iMateo/fastpanel-mcp.git
cd fastpanel-mcp
pnpm install      # or: npm install
pnpm build

Get API tokens

On the FastPanel host (as root), create a read-only token for day-to-day use:

mogwai users tokens add -n mcp-read -s read_only -e 2030-12-31

The CLI binary is /usr/local/fastpanel2/fastpanel; recent FastPanel builds expose it on PATH as mogwai (/usr/local/bin/mogwai → the same binary). Older docs call it fastpanel, which is not on PATH — use mogwai, or the full path. Root only.

Copy the msg field from the returned JSON — that's your token. It bypasses 2FA and survives session TTLs, so treat it as a server credential.

Optional write token, with an expiry and IP lock:

mogwai users tokens add -n mcp-write -c <your-ip> -e 2030-12-31

Leave FASTPANEL_WRITE_TOKEN unset in configs where you don't need writes.

Configure

cp .env.example .env

Minimum viable .env:

FASTPANEL_URL=https://panel.example.com:8888
FASTPANEL_TOKEN=<your read token>
FASTPANEL_INSECURE_TLS=1   # only if panel uses self-signed cert

Use with Claude Code

claude mcp add fastpanel \
  -s user \
  -e "FASTPANEL_URL=https://panel.example.com:8888" \
  -e "FASTPANEL_TOKEN=…" \
  -e "FASTPANEL_INSECURE_TLS=1" \
  -- node $PWD/dist/index.js

Add -e "FASTPANEL_WRITE_TOKEN=…" when you want write tools enabled.

Use with Claude Desktop / Cursor / other MCP clients

claude_desktop_config.json (or equivalent):

{
  "mcpServers": {
    "fastpanel": {
      "command": "node",
      "args": ["/absolute/path/to/fastpanel-mcp/dist/index.js"],
      "env": {
        "FASTPANEL_URL": "https://panel.example.com:8888",
        "FASTPANEL_TOKEN": "…",
        "FASTPANEL_INSECURE_TLS": "1"
      }
    }
  }
}

Debug

Inspect tools with the MCP Inspector GUI:

pnpm inspect

Drive JSON-RPC over stdio manually:

FASTPANEL_URL=… FASTPANEL_TOKEN=… node scripts/smoke.mjs

Tools

Read (no write token required)

Tool

Endpoint

Returns

sites_list

GET /api/sites/list

All websites, 13 essential fields by default (compact mode)

site_get

GET /api/sites/{id}

Full 40-field site object (cert, backend, backups, stats)

site_configuration_get

GET /api/sites/{id}/configuration

Raw nginx (frontend), handler backend (PHP-FPM or Apache), php.ini

databases_list

GET /api/databases

MySQL + PostgreSQL databases with owners and sizes

database_servers_list

GET /api/databases/servers

Available DB servers — use ids in database_create

users_list

GET /api/users

Panel users and site owners

dns_domains_list

GET /api/dns/domains

DNS zones (empty if panel DNS is off)

dns_records_list

GET /api/dns/domain/{id}/records

Records for one zone

certificates_list

GET /api/certificates

Stored SSL certificates (LE + custom)

system_load

GET /api/loads/full

CPU / memory / disk / load averages / top processes

queue_list

GET /api/queue/list

Background tasks including completed

queue_active

GET /api/queue

In-flight tasks only (filters finished) + meta.all_done for deterministic polling

site_logs

GET /api/sites/{id}/log/{lines}/{type}

Tail nginx/apache access or error log (frontend_/backend_) without SSH

site_resources

GET /api/sites/{id}/resources

Databases, sub-domains, DNS & email zones attached to a site

backup_plans_list

GET /api/v2/backup/plans

Configured backup plans

me

GET /api/me

Account behind the current read token (username, roles, ssh)

settings_get

GET /api/settings

Panel-wide settings (OS, license, limits, notifications)

email_domains_list

GET /api/email/domains

List email domains (optionally for one site); ids feed the mailbox tools

email_domain_dkim_get

GET /api/email/domains/{id}/dkim

DKIM DNS record (TXT with public key) for an email domain

mailboxes_list

GET /api/email/domains/{id}/boxs

Mailboxes of a domain: size, quota, redirects, aliases, flags (compact by default)

mailbox_get

GET /api/mail/box/{id}

One mailbox, full object. Passwords are never returned — FastPanel exposes no path to read one

mailbox_password_get

macOS Keychain

Password of a mailbox from the local password store (macOS Keychain). Opt-in via FASTPANEL_PASSWORD_STORE=keychain; only knows passwords set through this MCP

Write (require FASTPANEL_WRITE_TOKEN + explicit confirm: true)

Tool

Endpoint

Purpose

user_create

POST /api/users

Create a new panel user (site owner)

database_create

POST /api/databases

Create MySQL or PostgreSQL database with a dedicated DB user

site_create

POST /api/master/domain + PUT /api/master

Create a site atomically, optionally with inline user / database / FTP

site_update

PUT /api/sites/{id}

Change document root (index_dir) / directory index — e.g. point a Laravel site at public/ (framework: "laravel" preset)

site_ssl_update

PUT /api/sites/{id}

Attach / replace / detach an SSL certificate, toggle HTTPS / HTTP2 / HTTP3 / HSTS

site_backend_update

PUT /api/sites/backend/{backend_id}

Change PHP version, handler, port, socket, env vars (pass site id — backend id resolved internally)

site_configuration_update

PUT /api/sites/{id}/configuration

Replace raw nginx/apache/php.ini for the site. Dangerous: bad syntax can break the site — when SSH is configured, runs nginx -t after applying and auto-reverts on failure (validate: false to skip)

certificate_create_letsencrypt

POST /api/certificates

Issue a new Let's Encrypt certificate (async — poll queue_active)

mailbox_create

POST /api/email/domains/{id}/boxs

Create a mailbox with redirects / aliases / quota. generate_password: true mints a strong password and returns it once

mailbox_update

PUT /api/mail/box/{id}

Reset password (optionally generated, returned once), enable/disable, change quota / redirects / aliases — only the fields you pass change

Mailbox password store (optional)

FastPanel exposes no way to read a mailbox password back — no API or CLI returns one (internally it keeps a one-way IMAP hash plus a reversible copy only the panel process itself can decrypt, for its own Roundcube autologin). So handing an existing technical mailbox to a new client normally means resetting its password and breaking everything else that uses it. Set FASTPANEL_PASSWORD_STORE=keychain (macOS only) and every password set through mailbox_create / mailbox_update — generated or explicit — is also saved to your login Keychain (service fastpanel-mcp:<panel host>, account = mailbox address; visible in Keychain Access). mailbox_password_get reads it back and mailboxes_list marks each box with password_stored.

Passwords set before the store was enabled, or changed later in the panel UI, are not known to it. The secret is passed to security over stdin, never in argv, and never logged. Trade-off: anything running as your macOS user can read these entries, and mailbox_password_get puts a plaintext credential into the model's context — leave the store off if that is not acceptable.

SSH-backed (require FASTPANEL_SSH_HOST)

These do what the REST API can't — they run on the panel host itself. Opt-in and host-agnostic: set FASTPANEL_SSH_HOST (+ optional FASTPANEL_SSH_USER/PORT/KEY) to point at any FastPanel server. The server shells out to your own ssh client, so the host just needs to be reachable with key-based auth. nginx_validate and site_doctor are read-only; the rest are writes (confirm: true + dry_run preview).

Tool

Runs

Purpose

nginx_validate

nginx -t

Validate the live nginx config before/after site_configuration_update — catch syntax errors before they take nginx down

site_doctor

stat / systemctl / nginx -t

Diagnose why a site errors: missing docroot, a parent dir without o+x (the 750 → 404 trap), missing FPM socket, dead backend, broken nginx config

database_dump

mysqldump

Dump a database to a .sql file in the staging dir (local MySQL). Writes a root-owned file — needs confirm: true

database_import

mysql

Load a .sql file (from the staging dir) into a database. Destructive — needs confirm: true

site_files_upload

rsync (scp fallback)

Upload a local file/dir into a site's web root, then chown to the site user. delete: true mirrors (removes remote-only files)

site_files_deploy

git clone / curl + tar

Fetch files on the host (https git repo or tarball) into a site's web root, then chown to the site user

site_file_put

cat over ssh

Write one small inline file (placeholder/.htaccess/robots.txt) into a site's web root, then chown to the site user

Dump/import paths are confined to a staging dir (default /root/fastpanel-mcp-dumps, override with FASTPANEL_DUMP_DIR); paths outside it or containing .. are rejected. The three upload/deploy tools resolve the site's index_dir + owner via site_get, refuse destination subpaths that escape the web root or contain shell-unsafe characters, and chown everything to the site's system user so nginx/PHP-FPM can serve it (root-owned files would 403).

Cookbook

Provision a new test site under a wildcard cert (30 seconds, no DNS/LE wait):

site_create(domain="foo.example.com", owner_id=2, php_version="84")
  → site_ssl_update(site_id=<new>, certificate_id=<wildcard>, https_redirect=true, http2=true, http3=true)

Provision a production site with a fresh Let's Encrypt cert:

site_create(domain="foo.com", aliases=["www.foo.com"], owner_id=<id>, php_version="84", database={...})
  → certificate_create_letsencrypt(site_id=<new>, email, common_name="foo.com")
  → queue_active  # poll until LE job SUCCESS

Harden default nginx (block .git, .env, .htaccess, composer.json, etc.):

site_configuration_get(site_id)
  # LLM inserts security location blocks into frontend
site_configuration_update(site_id, frontend=<edited>, backend=<unchanged>, phpini=<unchanged>)

Remove deprecated TLS versions:

site_configuration_get(site_id)
  # LLM replaces "ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3" with "ssl_protocols TLSv1.2 TLSv1.3"
site_configuration_update(site_id, frontend=<edited>, backend=<unchanged>, phpini=<unchanged>)

Safety model

  • Dual tokens. Read token always required. Write token is optional — if FASTPANEL_WRITE_TOKEN isn't set, every write tool errors out before touching the network with FastPanelWriteDisabledError.

  • confirm: true is a required argument on every write tool. Tools refuse to execute without it — this is your last line of defence against a confused LLM.

  • dry_run: true returns the exact JSON body that would be sent, passwords redacted as ***, and skips the HTTP call entirely.

  • stderr audit log records every executed write with redacted payload. In Claude Code this surfaces in MCP logs.

  • nginx -t auto-validation. With SSH configured, site_configuration_update runs nginx -t right after applying and auto-reverts to the previous config if it fails — a bad edit can't leave nginx unable to reload. Pass validate: false to opt out.

  • Tool annotations. Every tool ships MCP readOnlyHint / destructiveHint / idempotentHint / openWorldHint hints so MCP clients and external policy gateways can apply the right guardrails per tool.

  • No delete tools yet — including mailbox delete/purge. Destructive operations stay in the UI for now; they are planned for later, once the MCP protocol itself offers stronger safety guarantees for irreversible actions.

  • IP-lock tokens (mogwai users tokens add -c <ip>) so a leaked token can't be used from elsewhere.

Known gotchas

  • filter[...] params: FastPanel list endpoints expect filter[limit]=…&filter[type]=…. Bare ?limit=… is silently ignored.

  • Site creation is a wizard, not a REST create. The panel does POST /api/master/domain (probe) then PUT /api/master (actual create), not POST /api/sites. site_create hides this.

  • Async operations. Cert issuance, site backend updates, and several other ops return action: "CREATING" / "UPDATING" immediately and run in the background. Use queue_active to poll.

  • No official OpenAPI spec. Endpoints were reverse-engineered. If a new FastPanel release breaks something, please file an issue with the new payload shape.

  • Self-signed TLS. Most panel installs use self-signed certs. Set FASTPANEL_INSECURE_TLS=1 or put a proper cert in front.

  • fail2ban / rate limiting. FastPanel ships with fail2ban and panel-level rate limiting. Test scripts that hammer the API may get your IP blocked.

Roadmap

  • Delete tools (user_delete, site_delete, database_delete, certificate_delete, mailbox delete/purge) — later, when MCP gets safer for irreversible operations

  • DNS record CRUD

  • Backup plan management (list / run / restore)

  • Email domain create/update

  • Bulk operations (e.g. "apply this nginx hardening to every site")

  • CLI-fallback tools over SSH for ops not in REST (transfer, firewall save/restore, panel ip_match)

  • Structured MCP outputSchema so clients can render typed results

  • Rate-limit aware retry with exponential backoff

Contributing

Issues and PRs welcome. Especially useful:

  • Captured DevTools Network payloads for actions not yet covered

  • Compatibility fixes for newer FastPanel versions

  • Additional DB servers / runtime types in the enum schemas

  • Screenshots / recordings of typical flows for the README

Author

Built and maintained by Ihor Chyshkala — chyshkala.com · ihor@chyshkala.com.

Services

Available for hire via chyshkala.com:

Service

What it covers

Web Development

Full-stack web apps with React, Next.js & Node.js

Process Automation

Workflows, integrations & data pipelines

API Development

REST, GraphQL & third-party integrations

AI Integration

ChatGPT, Claude & custom AI solutions

AI Chatbot (new)

Custom chatbots trained on your data

DevOps

CI/CD, Docker & cloud infrastructure

CTO-as-a-Service

Technical leadership for startups

Due Diligence

Technical audits for investors

Legacy Modernization

Migrate from legacy to modern stack

License

MIT — see LICENSE.

Disclaimer

This is a third-party, community project. "FastPanel" is a trademark of its respective owners. This project is not affiliated with, endorsed by, or sponsored by FastPanel. Test against a non-production FastPanel instance before pointing it at anything you care about.

Available Tools

39 tools
backup_plans_listA
Read-onlyIdempotent

List configured backup plans (FastPanel v2 backup system). Maps to GET /api/v2/backup/plans. Empty data array means no backup plans are configured.

Inputs: no named parameters.

certificate_create_letsencryptA

Issue a Let's Encrypt SSL certificate for an existing site. This is ASYNC — response returns immediately with status 'CREATING'. Poll queue_active to track issuance progress. REQUIREMENTS: site must be publicly accessible with correct DNS for HTTP-01 challenge to succeed. WRITE operation — confirm:true to execute.

Inputs: email (required), site_id (required), common_name (required), confirm, +4 more.

certificates_listA
Read-onlyIdempotent

List all SSL certificates stored in FastPanel (Let's Encrypt and custom). Returns id, name, type, common_name, alternative_name, expiration, linked site. Also injects computed crt_path/key_path — the on-disk paths FastPanel writes certs to (/var/www/httpd-cert/.crt|.key). These are needed when hand-writing a 443 server block after a site is in manual_changes mode. NOTE: the paths are derived from FastPanel's naming convention, not returned by the API — verify on disk (ls /var/www/httpd-cert/) if a cert was imported rather than issued by the panel.

Inputs: no named parameters.

database_createA

Create a new database (MySQL or PostgreSQL) with a dedicated DB user. WRITE operation — set dry_run:true to preview, confirm:true to execute.

Inputs: name (required), owner_id (required), server_id (required), db_user_login (required), +5 more.

database_dumpA

Dump a database to a .sql file ON the FastPanel host via SSH (mysqldump). Writes a file you can then download (scp/sftp); returns the path and byte size. The file can only be written inside the staging dir (default /root/fastpanel-mcp-dumps, override with FASTPANEL_DUMP_DIR) — arbitrary output paths are rejected. Targets the host's LOCAL MySQL via root socket auth; remote servers and non-MySQL engines are rejected. WRITE (it creates a root-owned file) — set dry_run:true to preview, confirm:true to execute. Requires SSH configured (FASTPANEL_SSH_HOST).

Inputs: database_id (required), confirm, dry_run, output_path.

database_importA
DestructiveIdempotent

Load a .sql dump file (already present on the host) INTO a database via SSH (mysql). DESTRUCTIVE: the SQL runs as-is, so a dump containing DROP/CREATE will replace existing tables and data. The source file must live inside the staging dir (default /root/fastpanel-mcp-dumps, override with FASTPANEL_DUMP_DIR) — paths elsewhere are rejected, so scp the file there first (or produce it with database_dump). Targets the local MySQL via root socket auth. WRITE — set dry_run:true to preview the command, confirm:true to execute. Requires SSH configured (FASTPANEL_SSH_HOST).

Inputs: database_id (required), source_path (required), confirm, dry_run.

database_servers_listA
Read-onlyIdempotent

List available database servers (MySQL, PostgreSQL). Use the returned ids as server_id in database_create and site_create.

Inputs: no named parameters.

databases_listA
Read-onlyIdempotent

List all MySQL and PostgreSQL databases. Returns id, name, charset, size, owner, linked site, server, last dump timestamp.

Inputs: no named parameters.

dns_domains_listA
Read-onlyIdempotent

List all DNS zones managed by FastPanel's DNS service. Empty if DNS is not configured.

Inputs: no named parameters.

dns_records_listA
Read-onlyIdempotent

List all DNS records for a specific domain (zone) by its id. Use dns_domains_list first to get ids.

Inputs: domain_id (required).

email_domain_dkim_getA
Read-onlyIdempotent

Get the DKIM DNS record (name, type, TXT content with the public key) for an email domain. Maps to GET /api/email/domains/{domain_id}/dkim. Use it to publish/verify the DKIM record when DNS is hosted outside the panel.

Inputs: domain_id (required).

email_domains_listA
Read-onlyIdempotent

List email (mail) domains — the containers that mailboxes live in. Maps to GET /api/email/domains, or GET /api/sites/{site_id}/email/domains when site_id is given. Use the returned id as domain_id for mailboxes_list / mailbox_create. Compact by default (the full object embeds the whole SSL certificate record).

Inputs: compact, site_id.

mailbox_createA

Create a mailbox in an email domain. Maps to POST /api/email/domains/{domain_id}/boxs. WRITE operation — set dry_run:true first, then confirm:true to execute. Pass either password or generate_password:true (recommended): the generated password is returned ONCE in the result as generated_password and can never be read back afterwards (FastPanel keeps only a hash) — store it in a password manager immediately. If the local password store is enabled (FASTPANEL_PASSWORD_STORE=keychain) the password — generated or explicit — is also saved there automatically and stays retrievable via mailbox_password_get. redirects forwards incoming mail to other addresses; with redirects set, save_in_box decides whether a copy also stays in this box. aliases are extra local parts on the same domain delivering to this box. Async: the response comes back with action:"CREATING" and the box becomes usable a second or two later (mailbox_get shows action:null when done).

Inputs: login (required), domain_id (required), quota, aliases, +7 more.

mailboxes_listA
Read-onlyIdempotent

List mailboxes of one email domain: address, enabled, size (bytes used), quota, redirects (forwarding targets), aliases, save_in_box (keep a local copy when forwarding), spam_to_junk. Maps to GET /api/email/domains/{domain_id}/boxs (sic — 'boxs'). Passwords are NOT returned: FastPanel exposes no API/CLI path to read a mailbox password back (it keeps a one-way IMAP hash plus a reversible copy only the panel process itself can decrypt). To give someone access to an existing box, reset it with mailbox_update generate_password:true. When the local password store is enabled (FASTPANEL_PASSWORD_STORE), each box also carries password_stored — true means mailbox_password_get can return its password.

Inputs: domain_id (required), compact.

mailbox_getA
Read-onlyIdempotent

Get one mailbox by id (full object: redirects, aliases, quota, size, flags, owner). Maps to GET /api/mail/box/{box_id} — note the different URL family from the list endpoint. The password is never returned — FastPanel has no endpoint that reveals it.

Inputs: box_id (required).

mailbox_password_getA
Read-onlyIdempotent

Return the password of a mailbox from the operator's LOCAL password store (macOS Keychain) — not from FastPanel, which never reveals a mailbox password through its API or CLI. Works only when FASTPANEL_PASSWORD_STORE=keychain is set and only for passwords that were set through mailbox_create / mailbox_update while the store was enabled (mailboxes_list shows password_stored per box). If nothing is stored, the only way to get a known password is a reset via mailbox_update generate_password:true — which breaks clients using the old one. SENSITIVE: the result contains a plaintext credential; only call it when the user asks for that mailbox's password. The stored value can be stale if the password was later changed in the panel UI.

Inputs: address (required).

mailbox_updateA
DestructiveIdempotent

Change an existing mailbox: reset its password, enable/disable it, change quota, redirects (forwarding), aliases, save_in_box, spam_to_junk. Maps to PUT /api/mail/box/{box_id}. WRITE operation — set dry_run:true first, then confirm:true to execute. Only the fields you pass change: the tool reads the current box and re-sends the rest (the panel form PUTs the whole object). redirects and aliases REPLACE the whole list — pass the full desired list, [] to clear. Password reset: password or generate_password:true (returned ONCE as generated_password, never retrievable later). WARNING: a password reset immediately breaks every mail client / integration still using the old password — existing passwords cannot be viewed through FastPanel, only replaced. Omitting the password keeps the current one. With the local password store enabled, any new password is saved there automatically (mailbox_password_get). Async: the response has action:"UPDATING"; poll mailbox_get until action is null.

Inputs: box_id (required), quota, aliases, confirm, +7 more.

meA
Read-onlyIdempotent

Identify the FastPanel account behind the current READ token — username, roles, home dir, ssh access. Maps to GET /api/me. Use to confirm which user/token the server is authenticated as. NOTE: this always reflects the read token; it does not tell you whether a write token is configured.

Inputs: no named parameters.

nginx_validateA
Read-onlyIdempotent

Run nginx -t on the FastPanel host (over SSH) to validate the live nginx config — use it before and after site_configuration_update to catch syntax errors that would otherwise take nginx (and every site on it) down. Read-only: does NOT reload or modify anything. Requires SSH configured (FASTPANEL_SSH_HOST); uses your own ssh client.

Inputs: no named parameters.

queue_activeA
Read-onlyIdempotent

Poll FastPanel background tasks and get a deterministic done/not-done signal. The raw /api/queue endpoint also returns recently-FINISHED tasks (status SUCCESS/FAILED), which makes naive polling ambiguous. This tool filters to genuinely in-flight tasks by default and adds meta.all_done (true when nothing is still running) so you can loop until done. Set include_finished:true to also see the just-completed tasks (useful to learn whether an async op SUCCEEDED or FAILED).

Inputs: include_finished.

queue_listA
Read-onlyIdempotent

List active and recent FastPanel background tasks (backups, migrations, SSL issuance, screenshots, etc) including completed ones.

Inputs: limit.

settings_getA
Read-onlyIdempotent

Read panel-wide settings — OS release, license type, upload limit, email notification config, statistics toggles, etc. Maps to GET /api/settings.

Inputs: no named parameters.

site_backend_updateA
DestructiveIdempotent

Update backend settings of an existing site: PHP version, handler (php_fpm/fcgi), app file, port, socket path, env vars. Pass the SITE id (from sites_list) — this tool resolves the backend id internally (the API endpoint is PUT /api/sites/backend/{backend_id}, where backend_id = main_backend.id, NOT the site id; passing a site id there 404s). All settings except site_id are optional: omitted fields keep the site's current backend values (fetched via site_get). NOTE: this does NOT change the site's document root (site.index_dir) — nginx renders root from the site object, not the backend. Use site_update for docroot. WRITE — confirm:true required.

Inputs: site_id (required), port, type, confirm, +8 more.

site_configuration_getA
Read-onlyIdempotent

Read the raw nginx (frontend), apache (backend) and php.ini configs for a site. Returns the literal config text as stored by FastPanel. Use before site_configuration_update to see current state — FastPanel's default configs often miss hardening (no .git/.env blocking, etc). Endpoint: GET /api/sites/{site_id}/configuration.

Inputs: site_id (required).

site_configuration_updateA
DestructiveIdempotent

Replace the nginx (frontend), apache (backend) and php.ini config for a site. DANGEROUS: invalid syntax can take down the site or the whole nginx/apache service. SAFETY NET: when SSH is configured (FASTPANEL_SSH_HOST) and validate:true (the default), the tool runs nginx -t right after applying and AUTO-REVERTS to the previous config if it fails, so a bad edit can't leave nginx unable to reload. Without SSH there is NO validation — preview with dry_run and double-check by hand. ⚠️ SIDE EFFECT — manual mode: the first config update flips the site to manual_changes=true on the panel side. After that, FastPanel STOPS managing this site's config: it will no longer auto-insert the 443 server block, the HTTP→HTTPS redirect, or Let's Encrypt renewal/acme-challenge locations when you issue or renew SSL. You become responsible for the full HTTPS block (including ssl_certificate paths — get them from certificates_list crt_path/key_path). Partial update IS supported here (unlike the raw API): omit any of frontend/backend/phpini and the tool fetches the current value via site_configuration_get and sends it back unchanged, so you can safely change just one block. Endpoint: PUT /api/sites/{site_id}/configuration. WRITE — confirm:true required.

Inputs: site_id (required), phpini, backend, confirm, +3 more.

site_createA

Create a new website in FastPanel using the /api/master wizard endpoint. Can create owner/database/FTP inline atomically. Does NOT issue SSL — call certificate_create_letsencrypt after site is active. WRITE operation — set dry_run:true first, then confirm:true to execute. Flow: (1) POST /api/master/domain probes for existing email/DNS zones, (2) PUT /api/master creates the site with everything.

Inputs: ips (required), domain (required), php_version (required), aliases, +7 more.

site_doctorA
Read-onlyIdempotent

Diagnose the common reasons a FastPanel site serves errors — runs host-level checks over SSH and returns a structured report. Catches the classic traps: docroot missing, a parent directory without o+x so nginx (www-data) can't traverse to the docroot (the 750 → '404 File not found' / 'permission denied' problem), missing PHP-FPM socket, dead backend service, and broken nginx config. Read-only. Requires SSH configured (FASTPANEL_SSH_HOST).

Inputs: site_id (required).

site_file_putA
DestructiveIdempotent

Write a single small file into a site's web root from inline content, over SSH, then chown it to the site's system user. For quick one-off files (index.html placeholder, .htaccess, robots.txt) — the content travels through the model, so keep it small; use site_files_upload/site_files_deploy for real payloads. rel_path is the file path relative to the web root; parent directories are created as needed. WRITE — dry_run:true to preview, confirm:true to execute. Requires SSH (FASTPANEL_SSH_HOST).

Inputs: content (required), site_id (required), rel_path (required), confirm, +2 more.

site_files_deployA
DestructiveIdempotent

Deploy site files onto the host by fetching them ON the server (no local copy needed) — git clone or a downloaded tarball — into the site's web root, then chowning to the site's system user. Resolves index_dir + owner via site_get. The fetch runs as root on the panel host; only https:// sources are accepted. source_type 'git': shallow-clones source (optionally at ref) and copies the tree (excluding .git) into the destination. source_type 'tarball': curls the archive and extracts it; a single wrapping top-level directory (e.g. GitHub's repo-main/) is descended into automatically. Existing files are overwritten; nothing is deleted. dest_subpath is relative to the web root. WRITE — dry_run:true to preview, confirm:true to execute. Requires SSH (FASTPANEL_SSH_HOST).

Inputs: source (required), site_id (required), ref, confirm, +3 more.

site_files_uploadA
DestructiveIdempotent

Upload a local file or directory from THIS machine into a site's web root, over SSH (rsync, scp fallback). Resolves the site's index_dir + owner via site_get, transfers with your own ssh key (bytes never pass through the model), then chowns to the site's system user AND normalises perms on the destination subtree to FastPanel's web defaults (dirs 755, files 644) so nginx/PHP-FPM can serve it (local file modes are not relied on). rsync TRAILING-SLASH semantics: local_path 'build/' uploads the CONTENTS of build into the destination; 'build' (no slash) uploads the build dir itself, creating /build. dest_subpath is relative to the web root (omit to target the root). delete:true mirrors the source (rsync --delete removes remote files absent locally) — needs rsync, gated behind confirm. WRITE — set dry_run:true to preview, confirm:true to execute. Requires SSH configured (FASTPANEL_SSH_HOST).

Inputs: site_id (required), local_path (required), delete, confirm, +2 more.

site_getA
Read-onlyIdempotent

Get full details for a single site by id. Returns all 40 fields including SSL certificate, backend config, permissions, backup plan, stats.

Inputs: site_id (required).

site_logsA
Read-onlyIdempotent

Tail a site's nginx/apache access or error log — no SSH needed. Maps to GET /api/sites/{site_id}/log/{lines}/{type}. Use type=frontend_error to debug 404/permission/realpath problems (nginx), backend_error for PHP-FPM/Apache app errors. FastPanel quirk: this endpoint returns the log tail inside an 'errors' JSON field and responds with HTTP 400 even on success — an empty log shows as '\n', a missing file shows a 'Path … not exists' message. This tool normalises that: the log text is always returned under log, and 400 is not treated as a failure. Log files live at <user_home>/data/logs/-.log.

Inputs: site_id (required), type, lines.

site_resourcesA
Read-onlyIdempotent

List the resources attached to a site — linked databases, sub-domains, DNS zones and email domains. Maps to GET /api/sites/{site_id}/resources. Handy before deleting or migrating a site, or to find which database(s) belong to it.

Inputs: site_id (required).

sites_listA
Read-onlyIdempotent

List all websites managed by FastPanel. Compact mode (default) returns only essential fields — full response is ~3KB per site and can overflow context. Use site_get(id) for full details of a specific site.

Inputs: limit, compact.

site_ssl_updateA
DestructiveIdempotent

Attach, replace, or detach an SSL certificate on an existing site, and toggle HTTPS flags. Maps to PUT /api/sites/{site_id}. Use for wildcard flow: create site in *.icstudio.space, then attach an existing wildcard cert. Pass certificate_id=null to detach. WRITE — confirm:true required.

Inputs: site_id (required), certificate_id (required), hsts, http2, +5 more.

site_updateA
DestructiveIdempotent

Change a site's document root (index_dir) and/or directory index, via PUT /api/sites/{site_id}. This is the ONLY way to repoint a site's docroot — nginx renders root from site.index_dir, NOT from the backend, so site_backend_update can't do it. Common need: frameworks that serve from a subfolder (Laravel/Symfony → /public). Pass framework:'laravel' to auto-append '/public' to the current docroot without computing the path yourself. This tool does a read-modify-write: it fetches the current site via site_get and resends the writable fields (docroot, index page, current certificate id, https/http2/http3/hsts flags) so the partial PUT doesn't blank out SSL or flags. ⚠️ UNVERIFIED ENDPOINT: the index_dir write path was not confirmable from the API spec (FastPanel has no OpenAPI). Run with dry_run:true, then a real call on a throwaway site, and check site_get afterwards. If index_dir does NOT change, capture the DevTools request the panel UI fires when you edit the docroot and report it so this can be corrected. WRITE — confirm:true required.

Inputs: site_id (required), confirm, dry_run, framework, +2 more.

system_loadA
Read-onlyIdempotent

Get current server load metrics — CPU, memory, disk, uptime. Source: FastPanel's internal /api/loads/full endpoint.

Inputs: no named parameters.

user_createA

Create a new FastPanel system user (site owner). This is a WRITE operation — set dry_run:true to preview, confirm:true to execute.

Inputs: password (required), username (required), quota, roles, +2 more.

users_listA
Read-onlyIdempotent

List all FastPanel system users (site owners). Returns id, username, home_dir, roles, PHP version, quota, ssh_access, enabled flag.

Inputs: no named parameters.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 39 tools

    Disambiguation4/5

    Most tools target a distinct resource and action, and the descriptions clearly separate close pairs such as queue_list vs queue_active and the three site file-writing tools. The cluster of site_update, site_backend_update, site_configuration_update, and site_ssl_update is distinguishable but requires careful reading.

    Naming Consistency4/5

    Names are consistently snake_case and mostly follow a resource_action pattern such as site_get, mailbox_create, and database_dump. Minor deviations include pluralized list prefixes, singular/plural file tools, and outliers like me, system_load, site_doctor, and queue_active.

    Tool Count2/5

    With 39 tools, the server is far above the typical 3-15 range and will impose significant context/tool-selection overhead. The breadth is partly justified by the large FastPanel domain, but several niche file, config, and password operations could be consolidated.

    Completeness2/5

    The surface covers many read/create/update workflows but has no delete operations for sites, mailboxes, databases, users, or certificates. DNS is read-only, backup support only lists plans, and common lifecycle operations such as restore and record management are missing.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      C
      quality
      B
      maintenance
      Enables natural language interaction with a Panelica hosting panel to manage domains, SSL, databases, services, and more through any MCP client.
      404
      340 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides 50 tools to manage a CloudPanel VPS through AI assistants, covering sites, databases, Docker, server software, firewall, DNS, and one-shot deployments.
      30 npm
      4
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to manage cPanel hosting accounts including DNS, email, databases, SSL, files, security, and more through natural language using cPanel's UAPI and API2.
      ISC