Claude·2 min lezen

Claude Code-plugins uitrollen over al je servers en accounts

Platformkennis als Claude Code-plugin verspreiden via een eigen marketplace, met automatische updates en de valkuilen die we tegenkwamen.

Claude weet veel, maar niet hoe jóúw hosting werkt: welke PHP-versie een site gebruikt, waar de bestanden staan, hoe je veilig een backup maakt. Die kennis geven we mee als Claude Code-plugin. Eén repository, alle servers, elk account. Dit is hoe we dat inrichtten.

Wat erin zit

Een plugin-marketplace met drie plugins:

  • hosting-core: skills (kennis die Claude alleen laadt als het relevant is) over het platform, WordPress, PHP, backups, Git en limieten. Plus kant-en-klare scripts.
  • invoker: wie de hostingprovider is en wanneer je contact opneemt.
  • invoker-tools: een MCP-server met DNS-, mail- en SSL-checks.

Skills kosten pas context als Claude ze nodig heeft. Een CLAUDE.md in elk account laadt alles in elk gesprek en botst met de eigen CLAUDE.md van de klant.

Live accountfeiten via een SessionStart-hook

Wat per account verschilt (pakket, limieten, PHP-versie per domein) zetten we niet in de plugin. Een SessionStart-hook print het bij de start van elke sessie. Die uitvoer komt als context bij Claude:

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

Houd die uitvoer kort: hij staat in elk gesprek.

Distributie: de server synct, niet de klant

De marketplace staat in een privérepository. Elke server haalt die elk uur binnen in een map onder /usr (zichtbaar in DirectAdmins jailshell). Claude Code leest hem als directory-marketplace.

Waarom niet elke klant rechtstreeks van GitHub laten lezen:

  • de klant heeft geen toegang tot een privérepository,
  • bij een GitHub-storing werkt elke server gewoon door,
  • je kunt per server een versie tegenhouden.

Valkuil 1: settings alleen installeert niets

Je zou verwachten dat dit in ~/.claude/settings.json genoeg is:

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

In de praktijk: claude plugin list gaf "No plugins installed", en claude -p zag de skills niet. Pas na deze commando's werkte het:

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

Bij een account dat de marketplace nog niet kent, faalt plugin install met "not found in marketplace". Voeg de marketplace dus altijd eerst toe.

Valkuil 2: autoUpdate werkte niet bij een directory-bron

Na een nieuwe versie (0.1.0 naar 0.1.1) bleef het account op 0.1.0, ook na een herstart van Claude. Claude Code bewaart per versie een kopie in ~/.claude/plugins/cache/. Wat wel betrouwbaar werkt:

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

Wij draaien die twee na elke nieuwe versie automatisch voor alle gekoppelde accounts. Verhoog bij elke inhoudswijziging het versienummer in plugin.json én in marketplace.json, anders ziet Claude geen update.

Controleren

claude plugin list          # versie en status per plugin
claude plugin validate .    # marketplace- en pluginbestanden controleren

Test daarna met een echte vraag: "welke skills heb je uit hosting-core?". Bij ons noemde Claude alle skills, het pakket en de PHP-versie uit de accountfeiten.

MK
Maarten Keizer

Oprichter van Invoker. Ruim twintig jaar hosting, systeembeheer en webdevelopment; bouwt de Claude-hosting zelf en test alles eerst op de eigen servers.

over maarten