Plugin developer guide
Approved plugin feeds: one policy, every format your team already deploys
By HOL · Reviewed by Michael Kantor on
Direct answer
Create a feed on the Approved plugin feeds page of your Guard Cloud workspace. List the HOL Plugins listings your team approves and the rules each must keep passing: trust score, attested releases, verified publisher, blocked capabilities and pinned versions. Each hour HOL checks them against public evidence and serves the approved set as Claude Code managed settings, managed-mcp.json, a Cursor team marketplace, an MCP Registry and JSON. Every response names its evidence snapshot.
Who this is for
Platform and security teams that decide which agent plugins and MCP servers developers may install.
Good fit
- Rolling an approved MCP server list out to Claude Code through managed settings
- Pointing GitHub Copilot, VS Code or Amp at an internal MCP registry
- Keeping a Cursor team marketplace limited to approved plugins
- Feeding approvals into your own tooling as JSON
Not a fit
- Certifying that a plugin is safe; HOL reports evidence and applies your rules, it does not vouch for any plugin
- Plugins that are not listed on HOL Plugins; a feed can only approve listings HOL can see
Steps
1.Create the feed and copy its token
Open Approved plugin feeds from Plugins in your Guard Cloud workspace and choose New feed. Name it and add one HOL Plugins slug per line, such as
owner/repo. HOL shows the feed token once and keeps only a hash of it, so store it as a secret straight away. Rotating the token stops the old one immediately.2.Set the rules a listing must keep passing
A listing reaches the feed only when it is on your list and passes every rule: minimum trust score (the score on the listing page; no score fails), attested releases only, verified publishers only, blocked capability classes (skills, apps, hooks, local MCP servers, remote MCP servers) and pinned versions. When HOL cannot tell whether a listing ships a blocked capability, the listing is rejected. Listings on the blocked list are written as disabled or denied in every format.
3.Check a plugin yourself before you approve it
The feed uses the scan behind each listing. To look at a candidate locally first, run the same open-source scanner on its repository.
pipx install plugin-scanner git clone https://github.com/OWNER/REPO plugin-scanner scan REPO --fail-on-severity high4.Deploy to Claude Code
claude-code-settingsreturns theextraKnownMarketplacesandenabledPluginskeys to merge into your managed settings, plusdeniedMcpServersfor blocked servers. With "Allow only what this feed approves" on, it also setsstrictKnownMarketplaces,allowManagedMcpServersOnlyandallowedMcpServers; try that on a few machines first.claude-code-mcpreturns amanaged-mcp.jsonwhose environment values are${NAME}references, never values.curl -fsS -H "Authorization: Bearer $HOL_FEED_TOKEN" https://hol.org/api/v1/guard/feeds/$FEED_ID/claude-code-settings curl -fsS -H "Authorization: Bearer $HOL_FEED_TOKEN" https://hol.org/api/v1/guard/feeds/$FEED_ID/claude-code-mcp -o managed-mcp.json5.Point GitHub Copilot, VS Code or Amp at the MCP registry
These clients read an MCP registry without credentials, so turn on "Serve the MCP Registry format without a token" for the feed. Only the registry paths become public; every other format still needs the token. Set the registry URL to the feed address ending in
/mcp-registry; the client adds/v0.1/servers. Entries follow the MCP Registry v0.1server.jsonschema.curl -fsS https://hol.org/api/v1/guard/feeds/$FEED_ID/mcp-registry/v0.1/servers6.Publish a Cursor team marketplace
cursor-marketplacereturns.cursor-plugin/marketplace.jsonlisting each approved plugin that is listed for Cursor, by its GitHub repository. Commit it to your team marketplace repository on a schedule. Whether each plugin is Default Off, Default On or Required is set by your Cursor admins; the feed does not set it.curl -fsS -H "Authorization: Bearer $HOL_FEED_TOKEN" https://hol.org/api/v1/guard/feeds/$FEED_ID/cursor-marketplace -o .cursor-plugin/marketplace.json7.Read only what changed and check where it came from
Every response carries
ETag,X-HOL-Feed-Snapshot(anhfs_id over the policy and the evidence),X-HOL-Feed-Evaluated-At,X-HOL-Feed-Disclaimerand, when a listing could not be written in that format,X-HOL-Feed-Warnings. Send the ETag back inIf-None-Matchto get 304 when nothing changed.X-HOL-Feed-Signatureissha256=and the HMAC-SHA256 of the exact body bytes keyed by the feed token. Thejsonformat lists every decision with the check that passed or failed.curl -fsS -D headers.txt -H "Authorization: Bearer $HOL_FEED_TOKEN" https://hol.org/api/v1/guard/feeds/$FEED_ID/json -o feed.json openssl dgst -sha256 -hmac "$HOL_FEED_TOKEN" feed.json | sed 's/^.*= /sha256=/'
Feed formats
| Source or runtime | Output | Carries | Drops |
|---|---|---|---|
| Claude Code managed settings | `claude-code-settings` | Approved plugins and their marketplaces; blocked MCP servers; strict mode when chosen | Listings with no Claude Code plugin or marketplace on HOL |
| Claude Code MCP servers | `claude-code-mcp` (`managed-mcp.json`) | Approved MCP servers with commands, args, URLs and `${NAME}` references | Environment values; servers whose config HOL could not read from the scanned commit |
| GitHub Copilot, VS Code, Amp | `mcp-registry` (MCP Registry v0.1) | Approved MCP servers as `server.json` entries with packages or remotes | Plugins without an MCP server |
| Cursor team marketplace | `cursor-marketplace` | Approved plugins listed for Cursor, by GitHub repository | Plugins not listed for Cursor; the Default Off, Default On or Required setting |
| Your own tooling | `json` | Every decision, every check and its reason, the policy, the snapshot id and the disclaimer | Nothing the evaluation recorded |
Limitations
- Every feed response carries this statement: "HOL reports public evidence: scan results, trust scores, attestations and publisher checks. It does not certify that a listing is safe. This workspace chose the policy and the listings; HOL applied that policy to the evidence it had when this snapshot was taken."
- Feeds are checked every hour. If the registry cannot be read, the feed keeps serving its last snapshot and the workspace page says so.
- Free, Solo and Pro workspaces can publish 3 feeds and 25 approved listings across them. Guard Team allows 25 feeds and 500 listings; Enterprise allows 100 and 2,000.
- Paid plans and HOL Blue or Gold on a listing never change its trust score, its checks or whether it is approved.
- Send the token in an Authorization header. HOL never accepts it in a URL.
Questions
Does HOL decide which plugins are approved?
No. Your workspace lists the plugins and sets the rules. HOL applies those rules to public evidence and writes the result in each format. A listing that is not on your list is never approved.
What happens when a plugin stops passing a rule?
The next hourly check removes it from every format at once, and the feed page shows what was added, removed or updated. Clients pick up the change on their next read.
What is the snapshot id for?
It identifies the exact policy and evidence behind a response. Record it with each deployment so you can show which evidence an approval rested on, and compare it between reads to see whether anything changed.
Why is the MCP registry format public when I turn it on?
GitHub Copilot, VS Code and Amp read MCP registries without credentials. Anyone with the feed address can then read the approved MCP servers, but not your policy, your blocked list or the other formats.
Sources
Related guides
List it on HOL
Connect the repository to verify ownership and claim the listing. New plugins can be submitted for free.