MCP server

Let your AI assistant run your hosting

One MCP server for your whole account. Connect Claude Code, Claude Desktop or Cursor once, and your assistant can list your sites, read their logs, sync their files with your repository and deploy — acting only with the permissions you give it.

65 tools today, listed below exactly as the server offers them.

Connect it

Two steps. The token is the whole credential, so treat it like a password: it is shown once, and you can revoke one connection without touching the others.

  1. Create a connection

    In your dashboard, open AI tools, name the connection, pick your client and tick what it may do. You can only grant what you are allowed to do yourself.

  2. Paste the config your client reads

    The dashboard shows the config for the client you picked, with your token already in it. Every client talks to the same server address:

    https://api.zinndigital.com/v1/mcp

Claude Code

Run the one command, or put the block in .mcp.json at the root of your project. The "type": "http" line is required — without it Claude Code skips the server.

claude mcp add --transport http zinn https://api.zinndigital.com/v1/mcp \
  --header "Authorization: Bearer zmcp_live_…"
// .mcp.json
{
  "mcpServers": {
    "zinn": {
      "type": "http",
      "url": "https://api.zinndigital.com/v1/mcp",
      "headers": {
        "Authorization": "Bearer zmcp_live_…"
      }
    }
  }
}

Claude Desktop

Claude Desktop starts local servers, so it runs our free Zinnector® CLI as a bridge to the hosted server. It needs Node 24 or newer. The token goes in env, never in the arguments.

// claude_desktop_config.json
{
  "mcpServers": {
    "zinn": {
      "command": "npx",
      "args": [
        "-y",
        "zinnector@0.1.4",
        "mcp"
      ],
      "env": {
        "ZINN_MCP_TOKEN": "zmcp_live_…"
      }
    }
  }
}

Cursor

Add the server to ~/.cursor/mcp.json (or .cursor/mcp.json in a project) with the address and the Authorization header.

// ~/.cursor/mcp.json
{
  "mcpServers": {
    "zinn": {
      "url": "https://api.zinndigital.com/v1/mcp",
      "headers": {
        "Authorization": "Bearer zmcp_live_…"
      }
    }
  }
}

Any other MCP client

Any client that supports remote Streamable HTTP servers with a custom header works: point it at the address above and send Authorization: Bearer with your token. A client that only starts local servers can use the Claude Desktop bridge.

ChatGPT connects to MCP servers only by signing in with OAuth, so it cannot use a token yet. Use the same connection with Claude Code, Claude Desktop or Cursor.

Check it works — four questions

Ask these in plain language. Under each is the tool your assistant should call and what a good answer looks like.

  1. > List my sites.
      ↳ sites_list

    Your sites with their status and plan. An empty list on an account that has sites means the connection is missing the permission to view sites.

  2. > Show me the error log for example.com.
      ↳ site_logs

    The recent error log and access log. If one could not be read, the answer says so — that is different from an empty log.

  3. > Sync example.com to its repository.
      ↳ site_repo_sync_run

    A commit in your repository with whatever changed on the live site, or a note that the repository already matched. If the repository moved, the sync is held and nothing is overwritten.

  4. > I pushed a commit — deploy example.com and tell me when it is live.
      ↳ site_deploy → site_deploy_status

    The deploy is queued, then goes live with the commit it applied. Write tools ask for your go-ahead in the client before they run.

Two-way sync, in both directions

A site with a connected repository stays level with it both ways, and your assistant can drive either direction.

Site → repository

Commits what changed in the live files — an edit in the file manager, a plugin update, an upload — and pushes it to your branch, so your next git pull has it.

site_repo_sync_run   ·   zinnector sync run

Repository → site

A deploy applies your branch to the site. Push your commit, then deploy; on our own servers this needs two-way sync switched on, which is free.

site_deploy   ·   zinnector push

When both sides changed

Nothing is ever merged or overwritten silently. The sync stops, names the commit, and waits for you to keep the site or keep the repository. Keeping the repository discards the site's unsynced changes, so it needs confirmation.

site_repo_sync_resolve keep=site|repository confirm=true

