Local-first MCP server that turns long-form audio/video into personalized, cited, navigable briefings — everything runs on your machine. Exposes Stage 1 primitives (catch, clip, export_timestamps, search) as MCP tools and packaged skills as MCP prompts.
OpenPod exposes 5 tools with detailed, domain-specific descriptions (avg 180+ chars) and comprehensive parameter documentation. Tool names are action-oriented (catch, search, clip, export_timestamps, captions). However, output schemas are not explicitly documented in the visible code, descriptions mention return structures (e.g., 'Returns the entry id, key ideas with deep-links, and the TOC') but JSON Schema definitions for responses are absent. Parameter schemas are present and well-typed in the FastMCP decorator signatures. Error handling is sophisticated (structured OpenPodError.to_dict(), recovery guidance like 'needs_confirmation'), but not all tools document error cases. Security is strong (no secrets in params, local-first design). Composition is clean, each tool has one responsibility, and outputs chain (entry_id used across tools). Naming could be more consistent: 'catch' is domain-specific but less verb-forward than 'ingest_podcast'; 'export_timestamps' is clear but 'captions' is ambiguous (export vs verify?).
Export a caption sidecar (.srt) for a clip window, generated from the transcript with a coverage report — or, with verify_path, check an edited/translated caption file against the transcript window. RULE: caption lines come from the transcript, never hand-summarized; after translating, keep every line and its timings, and re-run this tool with verify_path — a failed coverage report (ok=false, gaps listed) means spoken content was dropped and must be restored before any burn-in.
Ingest a podcast/RSS/YouTube/Spotify/Apple link (or local file) into the local library: transcribe, extract key ideas + a navigable TOC, and write transcript.json / transcript.md / ideas.md / briefing.md. transcript.md is the human-readable view — reflowed paragraphs, chaptered, a deep-link badge per paragraph — point the user at it when they want to skim rather than ask. Returns the entry id, key ideas with deep-links, and the TOC so you can author the briefing.
Cut a local, user-owned clip from a caught episode (snapping to sentence boundaries) and generate a shareable deep-link card. Requires ffmpeg. Does not publish or re-host anything. THE TWO-ARTIFACT CONTRACT: the file under the library is the clean master and is NEVER modified. Presentation — captions ('off'|'soft'|'burn'), a speaker name-plate, working-folder copies — are derivatives; burned files land only in out_dir (or the clip.export_dir setting). Never burn text into the library master yourself; use these parameters.
Emit a caught episode's timed segments and deep-links (json or markdown) for hand-off to another tool or player.
Output schemas not documented. Tool descriptions mention return structures (e.g., 'Returns entry id, key ideas, TOC') but no formal JSON Schema for responses. LLMs cannot plan downstream tool calls or extract fields reliably without documented output types.
Tool name 'captions' is ambiguous, does it export, verify, or both? Description clarifies (export + verify), but the name alone does not convey the dual action. Consider 'export_captions' or split into 'export_captions' + 'verify_captions'.
Error handling guidance is present in descriptions (e.g., 'error: needs_confirmation') but not formalized in schema. No explicit error response schema or categorization (retryable vs user-fixable vs fatal) visible in tool definitions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Search across the whole local library (keyword + local semantic re-rank). Each hit carries an anchor ladder — offer the user every rung that exists, labeled: `chapter_*` is the creator's own chapter ("take me to the topic"), `segment_*` is the detected beat where the idea starts being articulated (usually the best default citation), and `deeplink` is the exact cue where the words were said. Links are cheap; say briefly what each one lands on.
Parameter 'kind' in catch() is optional with no enum or description of valid values. LLMs cannot infer what kinds are supported (podcast, RSS, YouTube, Spotify, Apple, local file?).
Tool 'clip' has 14 parameters, many optional with interdependencies (e.g., 'captions' mode + 'captions_file' + 'lang'). Dependencies not documented; LLMs may pass conflicting combinations.