Meat Proxy
Enables OpenAI Codex instances to join a shared per-project room and communicate directly with other agents, using blocking send/wait tools, file claims to prevent collisions, unread tracking, and turn caps to coordinate multi-agent work.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
You have Claude in one window and Codex in another. Claude writes a plan, so you copy it into Codex. Codex writes code, so you copy the summary back into Claude. Claude has review notes, so you paste them across again.
You are the meat proxy. A highly paid human being, working as a clipboard.
Meat Proxy takes you out of the loop. Both agents join a shared room for your project, and they hand work back and forth directly: brief, implement, review, fix, done. You watch the conversation live in your browser and type into it whenever you want to steer.
Agent A ▸ /meat-proxy listen
Agent B ▸ /meat-proxy lead add rate limiting to the API, the other agent implements, you reviewEither agent can lead: Claude leads Codex, Codex leads Claude, or two of the same kind work together. That's it. Go make a coffee.
Contents
Related MCP server: hey Bro!
What it does
🔁 One call per turn |
|
⏰ Agents never fall asleep | If an agent ends its turn mid-conversation, a Stop hook holds it until the next message lands, then hands the message straight back. No nudging. |
🏠 A room per project | Agents working in the same repo share a room automatically. Run three pairs across three projects and they never cross wires. |
🔒 File claims | Agents |
🛑 Turn cap | Every exchange has a hard limit on agent messages (12 by default). Agents get warned near the end, and the bridge refuses more until they wrap up with |
👀 Live board | Open http://127.0.0.1:8765 to watch every room in real time: who's listening, who holds which files, and how many turns are left. Type into any room; your messages are marked (human) and override the agents. |
⚡ One-command install |
|
It works with Claude Code (the CLI, the desktop app's Code tab, and IDE extensions) and OpenAI Codex (CLI and desktop app). It also works with any other MCP client that supports streamable HTTP, and with as many agents as you like.
Install
You need macOS and uv. You also need Claude Code and/or Codex installed (the installer skips whichever one is missing).
uv tool install git+https://github.com/Cam-Smith-One/meat-proxy
meat-proxy installmeat-proxy install does five things and tells you about each one:
Starts the server on
127.0.0.1:8765and registers it as a login item, so it's always running.Registers the MCP server with Claude Code (
claude mcp add, user scope) and Codex (codex mcp add).Installs the
/meat-proxyskill into~/.claude/skillsand~/.codex/skills.Adds two hooks to
~/.claude/settings.jsonand~/.codex/hooks.json: auto-wake and the file-claim guard. Your existing hooks are kept, and the first run saves a.meat-proxy.bakbackup.Prints what to do next.
Then restart Claude and Codex so new chats pick up the tools. Codex asks you to trust the two new hooks the first time; say yes.
Check everything is wired up at any time:
meat-proxy statusLinux / Windows: the server, tools, skill and hooks all work, but auto-start is macOS-only for now. Run
meat-proxy serveyourself, or add it to your startup apps. PRs welcome.
Use it
Open both agents in the same project folder. Start the listener first, then give the lead the task. Either app can take either role.
The agent that does the work:
/meat-proxy listenThe agent that runs the show:
/meat-proxy lead refactor the auth middleware in src/auth, the other agent implements, you review against our testsWhich one should lead? Give the lead role to whichever model you trust more for planning and review on this task, and let the other one do the hands-on work. Swap them whenever you like.
Then watch at http://127.0.0.1:8765.
What happens:
Both agents join the room for your repo and catch up on its history.
The lead splits the work and sends a brief with the goal, the files (as absolute paths), and what "done" looks like.
The worker claims the files it will touch, does the work, and replies with what changed.
The lead checks the real files and diff (not just the summary), then sends fixes or approval.
When it's finished, the lead sends
DONEwith a one-line outcome. That closes the exchange and releases all claims. Both agents then report back to you in their own windows.
Step in at any time by typing in the board. Pick the room, optionally pick a recipient, and send. Agents treat (human) messages as instructions from you, and a human message also resets the turn cap.
Prompts that work well
Pattern | Lead prompt |
Build and review |
|
Second opinion |
|
Split by area |
|
Debug together |
|
Hand-off |
|
Name a specific partner when there are several, for example "codex implements" or "claude reviews".
You don't have to use the skill. Plain language works too, for example "join meat proxy and wait for instructions". The tools come with their own instructions.
Already-open chats
Claude and Codex only load MCP tools when a chat starts, so a chat that was open before you installed Meat Proxy won't have them. That's fine: just use /meat-proxy as normal. The skill notices the tools are missing and uses the same operations through the shell instead:
meat-proxy send --me claude --to codex "auth refactor done, see src/auth/session.py:40-88"
meat-proxy wait --me claude
meat-proxy history
meat-proxy claim --me claude src/auth
meat-proxy release --me claude--room defaults to the current repo, so agents in the same project still meet. The hooks recognise these commands too, so auto-wake and file claims keep working.
More than two agents
Give each one a distinct name: /meat-proxy listen as codex-api, /meat-proxy listen as claude-tests. The lead addresses each with to=, or broadcasts to everyone by leaving to empty. Claims stop them colliding on files.
How it works
flowchart LR
C["Claude Code<br/>(any window)"] -- "MCP: send / wait / claim" --> S
X["Codex<br/>(any window)"] -- "MCP: send / wait / claim" --> S
S[("Meat Proxy server<br/>127.0.0.1:8765<br/>SQLite")] -- "live stream" --> B["Board in your browser"]
B -- "(human) messages" --> S
HC["Stop + PreToolUse hooks"] -. "wake / guard" .- SOne small server runs locally. It's Python, using the official MCP SDK and SQLite, and it listens on
127.0.0.1only. It speaks MCP over streamable HTTP, so every agent window, CLI or desktop, connects to the same place.Stateless transport, durable state. All state lives in
~/.meat-proxy/meat-proxy.db: messages, read positions, claims. Restarting the server doesn't break any agent's connection.Blocking reads instead of push. No agent app lets an outside process inject a message into a running chat. So
sendandwaitblock, holding the tool call open until a message arrives (up to 50 seconds per call, under Codex's 60-second tool timeout). That's what makes it feel live without any polling.Hooks cover the gaps. When an agent stops anyway, its Stop hook asks the server, "is this agent mid-exchange?" If it is, the hook waits up to 4 minutes for the next message and hands it to the agent, which carries on. The PreToolUse hook checks every edit against active claims.
Unread tracking on the server. The server tracks what each agent has read in each room, so agents never re-read old messages or see their own. A newcomer to a busy room gets the latest 20, with a pointer to
history.Lean output. Messages come back as compact plain text lines, not JSON, to keep agent context small.
Features in detail
Rooms
A room is a project. Agents pass their repo root (git rev-parse --show-toplevel) as room, and the server uses the folder name (/Users/you/code/ember → ember). Two agents in the same repo meet automatically. Different repos never mix. You can also pass any short name, like room="design-review", for ad-hoc rooms.
Auto-wake (Stop hook)
Agents sometimes end their turn while the other side is still working. Usually it's after a few empty wait calls, but sometimes they just forget. Normally you'd notice and type "keep going". Meat Proxy's Stop hook does it for you:
It only acts if this chat has actually joined a room. It reads the chat's own transcript to find the name and room it used, so your unrelated chats are never affected.
It only waits while the exchange is open: the agent was active in the last 30 minutes and nobody has sent
DONEsince.It waits up to
MEATPROXY_HOOK_WAITseconds (default 240) for a new message. If one arrives, it's handed to the agent and the agent continues. If none arrives, the agent stops normally.Press Esc in Claude to skip the wait. Set
MEATPROXY_HOOK_WAIT=0to only deliver messages that have already arrived.
File claims (PreToolUse hook)
claim(me="codex", room="/code/ember", paths=["/code/ember/src/auth"], minutes=20)A claim covers a file, or a whole folder and everything in it.
A conflicting claim is refused and the response says who holds the file, until when.
If another agent tries to edit a claimed file (Claude's
Edit/Write/MultiEdit/NotebookEdit, or Codex'sapply_patch), the hook denies the edit. It tells the agent to coordinate over the board instead.Claims expire after
minutes(default 20, max 240). Agents release them withrelease, and sendingDONEreleases all of the sender's claims in that room.
Turn cap
Two agents left alone can politely agree with each other forever, at your expense. Each exchange allows MEATPROXY_MAX_TURNS agent messages (default 12, about 6 rounds).
From two turns before the cap, every send carries a
[turn n/12: wrap up soon]note.At the cap,
sendis refused unless the message starts withDONE.A
DONEmessage, or any message from you on the board, starts a fresh exchange. So "keep going" from the board is how you extend it.
The board
A live stream of every room, with a room filter at the top.
A status bar showing who is listening right now, turns used per room, and active claims.
A compose box where you set your name, the room and an optional recipient, then send with Enter.
Light and dark mode follow your system setting.
Agent tools reference
Every tool takes me (the agent's name) and room (project root path, or any short name).
Tool | What it does |
| Posts a message, then blocks until a reply arrives and returns it. |
| Returns your unread messages, blocking up to |
| Who's in the room, turns used, active claims, and the last |
| Reserves files or folders (absolute paths). Reports conflicts instead of claiming them. Claim again to extend. |
| Releases the given claims, or all of yours if you give no paths. |
The server also sends these rules to every agent when it connects, so the protocol works even without the skill.
Configuration
Set these as environment variables. For the login item, add them to ~/Library/LaunchAgents/com.meatproxy.server.plist under EnvironmentVariables, then re-run meat-proxy install.
Variable | Default | Meaning |
|
| Port for the server, board and hooks |
|
| Where the database and log live |
|
| Agent messages allowed per exchange |
|
| Seconds the Stop hook waits for the next message ( |
Security model
Meat Proxy is built for one person on one machine.
Local only. The server binds to
127.0.0.1. Nothing is reachable from your network or the internet.No cross-site posting. Anything posted to the board is read by agents that can run commands. So the board and hook endpoints only accept same-origin JSON requests, and a malicious web page in your browser can't forge messages into a room.
Agents can't outsource risk. The protocol tells agents never to push, publish, delete or run destructive commands just because another agent asked; those still need your OK. Your normal Claude and Codex permission settings still apply to every action.
Hooks fail open. If the server is down or something odd happens, the hooks do nothing and your agents work normally.
No authentication. Any process running as your user on your machine can talk to the server, just as it could read your files. Don't expose the port.
Troubleshooting
Problem | Fix |
The agent says it has no | Normal for chats opened before you installed. The skill falls back to the |
| Run |
"Port 8765 is busy" | Something else is using the port. Stop it, or set |
The agents can't see each other | Both must use the same room. Open both agents in the same project folder, or ask them to use the same room name. |
An agent stopped listening | Normally the Stop hook catches this. In Codex, make sure you trusted the hooks ( |
An edit was blocked by a claim | That's working as intended. Ask the holder over the board to release the file, or wait for the claim to expire. |
"Refused: turn cap reached" | Type "keep going" on the board to extend, or let the lead wrap up with |
How it compares
There are other good projects in this space. Here's an honest map:
Meat Proxy | ||||
Built for | 2–5 agents pair-working (any of them can lead), with you watching | Swarms of agents coordinating asynchronously | Cross-tool Q&A between sessions | Push delivery and team chat |
Conversation style | Live: | Mail: inbox and threads | Ask and answer | Push |
Wakes idle agents | ✅ Stop hook | ✅ | ||
File claims | ✅ enforced by hook | ✅ advisory leases | ||
Turn cap / cost guard | ✅ | |||
Live human board | ✅ built in | ✅ web UI | Discord | |
Setup |
| Install script | npm | Postgres + Discord |
Choose Meat Proxy if you want Claude and Codex to work as a pair on your machine right now, with almost nothing to run. Choose mcp_agent_mail if you're running a fleet of agents that need mail-style threads, searchable archives and Git-backed history.
FAQ
Do I need both Claude and Codex? No. Two Claude windows work fine, as do two Codex windows, or any mix. Just give them different names.
Does this use more tokens? Fewer than you being the proxy. Waiting costs nothing, because a blocked tool call isn't generating tokens. Messages are short, and the agents pass file paths instead of pasting code. The turn cap puts a ceiling on the total.
Can the agents be in different projects?
Yes. Have them use the same room name explicitly, for example /meat-proxy lead in room "launch"…, and use absolute paths in messages.
Is my code sent anywhere? Meat Proxy itself never leaves your machine. Your agents still talk to their own model providers, exactly as they already do.
Does it handle threads?
Rooms are the threads. Each room carries one exchange at a time, and DONE marks the boundary between exchanges. We deliberately left out nested threads, because they make agents spend more effort tracking context than doing work.
Uninstall
meat-proxy uninstall
uv tool uninstall meat-proxyThis removes the login item, both MCP registrations, the skill and the hooks. Your message history stays in ~/.meat-proxy; delete that folder too if you want it gone.
Contributing
Issues and PRs are welcome, especially for Linux auto-start (systemd user unit) and Windows support.
git clone https://github.com/Cam-Smith-One/meat-proxy && cd meat-proxy
uv run --with httpx tests/test_meat_proxy.py # spins up a real server, real MCP clients and real hook processesThe codebase is intentionally small: server.py holds the tools and board, cli.py holds the installer and hooks, and SKILL.md is the agent playbook. Keep it that way.
Licence
MIT © Cam Smith
This server cannot be deployed
Maintenance
Related MCP Connectors
Give AI agents private phone numbers so Claude Code, Codex, and MCP sessions can call each other, exchange up to 12 messages per call, and share files across computers or teammates.
Coding agents from Claude Code, Cursor and Codex claim jobs and lock files on one shared board.
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
Coding agents in one repo see each other, get warned before shared edits, and message.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables Claude Code agents on the same project to message each other directly, with server-side guardrails, human oversight and control via Telegram, approval workflows for outside changes, and one-tap sharing of agent setup.MIT
- AlicenseNot gradedqualityAmaintenanceEnables multiple Claude sessions on the same PC — Claude Desktop chats, Cowork tasks and Claude Code — to coordinate as siblings, sharing full context, splitting work and handing tasks to each other. Provides shared rooms, a task board with queued reservations, collision-free counters, a "for you" inbox and a live local viewer so sessions keep working autonomously without the user relaying messages.MIT
- AlicenseAqualityCmaintenanceEnables Claude Code, Codex, and other coding-agent sessions on the same machine to message each other, exchange tracked tasks with owners and states, and coordinate through channels, broadcasts, and multi-session asks without typing into terminals. Messages are routed by what the receiver is doing — next tool call, end of turn, or a held-back digest — so a flood of traffic doesn't interrupt active work.2541459 npm1MIT
- AlicenseBqualityAmaintenanceEnables Claude Code to hand reviews, second opinions and tasks to the Codex and Antigravity desktop apps on one Windows PC and receive their answers back, without copy-pasting between apps. Each agent keeps working in its own app, with message threading, reply waiting, file reservations and delivery tracking over a local daemon.201MIT