Releases: Don-Works/mcplexer
Release list
v0.6.3 — lean v11 agent rules
v0.6.3 — lean v11 agent rules block
The managed rules block agents read every session was rewritten from a ~180-line append-only accretion (V1→V10) into one self-contained ~33-line block (V11). Enforcement stays in code — leases + auto-release, the quote-aware shell hook, CWD gating — and the block now only says what exists, when to reach for it, and what the guardrails will do.
- Rules template (agentrules v11): four entrypoints, one line per namespace, guardrails-as-facts.
TestRenderV11LeanContractpins the design both ways: required strings, banned process-essay markers (HARD-BLOCKED, "default execution path",Anti-patterns, …), and a 60-line budget so sections can't accrete again. - Accurate shell-guard description: the old block still taught the pre-quote-aware hard-block ("
grep -E \"foo|bar\"is blocked") long after the guard went quote-aware andShellGuardAllowChainingbegan routing chains to the approval path by default. The rules now describe today's behaviour. - No more "ignore your harness" imperatives: where gateway and harness surfaces overlap (tasks, memory), the text states the durability trade-off ("prefer the gateway store") and leaves the call to the agent.
- Delegation is a tool, not a mandate: the "delegation-first / default execution path" framing was removed from the rules block,
CLAUDE.md,AGENTS.md, and thetoken-preserving-delegationskill; the skill's measured first-12h economics section stays. - harnesssync: the "single source of truth / Do NOT use your native memory" section was replaced with the preference-with-why framing across all harness variants; golden testdata now regenerates via
go test ./internal/harnesssync -update.
Existing installs pick up the new block on task upgrade (the upgrade script re-runs rules sync).
v0.6.2
v0.6.1
v0.6.0
v0.5.1 — Compression measures the code-mode path + live dashboard
v0.5.1 — Compression measures the code-mode path + live dashboard
A patch on v0.5.0 that makes token compression actually fire for the default usage pattern, and makes the dashboard live.
Fixes
- Token compression now measures
execute_codeoutput. The seam previously only ran on direct downstream tool results — but a slim-surface + code-mode harness (mcplexer's default) never makes those; every result comes back insideexecute_code, which is intentionally excluded from the seam (for JS iterability). So nothing was ever measured. Theexecute_codeoutput — the payload the model actually reads — is now measured (and, when turned on, compressed) too. - Live dashboard.
/settings/compressionupdates in real time via SSE (GET /api/v1/compression/stream), with a Live connection indicator — no manual refresh.
Notes
- Still dry-run by default — measurement only, zero accuracy/latency risk, until you flip a transform on.
- Code-mode output is often already compact (the sandbox caps it), so per-call savings are modest and accumulate; the larger wins are on verbose pretty-JSON / log outputs.
Full changes: v0.5.0...v0.5.1
v0.5.0 — Token compression at the gateway seam
v0.5.0 — Token compression at the gateway seam
MCPlexer now compresses the tokens it feeds into your agent's context — measured first, applied only when proven safe.
Highlights
Token compression (measure-first, zero-config)
MCPlexer compresses downstream MCP tool-result payloads before they reach the model. It auto-wires into a dry-run (shadow) mode on upgrade: it measures what each transform would save on your real traffic and returns results byte-identical — zero accuracy or latency risk — until you turn a transform on from the dashboard.
- Dashboard settings page (
/settings/compression): a three-state mode (off / dry-run / on), a per-transform toggle, and each transform's observed savings shown next to it, with a gate-verified badge for transforms proven safe. - Four transforms:
json_minify— strip insignificant JSON whitespace (value-lossless).structured_dedup— drop the double-encodedcontenttext whenstructuredContentalready carries the value.log_compact— drop low-severity INFO/DEBUG log noise, keep errors + stack traces + load-bearing tokens.oversize_truncate— head + tail for very large payloads.
- Reversible by design (CCR): any dropped content is stashed and expandable on demand via the new
mcpx__retrievetool. A verify-after-compress kill-switch guarantees the model never sees a marker it can't expand. - Measured, not asserted: the first tokenizer in the codebase + a durable savings ledger + a REST API power the dashboard. A CI gimmick gate enforces value-losslessness, credential safety, a latency budget, and a real measured win for every transform.
Also in this release
- Audit live-stream filter parity — the live tail now filters identically to the historical feed across all facets.
- macOS install — release binaries are re-signed + de-quarantined so the installed binary runs cleanly.
- Tasks — honest open-count + bulk move-to-workspace.
Good to know
- The compression seam sees MCP tool results +
execute_codeoutput; native harnessBash/Read/Grepbypass the gateway. Budget 15–35% on mixed MCP traffic. - Default is dry-run — nothing is compressed until you opt a transform in from the dashboard.
- Pure Go, no CGO, single static binary — the ML/sidecar path was deliberately left out to preserve that.
Full changes: v0.4.0...v0.5.0
MCPlexer v0.4.0 — brw multi-profile sync + auto-discovery
MCPlexer v0.4.0 — brw multi-profile sync + auto-discovery
Run several browser profiles (Chrome + Chromium, multiple profiles) and let an agent pick which one — the gateway now discovers and registers them for you.
✨ mcplexer brw sync
Turns brw's brwctl daemons discovery into one downstream MCP server + route per browser-profile daemon. Idempotent; adopts existing manually-registered brw servers untouched; --dry-run by default, --apply / --prune / --workspace.
🔄 Auto-discovery (opt-in, default off)
When enabled, the gateway keeps its source="brw" servers + routes in sync with the live daemon roster — via a file_watch on browser-profiles.json plus a periodic interval reconcile, both routed to one in-process executor. Launch a brwd for a new profile and its namespace just appears; no manual sync.
Enable: MCPLEXER_BRW_AUTODISCOVER=true (+ MCPLEXER_BRW_WORKSPACES, MCPLEXER_BRW_POLICY, MCPLEXER_BRW_INTERVAL, MCPLEXER_BRWCTL_PATH, MCPLEXER_BRW_PRUNE). Off = no behavior change.
Docs: docs/brw-profiles.md.
Also in this release
- Dashboard / UI + approval-flow refinements and accumulated web work.
Full changelog: v0.3.0...v0.4.0
v0.3.0
v0.2.0 — Worker pre/post-execute JS hooks
Worker pre/post-execute JS hooks 🪝
Workers can now carry two optional JavaScript hooks that run in MCPlexer's existing code-mode (goja) sandbox, around the model loop:
pre_execute_script— runs before any model/CLI spend and can block the run.throwor callabort(reason)to stop it; return cleanly to proceed. Use it to hit an endpoint, check a flag, or read a condition and decide whether the worker should run at all. A blocked run costs zero tokens.post_execute_script— runs after output is produced and can reject it (throw on a successful run), which suppresses emission to every output channel.
This lets an agent provisioning a worker attach a gate like "only run if https://…/gate says go" or "don't publish output shorter than N chars" — entirely declaratively.
How it works
- Hooks run through the worker's own
mcpx__execute_codepath, so they inherit that worker's tool allowlist, capability profile, and audit trail — no new sandbox or privilege surface. (There's no JSfetch; reach an HTTP endpoint via an allowed downstream tool, e.g.fetch.fetch({url}).) - A generated preamble binds a
hookcontext object —{phase, worker, run, params}(post addsrun.status/output/error/tokens/cost) — plusabort(reason)/proceed()helpers. - New terminal run status
blocked— deliberately notfailure, so an intentional gate never trips the consecutive-failure auto-pause. - Fail-closed: a hook that throws, times out, or fails to dispatch blocks the run.
- Scripts are validated at write time with
codemode.Preflight(syntax + noeval/Function/import/require) and a 64 KB cap.
Surfaces
- New
workers.pre_execute_script/post_execute_scriptcolumns (migration 125 + idempotent boot invariant). - Exposed on
create_worker,update_worker, andmcpx__delegate_worker. - Web editor: Tools → Execute hooks; read-only config view;
blockedstatus badge.
Tested
- Go unit + integration tests (hook engine, validation, store round-trip).
- Live end-to-end against the built daemon:
gate=no→blocked(zero spend);gate=yes→success; post-hook veto flips success →blocked; malformed hook JS rejected at create.
Artifact
mcplexer-v0.2.0-darwin-arm64.tar.gz — macOS (Apple Silicon) build, web UI embedded. Build from source with task build for other platforms.
🤖 Generated with Claude Code
MCPlexer v0.1.9
Highlights
- Stops human-owned tasks with stale agent leases from being reclaimed every minute by the lease sweeper.
- Fixes misleading mesh
task_event:status_changed ... -> openemissions for lease cleanup when the task status did not actually change. - Keeps routine
task_eventrows out of the Mesh page by default while preserving explicit/deep-link opt-in. - Sends task-related notification clicks to the task detail route instead of raw mesh rows or inert
/app?task=...URLs. - Bumps the PWA service-worker shell cache to
mcplexer-shell-v12so installed clients pick up the deep-link and Mesh feed fixes.
Verification
go test ./cmd/mcplexer ./internal/api ./internal/mesh ./internal/store/sqlite ./internal/tasksnpm run testnpm run build- Local daemon verification: default Mesh status has zero task_event rows; Tadweld task stopped moving after the pre-fix
19:42:02Zrow.
Artifacts
Installable archives are attached for macOS, Linux, and Windows on amd64 and arm64, with checksums.txt for verification.