Mcp Listen

io.github.analyticsinmotion由 GitHub 账号 analyticsinmotion 发布v0.1.1更新于 Oct 24, 2026

Give your AI agents the ability to listen. Microphone capture and speech-to-text.

已验证STDIO仅桌面媒体与设计AI 与机器学习

概览

AI 生成的概览

一个本地 MCP 服务器,让助手访问麦克风:列出输入设备、录制 WAV 音频,并运行本地语音转文字与 Ollama 语音查询。

可以做什么
列出可用的麦克风输入设备,附带稳定 id 与默认标记,便于在重启和设备变化后可靠选择设备。从指定麦克风录制音频并保存为 WAV 文件,可按固定时长录制,或借助设备端语音活动检测在说话人停止时结束。运行完整语音流程:采集语音、用 whisper.cpp 在本机转写、把转写文本发送给本地 Ollama 模型,并返回转写结果与模型回复。区分静音、有语音但无法转写,以及采集、转写或语言模型失败等不同结果。
适用场景
适合希望助手在同一台机器上接收语音输入的场景,例如用语音提问、录制一段短音频,或对本地模型进行免手操作查询。由于音频与转写都留在本机,也适合注重隐私的配置。
运行要求
以本地 npm 包运行(npx mcp-listen 或全局安装),支持 Windows x64、macOS Apple 芯片和 Linux x64/arm64;不支持 Intel Mac。列出设备和录音需要 Node.js 18+ 及麦克风。语音查询工具还需要本地运行 Ollama 并已拉取模型,以及预先下载的 Whisper GGML 模型(约 150MB),可通过 WHISPER_MODEL_PATH 环境变量指定位置。
安装前请注意
该服务器会从麦克风录音,附近任何可听见的声音都可能被采集;请确认所选设备并已授予麦克风权限。录音会以 WAV 文件写入系统临时目录,直到下次服务器启动清理超过 24 小时的文件前一直保留,敏感音频可能留在磁盘上。语音查询工具会把转写文本发送给本地 Ollama 守护进程;音频本身不会离开本机。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Mcp Listen,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Decibri mcp-listen]

mcp-listen

Give your AI agents the ability to listen

Microphone capture and speech-to-text tools for MCP-compatible agents.

Tools

ToolDescription
list_audio_devicesList available microphone input devices
capture_audioRecord audio from the microphone and save as WAV
voice_queryCapture, transcribe on this machine (whisper.cpp), and query a model through the local Ollama daemon

Quick Start

Claude Code

bash
claude mcp add mcp-listen npx mcp-listen

Claude Desktop / ChatGPT Desktop / Cursor / Windsurf / VS Code

Add to your MCP configuration:

json
{  "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

bash
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):

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:

json
[  { "index": 0, "name": "Microphone", "id": "wasapi:{0.0.1.00000000}.{00000000-0000-0000-0000-000000000001}", "maxInputChannels": 2, "defaultSampleRate": 48000, "isDefault": true },  { "index": 1, "name": "Microphone Array", "id": "wasapi:{0.0.1.00000000}.{00000000-0000-0000-0000-000000000002}", "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:

ParameterTypeDefaultDescription
duration_msnumber5000Recording duration in milliseconds (100-30000). A maximum, not an exact length, when stop_on_silence is true
devicenumber or stringsystem defaultDevice index or stable device id from list_audio_devices
stop_on_silencebooleanfalseStop when the speaker stops talking, detected with on-device voice activity detection (Silero VAD, bundled, no download)
silence_msnumber1000Continuous silence in milliseconds that ends a stop_on_silence recording (100-10000). Requires stop_on_silence: true

Example response (fixed duration):

json
{  "path": "/tmp/mcp-listen-1712345678901.wav",  "duration_ms": 5000,  "sample_rate": 16000,  "channels": 1,  "size_bytes": 160044}

Example response (stop_on_silence: true):

json
{  "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 it on this machine with whisper.cpp, send the transcription to the local Ollama daemon, and return the transcription and the response. The audio stays on this machine. Recording stops automatically when the speaker stops talking; pass stop_on_silence: false for a fixed-length recording.

Parameters:

ParameterTypeDefaultDescription
duration_msnumber15000 / 5000Maximum recording duration in milliseconds (100-30000). Default 15000 while silence-stopping is active, 5000 with stop_on_silence: false
devicenumber or stringsystem defaultDevice index or stable device id from list_audio_devices
stop_on_silencebooleantrueStop recording when the speaker stops talking. Pass false to record for exactly duration_ms
silence_msnumber1000Continuous silence in milliseconds that ends the recording (100-10000)
whisper_modelstringggml-base.en.binPath or filename of Whisper GGML model
languagestringenLanguage code for transcription
modelstringllama3.2Ollama model name
promptstringYou are a helpful assistant.System prompt for the LLM

Example response:

json
{  "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.

OutcomeisErrorspeech_detectedtranscriptionresponse
Normalabsentabsentthe textthe answer
No speech at allabsentfalsenullnull
Speech, but no transcribable wordsabsenttrue (absent with stop_on_silence: false)nullnull
Transcription step failedtrueabsentabsentabsent
Ollama unavailable, errored, or emptytrueabsentabsent (the text if the reply is empty)absent (null if the reply is empty)

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):

json
{  "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):

json
{  "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 captures audio and transcribes it on this machine with whisper.cpp, sends the transcription to the local Ollama daemon, and returns the transcription and the response to the calling client. The audio stays on this machine.

Whisper Model Setup

The voice_query tool requires a Whisper GGML model file. Download one:

Linux / macOS:

bash
mkdir -p ~/.mcp-listen/modelscurl -L -o ~/.mcp-listen/models/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin

Windows (PowerShell):

powershell
mkdir "$env:USERPROFILE\.mcp-listen\models" -ForceInvoke-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

  1. Install Ollama from https://ollama.com
  2. Pull a model: ollama pull llama3.2
  3. Ensure Ollama is running: ollama serve

Known Limitations

  1. 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_ms of quiet, yielding a short capture of mostly silence. The outcome is visible, not silent: the result reports the actual duration, and voice_query reports an empty transcription rather than inventing one. A minimum-speech-duration guard is a candidate refinement.
  2. voice_query requires Ollama running. If Ollama isn't running, the tool returns a clear error message.
  3. Whisper model must be downloaded before first use. voice_query does not download the model itself; the first call requires a pre-downloaded model (~150MB). See Whisper Model Setup.
  4. No streaming. MCP's request/response pattern means the entire recording is captured, then transcribed, then sent to the LLM. No real-time partial results.
  5. Temp files. capture_audio writes WAV files to the system temp directory and returns the path, so the file has to outlive the call for the caller to read it. Recordings older than 24 hours are removed the next time the server starts; recordings made since the last restart persist until then. voice_query deletes its recording as soon as the query completes.

Troubleshooting

Windows: "Error opening microphone" Windows may block microphone access by default. Go to Settings > Privacy & security > Microphone and ensure microphone access is enabled for desktop apps.

Ollama: "Ollama is not running" Some Ollama installations start as a background service automatically. If you see this error, run ollama serve manually or check that the Ollama service is running.

Whisper: "model not found" The whisper model file must be downloaded before first use. See Whisper Model Setup for instructions.

Whisper: "installed but failed to load" The @kutalia/whisper-node-addon package is present but a native library it depends on is missing or incompatible on your system. The error includes the underlying loader message naming the library. Reinstalling the package will not help; resolve the named library instead.

License

Apache-2.0. See LICENSE for details.

Copyright 2026 Decibri

来源:README.md,提交 77a0f4b

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分