Homelab toolbox: search the web, fetch JS-rendered pages, convert documents to markdown, manipulate PDFs, extract video metadata and transcripts, and synthesise speech (with optional voice cloning).
Strong tool definitions with clear naming (verb_noun pattern), comprehensive descriptions (avg 250+ chars), and complete input schemas. All 8 tools have types and descriptions. However, output schemas are not explicitly documented in the source, and error handling guidance is minimal. No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only. Parameter descriptions are detailed but some lack explicit constraints (e.g., max_results range not stated in schema). Composition is clean, each tool has one responsibility.
Convert a document (PDF/DOCX/PPTX/XLSX/HTML/images-with-OCR) to markdown.
Download the actual media FILE (audio or video) from a URL and return it base64-encoded. Unlike extract_video (returns metadata/transcript) and transcribe_audio (returns text), this hands back the real file bytes so the caller can save/use it. Uses yt-dlp with the container's Node JS runtime, so it sees the full format list and grabs the genuine best stream — NOT YouTube's low-quality `format 18` fallback you get without a JS runtime. The stream is taken as-is (no re-encode), so audio stays pristine.
Extract metadata (and optionally auto-transcript) from a YouTube/podcast/etc URL.
Fetch a web page and return clean markdown. Uses Crawl4AI (Playwright-backed). JS rendering on by default — handles SPAs, React/Next/Vue, Cloudflare-protected pages, login-gated dashboards.
Extract plain text from a PDF using Stirling-PDF's text extractor.
Health check / hot-reload smoke test. Returns 'pong'. Use to verify the toolbox is reachable.
Output schemas not documented in source code. LLMs cannot plan downstream tool calls or extract fields without knowing return structure.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Agents cannot distinguish safe tools from destructive ones.
Parameter constraints not fully specified in schema. E.g., search_web max_results has default=10 but no minimum/maximum bounds in schema; transcribe_audio model enum not visible in schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Search the web via SearXNG (federated meta-search, no rate limits).
Transcribe audio/video to text via local Whisper (GPU-accelerated on AMD 5700 XT via Vulkan). Use for YouTube videos without auto-captions, podcasts, recorded meetings, or any audio file. For URLs, audio is downloaded via yt-dlp (1000+ sites supported) and normalized before transcription.
Error handling guidance absent. Tools do not document what errors can occur, whether they are retryable, or what the LLM should do next (e.g., if fetch_page fails due to Cloudflare, should it retry with render_js=false?).
No pagination or result-limiting guidance. download_media has max_mb default=25 but no guidance on what happens if a file exceeds it or how to handle partial downloads.