Skip to main content
The TrustGuard Claude Code plugin adds lifecycle hooks on the developer machine. It calls POST /v1/evaluate with a collector tgk_… key. This is not Claude Enterprise Inference Hooks (POST /v1/evaluate/claude, source.application = claude-code). The plugin stamps source.application = claude-code-plugin. Gate the two paths separately. TrustGate MCP is not this plugin. Org-wide MCP (claude.ai, Desktop, Cowork, Claude Code) is an organization connector. Do not put the collector tgk_… on the connector, and do not put the MCP URL in the plugin (pluginConfigs / mcpServers).

Three pieces

Hooks fire only when all three are present: claude plugin list showing the plugin installed is not enough. Status must be enabled. Scope: managed only means the marketplace installed it.

Console setup

  1. Runtime → Collectors → Catalog → IDE & coding agents → Claude Code (or the Claude Code collector type your workspace lists).
  2. Auth — mint a tgk_… key (shown once).
  3. Policies — assign a default policy. Gate Ask / Block on source.application eq claude-code-plugin if this collector also receives other traffic.

Enable the plugin

Server-managed settings (claude.ai Admin → Claude Code → Managed settings) or /Library/Application Support/ClaudeCode/managed-settings.json:
No pluginConfigs. No MCP URL. enabledPlugins: true in the admin JSON does not always flip the CLI to enabled. Claude Code skips server-managed settings when ANTHROPIC_BASE_URL or CLAUDE_CODE_USE_* is set (including a TrustGate LLM proxy). In that case deploy the file path above (Kandji: TRUSTGUARD_DEPLOY_CLAUDE_MANAGED_SETTINGS=1). Check on the laptop:
Then start a new Claude Code session so hooks.json loads.

Collector config + binary (MDM)

If the managed file has api_key, that key, data_url, and fail_mode are locked. Missing ~/.trustguard/bin is fine when the MDM binary exists. Private GitHub repo: bootstrap curl of Releases 404s without a token (fail-open). Kandji install can set TRUSTGUARD_GITHUB_TOKEN and pin the release version. fail_mode: open + an empty hook body {} means allow. That is also the response when evaluate returns allow.

What is evaluated

Ask on PreToolUse shows Claude Code’s permission dialog. The subtitle is the generic TrustGuard sentence above. The title (tool name) is Claude Code’s; the plugin cannot change it.

Verify

A manual probe that shows up in Activity with source.application = claude-code-plugin means the binary and key work. If Claude Code still never evaluates, the plugin is disabled or hooks did not reload. Remote SSH / WSL: hooks run on the remote host. A Kandji binary on the Mac does not cover that session. claude.ai / Desktop: no lifecycle hooks. Use Inference Hooks and/or org Connectors, not this plugin.