Dispatch

v1.0.0 · macOS · open source

A switchboard between your local repos.

Link the repos you already work in as projects. Dispatch merges one entry into each linked repo's .mcp.json — nothing else changes. From then on, the Claude Code sessions you run in those repos, your own sessions, can ask each other questions over a local MCP bus, and you see every exchange.

v1.0.0 · macOS 14 (Sonoma)+ · Release notes

Dispatch showing five linked projects — Ledgerline, Driftwood, Beacon, Kestrel, and Halyard — on the Bus Map, with a scrollable list of questions and answers below

Not a runtime. A switchboard.

Dispatch is a native macOS app that links local repos you already work in and lets the Claude Code sessions running in them ask each other questions. You add each repo as a project; linking two projects merges a single dispatch entry into each one's own .mcp.json. Dispatch never starts a session, never queues work, and never gates a commit — it hosts one localhost MCP bus and relays messages between sessions you started yourself, over four tools: ask_agent, answer_agent, check_messages, list_projects. A project link is the whole consent model — an ask to a project you haven't linked fails closed.

The whole agent-facing surface: four verbs.

No fifth tool that runs commands or edits another repo's files. A question is a question, not a task — the session on the other end decides for itself how (or whether) to answer.

ask_agent

Ask a linked project

Ask another linked project's session a question about its own repo — its contract, its behavior, whether a change is safe there. Pass wait_seconds and, if that project is connected right now, get the answer back inline; otherwise it lands in that project's inbox.

answer_agent

Answer what's yours

Answer a question addressed to your project. Only the project a question was asked of can answer it. If the asker is waiting, your answer reaches them immediately.

check_messages

Read your inbox

Open questions still waiting on you, plus the outcome — answered or expired — of every question you asked and haven't seen yet. Each outcome is reported exactly once.

list_projects

See who you're linked to

The only projects ask_agent can reach. Each entry reports whether that project's session is connected right now, when it was last seen, and how many of its questions are sitting in your inbox.

Link

Add a repo as a project. Link the pairs that should talk.

A project is a name, a repo path, and a durable bus token — nothing is cloned or copied. Linking two projects is the human's decision, made once in the app; it's the only thing that makes them reachable from each other.

  • Value-faithful merge into .mcp.json — your own MCP servers and any other keys round-trip untouched
  • A foreign entry already named dispatch is reported as a conflict, never silently overwritten
  • Unlinking removes exactly the one key Dispatch added
{
  "mcpServers": {
    "dispatch": {
      "type": "http",
      "url": "http://127.0.0.1:<port>/bus/<token>"
    }
  }
}

What linking merges into a repo's .mcp.json — one key, added or replaced, everything else untouched.

Watch

The Bus Map shows every project and every link.

A graph of your linked projects, plus a searchable, filterable list of every question and answer that has crossed the bus — pending, answered, expired, or closed. Filter by project, or search by question text or id.

  • Live connection status per project — is a session actually there right now
  • Filter chips for pending / answered / expired / closed
  • Click a link in the map to filter the list to that pair
Dispatch Bus Map — a graph of five linked projects (Ledgerline, Driftwood, Beacon, Kestrel, Halyard) above a filterable list of questions between them

Read & answer

Every question and answer, visible to you.

Expand any thread in the Messages tab to read the full question, the full answer, and who answered it. Nothing crosses the bus without landing here — the human can read every exchange, and can answer a question directly from the app if the session on the other end isn't around.

  • Full question and answer text, not a summary
  • Scoped to one project or across every linked project at once
  • The human can answer any open question themselves
Dispatch Messages tab — expanded threads between Ledgerline and Driftwood about a sync worker and exported statement timezones, with the full question and answer text visible

Why linking two repos doesn't mean trusting each other blindly.

Cross-repo questions are a real attack surface if you let them be. Dispatch is built so a project you link can ask, but never quietly command.

A link is consent, not a default

Nothing is reachable until a human links it in the app. ask_agent checks the link before anything else fires — an ask to an unlinked project is refused, not silently dropped.

Untrusted by construction

Every question and answer crossing the bus is wrapped in explicit content markers and a framing line telling the receiving session it's data to reason about, not instructions to follow — before it ever reaches that session's prompt.

No agent spawning, no work queue

Dispatch starts nothing. The sessions on both ends are yours, started the normal way in your own terminal. There's no queue of tasks, no commit gate, no QA pipeline for Dispatch to abuse.

Local-only bus

The listener binds 127.0.0.1. The only thing Dispatch writes into your repo is a single localhost URL — nothing is sent to a Dispatch-run server, because there isn't one.

