How do I use CVD Portal from Claude Code?
The CVD Portal plugin for Claude Code connects a software repository to a CVD Portal account and adds three commands. The commands list Cyber Resilience Act gaps, write SECURITY.md and security.txt, and upload an SBOM.
Key takeaways
- Install with
/plugin marketplace add porta-regulus/cvd-portal-claude-plugin, then sign in through/mcp. list-gapsneeds the Compliance plan. The SBOM upload needs the Reporting plan and an ADMIN.- The agent asks for approval before each write to the portal and before each Annex I sign-off or Article 14 decision.
- No command files a report with ENISA.
Last updated 19 October 2026.
The plugin is open source under the MIT license at github.com/porta-regulus/cvd-portal-claude-plugin. It contains instructions for Claude and the address of the MCP server. It contains no code that runs on your machine.
Install
Run these commands in Claude Code.
/plugin marketplace add porta-regulus/cvd-portal-claude-plugin
/plugin install cvd-portal@porta-regulus
Start a new session after the install, or run /reload-plugins.
Sign in
The plugin registers the MCP server cvd-portal at https://cvdportal.com/api/mcp.
- Run
/mcpin Claude Code. - Select
cvd-portal. - Sign in to CVD Portal in the browser window that opens.
- Approve the access request.
Claude Code keeps the token. You do not need an API key.
Use an API key instead
Use an API key when a browser sign-in is not possible, for example on a CI runner.
- Create a key under Settings → API Keys. On the Compliance plan, give it only MCP scopes. See Connecting with an API key.
- Put the key in the variable
CVD_PORTAL_API_KEY. This command reads the key without echo, so the key does not go into the shell history. Paste the key and press Enter.
read -rs CVD_PORTAL_API_KEY && export CVD_PORTAL_API_KEY
- Add a second server with the key. If the variable is empty, the server gets an empty key and every call fails.
claude mcp add --transport http --scope user cvd-portal-key https://cvdportal.com/api/mcp \
--header "Authorization: Bearer ${CVD_PORTAL_API_KEY}"
- Disable the plugin server
cvd-portalin/mcp, so that only one server is active.
Claude Code stores the key in plain text in ~/.claude.json. Give the key a short expiry and rotate it. Do not write the key into a file in the repository.
Commands
| Command | What it does | What it changes |
|---|---|---|
/cvd-portal:list-gaps [product] | Lists the open conformity gaps for a product. Ranks each gap by the evidence that the repository can supply. | Nothing. It only reads. |
/cvd-portal:init-cvd [slug] | Writes SECURITY.md and .well-known/security.txt. Both point to https://<slug>.cvdportal.com. Shows the diff. | Local files only. It does not commit. |
/cvd-portal:sbom [file] [product] | Finds an SBOM in the repository, or a dependency manifest such as package.json. Shows the component count. Uploads it with upload_sbom after you confirm. It only reads and uploads a file that you created. | The stored SBOM of the product, after you confirm. |
Claude starts init-cvd and sbom only when you type the command.
Plan requirements
| Command | Plan | Other requirements |
|---|---|---|
list-gaps | Compliance or higher | read scope |
init-cvd | Any plan with a public portal | None. With MCP access the command reads the portal URL. Without it, give the slug yourself. |
sbom | Reporting or higher | sbom:write scope and the ADMIN role. An SBOM file or a dependency manifest in the repository. |
The free trial runs at the Compliance level, so all three commands work during the trial. An upload is limited to 5 MB.
To create an SBOM before you upload it, run a generator yourself, for example syft dir:. -o cyclonedx-json=bom.cdx.json or npx @cyclonedx/cdxgen@12.8.5 -o bom.cdx.json .. The detail of a dependency manifest depends on its format. Gemfile.lock and go.mod include indirect dependencies. package.json and Cargo.toml list only direct dependencies. A requirements.txt holds the packages its author listed, which is every installed package when it comes from pip freeze. An SBOM from a generator also records hashes and licences.
Rules that the agent follows
Every command first reads the plugin's AGENTS.md. These are the main rules.
- Claude does not sign off an Annex I requirement or record an Article 14 decision without your approval for that specific call.
- No tool files a report with ENISA. An authorized person files on the ENISA Single Reporting Platform.
- Claude does not invent a legal citation. Verify each citation on EUR-Lex.
- Each change in the repository names the Annex I point or the Article that it serves.
- Claude asks before each call that writes to the portal.
Privacy
- The commands read files in your repository to find evidence. The file contents go to the Claude model that you use.
- File contents go to CVD Portal only when you confirm an upload, for example the SBOM.
- Vulnerability reports and Article 14 drafts stay in CVD Portal. The commands do not write them into repository files.
Update or remove
- Run
/plugin marketplace update porta-regulusto get a new version. - Run
/plugin uninstall cvd-portal@porta-regulusto remove the plugin.