Skip to content

0.11.0 — native Claude MCP inventory and explainable policy decisions

Choose a tag to compare

@github-actions github-actions released this 19 Oct 04:58
· 62 commits to main since this release

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-local mcpServers maps in .claude.json.
    • Default discovery reads ~/.claude.json. An explicit --config-dir or
      CLAUDE_CONFIG_DIR reads .claude.json in 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 disabledMcpServers removes local and user entries.
      It does not control project .mcp.json entries.
    • 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.
  • Native MCP evidence in the BOM. Native components carry
    openaca:claude_mcp_scope (local or user). Local entries also carry
    openaca:claude_mcp_project_key. Bom-refs stay machine-independent. The
    home-level file keys as home/.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 example admission.plugins.blocked[0]. openaca policy compile --format json reports 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=None uses Claude's default configuration discovery.
  • Legacy Claude commands use the skills admission category. Claude Code
    loads commands/*.md through 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 compile requires --target, so it never reads the
    home-level file. Use collect_policy_evidence with target=None for that.
  • A skills block now applies to legacy commands. A policy with
    skills.default: blocked reports commands/*.md components as blocked.
  • openaca:schema_version bumps 0.5 → 0.6. 0.6 adds the
    openaca:claude_mcp_scope and openaca:claude_mcp_project_key component
    properties and the home/ bom-ref prefix. The document shape is otherwise
    the 0.5 agent-rooted shape. openaca bom lint accepts stored 0.5
    documents.
  • The overlay record schema is unchanged.