# `ExMCP.ACPCompat`
[🔗](https://github.com/azmaveth/ex_mcp/blob/v1.4.0/dev/ex_mcp/acp_compat.ex#L1)

Repository-only tooling for tracking ACP ecosystem compatibility.

The checked-in manifest is the reviewed source of truth. Remote catalogs and
repositories are treated as untrusted drift inputs: this module reports
changes but never installs agents or rewrites the manifest.

# `drift`

```elixir
@type drift() :: map()
```

# `report`

```elixir
@type report() :: %{
  manifest: String.t(),
  checked_at: String.t(),
  drift: [drift()],
  errors: [map()]
}
```

# `check_remote`

```elixir
@spec check_remote(
  map(),
  keyword()
) :: report()
```

Fetches every configured source and returns a drift report.

# `compare`

```elixir
@spec compare(map(), map()) :: [drift()]
```

Compares a manifest with already-fetched remote snapshots.

# `default_manifest`

```elixir
@spec default_manifest() :: String.t()
```

Returns the repository's default ACP compatibility manifest path.

# `format_report`

```elixir
@spec format_report(report()) :: String.t()
```

Formats a human-readable report for CI logs.

# `interop_agent`

```elixir
@spec interop_agent(map(), String.t()) :: {:ok, map()} | {:error, :unknown_agent}
```

Returns a reviewed ecosystem smoke-test entry by id.

# `load_manifest`

```elixir
@spec load_manifest(Path.t()) :: {:ok, map()} | {:error, term()}
```

Loads and validates an ACP compatibility manifest.

# `parse_catalog`

```elixir
@spec parse_catalog(binary()) :: {:ok, [String.t()]} | {:error, term()}
```

Extracts the primary agent name from each bullet on the ACP agents page.

# `registry_snapshot`

```elixir
@spec registry_snapshot(map()) :: {:ok, [map()]} | {:error, term()}
```

Builds the stable registry identity/version snapshot used by the manifest.

# `validate_manifest`

```elixir
@spec validate_manifest(map()) :: :ok | {:error, term()}
```

Validates the stable fields used by the drift checker and smoke suite.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