What keeps it safe

Only what you granted

Every tool needs a permission, and a connection holds only the ones you ticked. Another customer's sites do not exist as far as your connection can tell.

Confirmation for anything destructive

Rolling back, restoring, resolving a held sync and buying all require an explicit confirmation, and anything that costs money shows you the exact total first.

Every action in your audit log

Each call is recorded against the connection that made it. Revoke a connection on the AI tools page and it stops working immediately.

Every tool

All 65 tools, generated from the server's own registry — if it is listed here, your assistant can call it.

Sites and deploys

ToolWhat it doesPermissionNotes
sites_listList the organization's sites, with each site's primary domain, status, product line, stack and the plan it is on. Optionally filter by status, product line or a search over domain and name.sites.viewreads only
site_getGet one site's full record — domain, status, product line, stack, runtime, PHP version, region, plan and whether it is scheduled for deletion.sites.viewreads only
site_createCreate a site and start provisioning it. Give a primary domain and a product line; optionally a blueprint to build it from, a stack type, a PHP version or a region. Returns the new site, which begins in 'provisioning' — poll site_get for status.sites.createchanges things
site_deployDeploy a site — build and publish its current source to our servers. Returns the deploy state immediately; the build runs as a durable workflow. Poll site_deploy_status to follow it.hosting.deploy.managechanges things
site_deploy_statusThe site's current deploy state — status, target, the live URL, the deployed commit and when it last went live.sites.viewreads only
site_deployments_listList a site's recent deployments — id, status, commit, branch and timings. Use this to choose the deployment_id to roll back to.sites.viewreads only
site_rollbackRoll a site back to an earlier deployment by re-deploying its commit. Destructive: pass confirm=true. Use site_deployments_list to choose which one.hosting.deploy.managechanges things · asks for confirmation

Two-way sync

ToolWhat it doesPermissionNotes
site_repo_sync_getShow a site's two-way sync with its repository: whether it is available and on, the repository and branch, the current state (idle, synced, conflict, adopt, error) and the last runs with the commits they made.sites.viewreads only
site_repo_sync_setTurn two-way sync on or off for a site, optionally limited to a subdirectory of the site. Needs the customer's own GitHub account connected. Turning it on pushes nothing by itself — call site_repo_sync_run for that.hosting.deploy.managechanges things
site_repo_sync_runSync a site to its repository now: commit whatever changed in the site's live files and push it to the connected branch, so a local git pull receives it. If the repository moved since the last sync the run is HELD and nothing is overwritten — the result says so. The other direction (repository to site) is site_deploy.hosting.deploy.managechanges things
site_repo_sync_resolveResolve a HELD two-way sync. keep=site commits the site's files on top of the repository (their commits stay in history); keep=repository applies the repository to the site and DISCARDS the site's unsynced changes. Destructive: pass confirm=true.hosting.deploy.managechanges things · asks for confirmation

Logs and metrics

ToolWhat it doesPermissionNotes
site_metricsCurrent metrics for one site — visits, bandwidth, error rate, disk and resource use. Each section reports whether it is available, so 'no data' is distinguishable from 'zero'.sites.viewreads only
site_usageOne site's metered visit usage for the current billing period, with the plan's allowance and what any overage costs.sites.viewreads only
site_logsRead the recent tail of one site's web-server access log and error log. Each log reports whether it could be read, so an unreadable log is never mistaken for an empty one. Use this before proposing a fix for errors or slowness.sites.panel_accessreads only
site_build_logRead the build log of one deployment — the latest when deployment_id is omitted. Pass after=<total from the previous call> to fetch only new lines while complete is false.sites.viewreads only

Configuration and WordPress

ToolWhat it doesPermissionNotes
site_php_version_getThe site's current PHP version and every version it is allowed to switch to on its product line.sites.viewreads only
site_php_version_setSwitch a site to a different PHP version. The version must be one that site_php_version_get lists as available. Reports whether the change reached the machine or was only recorded for provisioning to apply.hosting.php.managechanges things
wordpress_stateA WordPress site's core version, whether an update is available, and which management operations its hosting permits.sites.viewreads only
wordpress_plugins_listList a WordPress site's plugins — name, version, whether active and whether an update is available.sites.viewreads only
wp_plugin_updateUpdate one WordPress plugin to its latest version. Returns the plugin list as it reads after the update.sites.panel_accesschanges things
wordpress_update_coreUpdate WordPress core to the latest version on a site. This cannot be undone by another call — take a backup first with backup_create if you may need to go back. Requires confirmation.sites.panel_accesschanges things · asks for confirmation
wordpress_set_pluginActivate or deactivate one plugin on a WordPress site. Takes effect on the live site immediately. Requires confirmation.sites.panel_accesschanges things · asks for confirmation

Backups

ToolWhat it doesPermissionNotes
backups_listA site's backups — each one's id, when it was taken, its size and status — plus whether a backup is currently running and how many on-demand backups remain in the rolling 24-hour allowance.sites.viewreads only
backup_createTake an on-demand backup of a site and return the updated backup state. Bounded to 3 per rolling 24 hours per site; the backup runs in the background.hosting.backup.managechanges things
backup_restoreRestore a site from one of its backups. This OVERWRITES the site's live database and files, and everything changed since that backup was taken is lost. Requires confirmation, and the confirmation names how old the backup is.hosting.backup.managechanges things · asks for confirmation

Domains and DNS

ToolWhat it doesPermissionNotes
dns_records_listList a page of DNS records for a domain whose DNS we host, in name/type/value order. Returns a next_cursor for the following page.sites.viewreads only
dns_record_createCreate a DNS record for a domain whose DNS we host.domains.dns.managechanges things
dns_record_updateUpdate an existing DNS record for a domain whose DNS we host.domains.dns.managechanges things
dns_record_deleteDelete a DNS record for a domain whose DNS we host.domains.dns.managechanges things · asks for confirmation
domains_listList the organization's domains — id, hostname, status, product line and whether we registered it or the customer pointed it at us. The ids returned here are what the DNS, cache-purge and index-check tools take.sites.viewreads only

Cache and crawlers

ToolWhat it doesPermissionNotes
cache_purgePurge the CDN cache for a domain. Omit 'urls' to purge everything, or pass a bounded list of absolute URLs to purge only those.sites.cache.purgereads only
crawler_policy_getGet a site's SEO-crawler-blocking (PBN footprint) policy: which crawlers are blocked, the available crawlers, and the rendered robots.txt/server rules.sites.viewreads only
crawler_policy_setSet a site's SEO-crawler-blocking policy. 'blocked' is a list of crawler keys (from crawler_policy_get's available_crawlers). Search engines can never be blocked. Publishes the change so the server rules are re-written.sites.crawler.managechanges things

Email

ToolWhat it doesPermissionNotes
mail_services_listList the organization's email services — every domain it has mailboxes on, with the plan's mailbox allowance, how many are used, and whether the mail DNS is published.mail.viewreads only
mailboxes_listList the mailboxes on one email service, with each mailbox's size, how full it is, and whether it can send and receive.mail.viewreads only
mailbox_createCreate a mailbox on an email service. Returns the new mailbox's password, which is shown once and cannot be retrieved later.mail.managechanges things
mail_forwarders_listList the mail forwarders on one email service — which address goes where.mail.viewreads only
mail_forwarder_createCreate a mail forwarder on an email service, sending everything for one address on to one or more destinations.mail.managechanges things

SEO

ToolWhat it doesPermissionNotes
site_seo_metricsThe cached SEO authority metrics for a hosted site — domain rank, backlinks, referring domains and organic keywords. Read-only and free; the figures are refreshed by the platform's own sweep, so they may be up to a month old.sites.viewreads only
domain_index_checkThe cached search-index status for a domain — whether it is indexed, how many pages, and when the reading was taken. Read-only and free.sites.viewreads only

AI images

