Skip to main content

MLX MCP Server

PyPI version Python License: MIT Publish to PyPI AI Automation Consultant

MCP server bridging Codex to local MLX LM (and any OpenAI-compatible backend)

AI automation consulting — I help businesses replace painful manual processes with LLM-powered pipelines and workflow automation.


Overview

mlx-mcp-server is a Model Context Protocol server that bridges Codex to a local LLM (MLX LM on Apple Silicon, or any OpenAI-compatible /v1 backend) so Codex can hand off eligible work to a free, private model instead of spending paid tokens.

Rather than a plain pass-through, it enforces an offload-first policy: its headline iterate tool runs a self-correcting escalation ladder — retry locally against a gate, step up to a bigger local model, and only hand back to Codex when the local rungs are exhausted. The result is lower token cost and more privacy for routine work (summarizing, extracting, classifying, boilerplate, single-file review), while Codex stays focused on multi-file reasoning and judgment calls.

Features

  • Offload-first, token-thrift — routes eligible work (summarize, extract, classify, boilerplate, single-file review, first drafts) to a free, private local model before spending paid Codex tokens.
  • Self-correcting iterate ladder — retries locally, then a bigger local model, then hands back to Codex; free rungs are exhausted before any paid work.
  • Gated retries — structural gates (require_json / schema_keys / contains / regex / min_len) and an executable gate (run a linter or test against $CANDIDATE_FILE) let the local model fix its own output.
  • Category profiles and telemetrysummarize, extract, explain, boilerplate, review, and other tune local retry behavior and log content-free savings data.
  • Runtime model switching — swap the active model by name or fuzzy fragment with no Codex restart; choice persists across restarts.
  • Work-hours guard — optionally blocks large (>22 GB RAM) models during work hours to avoid swap thrashing.
  • One-step install — writes the Codex MCP entry to ~/.codex/config.toml by default, with legacy Claude Code/Desktop support still available.
  • Backend-agnostic — works with MLX LM or any OpenAI-compatible /v1 endpoint; content-free usage metrics, MIT licensed, tested and CI'd.
  • Built-in observability package — Prometheus exporter, Alloy pipeline, Terraform dashboards, and rollout docs for tracking offload ROI, routing discipline, and local inference health.

Getting Started

Requires Python 3.11+ and a running OpenAI-compatible LLM backend (MLX LM on Apple Silicon is recommended).

pip install mlx-mcp-server
mlx-mcp-server install   # wire into Codex, then restart Codex or check /mcp

See Usage for backend setup, configuration, and the full tool reference.

Usage

1. Start a local LLM backend

The server talks to any OpenAI-compatible /v1 endpoint. On Apple Silicon, MLX LM is recommended:

pip install mlx-lm
mlx_lm.server --model mlx-community/Qwen2.5-Coder-14B-Instruct-4bit   # serves on http://localhost:8080

