Skip to main content

MLX MCP Server

PyPI version CI 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 routine work can run on-machine when that is the right trade-off.

The core value is convenience and privacy, not a promise of measurable API-bill savings. The headline iterate tool runs a self-correcting local ladder — retry against a gate, step up to a bigger local model, and hand back to Codex when the local rungs are exhausted. This is useful for routine work (summarizing, extracting, classifying, boilerplate, single-file review) while Codex stays focused on multi-file reasoning, tool-heavy debugging, and judgment calls. See POSTMORTEM.md for the accounting behind that scope.

Features

  • Local routine-work bridge — routes eligible work (summarize, extract, classify, boilerplate, single-file review, first drafts) to a private local model when local quality is good enough.
  • Self-correcting iterate ladder — retries locally, then uses a bigger model for that request only, then hands back to Codex; local rungs are exhausted before Codex takes over.
  • 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 telemetry — summarize, extract, explain, boilerplate, review, and other tune local retry behavior and log content-free routing 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 local routing activity, 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. Because iterate can execute a shell gate, it is configured to prompt for approval; the other listed tools are approved by default. 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 — local-first for routine work

The intended workflow is simple: route eligible routine work (summarize, extract, classify, reformat, boilerplate, single-file review, simple refactors, first drafts) to your private local model, then verify or polish the result in Codex. This can avoid remote generation for those delegated tasks, but it should not be treated as a general solution for cache-heavy API costs. The headline tool is iterate, which runs a self-correcting escalation ladder:

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

Local rungs are exhausted before Codex takes over. 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 — an arbitrary shell command that sees the candidate at $CANDIDATE_FILE and exits 0 to pass (e.g. a linter or test). Run only trusted commands and review the Codex approval prompt.

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 local routing activity, 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
python3 observability/verify_runtime.py --strict
terraform -chdir=observability/terraform validate

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

Development

# Install the locked development environment
uv sync --locked
# Run the complete test suite and build distributions
uv run pytest -q
uv build
# Verify observability and Terraform
python3 -m unittest discover -s observability/exporter -p 'test_*.py'
uv run python observability/verify_runtime.py --strict
terraform -chdir=observability/terraform fmt -check -diff
terraform -chdir=observability/terraform validate

License

MIT — see LICENSE.


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

Metadata

Release files for mlx-mcp-server 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mlx-mcp-server 0.7.0
File Size Uploaded Provenance
mlx_mcp_server-0.7.0.tar.gz 209.4 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for mlx-mcp-server 0.7.0
File Interpreter ABI Platform
mlx_mcp_server-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 240.3 kB

Release files / mlx_mcp_server-0.7.0.tar.gz

Download URL mlx_mcp_server-0.7.0.tar.gz
Size 209.4 kB
Tags Source
SHA-256 checksum
How to use checksums
2e7d4ce11aa2534f80bbeda84984402d5a1b8e55837d82cb1053b59b35f7834a
BLAKE2b-256 checksum
How to use checksums
339e3c72d32e70480b1764f1a311eda7e945ec4493015eab23d08c2f59b101d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.

Transparency log

Release files / mlx_mcp_server-0.7.0-py3-none-any.whl

Download URL mlx_mcp_server-0.7.0-py3-none-any.whl
Size 30.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
157d4ac97d1d6a14324f067f6d5619b1da36e53751f71e4089aa972931c04f83
BLAKE2b-256 checksum
How to use checksums
75d259d7145c212adbfe3cf0a54fa6d8d35716861f91d3d7a7dcee40fdfadadd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.

Transparency log

Security for mlx-mcp-server 0.7.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for mlx_mcp_server-0.7.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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