fastpanel-mcp
fastpanel-mcp lets an MCP client inspect and safely manage a FastPanel 2 server through read-only and guarded write tools.
Inspect sites: list/get sites, read nginx/apache/php.ini configs, tail logs, view attached resources, and run site diagnostics.
Manage sites: create sites, change document root/index, update backend/PHP settings, edit raw configs, and attach/detach SSL with HTTPS/HTTP2/HTTP3/HSTS toggles.
Manage SSL certificates: list stored certs, issue Let's Encrypt certs, and attach/replace/detach certificates on sites.
Manage databases: list DB servers/databases, create MySQL/PostgreSQL DBs with users, and SSH dump/import SQL files.
Manage users: list FastPanel users and create site-owner/reseller accounts.
Inspect DNS and email: list DNS zones/records, list email domains, get DKIM records, list mailboxes, and retrieve locally stored mailbox passwords if enabled.
Manage mailboxes: create/update mailboxes, reset or generate passwords, set quotas, redirects, aliases, spam handling, and enable/disable boxes.
Monitor system: view CPU/memory/disk load, settings, current token identity, backup plans, and poll background queue tasks.
Run SSH-backed operations: validate nginx config, diagnose broken sites, upload/deploy files into web roots, write small inline files, and dump/import databases.
Safety controls: separate read/write tokens, required confirm:true on writes, dry_run previews, redacted audit logs, and nginx -t auto-revert when SSH is configured.
Allows reading and updating Apache configuration (handler backend) for sites.
Allows issuing new Let's Encrypt SSL certificates for sites, with async polling for completion.
Allows listing and creating MySQL databases via the FastPanel API.
Allows reading and updating nginx configuration for sites managed by FastPanel.
Allows changing PHP version, handler settings, and php.ini configuration for sites.
Allows listing and creating PostgreSQL databases via the FastPanel API.
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., "@fastpanel-mcp Create a new site example.com with PHP 8.4 and SSL."
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.
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.
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.comunder userwww-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
.envand.htaccessare served as static files (security gap), edits the frontend to add deny rules for dotfiles + sensitive extensions + framework files, previews the diff viadry_run, then deploys it..envnow returns 404;.well-known/acme-challengestill works.
You: "What sites are running on this server, who owns them, and which ones don't force HTTPS?"
LLM: Queries
sites_listand reports the 5 sites withouthttps_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: truerequired on every write. Accidental LLM outputs cannot mutate state.dry_run: truepreviews 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 -tauto-validation with rollback —site_configuration_updatevalidates 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/domainprobe →PUT /api/master), not a conventionalPOST /api/sites.The
backendfield in site configuration is PHP-FPM pool config whenhandler=php_fpm, but an Apache VirtualHost block whenhandler=fcgi.SSL attach/detach flows through
PUT /api/sites/{id}(site-side) notPOST /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 buildGet 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-31The CLI binary is
/usr/local/fastpanel2/fastpanel; recent FastPanel builds expose it onPATHasmogwai(/usr/local/bin/mogwai→ the same binary). Older docs call itfastpanel, which is not onPATH— usemogwai, 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-31Leave FASTPANEL_WRITE_TOKEN unset in configs where you don't need writes.
Configure
cp .env.example .envMinimum viable .env:
FASTPANEL_URL=https://panel.example.com:8888
FASTPANEL_TOKEN=<your read token>
FASTPANEL_INSECURE_TLS=1 # only if panel uses self-signed certUse 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.jsAdd -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 inspectDrive JSON-RPC over stdio manually:
FASTPANEL_URL=… FASTPANEL_TOKEN=… node scripts/smoke.mjsTools
Read (no write token required)
Tool | Endpoint | Returns |
|
| All websites, 13 essential fields by default (compact mode) |
|
| Full 40-field site object (cert, backend, backups, stats) |
|
| Raw nginx (frontend), handler backend (PHP-FPM or Apache), php.ini |
|
| MySQL + PostgreSQL databases with owners and sizes |
|
| Available DB servers — use ids in |
|
| Panel users and site owners |
|
| DNS zones (empty if panel DNS is off) |
|
| Records for one zone |
|
| Stored SSL certificates (LE + custom) |
|
| CPU / memory / disk / load averages / top processes |
|
| Background tasks including completed |
|
| In-flight tasks only (filters finished) + |
|
| Tail nginx/apache access or error log (frontend_/backend_) without SSH |
|
| Databases, sub-domains, DNS & email zones attached to a site |
|
| Configured backup plans |
|
| Account behind the current read token (username, roles, ssh) |
|
| Panel-wide settings (OS, license, limits, notifications) |
|
| List email domains (optionally for one site); ids feed the mailbox tools |
|
| DKIM DNS record (TXT with public key) for an email domain |
|
| Mailboxes of a domain: size, quota, redirects, aliases, flags (compact by default) |
|
| One mailbox, full object. Passwords are never returned — FastPanel exposes no path to read one |
| macOS Keychain | Password of a mailbox from the local password store (macOS Keychain). Opt-in via |
Write (require FASTPANEL_WRITE_TOKEN + explicit confirm: true)
Tool | Endpoint | Purpose |
|
| Create a new panel user (site owner) |
|
| Create MySQL or PostgreSQL database with a dedicated DB user |
|
| Create a site atomically, optionally with inline user / database / FTP |
|
| Change document root ( |
|
| Attach / replace / detach an SSL certificate, toggle HTTPS / HTTP2 / HTTP3 / HSTS |
|
| Change PHP version, handler, port, socket, env vars (pass site id — backend id resolved internally) |
|
| Replace raw nginx/apache/php.ini for the site. Dangerous: bad syntax can break the site — when SSH is configured, runs |
|
| Issue a new Let's Encrypt certificate (async — poll |
|
| Create a mailbox with redirects / aliases / quota. |
|
| 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 |
|
| Validate the live nginx config before/after |
|
| Diagnose why a site errors: missing docroot, a parent dir without |
|
| Dump a database to a |
|
| Load a |
|
| Upload a local file/dir into a site's web root, then chown to the site user. |
|
| Fetch files on the host (https git repo or tarball) into a site's web root, then chown to the site user |
|
| 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 SUCCESSHarden 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_TOKENisn't set, every write tool errors out before touching the network withFastPanelWriteDisabledError.confirm: trueis 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: truereturns 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 -tauto-validation. With SSH configured,site_configuration_updaterunsnginx -tright after applying and auto-reverts to the previous config if it fails — a bad edit can't leave nginx unable to reload. Passvalidate: falseto opt out.Tool annotations. Every tool ships MCP
readOnlyHint/destructiveHint/idempotentHint/openWorldHinthints 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 expectfilter[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) thenPUT /api/master(actual create), notPOST /api/sites.site_createhides this.Async operations. Cert issuance, site backend updates, and several other ops return
action: "CREATING"/"UPDATING"immediately and run in the background. Usequeue_activeto 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=1or 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 operationsDNS 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
outputSchemaso clients can render typed resultsRate-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 toolsbackup_plans_listARead-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_listARead-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_importADestructiveIdempotent
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_listARead-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_listARead-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_listARead-onlyIdempotent
List all DNS zones managed by FastPanel's DNS service. Empty if DNS is not configured.
Inputs: no named parameters.
dns_records_listARead-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_getARead-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_listARead-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_listARead-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_getARead-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_getARead-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_updateADestructiveIdempotent
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.
meARead-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_validateARead-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_activeARead-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_listARead-onlyIdempotent
List active and recent FastPanel background tasks (backups, migrations, SSL issuance, screenshots, etc) including completed ones.
Inputs: limit.
settings_getARead-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_updateADestructiveIdempotent
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_getARead-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_updateADestructiveIdempotent
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_doctorARead-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_putADestructiveIdempotent
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_deployADestructiveIdempotent
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_uploadADestructiveIdempotent
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_getARead-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_logsARead-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_resourcesARead-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_listARead-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_updateADestructiveIdempotent
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_updateADestructiveIdempotent
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_loadARead-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_listARead-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
Scored across 39 tools
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.
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.
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.
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
Related MCP Connectors
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.
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.
Related MCP Servers
AlicenseCqualityBmaintenanceEnables natural language interaction with a Panelica hosting panel to manage domains, SSL, databases, services, and more through any MCP client.404340 npm2MIT- AlicenseBqualityDmaintenanceEnables management of CentOS Web Panel hosting accounts, SSL certificates, FTP users, MySQL databases, and packages through natural language commands via the Model Context Protocol.205 npmMIT
- AlicenseNot gradedqualityDmaintenanceProvides 50 tools to manage a CloudPanel VPS through AI assistants, covering sites, databases, Docker, server software, firewall, DNS, and one-shot deployments.30 npm4MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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