Local-first AI video analysis pipeline: transcript, keyframes, screen content, and structured summaries
Server has 5 tools with complete Zod schemas and descriptions. Naming follows verb_noun convention (analyze_*, get_*, list_*). Descriptions are adequate (100-200 chars) but lack actionable recovery guidance for errors. Parameters are well-typed with descriptions, but several lack constraints (enums, ranges). Output schemas are not documented, LLMs cannot predict response structure. No error handling guidance or permission gates. Tool composition is reasonable but analyze_video_gemini and analyze_video_local overlap significantly without clear differentiation.
Start a Gemini analysis job in the background and return immediately. Use get_analysis_status to check progress. A macOS notification fires on completion. Requires GEMINI_API_KEY. Writes analysis.json and analysis.md under the output directory.
Start a local video-analyzer + Ollama analysis job in the background and return immediately. Use get_analysis_status to check progress. A macOS notification fires on completion. Requires Ollama and Python stack (see npm run setup:local on macOS). Writes analysis.json and analysis.md under the output directory.
Read existing analysis.json for a video (resolves output dir like the CLI). Returns pretty-printed JSON.
Check the status of a background analysis job started with analyze_video_gemini or analyze_video_local.
List completed analyses under a directory by scanning *-analysis/analysis.json.
Output schemas not documented. LLMs cannot predict response structure for any tool. analyze_video_gemini and analyze_video_local return jobId/status but this is not declared in tool definition.
No error handling guidance. Tools lack recovery hints (e.g., 'If GEMINI_API_KEY is missing, set it in .env'). Errors return raw text without actionable next steps for LLM.
analyze_video_gemini and analyze_video_local are near-duplicates with overlapping intent. LLM must reason about which to call (cloud vs local). Consider consolidating with a 'backend' enum parameter.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Parameters lack constraints. 'model' is free-form string (should be enum: gemini-2.5-flash, gemini-2.0-flash, etc.). 'chunkMinutes' and 'maxFrames' lack min/max bounds. 'ollamaUrl' lacks format validation.
No permission gates or audit logging. Tools write files and spawn background processes without declaring required permissions (e.g., 'write:filesystem', 'execute:subprocess'). No trace of who called what.