Atlas / Skills / cavi-ai / mlx-agent

mlx-agentBLOCK

skills/cavi-ai/mlx-agent

🍏 Discover, verify, and wire local MLX-optimized models on Apple Silicon: plugins for Claude Code, Codex, Antigravity, and OpenCode, plus a portable AgentSkill.

Verdict
BLOCK
Grade
F
Trust score
54 /100
Version
—
Hosts
4 documented
License
MIT
Stars
2
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Discover, verify, and wire local MLX-optimized models on Apple Silicon — for your coding agent.

Current package version: 0.6.0.

Provider support

First-class adapters are included for each provider below. The universal installer supports both user and project scopes.

-brightgreen.svg)

The MLX model landscape moves weekly. mlx-agent queries the HuggingFace Hub live, matches models to your machine's memory and installed runtimes, tells you which are reasoning models (so you don't put one in a fast/cheap slot), and emits the exact config to wire a pick into your ag

Read from source at commit fe2e46f6cf6fOBSERVED · 2026-10-12
Advertisement
02

Install

Commands as the repository documents them. They are shown, not run.

claude plugin install mlx-agent@mlx-agent
git clone --depth 1 --branch v0.6.0 https://github.com/cavi-ai/mlx-agent.git
git clone --depth 1 --branch v0.6.0 https://github.com/cavi-ai/mlx-agent.git
claude plugin install mlx-agent
claude plugin install mlx-agent
claude plugin install mlx-agent@mlx-agent
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
codexmentioned
gemini-climentioned
openclawmentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: mlx-converter
description: "Inventory local GGUF weights on this Mac — what is already converted to MLX, what is still pending, and which copies are redundant — then run confirmation-gated GGUF to MLX conversions."
homepage: https://github.com/cavi-ai/mlx-agent
license: MIT
metadata:
  openclaw:
    emoji: "🔁"
    requires:
      bins: ["python3"]
---

# mlx-converter

Turn GGUF files already on disk into MLX models, and keep the local weight
collection honest. The scan is read-only and stdlib-only; conversion is a
preview-then-confirm job that never downloads, never overwrites, and never
deletes.

## Use when

- Deciding what to convert: which local GGUFs have no MLX output yet.
- Reclaiming disk: finding byte-identical or same-quantization duplicates.
- Converting one GGUF to MLX 4bit or 8bit.
- Checking on a conversion already running.

## Run

- Inventory the well-known roots: `python3 scripts/mlx_converter.py scan`
- Specific directories: `python3 scripts/mlx_converter.py scan --gguf-root ~/models --mlx-root ~/mlx`
- Only what still needs converting: `python3 scripts/mlx_converter.py scan --pending-only`
- Machine-readable: `python3 scripts/mlx_converter.py scan --json`
- Preview a conversion: `python3 scripts/mlx_converter.py start --gguf ~/models/model-Q4_K_M.gguf --q-bits 4`
- Run the reviewed plan: `... start --gguf PATH --q-bits 4 --confirm --preview-hash HASH`
- Poll jobs: `python3 scripts/mlx_converter.py status`

`scan` needs nothing but Python. Conversion needs `mlx-lm` on PATH plus
`torch`, `transformers`, and `gguf` importable by the same interpreter; the
skill reports what is missing and never installs it for you.

## Reading the scan

Each GGUF gets a status:

- `pending` — no MLX output found. This is the convert list.
- `converted` — an MLX output exists. `evidence` says how it was matched:
  `provenance` (the marker this tool wrote — exact), `receipt` (a convert
  receipt), or `name` (a name match — weaker, confirm before deleting anything).
- `shard` — a non-first shard of a split model; convert the `-00001-of-` file.
- `companion` — a projector (`mmproj`) or similar sidecar. Not convertible on
  its own; it belongs to a base model.

Duplicate groups come in two kinds:

- `exact` — same bytes, or same structure at the same quantization. Everything
  outside `keep` is redundant and its size counts toward `reclaimable_bytes`.
- `variant` — the same model at different quantization levels. Reported so the
  choice is visible, never recommended for removal.

Duplicate identity uses a size-plus-head-plus-tail signature rather than a full
digest, because full digests of multi-gigabyte weights are not worth the I/O.
Pass `--no-signature` to skip it entirely and fall back to header structure.

## Converting

Conversion is two steps in one job: `transformers` dequantizes the GGUF back to
Hugging Face weights, then `mlx_lm.convert` quantizes those to MLX. The
intermediate checkpoint is temporary and removed afterwards, but it is
full-precision — budget roughly 2x the original model's fp16 size in free disk
while the job runs.

