MCP server for local webcam capture and offline microphone transcription (ffmpeg + faster-whisper, no network)
Strong tool definitions with clear naming (verb_noun pattern), comprehensive parameter descriptions, and explicit input schemas. All 7 tools have detailed docstrings explaining WHAT they do and WHEN to use them. Parameters include type, description, defaults, and constraints. Error handling is contextual (e.g., _capture_hint() provides device-specific recovery guidance). Main gaps: output schemas are not formally documented in code; no tool annotations (readOnlyHint/destructiveHint); some parameter descriptions could be more concise per LLM optimization guidelines (50-200 chars ideal, some exceed 200).
Record audio from a microphone for a specified duration and save as WAV.
Capture a single still frame from a webcam and save it as a JPEG. Returns the path to the image, which can then be opened with the Read tool to actually view it.
Capture from two cameras at once and stack them into a single image. Top half is the first camera, bottom half the second. One image means one Read call and one coherent view, instead of two frames that have to be mentally reassembled.
Detect wake words in audio using openwakeword (offline, no network).
List the webcams and microphones available for capture on this machine. Call this first if a capture fails, or to find the exact device name to pass to the other tools.
Speak text aloud using the Windows SAPI engine (offline, no network).
Transcribe audio from a file or microphone using faster-whisper (offline, no network).
Output schemas not formally documented. Tools return strings with human-readable messages, but LLMs cannot parse structured fields for downstream chaining. E.g., capture_frame returns a path string; no schema declares it as {path: string, size_kb: number}.
Tool annotations missing. No readOnlyHint or destructiveHint declared. capture_frame, capture_audio, speak_text are destructive (write files); transcribe_audio, detect_wake_word, list_devices are read-only. Annotations help agents reason about side effects.
Parameter descriptions exceed LLM-optimal length (50-200 chars). E.g., capture_frame.warmup_seconds description is 180+ chars; capture_stitched.width is 150+ chars. Verbose descriptions waste tokens and bury key constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
No pagination or result limits documented. transcribe_audio and detect_wake_word process files but do not specify max file size, duration, or output length constraints. Unbounded processing risks timeouts and context explosion.
Error messages are contextual but not machine-parseable. _capture_hint() returns human-readable hints; no structured error codes or recovery actions. Agents cannot programmatically distinguish retryable vs. fatal errors.