Claude·2 min read

Rolling out Claude Code plugins across all your servers and accounts

Distributing platform knowledge as a Claude Code plugin through your own marketplace, with automatic updates and the pitfalls we ran into.

Claude knows a lot, but not how your hosting works: which PHP version a site uses, where the files live, how to make a backup safely. We ship that knowledge as a Claude Code plugin. One repository, every server, every account. This is how we set it up.

What's in it

A plugin marketplace with three plugins:

  • hosting-core: skills (knowledge Claude only loads when relevant) about the platform, WordPress, PHP, backups, Git and limits. Plus ready-made scripts.
  • invoker: who the hosting provider is and when to get in touch.
  • invoker-tools: an MCP server with DNS, email and SSL checks.

Skills only cost context when Claude needs them. A CLAUDE.md in every account loads everything into every conversation and clashes with the customer's own CLAUDE.md.

Live account facts through a SessionStart hook

What differs per account (plan, limits, PHP version per domain) doesn't go in the plugin. A SessionStart hook prints it at the start of every session. That output reaches Claude as context:

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/hooks/account-facts.sh" }] }]
  }
}

Keep that output short: it's in every conversation.

Distribution: the server syncs, not the customer

The marketplace lives in a private repository. Every server pulls it every hour into a folder under /usr (visible in DirectAdmin's jailshell). Claude Code reads it as a directory marketplace.

Why not let every customer read straight from GitHub:

  • the customer has no access to a private repository,
  • during a GitHub outage every server keeps working,
  • you can hold back a version per server.

Pitfall 1: settings alone install nothing

You'd expect this in ~/.claude/settings.json to be enough:

{
  "extraKnownMarketplaces": { "claude-hosting": { "source": { "source": "directory", "path": "/usr/local/share/.../marketplace" }, "autoUpdate": true } },
  "enabledPlugins": { "hosting-core@claude-hosting": true }
}

In practice: claude plugin list returned "No plugins installed", and claude -p didn't see the skills. It only worked after these commands:

claude plugin marketplace add /usr/local/share/.../marketplace
claude plugin install hosting-core@claude-hosting

For an account that doesn't know the marketplace yet, plugin install fails with "not found in marketplace". So always add the marketplace first.

Pitfall 2: autoUpdate didn't work with a directory source

After a new version (0.1.0 to 0.1.1) the account stayed on 0.1.0, even after restarting Claude. Claude Code keeps a copy per version in ~/.claude/plugins/cache/. What does work reliably:

claude plugin marketplace update claude-hosting
claude plugin update hosting-core@claude-hosting

We run those two automatically for every connected account after each new version. Bump the version number in plugin.json and in marketplace.json with every content change, otherwise Claude sees no update.

Checking

claude plugin list          # version and status per plugin
claude plugin validate .    # check marketplace and plugin files

Then test with a real question: "which skills do you have from hosting-core?". For us, Claude listed every skill, the plan and the PHP version from the account facts.

MK
Maarten Keizer

Founder of Invoker. Over twenty years in hosting, system administration and web development; builds the Claude hosting himself and tests everything on our own servers first.

about maarten