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.