Repository navigation
0.11.0 — native Claude MCP inventory and explainable policy decisions
0.11.0 — native Claude MCP inventory and explainable policy decisions
Claude Code keeps the servers that claude mcp add registers in .claude.json,
not in settings.json or .mcp.json. Endpoint scans did not read that file, so
a user-scope or project-local server was absent from the BOM and from policy
evidence. This release reads it. It selects each server name the way Claude Code
does. Each policy decision now names the rules that produced it.
Highlights
- Native Claude MCP inventory (ADR-0077). Endpoint scans read the user and
project-localmcpServersmaps in.claude.json.- Default discovery reads
~/.claude.json. An explicit--config-diror
CLAUDE_CONFIG_DIRreads.claude.jsonin that directory. - One resolver selects each server name in the order local, project
.mcp.json, user. The whole winning entry applies. Fields do not merge. - The selected project's
disabledMcpServersremoves local and user entries.
It does not control project.mcp.jsonentries. - An invalid entry does not hide a valid lower-scope entry with the same name.
An entry with an interpolated${VAR}URL claims its name, but OpenACA
cannot normalize it, so it does not become a component. - Posture checks, such as insecure transport, use the same selected entries.
A local-scope entry's header credential comes from its own scope.
- Default discovery reads
- Native MCP evidence in the BOM. Native components carry
openaca:claude_mcp_scope(localoruser). Local entries also carry
openaca:claude_mcp_project_key. Bom-refs stay machine-independent. The
home-level file keys ashome/.claude.json. The local locator uses a fixed
<project>placeholder instead of the absolute project path. - Policy decisions explain themselves. Each decision carries
rule_paths,
for exampleadmission.plugins.blocked[0].openaca policy compile --format jsonreports them. Consumers do not have to repeat policy matching. openaca.core.collect_policy_evidence. Library callers get components,
advisory matches and posture matches without rendering a host artifact.
target=Noneuses Claude's default configuration discovery.- Legacy Claude commands use the
skillsadmission category. Claude Code
loadscommands/*.mdthrough its skill registry, so a skills block also stops
them. Plugin commands still follow their plugin's decision.
Install
uv tool install openaca==0.11.0 or pip install openaca==0.11.0.
Compatibility
Pre-V0 — no back-compatibility hedging.
- Claude endpoint BOMs can gain components. Servers from
.claude.json
appear where 0.10.1 showed none. - Claude endpoint BOMs can lose components. A URL entry without a
type
is skipped, because Claude Code skips it. A shadowed or disabled entry is
also skipped. Repo-mode BOMs and other agent kinds keep every declaration. - An explicit root stays isolated (ADR-0054).
--config-dir ~/.claude
does not read~/.claude.json, although it names the default path.
openaca policy compilerequires--target, so it never reads the
home-level file. Usecollect_policy_evidencewithtarget=Nonefor that. - A skills block now applies to legacy commands. A policy with
skills.default: blockedreportscommands/*.mdcomponents as blocked. openaca:schema_versionbumps0.5→0.6.0.6adds the
openaca:claude_mcp_scopeandopenaca:claude_mcp_project_keycomponent
properties and thehome/bom-ref prefix. The document shape is otherwise
the0.5agent-rooted shape.openaca bom lintaccepts stored0.5
documents.- The overlay record schema is unchanged.