Skip to main content

Coding Agent for Mac

Project description

mlx-code

A lightweight coding agent built on Apple's MLX framework.

demo


Features

  • Composable by design: Agent, Tool, and the REPL are separate pieces you can import and wire together however you like
  • Swappable backends: point the harness at the local MLX server, a remote provider, or any OpenAI-compatible endpoint without changing anything else
  • Git worktree isolation: every session gets a fresh worktree so the agent can't silently corrupt your working tree
  • 9 built-in tools: Read, Write, Edit, Bash, Grep, Find, Ls, Skill, Agent
  • Interactive REPL commands: /clear, /history, /tools, /branch, /abort

Quick Start

pip install mlx-code[all]
mlxc

Command Line

mlxc: local server + harness

Starts the MLX inference server and launches a harness against it.

# Default: local MLX server + built-in REPL harness
mlxc

# Use a different harness (routes traffic through the local server)
mlxc --leash claude
mlxc --leash gemini
mlxc --leash codex

# Server only, no harness
mlxc --leash none

# Specify a model
mlxc --model mlx-community/Qwen3.5-4B-OptiQ-4bit

# Restrict the tools available to the agent
mlxc --tools Read Write Bash

# Custom system prompt
mlxc --system "You are a helpful assistant."

# Load skills from a directory (scans recursively for SKILL.md files)
mlxc --skill ./my-skills

# Resume a previous session from a git commit hash
mlxc --resume <commit-hash>

# Because `mlxc` reads from stdin when it isn't a TTY, it composes naturally with shell pipes:
echo "explain lsp.py" | mlxc -d | cat - PLAN.md | mlxc

mlxc-run: harness only

Runs the agent harness against an already-running server or a remote provider.

# Connect to a local server at 127.0.0.1:8000 (default)
mlxc-run

# Remote providers
mlxc-run --api claude
mlxc-run --api gemini
mlxc-run --api deepseek --model deepseek-v4-pro
mlxc-run --api codex

# Custom endpoint
mlxc-run --url http://localhost:9000

# With skills
mlxc-run --skill ./my-skills

Using as a Library

Import the pieces you need to build background workers, scheduled jobs, or event-triggered handlers.

Spawn an agent from Python

import asyncio
from mlx_code.repl import Agent

async def main():
    agent = Agent(system="You are a concise technical writer.")
    await agent.run("Summarise all *.py files changed in the last 7 days. Save to digest.md.")

asyncio.run(main())

Multi-agent pipeline

import asyncio
from mlx_code.repl import Agent

async def main():
    researcher = Agent(system="You are a research assistant.")
    await researcher.run("Research PBFT consensus. Save a structured summary to kb/draft.md.")

    reviewer = Agent(system="You are a critical reviewer.")
    await reviewer.run(
        "Read kb/draft.md. Write a one-paragraph critique to kb/critique.md. "
        "Use only information in that file."
    )

asyncio.run(main())

Parallel workers with asyncio.gather

import asyncio
from mlx_code.repl import Agent

async def main():
    topics = ["history", "algorithms", "industry_usage"]
    agents = [Agent() for _ in topics]
    await asyncio.gather(*[
        a.run(f"Research the {t} of Byzantine Fault Tolerance. Save to kb/{t}.md.")
        for a, t in zip(agents, topics)
    ])
    reducer = Agent()
    await reducer.run("Read all files in kb/. Synthesise into final_report.md.")

asyncio.run(main())

Resume a session from a git commit

mlx-code stores the full conversation as JSON in each commit message, so you can restore both the workspace state and the agent's memory from any checkpoint.

import asyncio
from mlx_code.gits import resume_worktree
from mlx_code.repl import Agent, repl

async def main():
    gwt, messages = resume_worktree(".", "abc1234")
    agent = Agent(ctx={"gwt": gwt})
    agent.messages = messages
    await repl(agent)

asyncio.run(main())

Custom tools

Subclass Tool, define a Pydantic schema, and pass the class at instantiation.

from mlx_code.tools import Tool
from mlx_code.repl import Agent
from pydantic import BaseModel, Field

class QueryParams(BaseModel):
    query: str = Field(description="SQL query to run")

class LiveDBTool(Tool):
    name = "QueryDB"
    description = "Execute a query against the dev database"
    parameters = QueryParams

    async def execute(self, params: QueryParams, signal=None) -> dict:
        result = run_query(params.query)   # your logic here
        return {"content": [{"type": "text", "text": result}], "is_error": False}

agent = Agent(extra_tool_classes=[LiveDBTool], tool_names=["QueryDB"])

Credits

Built on mlx and mlx-lm. Inspired by Mario Zechner's pi.

License

Apache License 2.0: see LICENSE for details.

Project details


Download files

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

Source Distribution

mlx_code-0.0.9.tar.gz (69.0 kB view details)

Uploaded Source

Built Distribution

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

mlx_code-0.0.9-py3-none-any.whl (72.0 kB view details)

Uploaded Python 3

File details

Details for the file mlx_code-0.0.9.tar.gz.

File metadata

  • Download URL: mlx_code-0.0.9.tar.gz
  • Upload date:
  • Size: 69.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for mlx_code-0.0.9.tar.gz
Algorithm Hash digest
SHA256 946065a21afae32ecfa6ce13b339794c2366de8a4460486d6adbd74d7080dbc0
MD5 ae2b6dc016baad45594c699870686f56
BLAKE2b-256 410505d052c75d9d9fda8aa8ae5d13a7d0cee1949294567df88ffc16378d9d8d

See more details on using hashes here.

File details

Details for the file mlx_code-0.0.9-py3-none-any.whl.

File metadata

  • Download URL: mlx_code-0.0.9-py3-none-any.whl
  • Upload date:
  • Size: 72.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for mlx_code-0.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 c2520c70745011a50fdb776c9e6825722138860a81e67d42f94bad79a31e109e
MD5 782d30f1f9d53aca13dde4ec0994c54b
BLAKE2b-256 580a126052c2af7ca5ec6c1191dd69bc57addbabc3c799b5bace670f0751e1de

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page