{
  "markdown": "# Call Copilot\n\n[![call-copilot MCP server](https://glama.ai/mcp/servers/AnisurRahmann/call-copilot/badges/card.svg)](https://glama.ai/mcp/servers/AnisurRahmann/call-copilot)\n[![call-copilot MCP server](https://glama.ai/mcp/servers/AnisurRahmann/call-copilot/badges/score.svg)](https://glama.ai/mcp/servers/AnisurRahmann/call-copilot)\n\n> One thing. Done really well. Record meetings. Save transcripts. Don't break audio.\n\n<!-- mcp-name: io.github.AnisurRahmann/call-copilot -->\n\nCall Copilot is a terminal command (`rec`) that records your meeting audio and, when you\nstop it, transcribes locally and saves a clean markdown transcript. **Everything runs on\nyour machine** — no cloud, no API keys, no account. Audio and transcripts never leave the\ncomputer.\n\n![Call Copilot demo](docs/demo.gif)\n\n```\n$ rec setup         # one-time: verify macOS + grant capture permission\n$ rec start         # starts recording, you keep working\n$ rec stop          # stops, transcribes, saves markdown\n$ rec list          # shows past recordings\n```\n\n## How it captures audio (no BlackHole, no Multi-Output Device)\n\nBy default, `rec` captures **both the microphone (your voice) AND system audio (other\nparticipants / anything apps play)** — so a real meeting where *you* speak gets recorded,\nnot just the audio coming out of your speakers. Both sources are tapped directly via\nApple's Core Audio taps API (macOS 14.2+) using the [`audiotap`](https://pypi.org/project/audiotap/)\nlibrary. There is:\n\n- **no virtual audio driver** to install (no BlackHole),\n- **no Multi-Output Device** to create in Audio MIDI Setup,\n- **no system output device** to switch and restore,\n- and therefore **no silent-recording failure** that the old driver-based approaches\n  produce when routing breaks.\n\nThe mic and system streams are recorded as **two separate WAVs** (each at its own true\nrate), transcribed separately, and merged into one transcript with `[Mic]` / `[System]`\nlabels so you can tell who said what. Want just one source? `rec start --mic-only` or\n`--system-only`.\n\n### Grant capture permission (one-time, per terminal app)\n\nmacOS ties capture permission to the app you run `rec` from (Terminal, iTerm, **Warp**,\nVS Code, …). You need **two** grants:\n\n1. **Microphone** (your voice): System Settings → Privacy & Security → **Microphone** →\n   enable your terminal app.\n2. **System audio** (grouped under Screen Recording on macOS 14.2+): System Settings →\n   Privacy & Security → **Screen Recording** → enable your terminal app, then **quit and\n   reopen it** (required for the change to take effect).\n\nUntil mic is granted, `rec start` records system audio only and skips the mic (it tells\nyou so). `rec setup` checks the current mic-permission status.\n\nAfter `rec stop` (or Ctrl+C from `rec start`), the recording(s) are transcribed locally\nwith [faster-whisper](https://github.com/SYSTRAN/faster-whisper) (CPU, int8 — no API, no\ndata leaves your machine) and written to a markdown transcript.\n\n```\nrecording.wav ──> faster-whisper (local, free) ──> transcript.md\n```\n\n## Requirements\n\n- **macOS 14.2 or later** (Sonoma — the Core Audio process taps API `rec` records through\n  landed in 14.2). Apple Silicon recommended. Intel works.\n- **Python 3.11+** only needed for the `pipx` install; the Homebrew formula brings its own.\n\nNo virtual audio driver (no BlackHole), no Multi-Output Device, no manual Audio MIDI Setup.\nThe tap reads system output directly. `rec` checks the macOS version itself and refuses to\nrun below 14.2 with a one-line message — you don't have to guess.\n\n## Install\n\n**Homebrew** (recommended — no Python to manage):\n\n```bash\nbrew install AnisurRahmann/tap/call-copilot\n```\n\n**pipx** (if you prefer a plain Python install, no Homebrew):\n\n```bash\npipx install call-copilot\n```\n\nEither way you get a `rec` command on your `PATH`. Then jump to\n[One-time setup](#one-time-setup).\n\n> Using `rec` on a machine below macOS 14.2 prints `Error: rec requires macOS 14.2 or\n> later ...` and exits — no traceback, no mystery. See\n> [docs/HOMEBREW.md](docs/HOMEBREW.md) if you're setting up the tap yourself.\n\n## Recording consent & privacy\n\nCall Copilot records audio from your meetings, which may include **other participants**.\nRecording laws vary by jurisdiction and many require the consent of everyone being\nrecorded (one-party vs. all-party consent). **Obtaining that consent is your\nresponsibility** — check your local laws and your organization's policy before recording.\n\nOn the technical side, your data stays put:\n\n- Transcription runs **100% locally** with faster-whisper (CPU, int8) — no API, no cloud.\n- **Audio and transcripts never leave your machine.** The only network access is the\n  first run of a given Whisper model, which downloads its weights from Hugging Face;\n  after that it's fully offline.\n- Recordings live under `~/.local/share/rec/sessions/` (XDG data home), outside any repo.\n\n## One-time setup\n\n```bash\nrec setup\n```\n\nVerifies your macOS version, that the `audiotap` library + its bundled dylib load, saves\nyour config, and tells you about the one-time capture permission prompt.\n\n## Recording a meeting\n\n```bash\nrec start                          # mic + system (default); Ctrl+C to stop & transcribe\nrec start --system-only            # just what apps play (not your voice)\nrec start --mic-only               # just your voice (not system audio)\nrec list                           # browse past sessions\nrec transcribe 2026-07-27_14-30-00 --model medium    # re-transcribe at higher quality\nrec diagnose 2026-07-27_14-30-00                      # bundle debug info for an AI agent\n```\n\nBy default `rec start` records **both** your microphone and system audio; the transcript\nlabels each line `[Mic]` or `[System]`. Use `--system-only` / `--mic-only` to narrow.\n\n**`rec start`** shows a live indicator while recording:\n\n```\n● REC  2026-07-28_14-30-00\nelapsed 03:47   size 18.2 MB\npress Ctrl+C to stop & transcribe\n```\n\nPress **Ctrl+C** when your meeting ends — it stops the recording and transcribes in the\nsame command, then prints the transcript path. One command, start to finish.\n\nWant the old background behavior instead? `rec start --detach` spawns the recorder and\nexits immediately; stop it later from another terminal with `rec stop` (or check progress\nwith `rec status`).\n\n> **Tip:** if a transcript comes back empty, the recording was silent — nothing was\n> playing, or the capture permission was revoked. `rec start` (and `rec stop`) warn you\n> about this immediately, and `rec diagnose <session>` bundles the audio levels + logs.\n\n## Use your meetings from Claude Code\n\n`rec` ships an **MCP server** (the open protocol Claude Code, Cursor, Zed, Cline, and\nother AI tools speak). Point any MCP client at your locally-recorded transcripts and ask\nquestions about them — answers come back with the **session id cited**, so you can check\nthe exact moment. Nothing leaves your machine: the server is strictly read-only and makes\nno network calls.\n\n```bash\nrec mcp install     # writes the server entry into Claude Code's config\n```\n\nThen restart Claude Code and ask, for example:\n\n- *\"What did the client actually ask for on Tuesday's call?\"* — it searches the transcripts,\n  finds the line, and cites the session id (e.g. `2026-07-28_12-25-20`) with a timestamp.\n- *\"List my meetings from last week with their durations.\"* — it lists sessions, narrowing\n  by date.\n- *\"Show me the full transcript of the standup where we discussed the API migration.\"* — it\n  finds the session, then reads the whole transcript.\n\nThree tools are exposed: `list_sessions` (find a meeting by date), `get_session` (read a\nwhole transcript), and `search_transcripts` (find specific lines across long transcripts —\npass it **keywords** like `pricing discount`, not a full sentence). The search index lives\nat `~/.local/share/rec/index.db`; it builds lazily on first search and is a disposable cache\n— `rec index` refreshes it, `rec index --rebuild` recreates it from scratch.\n\n### Other MCP clients (Cursor, Zed, Cline, …)\n\n`rec mcp install` prints a config block that works in any MCP client. For Cursor, paste it\ninto `.cursor/mcp.json`; for Zed, into `settings.json` under `mcp_servers`. It looks like:\n\n```json\n{\n  \"call-copilot\": {\n    \"type\": \"stdio\",\n    \"command\": \"rec\",\n    \"args\": [\"mcp\"]\n  }\n}\n```\n\nYou can also run the server directly with `rec mcp` (stdio transport) if a client prefers a\nraw command.\n\n### Official MCP Registry\n\nCall Copilot is listed on the [official MCP Registry](https://registry.modelcontextprotocol.io)\nunder `io.github.AnisurRahmann/call-copilot`. Any MCP client that speaks the registry can\ndiscover and add it from there. The registry entry runs the server with:\n\n```bash\nuvx --from call-copilot rec mcp\n```\n\n(The PyPI package is `call-copilot`; the command it installs is `rec`, so the server is\nlaunched as `rec mcp`.)\n\n## Browser UI\n\n`rec web` opens a local browser tab — a read-mostly viewer for sessions you've\nalready recorded, plus Start/Stop controls. It's modelled on the qBittorrent /\nTransmission web UI: a loopback HTTP server serves a single-page app that drives\nthe **same** session store the CLI uses. The terminal can't show a live capture\nmeter, a seekable audio player beside its transcript, or a session list you can\nskim in one glance — the browser can, so the UI exists for exactly those three\nthings.\n\n![rec web — session list](docs/web-sessions.png)\n\n![rec web — session detail with audio and transcript](docs/web-detail.png)\n\n```bash\nrec setup            # one-time, in a terminal (the UI can't grant capture permission)\nrec web              # opens a browser tab at http://127.0.0.1:7717\n```\n\nFrom the tab you can browse sessions, play and seek the audio next to its\ntranscript, search across every transcript, and Start/Stop a recording. Start\ncalls the same recorder the CLI does; Stop queues transcription and the page\npolls until the transcript is ready. If no config is found, the Start button\ntells you to run `rec setup` in a terminal first.\n\nThe server binds to `127.0.0.1` only — the host is not configurable, by design\n(a local tool must not become an open transcript server). `--port` overrides the\ndefault port; `--no-open` skips the automatic browser tab.\n\n> **What this is not.** The UI is still **not** a real-time transcription\n> surface — the transcript arrives after Stop, exactly as in the CLI, and there\n> is still no cloud, no sync, and no account. Every action in the browser maps\n> to a command that already exists; if a feature has no CLI equivalent, it is\n> not in the UI.\n\n## Configuration\n\nStored at `~/.config/rec/config.json` (XDG). Recordings live under\n`~/.local/share/rec/sessions/{id}/`. Override the XDG roots with `XDG_CONFIG_HOME` /\n`XDG_DATA_HOME` if needed.\n\n```json\n{\n  \"sample_rate\": 16000,\n  \"channels\": 1,\n  \"whisper_model\": \"base\",\n  \"capture\": \"system\",\n  \"sessions_dir\": \"~/.local/share/rec/sessions\"\n}\n```\n\n16 kHz mono float32 is Whisper's native input format — no resampling, smallest files\n(~7.5 MB/min), best transcription accuracy.\n\n### A note on sample rate (why your recordings play at the right speed)\n\n`audiotap`'s `sample_rate` parameter is **not honored** — the tap always delivers\naudio at your output device's native rate (typically 48 kHz), regardless of what\nwe request. `rec` handles this transparently: the recorder **measures the true\ncapture rate** when the tap starts and writes the WAV at that rate (so playback\nis the correct speed), and the transcriber **resamples to 16 kHz** before\nfeeding Whisper (so transcription is accurate). You don't need to do anything;\nthis section exists to explain the `capture_sample_rate` field in `session.json`\n(which may differ from the `sample_rate` in your config).\n\n### A note on VAD (voice activity detection)\n\nTranscription runs **without** faster-whisper's Silero VAD pre-filter by default.\nThe VAD is tuned for close-mic speech and aggressively rejects system-audio\ncapture (speakers/headphones via a tap, which has a different character) — we've\nseen it discard 100% of a clearly-audible recording and return an empty\ntranscript. Whisper's own `no_speech_threshold` handles silence adequately\nwithout that risk.\n\nIf you have clean close-mic input and want long silences skipped (faster,\ncleaner output), enable it per run:\n\n```bash\nrec stop --vad              # VAD on for this transcription\nrec transcribe <id> --vad   # re-transcribe with VAD\n```\n\n## Stack\n\n| Tool | Role |\n|------|------|\n| [`audiotap`](https://github.com/graphaelli/audiotap) | Core Audio taps → captures system audio directly (macOS 14.2+) |\n| [`soundfile`](https://github.com/bastibe/python-soundfile) | Streams WAV chunks to disk (constant memory) |\n| [`faster-whisper`](https://github.com/SYSTRAN/faster-whisper) | Local speech-to-text (CPU int8) |\n| [`rich`](https://github.com/Textualize/rich) + [`click`](https://click.palletsprojects.com/) | Terminal UI + CLI |\n\nEverything is free and open-source. Transcription runs 100% locally — no API cost, no\ndata leaves the machine. (The first run of a given whisper model downloads its weights\nfrom Hugging Face; after that it's offline.)\n\n## Logging & debugging\n\nEvery activity — the audio tap lifecycle, chunk writes, transcription, formatting, each\nCLI decision — is logged. Logs flow to three destinations:\n\n| Destination | Path | Level | What it's for |\n|---|---|---|---|\n| **Console (stderr)** | your terminal | WARNING* | User-facing; clean by default |\n| **Global log** | `~/.local/share/rec/logs/rec.log` | DEBUG | Monitor surface — `tail -f` it |\n| **Session log** | `~/.local/share/rec/sessions/<id>/recorder.log` | DEBUG | Per-session post-mortem |\n\n\\* WARNING by default: `-v` → INFO, `-vv` → DEBUG, `--quiet` → CRITICAL, `REC_LOG_LEVEL=DEBUG`.\n\nEvery command failure is logged at `ERROR` with the reason + exit code; unexpected\ncrashes include the full traceback.\n\n### Hand a session to an AI agent to debug\n\n```bash\nrec list                                 # find the session id\nrec diagnose 2026-07-27_14-30-00        # → writes sessions/<id>/diagnose.md\nrec diagnose 2026-07-27_14-30-00 --stdout | <your-ai-tool>   # pipe straight to an agent\n```\n\nThe bundle contains the session metadata, the daemon's `recorder.log`, the global-log\nlines tagged with that session, the transcript if it exists, and the config — followed\nby a debugging checklist. (`rec diagnose` accepts a unique prefix too, e.g. `2026-07-27`.)\n\n> **Note on the recording loop:** the audio callback runs on Core Audio's real-time\n> thread and deliberately logs nothing — it copies each chunk to a queue and a writer\n> thread does the disk I/O. The daemon logs only at tap start/stop and on signals.\n\n## Development\n\nYou only need this if you're hacking on `rec` itself. End users should use the\n[Install](#install) commands above.\n\n```bash\ngit clone https://github.com/AnisurRahmann/call-copilot.git && cd call-copilot\nmake install          # creates .venv and installs `rec` in editable mode + dev deps\nmake test             # unit tests (offline — no audio device or model download needed)\nmake run              # rec start, using the dev venv's rec\n```\n\n`make install` requires Python 3.11+ on your `PATH` (it pins `python3.11` for the\nvenv). For everything else — releasing, the Homebrew tap, code style — see\n[CONTRIBUTING.md](CONTRIBUTING.md) and [docs/HOMEBREW.md](docs/HOMEBREW.md).\n\n## Contributing\n\nIssues and pull requests are welcome at\n[github.com/AnisurRahmann/call-copilot](https://github.com/AnisurRahmann/call-copilot).\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a PR, and report security\nissues privately per [SECURITY.md](SECURITY.md).\n\n## What this is NOT\n\n- Not a real-time transcription tool (transcription happens after you stop).\n- Not a meeting summarizer (just the transcript).\n- Not a Zoom/Meet plugin (it captures system audio generically).\n- Not cross-platform (macOS 14.2+ only).\n\n## License\n\nMIT — see [LICENSE](LICENSE). © Anisur Rahman.\n",
  "bytes": 15984,
  "sha": "cf327f8be24340e4acf6c05a0940fee75cd92e97d3e742132621b95e0c06f052",
  "repo_slug": "anisurrahmann/call-copilot",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_anisurrahmann_call_copilot_f94c7cc5/readme"
}