Back to blog
View Markdown

Meetings your scripts and your agents can read

Months of calls in a local database are worth more than a folder of recordings, because a shell script and an assistant can both read them.

4 min read

Everything the Mac app records lands in a SQLite database on your disk, and the listenr command reads it. A question about any call is one line in a shell:

listenr search "budget review" --since 30d --language de
listenr list --from 2026-06-01 --to 2026-06-30 --participant anna --json
listenr show 8f3a --transcript
listenr export 8f3a --output meeting.md

The same binary is an MCP server, so Claude Desktop or Claude Code can answer “what did we agree with that customer last Tuesday” from the transcript. The CLI and the local MCP server are on every plan, work signed out and offline, and read only the database on your Mac.

Finding a meeting

Meeting ids are the full UUID or any unique prefix of at least four characters. Zsh completion fills them in as the shortest unique prefix, with the title and start time beside each, and answers without starting the app.

Read commands never launch anything: list, show, search, export, contacts, logs and status, plus settings and model listings. --json gives a script structured output:

listenr list --since 7d --platform googleMeet --has-notes
listenr show 8f3a --markdown

Controlling the app

The CLI is read-only by default, and control verbs cover every command the app has:

listenr record start --platform googleMeet --language de
listenr watch --topics session
listenr record stop --wait
listenr deliver 8f3a --to obsidian

record stop --wait blocks until the notes exist. listenr watch prints one line per event (NDJSON with --json): live transcript segments, speakers, downloads, and the notes text as it is written. listenr do <id> --arg name=value runs any command by its id, and listenr commands lists them.

When the app is running, commands run inside it over a local socket, so a write from the terminal never races the app. When it is not, commands that only touch your files (notes, transcripts, settings, models) run in the CLI process, and commands that need the app, such as recording, start it in the background first.

Letting your assistant read your meetings

MCP is the protocol assistants like Claude use to read data from other applications. listenr mcp speaks it over stdio, so the client starts it as a local process and your meetings stay on your Mac:

claude mcp add listenr -- /absolute/path/to/listenr mcp
{
  "mcpServers": {
    "listenr": { "command": "/absolute/path/to/listenr", "args": ["mcp"] }
  }
}

With no flag you get seven read-only tools: list_meetings, get_meeting, get_transcript, search_meetings, list_contacts, get_logs and get_status. That covers the common questions: what was committed to in the last three calls with an account, who raised the pricing objection, a summary of every design meeting in June.

Two things to know:

  • Local only. A stdio server works with Claude Desktop, Claude Code and other clients that launch local servers. It is not a claude.ai or ChatGPT connector. For those, Pro includes a hosted MCP connector that is read-only and covers only meetings you have uploaded or shared.
  • Writes are opt-in and broad. --allow control adds more than a hundred tools, including deleting a meeting and quitting the app. --allow settings adds settings, secrets, keybindings and integrations. --allow all adds both. Destructive tools refuse until the call is repeated with confirm: true, and the refusal names the exact target, so the model confirms a specific meeting rather than a description of one.

Writing a script against it

The exit code is the output a script can rely on without parsing.

Code Meaning
0 ok
1 error
3 app required but not running and --no-launch
4 refused (the message names the reason)
5 finish the step in Listenr
6 confirmation required (--yes)
64 usage

A 1 means something went wrong. A 4 means the command was understood and refused because of the current state, such as stopping when nothing is recording, so retrying it unchanged is pointless. A 5 means a person has to finish it in the app, such as a sign-in. A 6 means the command is destructive and needs --yes.

Three details for scripts:

  • --wait is accepted only on record stop and notes regenerate, and is a usage error anywhere else, so a script never relies on a flag that did nothing.
  • Secrets are never taken as arguments, since argv lands in shell history and ps. Use listenr secrets set <name> --stdin.
  • NO_COLOR is honoured, and colour and progress bars appear only on a terminal.

The terminal and the app never disagree

Every command is declared once and offered in the app, as a keyboard shortcut, on the command line, as an MCP tool and in the terminal interface. An argument means the same thing everywhere, a destructive command asks first wherever you call it, and anything the app would refuse right now is refused on the command line with the same reason. You can start a recording with a shortcut, stop it from a script, and have an assistant pull the notes into your weekly update.

Common questions

Is the Listenr command line included in the free plan?

Yes. The `listenr` command and the local MCP server are on every plan, including Free, and work signed out and offline. They read the local database the Mac app writes, so the app has to have run at least once.

Which assistants can use the local Listenr MCP server?

Any MCP client that launches local servers over stdio, such as Claude Desktop and Claude Code. claude.ai and ChatGPT connect to remote servers instead; for those, Listenr Pro includes a hosted, read-only MCP connector that covers meetings you have uploaded or shared.

Can an AI assistant change anything in Listenr through MCP?

Not by default. Without a flag, `listenr mcp` exposes seven read-only tools for meetings, transcripts, contacts, logs and status. `--allow control` adds recording, meeting and notes commands, and `--allow settings` adds settings, secrets and keybindings. Destructive tools refuse until the call is repeated with `confirm` set to true.

What do the listenr exit codes mean?

0 is success and 1 is an error. 3 means the command needs the Mac app, which is not running, and `--no-launch` was passed. 4 means the command was refused and the message says why. 5 means a step has to be finished in the app, 6 means confirmation is required (`--yes`), and 64 is a usage error.

Do I have to type a full meeting UUID?

No. Any unique prefix of at least four characters works, so `listenr show 8f3a --transcript` addresses a meeting. Zsh completion offers each id as its shortest unique prefix with the title and start time, without starting the app.

Notes from your next meeting.

Record your next call and read the transcript and notes on your Mac. Free for personal use, on macOS 15 or later with Apple Silicon.