Summary
Small documentation/hardening ask. For agent frameworks that support portable Agent Plugin v1 packages (install-disabled by default, mcp.json can declare stdio MCP servers), the docs should state explicitly that env values declared in a portable package's mcp.json are visible package data, not a secret store — and recommend runtime-injected env refs instead.
This is a footgun: a plugin author or adopter may read the spec, see mcp.json accepts env, and put an API key there. Unlike .env (mode 0600, gitignored), mcp.json ships inside the package and can be committed/exfiltrated.
Suggested change
- In the plugin/portable-package docs, add a bolded line: "Never place credentials in mcp.json — values there are plaintext package data. Inject secrets via environment variables or a secret manager at runtime."
- Optionally: a CI lint that greps repo
.json manifests for key-like patterns (sk-, api_key=, token=), mirroring the gitleaks approach already used in this repo (see the recent #131 test fixture allowlist work).
Why it matters here
This repo already takes secret hygiene seriously (0600 config stores, private-directory ACLs, gitleaks allowlists). One explicit line in the plugin docs closes the same gap for the plugin path, where the trust model is "same full-trust posture as any installed plugin."
Summary
Small documentation/hardening ask. For agent frameworks that support portable Agent Plugin v1 packages (install-disabled by default,
mcp.jsoncan declare stdio MCP servers), the docs should state explicitly that env values declared in a portable package'smcp.jsonare visible package data, not a secret store — and recommend runtime-injected env refs instead.This is a footgun: a plugin author or adopter may read the spec, see
mcp.jsonaccepts env, and put an API key there. Unlike.env(mode 0600, gitignored),mcp.jsonships inside the package and can be committed/exfiltrated.Suggested change
.jsonmanifests for key-like patterns (sk-,api_key=,token=), mirroring the gitleaks approach already used in this repo (see the recent#131 test fixtureallowlist work).Why it matters here
This repo already takes secret hygiene seriously (0600 config stores, private-directory ACLs, gitleaks allowlists). One explicit line in the plugin docs closes the same gap for the plugin path, where the trust model is "same full-trust posture as any installed plugin."