meetscribe
Record, transcribe, and extract action items from meetings inside Claude Code. Bring your own API key. macOS, Node 18+.
Links
README
From the repo.
MeetScribe
Record, transcribe, and extract action items from meetings - directly inside Claude Code. No subscriptions, no separate app. Bring your own API key and get structured meeting notes in seconds.
Think of it as your own Granola, running as a Claude Code plugin.
What it does
- Record - captures mic audio (+ system audio if BlackHole is installed) via ffmpeg
- Transcribe - streams to Deepgram in real time, or batch-transcribes with AssemblyAI or OpenAI Whisper
- Extract - MeetScribe pulls out action items, decisions, blockers, and a summary
- Save - writes everything to a clean markdown file in your project
One command to start, one to stop. Everything else is automatic.
Quick start
Prerequisites
- macOS (recording uses ffmpeg's avfoundation; other platforms can still use
meeting_import) - Node.js 18+
- ffmpeg (
brew install ffmpeg) - A transcription API key (any one of the three providers)
Install
# Clone the plugin
git clone https://github.com/qa-aman/meetscribe.git
cd meetscribe
npm install
# Add your API key
cp .env.example .env
# Edit .env and add your key
Connect to Claude Code
Option A - all projects (recommended). From the cloned folder, run:
npm run connect
That's it - no paths to figure out. It registers MeetScribe at user scope so it works in every project. Restart Claude Code, then verify with /mcp - meetscribe should be listed as connected.
Under the hood it runs:
claude mcp add meetscribe --scope user -- node "$(pwd)/src/index.js"
Option B - single project. Add to that project's .mcp.json with the absolute path:
{
"mcpServers": {
"meetscribe": {
"command": "node",
"args": ["/absolute/path/to/meetscribe/src/index.js"]
}
}
}
Either way, meeting notes always save into the project you run it from (<project>/meetscribe/), and the API key is read from the MeetScribe install directory - no per-project key setup.
Use it
You: meeting_setup # check prerequisites
You: meeting_start "Sprint 14" # start recording
... have your meeting ...
You: meeting_stop # stop, transcribe, extract, save
Your notes land in meetscribe/YYYY-MM-DD_Sprint-14/.
Tools
| Tool | What it does |
|---|---|
meeting_setup | Check prerequisites (ffmpeg, API keys, config) |
meeting_start | Start recording with a title |
meeting_stop | Stop recording and run the full pipeline |
meeting_import | Import an existing audio or transcript file |
meeting_save | Save extracted notes (called automatically) |
meeting_list | List all past meetings |
meeting_config | View current configuration |
Transcription providers
| Provider | Free tier | Speaker labels | Streaming | Languages |
|---|---|---|---|---|
| Deepgram (default) | $200 credit | Yes | Yes (live) | 60+ |
| AssemblyAI | $50 credit | Yes | No (batch) | 6 |
| OpenAI Whisper | None (pay-as-you-go) | No | No (batch) | 50+ |
Switch providers in meetscribe/config.yaml:
provider: assemblyai # deepgram | assemblyai | whisper
Streaming vs batch
With Deepgram (the default), MeetScribe streams audio over WebSocket and writes the transcript in real time as you speak. meeting_stop returns extraction-ready text instantly.
For AssemblyAI and Whisper, audio is uploaded and transcribed after meeting_stop (batch mode). Streaming auto-falls-back to batch if the WebSocket connection fails.
Disable streaming explicitly in config.yaml:
streaming: false
Multi-language support
Set the language field in config.yaml:
language: en # ISO code: en, hi, es, fr, de, ja, ...
# or
language: multi # Deepgram auto-detects language per utterance
Import existing recordings
Already have an audio file or transcript? Import it directly:
meeting_import '/path/to/recording.m4a'
meeting_import '/path/to/transcript.txt'
Supported audio formats: .m4a, .mp3, .wav, .ogg, .flac, .aac
Supported transcript formats: .txt, .srt, .vtt
Speaker mapping
Create a team.md file in your project root with your team members:
# Team
- Alice Chen - Engineering Lead
- Bob Park - Backend Developer
- Carol Liu - Product Manager
MeetScribe will map "Speaker 0", "Speaker 1" to real names using context from the conversation (who's addressed by name, who discusses what, role references).
Requirements:
- Provider must return speaker labels - works with Deepgram and AssemblyAI, automatically skipped for Whisper
- If
team.mddoesn't exist, mapping is skipped silently (no error) - Configure the path in
meetscribe/config.yamlviateam_file, or set tonullto disable
Customizing extraction
Edit meetscribe/extract.md to change what gets extracted. The default template pulls:
- Action items (owner, task, deadline)
- Key decisions
- Open questions and blockers
- 3-sentence summary
System audio capture (optional)
To capture all meeting participants (not just your mic):
- Install BlackHole:
brew install blackhole-2ch - Open Audio MIDI Setup
- Create a Multi-Output Device combining your speakers + BlackHole
MeetScribe auto-detects BlackHole and switches to dual-capture mode.
Configuration
All config lives in meetscribe/config.yaml:
provider: deepgram # deepgram | assemblyai | whisper
language: en # ISO code, or "multi" for Deepgram auto-detection
streaming: true # real-time transcription (deepgram only, auto-disabled for whisper/assemblyai)
output_dir: ./meetscribe # where meeting folders are created
keep_audio: true # keep audio files after transcription
extraction_prompt: ./meetscribe/extract.md
auto_extract: true # run extraction automatically on meeting_stop
team_file: ./team.md # path to team file, or null to skip
Safety features
- Recordings auto-stop after 4 hours (ffmpeg hard cap)
- Stale recording state auto-expires after 4h5m
- Transcription API calls timeout after 5 minutes (10 min for AssemblyAI)
- Orphaned ffmpeg processes are detected and cleaned up on restart
- SIGKILL fallback if ffmpeg doesn't respond to graceful shutdown
Output structure
meetscribe/
config.yaml
extract.md
2026-04-15_Sprint-14/
2026-04-15_sprint-14.md # final notes
recording.m4a # audio file
transcript.txt # raw transcript
Feedback
Found a bug? Have an idea? Want to share how you're using it?
- Issues: https://github.com/qa-aman/meetscribe/issues (bug reports and feature requests use the built-in templates)
- Email: connect@shipwithai-labs.com
- GitHub: @qa-aman
License
MIT
Author
Collected info
- ★ 3 stars
- Language: JavaScript
- Source updated: 6/14/2026
Config for your environment
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.