An MCP server for any AI to run your hosting panel

jabali-mcp speaks the open Model Context Protocol. Claude, Codex, Kimicode, OpenCode, and any other MCP-capable assistant can diagnose outages and provision domains, mailboxes, DNS, SSL, and databases — all through the panel's own API, with your permissions and your guardrails.

Open source (AGPL-3.0) Single Go binary Read-only by default
claude — jabali-mcp
you · Why is example.com down?
→ calling diagnose_domain(domain: "example.com")
→ calling get_ssl_status(domain: "example.com")
→ calling tail_web_log(domain: "example.com", lines: 50)
claude · The A record for example.com points at 203.0.113.9, but this server's IP is 203.0.113.4. DNS was changed 2 hours ago. Update the A record and it comes back.

What is this?

The Model Context Protocol (MCP) is an open standard that lets AI assistants use external tools. jabali-mcp is Jabali Panel's official MCP server: a small open-source binary that exposes the panel's REST API as 75+ tools an assistant can call.

It adds no new attack surface to your panel: it reimplements no auth, no validation, no scoping. Your API token acts as your user, and the panel enforces ownership on every call — exactly as it does for any other API client. A tenant token can only ever touch that tenant's resources.

It works with any MCP client: Claude Code, Claude Desktop, Cursor, Windsurf, Cline, OpenAI Codex, OpenCode, Gemini CLI, and more.

What can you ask?

Six real prompts, and what the assistant does under the hood.

"Why is example.com down?"
one diagnose_domain call gathers config, SSL status, DNS records, recent nginx errors, and bandwidth; the assistant reads the results and tells you.
"Set up mail for my new domain: two mailboxes and a catch-all forwarder."
creates the mailboxes and forwarder through the panel API.
"Add an A record for vpn pointing at 203.0.113.5, TTL 300."
validated against the panel's DNS rules before anything is sent.
"Enable Let's Encrypt on every domain that doesn't have it."
checks each domain's SSL status, issues certificates where missing.
"Create a database and user for the shop app, read-write."
database, user, and grant in one conversation; the password is shown once.
"Something's wrong with SSL issuance — file a bug."
report_issue drafts a GitHub issue with live diagnostics attached, and you review it before anything is posted.

Built for a control plane, not a chatbot demo

Read-only by default

Mutating tools don't exist unless you opt in with JABALI_MCP_ALLOW_WRITE=1.

Destructive actions take two steps

Deletes, restores, and password rotations return a preview and only execute when re-called with an explicit confirm: true. An assistant cannot destroy anything in one call.

Dry-run everything

JABALI_MCP_DRY_RUN=1 (or per-call dry_run) shows the exact request that would be sent, without sending it.

Your token is the boundary

Ownership is enforced server-side by the panel on every endpoint. The MCP server can't reach anything your token can't.

Every tool call is a normal REST request in your panel's audit trail.

Quick start

Four steps, five minutes.

  1. 1

    Install jabali-mcp

    Grab the prebuilt binary or install with go install.

    # prebuilt binary: https://github.com/shukiv/jabali-mcp/releases/latest
    go install github.com/shukiv/jabali-mcp/cmd/jabali-mcp@latest
  2. 2

    Mint a token in the panel

    In your Jabali Panel tenant shell → API TokensMCP tab. The wizard generates the client config with your token pre-filled, entirely in the browser.

  3. 3

    Run the setup wizard

    Prompts for panel URL + token, verifies the connection, writes the config.

    jabali-mcp init
  4. 4

    Register with your client

    Claude Code needs one command:

    claude mcp add jabali -- jabali-mcp

    Claude Desktop, Cursor, and other clients accept a generic mcpServers block:

    {
      "mcpServers": {
        "jabali": {
          "command": "jabali-mcp",
          "env": {
            "JABALI_PANEL_URL": "https://panel.example:8443/api/v1",
            "JABALI_API_TOKEN": "jat_…"
          }
        }
      }
    }

    Start read-only. Turn on writes later with JABALI_MCP_ALLOW_WRITE=1, optionally with JABALI_MCP_DRY_RUN=1.

75+ tools

Across domains, DNS, SSL, mail, databases, backups, cron, files, and diagnostics. Highlights include diagnose_domain (one-call triage) and report_issue (file bugs with diagnostics attached).

Full tool reference on GitHub

What should it do next?

The roadmap is open. Drop ideas, use cases, and pain points in the discussion.

Join the discussion

FAQ

Do I need to run another daemon?

No. It's a stdio server — your MCP client launches it on demand. There's nothing to keep running.

Which AI clients work?

Any MCP-capable client. Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Codex, OpenCode, and Gemini CLI are documented in the README.

Can the AI delete my domain?

Only if you enabled write mode AND the assistant calls the delete tool twice — the first call returns a preview, the second needs an explicit confirm: true. By default the server is read-only.

Does my panel token go to the AI company?

The token lives in your local MCP client config and is sent only to your panel over TLS. Tool results (domain lists, log lines) do enter the AI conversation — use a tenant token, and don't ask it to read files containing secrets.

Is it free?

Yes — AGPL-3.0, same license as Jabali Panel.

My panel uses a self-signed CA.

Point JABALI_CA_FILE at your CA bundle. TLS verification is always on; there is no way to disable it.