Quality is capped by the GGUF's own quantization: a Q4 GGUF converted to MLX
4bit has been quantized twice. When the original fp16 weights are available,
convert those instead (`start --repo publisher/model`).

The job writes `mlx-converter.json` into the output directory recording which
GGUF produced it, so later scans can pair them exactly.

## Removing redundant copies

The scan only reports. Deleting is the user's call, and the file paths in
`redundant` are the exact candidates. Move rather than delete when unsure.
05

Trust audit

BLOCKgrade F · trust 54/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
declared (10 observation(s))
Shell
declared (6 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
providers/agy/src/mlx_agent/verification.py:124
exec(compile(tree, "<coding-probe>", "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
providers/codex/src/mlx_agent/verification.py:124
exec(compile(tree, "<coding-probe>", "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/mlx_agent/verification.py:124
exec(compile(tree, "<coding-probe>", "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
providers/agy/src/mlx_agent/_lab/video_lab/adapters/wan_mps.py:321
return str(importlib.import_module(module).__version__)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
providers/agy/src/mlx_agent/decide_runner.py:19
port = importlib.import_module(arguments.module)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
providers/agy/src/mlx_agent/generate_runner.py:22
port = importlib.import_module(arguments.module)
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
providers/agy/src/mlx_agent/cli.py:147
if url.startswith("http://127.0.0.1") or url.startswith("http://localhost"):
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
providers/agy/src/mlx_agent/cli.py:783
return OpenAICompatibleRuntimeClient("mlx_lm", "http://127.0.0.1:8080")
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
providers/agy/src/mlx_agent/cli.py:785
return OpenAICompatibleRuntimeClient("litellm", "http://127.0.0.1:4000")
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
providers/agy/src/mlx_agent/cli.py:1222
OpenAICompatibleRuntimeClient("mlx_lm", "http://127.0.0.1:8080"),
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
providers/agy/src/mlx_agent/cli.py:1224
OpenAICompatibleRuntimeClient("litellm", "http://127.0.0.1:4000"),
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
lab_tests/test_wan_production_canary.py:2002
secret = "/private/models/customer-secret"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/integration/test_transactions.py:54
secret = "terminal-json-receipt-backup-secret"
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
lab_tests/test_feasibility.py:787
"ghp_abcdefghijklmnopqrstuvwxyz123456",
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
lab_tests/test_feasibility.py:788
"github_pat_abcdefghijklmnopqrstuvwxyz123456",
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mlx-agent-generated-files.json
.mlx-agent-generated-files.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
providers/agentskills/.mlx-agent-generated-files.json
.mlx-agent-generated-files.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
providers/agy/.mlx-agent-generated-files.json
.mlx-agent-generated-files.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
providers/codex/.mlx-agent-generated-files.json
.mlx-agent-generated-files.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
providers/opencode/.mlx-agent-generated-files.json
.mlx-agent-generated-files.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
lab_tests/host/test_wan_mps_branch_micro_canary.py:37
modules[name] = importlib.import_module(name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
lab_tests/test_wan_branch_runtime.py:211
return importlib.import_module(name)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/unit/test_research.py:208
DomainIntent(domain="../../etc/passwd", roles=("vision",)),
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/unit/test_wiring.py:88
"http://169.254.169.254/latest/meta-data",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
lab_tests/test_wan_curated_compiler.py:414
raw = bytearray(__import__("base64").b64decode(source["frames_base64"]))

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha fe2e46f6cf6ffull audit observations/trust-audit/skill/cavi-ai__mlx-agent.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-12fe2e46f6cf6fBLOCKF54first audit
07

Questions

What does the mlx-agent skill do?

🍏 Discover, verify, and wire local MLX-optimized models on Apple Silicon: plugins for Claude Code, Codex, Antigravity, and OpenCode, plus a portable AgentSkill.

Is mlx-agent safe to install?

No — not without reading the findings first. The audit graded it F (54/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What can mlx-agent access on my machine?

The audit observed that it reaches the network, runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.

What do I need installed to use mlx-agent?

Its own instructions reference mlx-lm. Dependencies are not all pinned to exact versions, so what installs today may differ tomorrow.

Which assistants does mlx-agent work with?

Its documentation mentions claude-code, codex, gemini-cli and openclaw. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (fe2e46f6cf6f), read on 2026-10-12. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement