Install
$ agentstack add mcp-silverstein-minutes ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
minutes
[](https://github.com/silverstein/minutes) [](LICENSE) [](https://crates.io/crates/minutes-cli)
Open-source conversation memory. useminutes.app
Agents have run logs. Humans have conversations. minutes captures the human side — the decisions, the intent, the context that agents need but can't observe — and makes it queryable.
Record a meeting. Capture a voice memo on a walk. Ask Claude "what did I promise Sarah?" — and get an answer. Your AI remembers every conversation you've had.
Minutes is not just a meeting-notes app. It is local conversation infrastructure for agents: audio capture, transcripts, decisions, commitments, people, and provenance exposed through plain files, CLI commands, MCP tools, and live transcript streams.
> Own every conversation you've ever had. Cloud meeting tools rent your own conversations back to you. Minutes writes every meeting to ~/meetings/ as plain markdown, which every AI you use (Claude Code, Codex, Gemini CLI, Cursor, OpenCode, Pi) reads directly. No SDK. No API key. No vendor to outlive. Ten years from now, grep still works on your corpus. For agents → · [Frontmatter schema →](docs/frontmatter-schema.md)
Works with
Claude Code • Codex • OpenCode • Pi • Gemini CLI • Claude Desktop • Mistral Vibe • Obsidian • Logseq • Phone Voice Memos • Any MCP client
Quick start
# macOS — Desktop app (menu bar, recording UI, AI assistant)
brew install --cask silverstein/tap/minutes
# macOS — CLI only
brew tap silverstein/tap && brew install minutes
# Newer Homebrew versions distrust third-party taps by default; if brew warns
# "Skipping silverstein/tap because it is not trusted", run once:
brew trust silverstein/tap
# Any platform — from source (requires Rust + cmake; Windows also needs LLVM)
cargo install minutes-cli # macOS/Linux
cargo install minutes-cli --no-default-features # Windows (see install notes below)
# MCP server only — no Rust needed (Claude Code, Codex, OpenCode, Gemini CLI, Claude Desktop, etc.)
npx minutes-mcp
minutes setup --model small # Download whisper model (466MB, recommended)
minutes record # Start recording
minutes stop # Stop and transcribe
Docs and agent surfaces
The README is now the product overview and install guide, not the only home for agent-facing reference.
- Agent entry point:
- MCP tools reference:
- MCP tools markdown mirror:
- Error reference:
- Concise agent index:
- Full agent index:
Choose your surface
Desktop app—brew install --cask silverstein/tap/minutes
Best for first recording, live capture, Recall, and post-meeting artifact work.
MCP server—npx minutes-mcp
Best for agent-first search, recall, and meeting-memory workflows in Claude Desktop, Codex, OpenCode, Gemini CLI, and other MCP clients.
CLI—brew tap silverstein/tap && brew install minutes
Best for terminal-first local operator workflows, import, search, and vault sync.
Claude Code plugin—claude plugin marketplace add silverstein/minutes
Best for workflow guidance, prep, debrief, and meeting coaching with the lifecycle skills and hooks.
OpenCode project integration— built-in.opencode/skills/+.opencode/commands/
Best for OpenCode users who want native /minutes-* commands plus the portable Minutes skill pack in the repo.
How it works
Audio → Transcribe → Diarize → Summarize → Structured Markdown → Relationship Graph
(local) (local) (LLM) (decisions, (people, commitments,
whisper.cpp pyannote-rs Claude/ action items, topics, scores)
/parakeet (native) Ollama/ people, entities) SQLite index
Mistral/OpenAI
Everything runs locally. Your audio never leaves your machine (unless you opt into cloud LLM summarization). Speakers are identified via native diarization. The relationship graph indexes people, commitments, and topics across all meetings for instant queries.
Features
Record meetings
minutes record # Record from mic
minutes record --title "Standup" --context "Sprint 4 blockers" # With context
minutes record --language ur # Force Urdu (ISO 639-1 code)
minutes record --device "AirPods Pro" # Use specific audio device
minutes record --template standup # Apply a summary template
minutes stop # Stop from another terminal
Recording calls (Zoom, Meet, Teams, Webex): the desktop app captures both your mic and the call's audio natively (ScreenCaptureKit, macOS 15+, no extra software). Grant Screen Recording + Microphone permission and start from the "Call detected" banner; Google Meet and Teams-in-browser need their experimental detection toggles enabled. The CLI (minutes record) cannot use native capture, so for command-line call recording you route system audio through BlackHole and a Multi-Output Device. Full setup in [docs/audio-devices.md](docs/audio-devices.md).
Consent disclosure aid
For meetings where participant notice is required, Minutes can show a reminder, require an interactive acknowledgement, and stamp the chosen basis into the markdown frontmatter. This is a disclosure aid, not advice; ensure everyone present consents where required.
minutes record --consent verbal_all_parties
minutes record --consent notice_in_invite --consent-notice "Notice was included in the calendar invite."
[consent]
mode = "remind" # off | remind | require
disclosure_script = "Heads up: I'm using Minutes to transcribe this conversation locally on my device for my own notes. Let me know if you'd prefer I didn't."
# default_basis = "notice_in_invite"
When present, artifacts include:
consent: verbal_all_parties
consent_notice: Heads up: I'm using Minutes to transcribe this conversation locally on my device for my own notes. Let me know if you'd prefer I didn't.
Sensitive meetings
Use a sensitive meeting when you want timed typed markers and a saved meeting artifact, but no audio capture.
minutes sensitive start --title "Board prep"
minutes note "Opened with pricing risk"
minutes sensitive stop
The stop flow writes a normal markdown meeting with capture: none and sensitivity: restricted. In a terminal, Minutes prompts for a short debrief. From scripts or other non-interactive callers it saves immediately with debrief: pending so an assistant can help finish the written summary later.
Take notes during meetings
minutes note "Alex wants monthly billing not annual billing" # Timestamped, feeds into summary
minutes note "Logan agreed" # LLM weights your notes heavily
Process voice memos
minutes process ~/Downloads/voice-memo.m4a # Any audio format
minutes process ~/.minutes/native-captures/2026-05-19-120148-call.voice.wav --type meeting
minutes watch # Auto-process new files in inbox
Search everything
minutes search "pricing" # Full-text search
minutes search "onboarding" -t memo # Filter by type
minutes actions # Open action items across all meetings
minutes actions --assignee sarah # Filter by person
minutes list # Recent recordings
Relationship intelligence
> "What did I promise Sarah?" — the query nobody else can answer.
minutes people # Who you talk to, how often, about what
minutes people --rebuild # Rebuild the relationship index
minutes commitments # All open + overdue commitments
minutes commitments --person alex # What did I promise Alex?
Tracks people, commitments, topics, and relationship health across every meeting. Detects when you're losing touch with someone. Suggests duplicate contacts ("Sarah Chen" ↔ "Sarah"). Powered by a SQLite index rebuilt from your markdown in Populating the export directory: ~/.granola-archivist/output/ has to be filled by a separate Granola export tool first. Recent Granola versions encrypt their local cache, which can break exporters that scrape it. If minutes import granola finds nothing, use the API-based granola-to-minutes route below instead (it reads Granola's API and writes straight to ~/meetings/).
Want transcripts and AI summaries?
granola-to-minutes exports richer data using granola-cli, a community-built CLI tool (not affiliated with Granola Labs) that accesses Granola's internal API:
| | minutes import granola | granola-to-minutes | |---|---|---| | Data source | Local export (~/.granola-archivist/output/) | Granola internal API via granola-cli | | Notes & transcript | ✓ | ✓ | | AI-enhanced summaries | — | ✓ | | Action items & decisions | — | ✓ (extracted via Claude) | | Speaker attribution | — | ✓ (speaker_map in frontmatter) | | Setup | Export from Granola desktop app | npm install -g granola-to-minutes | | Works on free tier | ✓ | ✓ | | API stability | N/A (local files) | Internal API — may change without notice |
npx granola-to-minutes export # Export to ~/meetings/
Output format
Meetings save as markdown with structured YAML frontmatter:
---
title: Q2 Pricing Discussion with Alex
type: meeting
date: 2026-03-17T14:00:00
duration: 42m
context: "Discuss Q2 pricing, follow up on annual billing decision"
action_items:
- assignee: mat
task: Send pricing doc
due: Friday
status: open
- assignee: sarah
task: Review competitor grid
due: March 21
status: open
decisions:
- text: Run pricing experiment at monthly billing with 10 advisors
topic: pricing experiment
---
## Summary
- Alex proposed lowering API launch timeline from annual billing to monthly billing/mo
- Compromise: run experiment with 10 advisors at monthly billing
## Transcript
[SPEAKER_0 0:00] So let's talk about the pricing...
[SPEAKER_1 4:20] I think monthly billing makes more sense...
Works with Obsidian, grep, or any markdown tool. Action items and decisions are queryable via the CLI and MCP tools.
Phone → desktop voice memo pipeline
No phone app needed. Record a thought on your phone, and it becomes searchable memory on your desktop. Claude even surfaces recent memos proactively — "you had a voice memo about pricing yesterday."
The watcher is folder-agnostic — it processes any audio file that lands in a watched folder. Pick the sync method that matches your setup:
| Phone | Desktop | Sync method | |-------|---------|-------------| | iPhone | Mac | iCloud Drive (built-in, ~5-30s) | | iPhone | Windows/Linux | iCloud for Windows, or Dropbox/Google Drive | | Android | Any | Dropbox, Google Drive, Syncthing, or any folder sync | | Any | Any | AirDrop, USB, email — drop the file in the watched folder |
Setup (one-time)
Step 1: Create a sync folder — pick one that syncs between your phone and desktop:
# macOS + iPhone (iCloud Drive)
mkdir -p ~/Library/Mobile\ Documents/com~apple~CloudDocs/minutes-inbox
# Any platform (Dropbox)
mkdir -p ~/Dropbox/minutes-inbox
# Any platform (Google Drive)
mkdir -p ~/Google\ Drive/minutes-inbox
# Or just use the default inbox (manually drop files into it)
# ~/.minutes/inbox/ ← already exists
Step 2: Add the sync folder to your watch config in your config file ($XDG_CONFIG_HOME/minutes/config.toml when XDG_CONFIG_HOME is set, otherwise ~/.config/minutes/config.toml):
[watch]
paths = [
"~/.minutes/inbox",
# Add your sync folder here — uncomment one:
# "~/Library/Mobile Documents/com~apple~CloudDocs/minutes-inbox", # iCloud
# "~/Dropbox/minutes-inbox", # Dropbox
# "~/Google Drive/minutes-inbox", # Google Drive
]
Step 3: Set up your phone
iPhone (Apple Shortcuts)
- Open the Shortcuts app on your iPhone
- Tap + → Add Action → search "Save File"
- Set destination to
iCloud Drive/minutes-inbox/(or your Dropbox/Google Drive folder) - Turn OFF "Ask Where to Save"
- Tap the (i) info button → enable Share Sheet → set to accept Audio
- Name it "Save to Minutes"
Now: Voice Memos → Share → Save to Minutes → done.
Android
Use any voice recorder app + your cloud sync of choice:
- Dropbox: Record with any app → Share → Save to Dropbox →
minutes-inbox/ - Google Drive: Record → Share → Save to Drive →
minutes-inbox/ - Syncthing (no cloud): Set up a Syncthing share between phone and desktop pointing at your watched folder. Fully local, no cloud.
- Tasker/Automate (power users): Auto-move new recordings from your recorder app to the sync folder.
Manual (any phone)
No sync setup needed — just get the audio file to your desktop's watched folder:
- AirDrop (Apple): Share → AirDrop to Mac → move to
~/.minutes/inbox/ - Email: Email the recording to yourself → save attachment to watched folder
- USB: Transfer directly
Step 4: Start the watcher (or install as a background service):
minutes watch # Run in foreground
minutes service install # Install all background services (macOS launchd / Linux systemd)
minutes service status # Check what's running
minutes service restart # Restart all services (e.g. after upgrading the binary)
minutes service install sets up three agents:
| Agent | Schedule | What it does | |-------|----------|--------------| | watcher | Always on | Processes voice memos from ~/.minutes/inbox/ | | weekly-summary | Sundays 7pm | Generates a weekly digest to ~/.minutes/automations/ | | proactive-context | Daily 8am | Builds a context bundle (recent meetings, stale commitments, losing-touch alerts) |
> Upgrading? minutes service install is idempotent. Re-running it after a binary > upgrade rewrites all plists/units and reloads with the new binary path.
How it works
Phone (any) Desktop (any)
─────────── ─────────────
Record voice memo → Cloud sync / manual transfer
Share to sync folder │
▼
minutes watch detects file
│
probe duration ( --type meeting`. For compatibility, `minutes import ` also routes to the same meeting-processing path; `minutes import granola` remains the Granola history importer.
### Vault sync (Obsidian / Logseq)
```bash
minutes vault setup # Auto-detect vaults, configure sync
minutes vault status # Check health
minutes vault sync # Copy existing meetings to vault
Three strategies: symlink (zero-copy), copy (works with iCloud/Obsidian Sync), direct (write to vault). minutes vault setup detects your vault and recommends the right strategy automatically.
Claude integration
minutes is a native extension for the Claude ecosystem. No API keys needed — Claude summarizes your meetings when you ask, using your existing Claude subscription.
You: "Summarize my last meeting"
Claude: [calls get_meeting] → reads transcript → summa
…
## Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [silverstein](https://github.com/silverstein)
- **Source:** [silverstein/minutes](https://github.com/silverstein/minutes)
- **License:** MIT
- **Homepage:** https://useminutes.app
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.