Any other OpenAI-compatible backend works too (e.g. Ollama on Linux/Intel — point MLX_BASE_URL at http://localhost:11434).

2. Install and wire it into Codex

pip install mlx-mcp-server

# One-step setup for Codex user config
mlx-mcp-server install

# ...or project-local Codex config
mlx-mcp-server install --codex-project

# Preview the config without writing anything
mlx-mcp-server install --dry-run

The installer writes an mlx entry into Codex config (~/.codex/config.toml by default) with [mcp_servers.mlx], environment variables, and approval-mode entries for iterate, chat, quick_test, health_check, and list_models. Restart Codex or run /mcp, then call health_check to verify the backend is reachable. Run mlx-mcp-server help for the full CLI reference.

3. How Codex uses it — offload-first

The whole point is token thrift: Codex routes eligible work (summarize, extract, classify, reformat, boilerplate, single-file review, simple refactors, first drafts) to your free, private local model before spending paid tokens. The headline tool is iterate, which runs a self-correcting escalation ladder:

local model retries (feeding each gate failure back in) → a bigger local modelhand back to Codex

Free rungs are exhausted before any paid work happens. You attach a gate so the local model can self-correct:

  • Structural gates (cheap, content-free): require_json, schema_keys, contains, regex, min_len
  • Executable gate: check_command — a shell command that sees the candidate at $CANDIDATE_FILE and exits 0 to pass (e.g. a linter or test)

With no gate, iterate runs a single local attempt and asks Codex to verify.

# Generate boilerplate, gated by a linter — retries locally until ruff is happy
iterate(message="write a Python slugify() function",
        category="boilerplate",
        check_command="ruff check $CANDIDATE_FILE")

# Extract structured data, gated on valid JSON with required keys
iterate(message="extract name, email, company from this signature: ...",
        category="extract",
        require_json=true,
        schema_keys=["name", "email", "company"])

# Quick one-off to the local model, no iteration
chat(message="explain what this regex does: ^\\d{3}-\\d{4}$")

Tools

Tool What it does
iterate Offload a task with a gate; retries locally, then a bigger local model, then hands back to Codex
chat Send a single prompt to the local model and get the response + token usage
quick_test Run a canned diagnostic (hello / math / creative / code_review) to sanity-check the model
list_models List loaded models with speed/quality descriptions and the active marker
set_model Switch the active model at runtime by name or fuzzy fragment — no restart needed
health_check Confirm the backend is reachable
set_work_hours_guard Block large (>22 GB RAM) models Mon–Fri 8am–5pm MT to avoid swap thrashing
get_config Show current config (URL, active model, guard state) — resource config://settings

Codex can inspect the server with /mcp and overall session state with /status. The bundled /switch-model and /mlx-help slash commands remain available for legacy Claude Code installs.

Configuration

Set as env vars in the MCP server entry (the installer scaffolds these):

Variable Default Notes
MLX_BASE_URL http://localhost:8080 Backend /v1 URL
MLX_DEFAULT_MODEL (empty) Optional — auto-detected from /v1/models if unset
MLX_API_KEY (empty) Optional, for secured backends
MLX_TIMEOUT 30 Request timeout in seconds

AGENTS.md offload policy

Codex reliably follows local offload when the project gives it explicit guidance. This repository includes AGENTS.md with the expected policy:

  • call mcp__mlx__iterate before eligible local work
  • call mcp__mlx__chat for quick one-shot summarize/explain/extract/review tasks
  • always pass category as one of review, boilerplate, summarize, extract, explain, or other
  • keep multi-file architecture, tool-heavy work, and final user-facing synthesis on Codex

Legacy Claude support

Claude Code and Claude Desktop config writers remain available for compatibility, but Codex is the primary target:

# Claude Code plus legacy slash commands
mlx-mcp-server install --claude-code --with-commands

# Claude Desktop
mlx-mcp-server install --claude-desktop

Observability

The observability/ package turns the server's content-free local telemetry into operator-grade dashboards:

  • local Prometheus exporter over ~/.omlx/mlx-call-log.jsonl, ~/.omlx/hook-decisions.jsonl, and ~/.omlx/stats.json
  • Alloy scrape and Grafana Cloud remote_write configuration
  • Terraform-managed Grafana folder and dashboards
  • docs for architecture, telemetry privacy, rollout gates, and PDF report artifacts

Phase 1 dashboards cover offload ROI, routing discipline, and local inference health. Phase 2 latency metrics are deliberately gated: the exporter only emits call duration histograms when --enable-call-latency is set after source-writer validation and log cutover.

Start here:

python3 -m unittest discover -s observability/exporter -p 'test_*.py'
python3 observability/exporter/mlx_mcp_exporter.py --once
terraform -chdir=observability/terraform validate

See observability/README.md for the architecture, privacy contract, rollout checklist, and Grafana/Terraform workflow.

Development

# Install dev dependencies
pip install -r requirements-dev.txt  # if present
# Run tests
pytest -q
# Run observability exporter tests
python3 -m unittest discover -s observability/exporter -p 'test_*.py'

License

MIT — see LICENSE.


Built and maintained by Brice — Observability Engineer at Grafana Labs / AI Automation Consultant. See more at github.com/deresolution20.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mlx_mcp_server-0.6.1.tar.gz (191.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mlx_mcp_server-0.6.1-py3-none-any.whl (30.4 kB view details)

Uploaded Python 3

File details

Details for the file mlx_mcp_server-0.6.1.tar.gz.

File metadata

  • Download URL: mlx_mcp_server-0.6.1.tar.gz
  • Upload date:
  • Size: 191.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mlx_mcp_server-0.6.1.tar.gz
Algorithm Hash digest
SHA256 ab5b9d160738df7c9be8ca489f09bdc5227b022658f1824706d502b9dc03d35f
MD5 8e0d046e2bacd354be4f0375f4ecbebb
BLAKE2b-256 fbfb04c37325e4f4280f59c77209fb96111e7cc1bfac8ab9190d7448b4f80ef3

See more details on using hashes here.

Provenance

The following attestation bundles were made for mlx_mcp_server-0.6.1.tar.gz:

Publisher: publish.yml on deresolution20/mlx-mcp-server

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mlx_mcp_server-0.6.1-py3-none-any.whl.

File metadata

  • Download URL: mlx_mcp_server-0.6.1-py3-none-any.whl
  • Upload date:
  • Size: 30.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mlx_mcp_server-0.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 60f6d60d77fc14505d88177336161cf52f8bddd99fd9fc772a4b061378090ad7
MD5 ca2395565edbc90386983d04827fc40a
BLAKE2b-256 b3f86b43b36f1c9e48bfee66c27d0ae45aacc4ddd867a1958137a7665bd587fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for mlx_mcp_server-0.6.1-py3-none-any.whl:

Publisher: publish.yml on deresolution20/mlx-mcp-server

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.7.0

2 files

This release

0.6.1 This release

2 files

0.6.0

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page