ToolWhat it doesPermissionNotes
image_models_listThe image models this account can generate with — provider, model, and the price per image in USD. Read-only and free. A model that is not listed cannot be used, either because it is retired or because nobody has priced it.sites.viewreads only
image_generateGenerate an image from a prompt and put it in this account's image library. Costs money — the price per image is what image_models_list reports for the model used. Returns the image ids; the customer sees them in their library immediately.links.editchanges things · can spend money

Boards

ToolWhat it doesPermissionNotes
board_listList this organisation's project boards, newest first.agency.board.viewreads only
board_getRead one board in full: its columns and every card on them.agency.board.viewreads only
board_createCreate a project board, optionally for one of your client organisations.agency.board.managechanges things
board_card_createAdd a card to a column. Cards are agency-only unless you pass visibility 'client'.agency.board.managechanges things
board_card_moveMove a card to another column, or to another position in its column.agency.board.managechanges things
board_card_commentComment on a card. Agency-only unless you pass visibility 'client', in which case the client sees it attributed to your agency.agency.board.commentchanges things

Billing and upgrades

ToolWhat it doesPermissionNotes
subscriptions_listList the organization's subscriptions — the plan each one is on, its status, renewal date and whether it auto-renews.billing.viewreads only
invoices_listList the organization's invoices and credit notes — number, status, total, currency and issue date. Optionally filter by status.billing.viewreads only
upgrade_optionsWhat can be bought to lift a limit you have hit — bigger plans, priced with tax, in your own currency. Pass the entitlement from a refusal (e.g. 'max_sites'), or a site_id to see what that site's own plan could move to. Read-only: nothing is bought, and calling this costs nothing.billing.viewreads only
purchase_quotePrice a plan exactly, with tax, in the customer's own currency — and nothing is bought or charged. Returns a quote_id to pass to purchase_authorize together with the total, which is what stops an agent committing someone to a figure they never saw. Quotes expire: re-quote rather than reusing an old id.billing.payment.managechanges things
purchase_authorizeComplete a purchase from a quote: places the order and charges the payment method on file. You must pass the exact total and currency purchase_quote returned — if the price has moved since, this refuses rather than charging a different amount. Retrying with the same quote_id returns the same order and never charges twice.billing.payment.managechanges things · asks for confirmation · can spend money

Support

ToolWhat it doesPermissionNotes
tickets_listList the organization's support tickets — subject, status, priority and when they were last updated. Optionally filter by status or site.tickets.viewreads only
ticket_createOpen a support ticket. Include what you already checked — an agent that has read the KB and run diagnostics should say so in the body, so a human does not repeat it.tickets.replychanges things

Reseller

ToolWhat it doesPermissionNotes
reseller_overviewThe reseller programme in one read: status, whether you can sell, billing day, default markup, your panel hostname and nameservers, mail sending domain, support routing, commerce readiness and the languages your clients' panel offers.reseller.viewreads only · resellers only
reseller_services_listList the sites you have provisioned for your clients — one row per service, with the client organisation, status, any hold you placed, what it costs you wholesale and what you sell it for. Your own sites are not here; use sites_list for those.reseller.viewreads only · resellers only
reseller_service_getOne client service in full — status, plan, any hold, wholesale cost, your sell price, and its disk and bandwidth usage.reseller.viewreads only · resellers only
reseller_service_suspendPut one of your client's services on a non-payment hold. The site stops serving until you release it. Requires confirm: true.reseller.provisionchanges things · asks for confirmation · resellers only
reseller_service_unsuspendRelease a non-payment hold you placed on a client's service. The site starts serving again.reseller.provisionchanges things · resellers only
reseller_prices_listYour price list: every plan you can sell, with the Zinn® list price, your wholesale cost, and the retail price you have set (if any).reseller.viewreads only · resellers only
reseller_client_wallets_listEvery client wallet you hold a float in, with the balance per client and the total held per currency. This is money you have taken and not yet delivered service for.reseller.viewreads only · resellers only

Keep reading

Built on the public API

The API reference

What an AI assistant can do for you

AI tools and MCP

Connect your assistant in two minutes

Open AI tools in your dashboard, create a connection, and paste the config your client reads.