Agent bridge
Give the coding agent you already have a seat at the table.
MidMeeting can hand the live meeting straight to an agent CLI running on your own machine instead of an API key. Settings, Copilot provider, Agent bridge. The app then listens on a local Unix socket, and any agent that can run a shell can attach, hear the room, answer what you highlight, and play the agents you armed, with everything it already knows about your repos, your notes and your tools. No key to buy, nothing leaves the machine unless your agent itself calls out.
Step 1. Install the bridge CLI.
midmeeting-bridge is the small program that speaks to MidMeeting's socket. One command:
$ curl -fsSL https://midmeeting.com/bridge.sh | sh
It detects your platform, downloads the right binary, and puts it on your PATH as midmeeting-bridge.
Or download it directly:
Manual install: put the binary on your PATH as midmeeting-bridge and make it executable.
$ mv midmeeting-bridge-linux-x86_64 ~/.local/bin/midmeeting-bridge
$ chmod +x ~/.local/bin/midmeeting-bridge
Windows has no agent bridge yet. This is Linux and macOS 14.4 and later, Apple Silicon.
Step 2. Install the skill.
A skill is a short markdown file that teaches your agent how to attach to the bridge, when to speak, and when to stay quiet. All four agent CLIs below read the same SKILL.md format.
One command installs it into every agent CLI it finds on your machine:
$ npx skills add matpb/midmeeting-web --skill midmeeting -g
Target one agent with -a claude-code, -a codex, -a cursor or -a grok. Update later with npx skills update.
Claude Code
~/.claude/skills/midmeeting/SKILL.md
$ mkdir -p ~/.claude/skills/midmeeting && curl -fsSL https://midmeeting.com/skills/midmeeting/SKILL.md -o ~/.claude/skills/midmeeting/SKILL.md
Codex CLI
~/.codex/skills/midmeeting/SKILL.md (also read from ~/.agents/skills/)
$ mkdir -p ~/.codex/skills/midmeeting && curl -fsSL https://midmeeting.com/skills/midmeeting/SKILL.md -o ~/.codex/skills/midmeeting/SKILL.md
Cursor CLI
~/.cursor/skills/midmeeting/SKILL.md
$ mkdir -p ~/.cursor/skills/midmeeting && curl -fsSL https://midmeeting.com/skills/midmeeting/SKILL.md -o ~/.cursor/skills/midmeeting/SKILL.md
Grok Build
~/.grok/skills/midmeeting/SKILL.md (Grok also reads ~/.claude/skills)
$ mkdir -p ~/.grok/skills/midmeeting && curl -fsSL https://midmeeting.com/skills/midmeeting/SKILL.md -o ~/.grok/skills/midmeeting/SKILL.md
Once it is installed, type /midmeeting in the agent, or just say "listen to my meeting."
The full file, to read or copy by hand:
---
name: midmeeting
description: Use on "/midmeeting", "listen to my meeting", "join the meeting", "watch MidMeeting", "attach to the bridge": attaches this session to a MidMeeting desktop app's agent bridge, streams the live transcript in, answers questions asked in the app, and plays any agent turns it is armed for.
---
# MidMeeting agent bridge
MidMeeting is a local-first meeting recorder. When its Copilot provider is set to
Agent bridge, the app hands the live transcript to whatever agent CLI is running
on the same machine instead of calling a cloud API key.
## Attach
Check for the bridge socket before doing anything else:
```sh
test -S "${XDG_RUNTIME_DIR:-/tmp}/midmeeting/bridge.sock" || test -S /tmp/midmeeting/bridge.sock
```
If neither path has a socket, tell the user MidMeeting is not running with the
agent bridge on, and stop.
Once the socket exists, start `midmeeting-bridge tail` as a persistent background
process using whatever mechanism this agent supports for a long-running monitor
(background shell, watcher task). Read every JSON line it prints as it arrives.
Do not run `tail` in the foreground and block on it. Tell the user you are
listening, then stay quiet until there is a reason to speak.
## Respond
- `ask` lines are always answered. Ground the answer in the transcript seen so
far, and verify factual claims with other tools when they are available and
relevant. A question starting with `Over the whole meeting:` is a summary
preset: its `selection.text` is the full transcript, and the answer can run
long, sent back via `answer <id> @/path/to/file` or `answer <id> -` on stdin.
- `agent` lines are one armed agent's turn. Play the role in its `system` field
against the transcript window in `user`. PASS is the default reply
(`midmeeting-bridge answer <id> PASS`): most turns deserve no comment. Only
reply with a card when a sharp colleague in the room would actually interrupt,
and no more than about one card every few minutes. A card reply is JSON:
`{"kind":"idea","text":"<40 words or fewer>","why":"<20 words>"}`, kind one of
claim_check, risk, question, idea, correction.
- `segment` and `tail` lines are not answered directly, they are context: fold
them into what the agent and ask replies are grounded in.
Reply to every `ask` and `agent` id within about a minute; the app forgets a
request after 180 seconds.
## Detach
When the meeting ends, or the user says to stop, stop the `tail` process. Do
not leave it running past the meeting.
## Gotchas
- The tail dies when the MidMeeting app restarts. If replies stop landing,
rearm by starting `tail` again.
- Attach one agent per meeting. The socket accepts several watchers and sends
every line to all of them, so two attached agents both answer every ask.
- The tail cadence (updated within a second of a pause, at least every 5
seconds while someone is talking) is a floor, not a promise of faster
updates. Do not treat a delayed line as a dropped connection.
Step 3. Turn it on in MidMeeting.
Settings, Copilot provider.
Choose Agent bridge instead of an API key or a local model.
Start a meeting.
MidMeeting opens the socket and waits for a watcher.
In your agent, type /midmeeting.
It attaches, starts listening, and stays quiet until it has something worth saying.
What your agent receives.
Every line from midmeeting-bridge tail is one JSON object on its own line.
| type | fields | meaning |
|---|---|---|
| tail | lines[].track, text, from_ms, to_ms | the provisional live line, replaced on every push |
| segment | track, text, from_ms, to_ms | a finalised line, sent once, 25s or more after it was spoken |
| ask | id, selection.text, question | the user highlighted text and asked a question |
| agent | id, agent, name, system, user | an armed agent's turn: system is its role prompt, user is the transcript window |
Reply to an ask or an agent turn with midmeeting-bridge answer <id> <text>, or PASS. Volunteer an unprompted card with midmeeting-bridge card <agent-id> <kind> "<text>". Track you is your mic, them is everyone else.
Limits.
Linux and macOS only. Windows has no agent bridge yet.
One agent per meeting. The socket sends every line to every watcher, so two attached agents would both answer every question.
The tail cadence is a floor. Provisional lines update within a second of a pause and at least every 5 seconds while someone talks. Finalised segments land 25s or more after they were spoken.