mcp-listen
Give your AI agents the ability to listen. Microphone capture and speech-to-text tools for MCP-compatible agents.
Install / Use
claude mcp add decibri -- npx -y github:decibri/mcp-listenIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
OtherSupported Platforms
Our assessment of mcp-listen
mcp-listen scores 81/100 on our quality scale, 249th of 295 Other skills we index.
Its MCP Server is 13 KB long, well organised into 17 sections with 11 code examples: a thorough specification that gives an agent plenty to work with.
It has 10 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so mcp-listen is actively maintained.
- Our last check on 2026-10-18 found the source still online.
- It is released under the Apache-2.0 license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 97/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful.
AI review by kimi-k2.7-code on 2026-09-24. Automated pattern scan on 2026-09-24. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
mcp-listen compared with similar skills
All 4 of these similar skills score higher than mcp-listen; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| mcp-listen (this skill)by decibri | 81 | 10 | today | MCP Server |
| Agent-Reachby Panniantong | 100 | 106.9k | 6d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 78.4k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.7k | 1d ago | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 90.5k | 1d ago | MCP Server |
Frequently asked questions
- How do I install mcp-listen?
- Run
claude mcp add decibri -- npx -y github:decibri/mcp-listen. The install tabs above show the steps for each supported agent. - Which AI agents does mcp-listen work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is mcp-listen safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful. It is Apache-2.0-licensed and scores 97/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is mcp-listen still maintained?
- The repository was last updated today, so mcp-listen is actively maintained.
Skill content
View source on GitHubmcp-listen
Give your AI agents the ability to listen
Microphone capture and speech-to-text tools for MCP-compatible agents.
<div> <!-- badges: start --> <table> <tr> <td><strong>Meta</strong></td> <td> <a href="https://github.com/decibri/mcp-listen"><img src="https://badge.mcpx.dev?type=server" title="MCP Server" alt="MCP Server" /></a> <a href="https://www.npmjs.com/package/mcp-listen"><img src="https://img.shields.io/npm/v/mcp-listen" alt="npm version"></a> <a href="https://github.com/decibri/mcp-listen/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-Apache_2.0-blue.svg" alt="Apache 2.0 License"></a> <a href="https://github.com/decibri/mcp-listen/actions/workflows/ci.yml"><img src="https://github.com/decibri/mcp-listen/actions/workflows/ci.yml/badge.svg" alt="CI"></a> <a href="https://glama.ai/mcp/servers/decibri/mcp-listen"><img src="https://glama.ai/mcp/servers/decibri/mcp-listen/badges/score.svg" alt="mcp-listen MCP server" /></a> </td> </tr> </table> <!-- badges: end --> </div>Tools
| Tool | Description |
| ------ | ------------- |
| list_audio_devices | List available microphone input devices |
| capture_audio | Record audio from the microphone and save as WAV |
| voice_query | Capture, transcribe (whisper.cpp), and query a local LLM (Ollama) |
Quick Start
Claude Code
claude mcp add mcp-listen npx mcp-listen
Claude Desktop / ChatGPT Desktop / Cursor / Windsurf / VS Code
Add to your MCP configuration:
{
"mcpServers": {
"mcp-listen": {
"command": "npx",
"args": ["-y", "mcp-listen"]
}
}
}
Compatible with Claude Desktop, ChatGPT Desktop, Cursor, GitHub Copilot, Windsurf, VS Code, Gemini, Zed, and any MCP-compatible client.
Global Install
npm install -g mcp-listen
Requirements
Supported platforms:
- Windows x64
- macOS Apple silicon (arm64)
- Linux x64 and arm64 (glibc)
Intel Mac (darwin-x64) is not supported: Apple has discontinued the platform and no decibri binary is published for it.
For list_audio_devices and capture_audio:
- Node.js 18+
- A microphone
For voice_query (optional):
- Ollama running locally
- Whisper GGML model (see Whisper Model Setup)
Tool Reference
Arguments are validated before anything is recorded or written. An argument a tool does not declare is rejected with an error naming it, rather than silently ignored. duration_ms must be an integer between 100 and 30000; silence_ms an integer between 100 and 10000; stop_on_silence a boolean; device a non-negative integer index or a non-empty string id from list_audio_devices. A silence_ms that cannot take effect (passed without silence-stopping active) is rejected for the same reason unknown arguments are. A rejected call writes nothing to disk.
list_audio_devices
Returns a JSON array of available audio input devices.
Parameters: None
Example response:
[
{ "index": 0, "name": "Microphone", "id": "wasapi:{0.0.1.00000000}.{6b187949-26ea-470b-907d-66bf87261530}", "maxInputChannels": 2, "defaultSampleRate": 48000, "isDefault": true },
{ "index": 1, "name": "Microphone Array", "id": "wasapi:{0.0.1.00000000}.{b7a6e3e2-a62b-4e92-9320-947c4be98552}", "maxInputChannels": 2, "defaultSampleRate": 48000, "isDefault": false }
]
The id is stable across reboots and device changes. The index is positional and can shift when devices are added or removed, and names are not unique. Prefer id when selecting a device. In the rare case the host cannot produce a stable id for a device, its id is an empty string and it can only be selected by index.
capture_audio
Records audio from the microphone and saves as a WAV file. Records for exactly duration_ms by default, or until the speaker stops talking with stop_on_silence: true.
Parameters:
| Parameter | Type | Default | Description |
| ---------- | ------ | --------- | ------------- |
| duration_ms | number | 5000 | Recording duration in milliseconds (100-30000). A maximum, not an exact length, when stop_on_silence is true |
| device | number or string | system default | Device index or stable device id from list_audio_devices |
| stop_on_silence | boolean | false | Stop when the speaker stops talking, detected with on-device voice activity detection (Silero VAD, bundled, no download) |
| silence_ms | number | 1000 | Continuous silence in milliseconds that ends a stop_on_silence recording (100-10000). Requires stop_on_silence: true |
Example response (fixed duration):
{
"path": "/tmp/mcp-listen-1712345678901.wav",
"duration_ms": 5000,
"sample_rate": 16000,
"channels": 1,
"size_bytes": 160044
}
Example response (stop_on_silence: true):
{
"path": "/tmp/mcp-listen-1712345678901.wav",
"duration_ms": 2600,
"sample_rate": 16000,
"channels": 1,
"size_bytes": 83244,
"stopped_by": "silence",
"speech_detected": true
}
With stop_on_silence, duration_ms in the response is the actual captured length, and stopped_by says how the recording ended: "silence" (the speaker finished), "ceiling" (the duration_ms maximum was reached), or "no_speech_timeout" (nobody spoke for 10 seconds; the WAV is still returned, with speech_detected: false, so silence is a reported outcome rather than an error). Detection runs per ~100ms audio buffer, so the effective hangover rounds up to the next buffer, and the recording keeps everything from the start of the call through the stop decision: nothing is gated or clipped at speech boundaries, and the audio itself is byte-identical to a fixed-duration capture of the same sounds.
voice_query
Full voice pipeline: capture audio, transcribe with whisper.cpp, send to Ollama, return the response. Entirely offline. Recording stops automatically when the speaker stops talking; pass stop_on_silence: false for a fixed-length recording.
Parameters:
| Parameter | Type | Default | Description |
| ----------- | ------ | --------- | ------------- |
| duration_ms | number | 15000 / 5000 | Maximum recording duration in milliseconds (100-30000). Default 15000 while silence-stopping is active, 5000 with stop_on_silence: false |
| device | number or string | system default | Device index or stable device id from list_audio_devices |
| stop_on_silence | boolean | true | Stop recording when the speaker stops talking. Pass false to record for exactly duration_ms |
| silence_ms | number | 1000 | Continuous silence in milliseconds that ends the recording (100-10000) |
| whisper_model | string | ggml-base.en.bin | Path or filename of Whisper GGML model |
| language | string | en | Language code for transcription |
| model | string | llama3.2 | Ollama model name |
| prompt | string | You are a helpful assistant. | System prompt for the LLM |
Example response:
{
"transcription": "What is the default port for PostgreSQL?",
"response": "PostgreSQL runs on port 5432 by default.",
"model": "llama3.2"
}
Result outcomes. voice_query reports five distinct outcomes. The structured fields are the contract (isError, speech_detected, transcription); any message is a human-readable hint whose wording is not part of the contract, so a caller branches on the fields, never on the prose. The rule is simple: if the pipeline ran, the result is a success (even when it found no words); if a dependency broke, the result is an error.
| Outcome | isError | speech_detected | transcription | response |
| --- | --- | --- | --- | --- |
| Normal | absent | (true/omitted) | the text | the answer |
| No speech at all | absent | false | null | null |
| Speech, but no transcribable words | absent | true | null | null |
| Transcription step failed | true | — | — | — |
| Ollama unavailable, errored, or empty | true | — | — | — |
A caller distinguishes "the user was silent" from "the user spoke but produced no words" by speech_detected (false vs true), both carrying transcription: null. Non-speech audio never reaches the language model: whisper's non-speech markers ([BLANK_AUDIO], [MUSIC], (silence), and similar) are treated as no usable words rather than sent on as a query.
No speech (speech_detected: false):
{
"speech_detected": false,
"stopped_by": "no_speech_timeout",
"transcription": null,
"response": null,
"message": "No speech was detected. Ask the user to repeat, or check that the correct microphone is selected."
}
Speech, but no transcribable words (speech_detected: true, transcription: null):
{
"speech_detected": true,
"stopped_by": "silence",
"transcription": null,
"response": null,
"message": "Speech was detected but could not be transcribed. It may have been too quiet, too brief, or unclear. Ask the user to repeat, a little louder and closer to the microphone."
}
Transcription and dependency failures return isError: true with the real cause (a missing model, a whisper load failure, Ollama not running, a timeout, or an empty model response), so a caller debugging can tell whether the failure was in capture, transcription, or the language model.
How It Works
mcp-listen uses decibri for cross-platform microphone capture. No ffmpeg, no SoX, no system audio tools required. Pre-built native binaries with zero setup.
Audio is captured as 16-bit PCM at 16kHz mono, the standard format for speech-to-text engines.
Silence-stopping uses the Silero voice activity detection model that ships inside decibri, running on-device through the bundled ONNX Runtime. Nothing extra is downloaded and no audio leaves the machine. The stop decision is measured in captured audio, not wall-clock time, and the VAD only decides when to stop: it never gates or alters the recorded samples.
The voice_query tool runs the full pipeline locally: capture audio, transcribe with whisper.cpp, and send to a local Ollama LLM. Fully offline, nothing leaves your machine.
Whisper Model Setup
The voice_query tool requires a Whisper GGML model file. Download one:
Linux / macOS:
mkdir -p ~/.mcp-listen/models
curl -L -o ~/.mcp-listen/models/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin
Windows (PowerShell):
mkdir "$env:USERPROFILE\.mcp-listen\models" -Force
Invoke-WebRequest -Uri "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin" -OutFile "$env:USERPROFILE\.mcp-listen\models\ggml-base.en.bin"
The model is ~150MB and downloads once. You can also set the WHISPER_MODEL_PATH environment variable to a custom directory.
Ollama Setup
- Install Ollama from https://ollama.com
- Pull a model:
ollama pull llama3.2 - Ensure Ollama is running:
ollama serve
Known Limitations
- A loud transient can register as speech. Silence-stopping decides "speech has started" from the VAD score, so a door slam or a cough can start the countdown and end the recording after
silence_msof quiet, yielding a short capture of mostly silence. The outcome is visible, not silent: the result reports the actual duration, andvoice_queryreports an empty transcription rather than inventing one. A minimum-speech-duration guard is a candidate refinement. voice_queryrequires Ollama running. If Ollama isn't running, the tool returns a clear error message.- **Whisper model must be downloaded before
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
106.9kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
78.4kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.7kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Scrapling
90.5k🕷️ The BEST Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