Get started

Dispatch is pre-1.0 — the app is real and buildable today. Grab a release when one's cut, or build from source below.

Prerequisites

  • macOS 14 (Sonoma) or later, recent Xcode
  • The Claude Code CLI on your $PATH — Dispatch never installs or spawns it, but it's what runs in each linked repo
  • Two git repositories you actually work in — one repo alone has nobody to ask

Build

git clone https://github.com/awizemann/Dispatch.git
cd Dispatch
./scripts/build.sh

Link two repos and ask a question

  1. Open Dispatch, click +, add both repos as projects, then link them.
  2. Run claude as usual in each repo — it picks up the dispatch server from .mcp.json on start.
  3. From one session: "Use ask_agent to ask <other project> whether its API response still includes a field, and wait for the answer."

Full walkthrough, including troubleshooting, on the Getting Started wiki page.

Dispatch Messages tab showing an answered question thread between two linked projects

FAQ

Quick answers to the questions developers usually ask before installing.

What is Dispatch?

Dispatch is a native macOS app that acts as a switchboard between local repos. You add each repo you work in as a project and link the pairs that should be able to talk. Linking merges one dispatch entry into that repo's own .mcp.json. From then on, the Claude Code sessions you run in those repos — your own sessions, started the normal way in your own terminal — can ask each other questions over an app-hosted localhost MCP bus.

Does Dispatch spawn or run Claude Code sessions itself?

No. Dispatch never starts a session, never queues work, and has no commit gate or QA pipeline. It only hosts the bus and relays messages between sessions you started yourself by running claude in a linked repo. If no session is running in a project, questions addressed to it simply wait in its inbox until one is.

What can one project's session actually do to another's?

Exactly four things, all mediated by Dispatch: ask_agent (ask a linked project's session a question about its own repo), answer_agent (answer a question addressed to you), check_messages (read your inbox), and list_projects (see who you're linked to and who's connected). There is no fifth tool that runs commands, edits files, or triggers work in another repo — a question is not a task, and the receiving session decides for itself how to answer.

What happens if I ask a project I haven't linked?

It fails closed. A human-created project link is the entire consent model — ask_agent cannot reach a project that isn't listed by list_projects, and there is no way to reach an unlinked project by guessing a name or id. If the project you need is missing, that's a decision for the human, not something a session can route around.

Can the other project's session see my repo, my files, or this conversation?

No. A question crosses the bus as a single self-contained block of text — the asking session's repo, files, and conversation are never visible to the other side. Each project answers only from what it can verify in its own repo, and is expected to say plainly when it doesn't know.

Is bus traffic trusted the way my own prompts are?

No, by design. Every question and answer that crosses the bus is framed as untrusted data before it reaches the receiving session's prompt, with explicit content markers and an instruction that it's content to reason about, not instructions to follow. One repo's session cannot use a bus message to make another repo's session do something its own rules would otherwise refuse.

What happens if the other session isn't running?

The question sits in that project's inbox. Nothing wakes a session that isn't there — the other side picks it up the next time it calls check_messages, whether that's a minute later or the next day. Pass wait_seconds to ask_agent only when you want an inline answer and the other project shows as connected on list_projects; otherwise the ask returns a pending id immediately. Unanswered questions eventually expire, and the asker is told so — never silently dropped.

Does data leave my Mac?

Not through Dispatch. The bus listener binds 127.0.0.1 only, and the only thing Dispatch writes into a repo is a single localhost URL inside its .mcp.json. Whatever a Claude Code session itself does — reach a model provider, use other tools — is between that session and its own configuration, unrelated to Dispatch.

What does linking actually change in my repo?

One key. Dispatch merges a single dispatch entry into the repo's .mcp.json (creating the file if needed) and touches nothing else — your own MCP servers and any other top-level keys round-trip untouched. If a dispatch entry already exists that Dispatch didn't write, install refuses rather than overwriting it, and reports the conflict. Unlinking removes only that one key; the file itself is only deleted if Dispatch created it and removing the key leaves it an empty shell.

Is Dispatch open source?

Yes, MIT licensed. The source — the MCP bus implementation, the .mcp.json installer, the whole app — is on GitHub.

What macOS version and tools do I need?

macOS 14 (Sonoma) or later, and the Claude Code CLI installed and on your $PATH in each repo you want to link — Dispatch never installs or runs it for you. Building from source additionally needs a recent Xcode.

Is there a Windows or Linux version?

No. Dispatch is a native macOS app built on SwiftUI and AppKit. There is no current Windows or Linux build.