Skip to main content
Glama

Guaardvark

The self-hosted AI studio. Chat with your own files, hand tasks to agents that use a real desktop and browser, run parallel coding agents, and generate video, images, music and voice. Everything runs locally, on your own GPU.

License: MIT CI PyPI Glama GitHub stars Sponsor

Quick start · Features · Videos · FAQ · Full capability list · guaardvark.com

https://github.com/user-attachments/assets/c6d9d18b-cfff-4ae2-8220-dc7f329fee5d

Why Guaardvark

  • It runs on your machine. Language models, retrieval, agents and every generator run on your own hardware, through Ollama, ComfyUI and Guaardvark's own GPU services. No cloud API keys, no per-token or per-minute fees, nothing reported home. Web access, posting and every other outbound path stay off until you switch them on or start them, and all of them are declared in one file, egress.json.

  • One install is the whole studio. Chat and RAG, screen agents, coding swarms and a full media pipeline share one GPU through a single orchestrator, so a video render and a language model take turns instead of fighting over VRAM.

  • Your coding agent can drive it. A built-in MCP server, fifteen agent skills and plugins for Claude Code, Grok Build and Antigravity let Claude Code, Grok, Antigravity, Cursor, Codex, Gemini CLI and other agents run every flow: "make a music video from this song", "film this script", "train a LoRA of this character", "swarm this refactor".

  • You approve what matters. Nothing posts and no voice is cloned without an explicit yes from you, and fixes Guaardvark writes for its own code wait for your review. The MCP server hides desktop, shell and browser tools unless you allowlist them.

Related MCP server: omnicinema-mcp

Quick start

Linux with an NVIDIA GPU (16 GB for video, 12 GB for the Wan 2.2 5B; chat, RAG and agents run on less, see the hardware tiers). A fresh Ubuntu desktop has no curl or git; run sudo apt install -y curl git first.

curl -fsSL https://guaardvark.com/install.sh | bash

Then open http://localhost:5173. The script is install.sh from this repository: it clones to ~/guaardvark and runs ./start.sh, which installs everything on the first run. To read it before it runs, download it first (curl -fsSL https://guaardvark.com/install.sh -o install.sh, read it, then bash install.sh), or install by hand.

Add it to Claude Code (two lines, no clone):

/plugin marketplace add guaardvark/guaardvark
/plugin install guaardvark@guaardvark

Other ways in: Docker · macOS on Apple Silicon · the CLI from PyPI · the full install guide. The current release is in the VERSION file.

Features

  • Chat with your own files. Local RAG on pgvector: keyword and vector search fused per query, cross-encoder reranking, source citations, and retrieval that shows the chunks and scores behind an answer. Autoresearch tunes retrieval overnight. ▶ Ep 3

  • Plan mode. Turn it on with /plan and every request is looked into with read-only tools first, then comes back as a plan card you approve, edit or reject; approved steps run one at a time and pause when one fails. It is offered on a model only once that model passes the plan-mode test.

  • Agents on a real desktop. Screen agents get an Ubuntu desktop of their own, see it with a vision model, click with closed-loop targeting, and work in a real browser while you watch from any page. ▶ Ep 4

  • Parallel coding agents. A swarm of coding agents, each in its own git worktree, merged back in dependency order. Runs on Claude Code or fully locally through Ollama.

  • MCP, both ways. An MCP server that plugs into Claude Code, Cursor, Codex, Gemini CLI, Zed and more with one command, and an MCP client so chat can use tools from other servers. ▶ Ep 21 · ▶ Ep 16

  • Video generation. 13 local video models across five families (Wan 2.2, LTX, HunyuanVideo, CogVideoX, and MiniMax H3 with its own soundtrack), video LoRAs, a batch queue, frame interpolation, and one click into ComfyUI. ▶ Ep 6

  • LoRA training and consistent characters. Train character, environment and prop LoRAs from a few reference photos on your own GPU, import LoRAs trained elsewhere, and keep the same character across images, video, music videos and Film Crew productions. Details

  • Images. Z-Image, FLUX.1, Krea 2, SDXL and Sana Sprint (1024 stills in seconds, even on 8 GB cards) generation, photo edits by instruction, inpainting and outpainting, and 4K/8K upscaling. ▶ Ep 5

  • Music and voice. Full songs with vocals, sound effects, three neural text-to-speech engines, consent-gated voice cloning, and hands-free voice chat. ▶ Ep 7

  • Directors. A beat-synced music-video director, a five-role Film Crew that turns a logline into a finished video, and a built-in video editor. ▶ Ep 8 · ▶ Ep 9

  • Self-improvement. Ask how part of Guaardvark works and it answers from its own source with checked file:line links. A change it makes to itself is planned, checked, undone when a check fails, and one button reverts it. The System Map draws the whole codebase from its real imports. ▶ Ep 11 · ▶ Ep 14

  • Command center. A GPU orchestrator, a plugin manager with a live VRAM budget, jobs and scheduling, schema-aware backups, and a multi-machine Interconnector. ▶ Ep 12

  • Terminal and API. The guaardvark CLI with an interactive REPL, plus REST and Socket.IO. ▶ Ep 20

The complete, enumerated list of models, tools, plugins and pages is in CAPABILITIES.md.


Chat with your own files (local RAG)

Upload documents, build a knowledge base per project, and ask questions. Answers are grounded in your files and cite where they came from.

  • Hybrid retrieval. Postgres full-text keyword search and vector search, fused with a per-query weighting that leans toward keywords for identifier-like queries and toward meaning for prose.

  • Cross-encoder reranking. A reranker (one Install in Settings) reads the query and passage together and reorders the candidates. It is admitted against free VRAM and falls back to CPU rather than competing with image or video generation.

  • Layout-aware parsing. PDF, DOCX and PPTX are parsed for reading order and section headers, and PDF passages carry the page they came from. (Scanned documents need OCR, which is not installed by default; they say so rather than indexing as empty.)

  • Grounded citations. Every chunk carries its source file and section breadcrumb (and, for PDFs, the page), written into the embedded text as well, so a passage lifted from the middle of a document still says where it came from.

  • Smart chunking. Code gets AST-informed chunks, so a function stays one chunk; prose gets semantic splitting.

  • Postgres-backed vector store. Embeddings live in pgvector next to the rest of your data, with an ANN index and a persisted full-text index, covered by the same backups.

  • Retrieval that shows its work. Live retrieval tests show the actual chunks and scores behind an answer (Episode 3), and every query can return a trace of which retrieval legs ran, so a degraded answer can be told apart from a bad one.

  • More: index profiles (the same documents projected more than one way), corpus-level summaries for "what are the themes across all of this", a choice of embedding models from 300M to 4B+, entity extraction, and per-project isolation.

Autoresearch tunes retrieval while you sleep. An overnight loop proposes changes to chunking and retrieval settings, scores them with an LLM-as-judge harness, keeps the wins and reverts the regressions, bounded by a wall-clock budget, a run ledger and a circuit breaker. The morning report says what changed and why.

One chat box, three speeds. Every message goes through a three-tier router that picks the fastest path to the right answer (Episode 2):

Tier

Name

Latency

LLM calls

When it fires

1

Reflex

<100 ms

0

Deterministic actions such as media controls, pattern-matched with no inference

2

Instinct

1–3 s

1

Conversation and most requests: single questions, web searches, image generation, vision

3

Deliberation

5–30 s

3–10

Multi-step research, analysis chains, complex agent tasks (a full ReACT loop)

Desktop and vision tools are only offered to the model while the agent screen is active.

Agents that use a real desktop and browser

Guaardvark's agents control a real Ubuntu desktop (Xvfb and XFCE on display :99): the same Applications menu, desktop icons and taskbar you would see if you connected to the box over VNC. They see the screen through a vision model, move the mouse, click, type, browse, and check their own work. The desktop is isolated from yours: its own XDG_DESKTOP_DIR and XDG_CONFIG_HOME, so the agent's files and settings never collide with your session.

  • One vision brain. Gemma4 sees the screen, decides the next action and returns click coordinates in a single inference call.

  • Closed-loop targeting. The servo moves, checks where the cursor actually landed, and corrects until it is on the target, rejecting targets the model cannot really see.

  • Live reasoning. Every step (action, target, reasoning, pivots when the loop is stuck) streams into chat as it happens and stays in history, so any run can be audited.

  • Deterministic recipes. Common browser actions (navigation, tabs, back and forward, find, zoom, bookmarks, YouTube search) run instantly from a recipe library instead of the vision loop, and every recipe is checked against safety bounds before it loads.

  • Done means done. The agent claims a task is finished only when it can show proof on the screen.

  • Watch it work. A draggable, resizable viewer of the agent's desktop on any page, with a pop-out window.

Model

Role

Coordinate system

Notes

Gemma4 (e4b)

Sees, decides and clicks

box_2d normalized to 1000, [y1,x1,y2,x2]

Vision, reasoning and coordinates in one call

Moondream

Fallback eyes

1024 px internal width

For text-only chat models that need external vision

  • Obstacle detection checks every step for popups, permission dialogs and notification bars before acting.

  • A separate Playwright browser tool handles headless page tasks that don't need a visible screen.

  • The screen agent is Linux-only; on macOS the agent tools say so and the rest of the app is unaffected.

Parallel coding agents (Swarm)

Launch several coding agents at once, each in an isolated git worktree on its own branch. Results merge back with dependency-ordered conflict detection, optional test validation, and a live dashboard.

  • Backends: Claude Code, or Cline/OpenClaw running fully locally on an Ollama model.

  • Flight Mode keeps a swarm offline: tasks run on the local backend only.

  • Git worktree isolation: every task gets its own branch and working directory, sharing one .git directory.

  • Dependency-aware merging: a topological sort lands foundational changes first, with a dry-run conflict check before the real merge and tests before integration.

  • Templates for a REST API scaffold, refactor-and-extract, test-coverage expansion, and more.

  • Live dashboard: status, per-task logs, cost, elapsed time and disk use. Five agents run at once by default; the dashboard takes up to 20.

Film Crew runs on the same orchestrator (see Directors).

MCP server, agent skills and agent plugins

Guaardvark speaks the Model Context Protocol both ways: it exposes its tools to any MCP client, and it can call tools on other MCP servers. Episode 21 shows five coding agents (opencode on a local model, Codex, Cursor, Grok and Antigravity) making pictures, clips, songs and voices through it.

  • One-command setup. python -m backend.mcp install finds the agent clients on your machine (Claude Code, Codex, Cursor, Grok, Antigravity, opencode, Claude Desktop, Zed, Gemini CLI) and writes the guaardvark server entry into their configs, backing up existing files and leaving other entries alone. python -m backend.mcp doctor diagnoses a broken setup with a server self-test, a real stdio handshake, and a scan for stale client configs.

  • Claude Code plugin. /plugin marketplace add guaardvark/guaardvark, then /plugin install guaardvark@guaardvark. It asks for the path of your Guaardvark checkout, starts the MCP server from there, and loads every skill as /guaardvark:<skill>.

  • Grok Build plugin. grok plugin marketplace add guaardvark/guaardvark, then grok plugin install guaardvark --trust. It installs the plugin repository at a pinned commit and loads every skill; the server finds your checkout once python -m backend.mcp install has run there.

  • Antigravity plugin. agy plugin install .agents/plugins/guaardvark from the checkout; opening the repository in Antigravity also loads it. It carries all fifteen skills, the MCP server and a short operating guide.

  • Agent skills. .agents/skills/ has one skill per flow (images, video, music video, Film Crew, voice, music, upscaling, Cast and LoRA training, Hugging Face model onboarding, swarm, knowledge, code, outreach, operations, setup) in the Agent Skills format, so Claude Code, Cursor, Codex and OpenClaw know which tool to call for each job. python -m backend.mcp install --skills links them into ~/.claude/skills and gives Antigravity the plugin instead of a bare server entry.

  • As a server: python -m backend.mcp (stdio) or python -m backend.mcp http (streamable HTTP on 127.0.0.1:8788/mcp, loopback-only by default). python -m backend.mcp list-tools prints the live tool list. Generation tools queue by default and return a batch id for get_generation_status; every call runs under an enforced timeout.

  • Default-deny policy (backend/mcp/config.py): desktop control, agent control, system and shell, browser automation, test execution and MCP meta-tools are hidden unless you allowlist them, and so are tools that need approval. More than 50 tools are exposed by default (RAG, files, generation, memory, code search, web), plus read-only guaardvark://outputs/ resources.

  • As a client: mcp_connect and mcp_execute, with a live inventory so the chat model can find and use tools from other MCP servers by name. Audit logging, timeouts and circuit breakers are built in.

More in docs/mcp.md.

Local video, image, music and voice generation

All generation runs on your GPU. No cloud APIs, no per-minute billing.

Video generation

Model

Type

Max duration

Native resolution

VRAM

Wan 2.2 TI2V-5B (default)

Text + image to video

~5 s (up to 121 frames @ 24 fps)

1280x704

~11 GB

Wan 2.2 14B MoE

Text to video

5 s (81 frames @ 16 fps)

832x480

16 GB

Wan 2.2 14B I2V

Image to video

5 s (81 frames @ 16 fps)

832x480

16 GB

CogVideoX-5B

Text to video

6 s (49 frames @ 8 fps)

720x480

16 GB

CogVideoX-5B I2V

Image to video

6 s (49 frames @ 8 fps)

720x480

16 GB

LTX-2.3 Distilled FP8

Text + image to video

~10 s (161 frames @ 16 fps)

768x512

16 GB

LTX-2.5 Distilled Int8

Text + image to video

~10 s (161 frames @ 16 fps)

768x512

16 GB

HunyuanVideo 13B (GGUF Q5)

Text to video

~3 s (73 frames @ 24 fps, up to 129)

848x480

16 GB

HunyuanVideo 13B I2V (GGUF Q5)

Image to video

~3 s (73 frames @ 24 fps, up to 129)

848x480

16 GB

MiniMax H3 (pruned Int8)

Text, first frame, last frame, first + last frame to video with its own stereo soundtrack (dialogue, ambience, score)

~7 s offered (175 frames @ 24 fps; the model trains to 15 s)

864x480 default, 1344x768 max

16 GB card; measured 6.5 min for a 5 s clip at 864x480, 20 steps, on a 16 GB RTX 40-series card

MiniMax H3 Reference (pruned Int8)

Up to 9 images, 3 clips and 3 audio files to video with soundtrack (identity, motion, voice, editing)

same

same

same

MiniMax H3 also comes as unpruned Int8 and BF16 builds for 24 GB and 48 GB cards, which makes 13 video models in all.

  • Resolutions of 512, 576, 720, 1280 and 1920 px (1080p), aligned per model.

  • Quality tiers: Fast (10 steps), Standard (30), High (40), Maximum (50). Each model declares the fewest steps it renders well at, and a preset below that floor is raised to it (Wan and MiniMax H3: 20). MiniMax H3 also offers 8- and 4-step turbo profiles through its distilled LoRAs.

  • Frame interpolation with RIFE (1x raw, 2x frame rate, 2x plus upscale), prompt enhancement styles (Cinematic, Realistic, Artistic, Anime, or raw), a low-VRAM mode for Wan and CogVideoX, and a batch queue for prompt lists.

  • ComfyUI integration: one click into the node editor for custom workflows. Wan and LTX run through ComfyUI. LTX-2.5 needs ComfyUI ≥ 0.32.0 and a one-time license accept on Lightricks/LTX-2.5 (HF_TOKEN in .env); after the download, generation stays local.

  • MiniMax H3 generates picture and sound in one pass. Guaardvark compiles your prompt into the model's structured format (numbered shots with cut times, speaker ids, tagged dialogue), and the Film Crew renders each scene as one spoken window on it. It is licensed under the MiniMax H3 Community License, which names the EU, UK, South Korea and USA as territories that need MiniMax's application form; the Video Models dialog shows the license and the link, and posts carrying H3 clips add a "Generated with MiniMax H3" line.

  • Video generation needs a 16 GB-class card, except the Wan 2.2 5B, which is admitted from 11 GB; see docs/HARDWARE.md.

LoRA training and consistent characters

Train your own LoRAs on your own GPU and keep the same character, place or object across everything Guaardvark makes.

  • Character, environment and prop LoRAs from a few photos. In the Cast Library, add reference photos, approve the generated samples, and train. The LoRA Trainer uses Z-Image Turbo as its default base (SDXL for older setups) and trains in bf16. A character LoRA trained from 5 photos at 512 px for 400 steps (rank 16) is about 33 MB.

  • Consistent characters. Pick a Cast member on the Images, Video Generator or Music Video pages, or let Film Crew's Casting role assign one. Stills and keyframes are rendered with that character's LoRA, and video models animate those keyframes, so every shot starts from a frame made with the same character LoRA.

  • Import LoRAs trained elsewhere. Attach a .safetensors LoRA from Ostris AI-Toolkit, kohya or diffusers/PEFT to a Cast member; Z-Image Turbo and FLUX.1 Dev layouts are accepted, and the key layout is checked before it is stored.

  • Video LoRAs. Add a video LoRA from its Hugging Face URL for the model it was trained on and pick it in the Video Generator; it loads into the Wan 2.2, LTX, HunyuanVideo or MiniMax H3 workflow in ComfyUI. Speed LoRAs are in the catalog: 8- and 4-step turbo profiles for MiniMax H3 and an experimental 4-step Lightning profile for Wan 2.2 14B.

  • Image LoRAs from Hugging Face are added the same way and offered only for the models they fit.

Images and upscaling

  • Image generation with Z-Image, FLUX.1, Krea 2, SDXL and Stable Diffusion 1.5 fine-tunes, batch runs from a prompt list or CSV, and anatomy controls.

  • Photo editing by instruction (Qwen-Image-Edit, FLUX.1 Kontext), inpainting, outpainting and background removal, from the Images pages or straight from chat.

  • Add any Hugging Face model (checkpoint or LoRA) from its URL.

  • 4K and 8K upscaling on the GPU with nine models, from HAT-L (maximum-quality restoration) to anime-tuned Real-ESRGAN variants: two-pass mode, FP16/BF16 with optional torch.compile, frame-by-frame video upscaling, and an optional watch folder. The model table is in CAPABILITIES.md.

Music, sound and voice

The Audio Foundry plugin runs three audio backends with shared GPU arbitration, so they don't trample each other or fight Ollama for VRAM.

  • Music: ACE-Step v1 (3.5B) writes full songs with vocals, or instrumentals. Pick genre, mood and instrument chips, with an optional LLM "Polish" pass that turns plain English into ACE-Step's tag vocabulary plus a paired negative prompt. ACE-Step 1.5 is an optional install.

  • FX Lab: Stable Audio Open for sound effects and short ambient pieces.

  • Neural voice: Chatterbox as the main text-to-speech engine, Kokoro as a fast fallback, and Piper for narration. Used for chat narration, lines spoken in chat ("say this out loud"), video voiceover and voice chat.

  • Voice cloning: opt-in, behind an explicit consent prompt before any clone is created or used. Reference clips stay under your control, and nothing is cloned from incidental audio.

  • Voice chat: local Whisper speech-to-text, one microphone for the whole app, hands-free conversation, and a narrate button on every chat reply.

  • Generated audio opens in an in-app player.

Directors: Film Crew, music videos and the editor

Film Crew turns a one-line idea into a finished video with five roles, with human checkpoints at casting and storyboard (Episode 9):

Role

What it does

Screenwriter

Writes the script and scene breakdown from a logline

Casting

Assigns characters to LoRAs from the Cast Library, or to stock characters

Cinematographer

Produces a shot list with camera moves, framing and lens choices

Storyboard

Generates keyframe images for every shot

Editor

Assembles the generated clips into the finished video

Music videos, cut on the beat (Episode 8). Give it a song, a style prompt and a short narrative. Guaardvark analyzes the tempo and beats, writes a distinct prompt for every cut, renders a storyboard still per cut (with optional character LoRAs for identity), and stops for your approval before any GPU time is spent on video. Then it animates each still with an image-to-video model and assembles the clips so they land on the beat, with RIFE frame interpolation for smooth motion. Assembly uses melt from Shotcut (setup in plugins/video_editor/README.md).

Video editor. Drop clips into the bin, pick a song, and press Plan: the Art Director arranges the cut, you adjust it with director's notes, and Render writes an MLT project and an MP4, with undo and keyboard shortcuts. A separate text-overlay tool places captions in nine positions with ffmpeg drawtext.

Self-improvement, System Map and code intelligence

  • Self-improvement. Guaardvark runs its own tests, sends a code agent to read the failure and the source, drafts a fix, verifies it, and stages it as a pending fix for your review; applying fixes on its own stays off unless you turn it on. Three modes: scheduled (every six hours), reactive (after repeated server errors) and directed (tasks you give it). A codebase lock stops all changes, and what it learns can be shared with your other machines over the Interconnector (Episode 11).

  • Self-analysis and self-edits. A question about Guaardvark itself ("where does the seed box keep its value?") starts from the System Map: the files most likely involved, the functions read by name, their callers and tests. Each file:line in the answer is checked against the file. A change to its own code is planned first, copies the files it touches to a restore point, runs a syntax check, an import check and the tests that cover those files, and puts them back if one fails. Revert is on the chat card and on the Self-improvement page.

  • System Map. A force-directed constellation of every Python and JavaScript module in the checkout, drawn from its real imports, with lifecycle tags (active, dormant, auto-loaded, test, script, config) and ranked findings you can hand to the self-improvement agent, which stages a proposed fix for your review. Ask it about the code with system_map_query in chat or over MCP, or /sysmap <question>: where a feature lives, what calls a function, what depends on a module, which tests to run after changing it (Episode 14).

  • Code intelligence. A Monaco code editor with tabs and an assistant pane, repository maps, dependency graphs and AST-aware search (get_repository_map, read_ast_node, search_code, also over MCP). Every AI code write goes through one verified exact-replacement gate behind the codebase lock.

Privacy and safety

  • Local by default. Your data, models, LoRAs and generated media stay on your machine unless you choose to send them. Every outbound path is declared in scripts/inbound_guard/egress.json and is off until a setting or a person turns it on: models download when you install one or first use one that isn't on disk, and web access is a switch in Settings, off by default.

  • Works offline. With models downloaded, chat, RAG, agents and generation run without internet, and the Swarm has a dedicated Flight Mode.

  • Approvals. Publishes, outreach drafts and held code changes wait on the Approvals page, each in its own tab.

  • What a chat model can reach. Python and JavaScript the model writes run with no network (inside a bubblewrap network namespace on Linux; where none can be made they do not run) unless "Internet for code it runs" is on in Settings → Chat. Web fetches go only to sites named in the chat or returned by a search made in it. A self-edit that names an outside host, imports a hosted AI client or turns off TLS checks shows an approval card every time.

  • MCP default-deny. Desktop, agent control, shell, browser and test tools are hidden from MCP clients unless you allowlist them.

  • Inbound guard. scripts/check_inbound.py reads code before it lands, in pull requests and inside the product, and in Enforce mode holds risky changes for a person to read.

  • Uncle Claude is an optional second opinion and code reviewer that calls Anthropic's API. Without an ANTHROPIC_API_KEY in the environment it sends nothing. With a key, it runs only when you start it, unless you change one of two settings:

    • When you start it: /claude … in chat sends that message and the last 10 messages; Test connection sends a fixed test line; advice you ask for sends your GPU memory figures; a code change the agent makes at your request is sent for review as a file excerpt (up to 3,000 characters) and the diff.

    • Escalation: Always (Settings, off by default): every chat message and the last 10 turns go to Anthropic, and Claude's answer replaces the local one.

    • Scheduled sends (Settings → Uncle Claude, off by default): advice twice a day (the time, node id, GPU name and memory) and reviews of changes the self-improvement loop makes on its own (a source excerpt and the diff).

    • A review never applies anything; staged fixes still wait for you. Usage is counted against a monthly token budget.

See SECURITY.md to report a vulnerability.

More built in

  • Supervised outreach. Drafts replies to threads on Reddit, YouTube, Discord and Facebook, grounded in your own indexed documents, graded for relevance before they reach the queue, with nothing posted until you approve it. Reddit, YouTube and Facebook posts go out one at a time while you watch the Agent Screen. Kill switch, per-platform cadence limits and a JSONL audit trail.

  • Files and projects. A desktop-style file manager (folders as windows, drag and drop, right-click menus) with clients, projects, websites and notes linked together and indexed recursively. Files stream into the browser's own players and viewers, so video plays without a codec pack and PDFs start rendering before they finish downloading.

  • Rules, prompts, lessons and memory. Portable rule bundles, lessons that teach the agent from a good run, and "remember …" notes that carry across chats.

  • Discord bot plugin for chat, /imagine images and search against your own install.

  • WordPress (opt-in): pull pages and posts from your sites, generate content in bulk, and push it back.

  • Multi-machine Interconnector. Master and client nodes with approval gates, code and data sync, and shared learnings.

  • Operations. Jobs and scheduling (Celery beat), schema-aware backup and restore, live GPU and CPU monitoring, and 11 first-party plugins with health checks and a GPU memory orchestrator.

  1. Discover. The agent scouts target threads from a URL you paste or from platform entry points (subscribed subreddits, Discord channels, Facebook groups).

  2. Context. For each candidate it fetches the post and top comments: Reddit through its JSON API, Discord and Facebook through the agent's logged-in Firefox session, with a vision-model fallback when page selectors drift.

  3. Draft. Your local model writes a reply grounded in the thread and in citations from your indexed documents, shaped by one configurable persona (voice, expertise, citation style, what never to say).

  4. Grade. Every draft is scored against a relevance and quality rubric; anything below the threshold is dropped. Generic "great post!" replies don't survive.

  5. Review. Drafts land in a queue. Nothing posts without your approval, and there is no setting that changes that.

  6. Post. Approved Discord replies go out through the Discord bot. Reddit comments and link posts, Facebook comments and YouTube comments go through the agent's logged-in browser, so each one starts only when you press Post now, I'm watching on the Approvals page with the Agent Screen open: one click, one post, driven on screen while you watch, cadence-gated. Closing the Agent Screen before the submit step stops it. The Reddit and Facebook posters read the page at every step: they check the browser is still on the approved post, read the text back out of the box before submitting, and count a post only once it shows on the page. /outreach … in chat or guaardvark outreach "…" runs recon and drafting; posting still needs your approval and your click. X and LinkedIn are not offered: both forbid driving an account with browser automation.

Safety: a system-wide kill switch stops every pipeline mid-flight; every post needs a person's approval; at most one post per 30 minutes per platform; every scout, draft, grade, approval, rejection, post and failure is recorded in a JSONL audit trail. Manual draft mode and on-demand passes for one platform or subreddit are available from the UI.

How Guaardvark compares

The local-AI ecosystem has excellent tools for every slice: chat UIs, RAG workspaces, node-graph media pipelines, coding agents, assistant gateways. Guaardvark's bet is different: one install on one GPU that is the whole studio, with one GPU orchestrator arbitrating all of it.

Capability

Chat UIs

RAG apps

Node graphs

Coding agents

Assistant gateways

Guaardvark

Local chat + RAG

core

core

—

—

via tools

core (Ep 3)

Media production (video · image · music · voice)

—

—

image/video graphs

—

via connected tools

core, with director engines (Eps 5–9)

Agents on a real desktop

—

—

—

—

browser/tool use

core (Ep 4)

Parallel coding swarms

—

—

—

usually one agent

—

up to 20 in git worktrees

Self-improvement behind human gates

—

—

—

—

—

core (Ep 11)

One-GPU resource arbitration

—

—

—

—

—

core (Ep 12)

Integrations and plugins

varies

varies

enormous

growing

enormous

11 first-party plugins, plus MCP both ways

Hosted or mobile option

often

often

often

often

often

none, by design: it's your machine

Columns describe the typical shape of each category, not any single project; several projects exceed their category in places.

If you need one slice, use the excellent specialist: a chat UI like Open WebUI, a node graph like ComfyUI (Guaardvark hands off to it with one click), a RAG workspace like AnythingLLM. Guaardvark is for when you want the whole studio on one box.

Cloud platforms

Guaardvark

Where your data lives

Their servers

Your machine

Per-token or per-minute fees

Always on the meter

None. Generate all night if you want.

Content policy

Their rules

Your rules

Custom models and LoRAs

Whatever they expose

Ollama models including your own GGUF files, LoRAs you train or add from Hugging Face, a choice of embedding models

Works offline

No

Yes, once models are downloaded

Agents drive a real desktop

Sandboxed browsers

Real Ubuntu/XFCE on your hardware

Swarms of parallel agents

Per-task billing

Up to 20 in parallel; the only cost is power

Multi-machine clusters

"Talk to sales"

Built in: master/client with approval gates

A newer category: the coding agent runs the studio. As of October 2026, from each project's own repository or site.

OpenMontage

Nomi

Maestro

Comfy MCP

Promptus / LocalForge / SimpliGen

Guaardvark

What it is

Agentic video production system: 12 pipelines and 100+ tools driven by your coding assistant

Desktop AI video workbench with 24 MCP tools

Local video, image, music and voice studio with a Director mode and a timeline editor

Comfy Org's official MCP servers: local (beta, 40 tools) and Comfy Cloud

One-click image and video apps, about $32–$97 one-time

The whole studio, driven by your agent, the CLI or the Studio UI

Generation runs

Cloud APIs, or local models (Wan, Hunyuan, LTX, Stable Diffusion) with no API keys

Your local ComfyUI or cloud providers

Local (built on WanGP)

Your ComfyUI, or Comfy Cloud on subscription

Local; Promptus and SimpliGen also sell cloud credits

Local

Agent driving it

Skills, instruction files and a CLI (Claude Code, Cursor, Codex, Copilot, Windsurf)

MCP (Claude Code, Codex, Cursor)

In-app local LLM planner

MCP: runs workflows, installs nodes, downloads models, manages ComfyUI

—

MCP (more than 50 tools), 15 skills, a CLI, and the built-in agent brain

Music, voice, voice clone

Music through cloud services; speech local (Piper) or cloud

Speech dubbing through OpenAI-compatible or cloud endpoints

Music (ACE-Step, MiniMax-Music3, YuE2), speech, voice cloning

Through ComfyUI nodes (ACE-Step music; speech through partner or community nodes)

Promptus lists music for its upcoming local app

ACE-Step songs, Stable Audio Open effects, three TTS engines, consent-gated voice cloning

Film crew, director, storyboard

Pipelines, a storyboard approval gate, a live board, director skills

Storyboard, a 3D director for posing characters and cameras, a timeline

Director mode, multi-track editor

Workflow templates

—

Five-role Film Crew, beat-synced music-video director, video editor

Coding swarm, screen agents, outreach, RAG

—

—

—

—

—

Built in

LoRA, upscaling, Hugging Face models

Real-ESRGAN upscaling

ComfyUI LoRA picker, upscale inputs

CivitAI LoRA browser, music-style training, upscaling, Hugging Face downloads

Downloads models and LoRAs from Hugging Face or CivitAI URLs; upscale workflows

—

LoRA training (character, environment, prop) and import, video and image LoRAs, upscaling, models and LoRAs from Hugging Face URLs

OS

macOS, Linux, Windows

macOS, Windows

Windows, Linux; NVIDIA; via Pinokio

macOS, Linux, Windows

Windows (all three), macOS (Promptus, LocalForge), Linux (LocalForge)

Linux; Apple Silicon partial (Metal); WSL2 being verified

License

AGPL-3.0

AGPL-3.0

WanGP Non-Commercial

AGPL-3.0 or commercial

Proprietary

MIT

"—" means the project's own docs don't list it. Every cell can be checked at the linked repository or site; corrections are welcome in an issue.

Watch it work

Short screen recordings of the real system doing real work, narrated by its own local speech engine. Watch the full playlist.

Episode

What it shows

21 · Five coding agents, one studio (2:45)

opencode on a local model, Codex, Cursor, Grok and Antigravity each use Guaardvark's MCP tools; every picture, clip, song and voice is made on the local machine

20 · The whole studio from the command line (4:14)

One command for everything: requests in plain words, engines started on request, answers from your own files, search with real scores, images in the terminal, batches from a file, video, speech, a song, and 53 tools handed to other AI agents

19 · Everything new in 2.9 (3:50)

A thumbs up that teaches, web pages read for you, MCP tools from chat, photo edits in chat, video with its own voice

16 · MCP for any client

Plug Guaardvark into any MCP client

14 · A map of everything

Every module drawn from its real imports; findings that carry their own fix

13 · The new front door

The Workspaces bar, and everything new since the first series

12 · Command center

See everything, gate everything, kill everything

11 · Self-repair

It fixes its own code, behind a gate you control

9 · Film Crew

Script, cast, storyboard, cut

8 · Music video

Drop a song, get a film

7 · Voice clone

Consent-gated and self-checking

6 · Video generation

Seven models, one GPU

5 · Image generation

One prompt, a whole story

4 · Screen agent

Its own desktop, eyes and hands

3 · File desktop

Your files get a desktop, plus RAG that shows its work

2 · Chat brain

One chat box, three speeds

Beat-synced music video (watch the short): one style prompt and a short narrative, then go. Guaardvark wrote every shot prompt, generated the storyboards, rendered the clips and cut them to the beat it detected in the song. (The glitch effect was added afterwards in Shotcut, and the song was made in Suno.)

More screenshots are on guaardvark.com.


Requirements

Dependency

Version

Notes

Python

3.12 only

Backend. 3.13/3.14 are not supported yet: the ML stack (numpy<2.0, mediapipe, basicsr/gfpgan) has no wheels for them. ./start.sh installs 3.12 for you.

Node.js

20.19+ or 22.12+

Frontend build (Vite 8). On Linux, start.sh installs Node 22 to ~/.local/node when the system one is older.

PostgreSQL

14+

Auto-installed

Redis

5.0+

Auto-installed

Ollama

latest

Local LLM inference

CUDA GPU

8 GB+ VRAM

16 GB recommended for video generation

Which tier is your machine? docs/HARDWARE.md says what runs CPU-only, on 8–12 GB, on the 16 GB design target, and with 24 GB+ of headroom.

Feature

Minimum

Recommended

Chat + RAG

4 GB

8 GB

Image generation

6 GB

12 GB

Wan 2.2 5B video

11 GB*

16 GB

Wan 2.2 14B video

16 GB

16 GB

CogVideoX-5B video

16 GB

20 GB

Upscaling

0.5 GB

2–4 GB

* The Wan 2.2 5B declares an 11 GB floor: an 11 GB card can select it by hand, and from 12 GB the automatic pick chooses it. A full render on 12 GB has not been confirmed yet. Every other video family needs a 16 GB-class card; see docs/HARDWARE.md.

Platforms. Linux with one NVIDIA card is the primary target. Apple Silicon is supported, with GPU features arriving through Metal (what works today is in INSTALL.md). Windows through WSL2 is being verified.

Running Guaardvark

Install by hand

git clone https://github.com/guaardvark/guaardvark.git
cd guaardvark
./start.sh

The one-line installer does the same, cloning to ~/guaardvark (override with GUAARDVARK_HOME=/path); re-running it updates an existing install. The first run handles everything: Python 3.12, the virtualenv, Node dependencies, PostgreSQL, Redis, Ollama, Whisper.cpp, database migrations, the frontend build and all services. It asks for your system password once for PostgreSQL setup (and, on fresh Linux installs, optionally for apt packages).

Service

URL (defaults; see .env for VITE_PORT / FLASK_PORT)

Web UI

http://localhost:5173

API

http://localhost:5000 (macOS: 5055)

Health check

http://localhost:5000/api/health (macOS: 5055)

./start.sh                    # Full startup with health checks
./start.sh --fast             # Reuse venv + node_modules as they are: no installs, no frontend build, no preflight
./start.sh --test             # Health diagnostics
./start.sh --plugins          # Start all enabled plugins
./start.sh --external-ollama  # You run Ollama yourself; never started or stopped by these scripts
./stop.sh                     # Stop Guaardvark (and only the Ollama that start.sh launched)
./stop.sh --keep-ollama       # Stop Guaardvark, leave Ollama running whoever started it
./stop.sh --all               # Also stop your own `ollama serve` and the systemd service

An Ollama already running before ./start.sh is adopted, not restarted, and left running on ./stop.sh. To make either policy permanent, flip the switches in Settings → Product Profile → Ollama, or set GUAARDVARK_OLLAMA_KEEP_RUNNING=1 / GUAARDVARK_OLLAMA_EXTERNAL=1 in .env.

Pick a profile

The first start asks what Guaardvark is for here. Creator lists the media workflow (image, video, audio, Film Crew, LoRA, upscaling) and leaves agents, the knowledge index, outreach and automation installed but out of the way; Workstation is everything. Either is a starting point, not a ceiling: switch in Settings → Product Profile, or run ./start.sh --profile creator. Details are in backend/profiles/README.md; building a distribution of your own is docs/EXTENSIONS.md.

Find your way around

Much of the interface is one right-click, drag or key away: menus on dashboard cards and most lists, cards you move and resize, files dropped straight into Files or an image into chat, a floating chat that knows which page you are on, hands-free voice, and ? for the keyboard shortcuts. docs/interface.md walks through all of it.

Making it fast

Chat and agent latency depend on a few settings, all in Settings unless noted. The defaults favor visibility while you learn the system; flip these once you trust it:

  • Thinking mode off. Extended reasoning (/thinking, or the chat-thinking default in Settings) adds a long deliberation pass to every turn. Off, simple turns answer in a second or two.

  • Developer toggles off. RAG Debug, Verbose Logging and LLM Debug each add per-request work.

  • Pick one reliable model and stay on it. Every model switch evicts and reloads weights on the GPU. A single mid-size model that stays resident beats a bigger one that thrashes.

  • Mind the VRAM neighbors. Renders wait for the card, but idle services holding VRAM (voice models, image pipelines) slow everything's admission. The Plugins page shows who holds what.

CLI

pip install guaardvark

The package is the guaardvark command, built with Typer, Rich and prompt_toolkit (Episode 20 walks through it). It talks to a running backend on the configured port, or starts one with start.sh from a checkout it finds through GUAARDVARK_ROOT or the current directory; with no checkout it stops with "Guaardvark installation not found". An MCP client can start the server with guaardvark mcp serve from a pip install plus a checkout.

guaardvark                              # Interactive REPL
guaardvark status                       # System dashboard
guaardvark chat "explain this codebase" # Chat with RAG context
guaardvark search "query"               # Semantic search
guaardvark files upload report.pdf      # Upload and index
guaardvark plugins list                 # ComfyUI / Ollama / …
guaardvark gpu status                   # VRAM and owner lock
guaardvark mcp install --client cursor  # Wire Guaardvark into Cursor
guaardvark completion zsh               # Shell completion script
/imagine <prompt>       Generate an image (inline preview in Kitty/iTerm)
/video <prompt>         Generate a video from text
/voice <text>           Text-to-speech (plays locally)
/agent [on|off|shot]    Screen-agent mode; shot = desktop screenshot
/web [images|chat]      Open the web UI on the real frontend port
/ingest <path>          Index files or directories for RAG
/plugins list|start     GPU / service plugins
/gpu status|release     VRAM and owner lock
/audio tts|music|sfx    Audio Foundry
/swarm run <prompt>     Parallel agents in worktrees
/lessons begin|end      Lesson pearls
/skills                 List SKILL.md files
/help [query]           Full command reference, or one command

Tab completion works with or without a leading /; /help imagine shows one command; unknown commands suggest a close match. While a reply is on its way, a status line says what is happening and for how long (⠋ Searching the web… · 14s · esc to stop); piped and --json output never show it, and GUAARDVARK_NO_SPINNER=1 turns it off in a terminal too.

Config: ~/.guaardvark/cli.json (legacy ~/.llx/config.json is still read). Themes: default, teal, musk, hacker, vader, guaardvark, day, auto. Short terminals get a compact aardvark banner.

Architecture

Browser / CLI (PyPI: guaardvark) / MCP Client (Claude Desktop, Cursor, etc.)
    | HTTP + WebSocket / stdio MCP
    v
Flask (about 96 API modules, auto-discovered) + Socket.IO
    |
    +-- AgentBrain (3-tier routing: Reflex → Instinct → Deliberation)
    |
Service Layer (many modules; plugin sidecars for heavy GPU work)
|-- Agent Executor (ReACT + 100+ registered tools + BrainState)
|-- Screen Control (See-Think-Act-Verify + live reasoning stream)
|-- RAG + Autoresearch + Entity extraction
|-- Self-Improvement (detect/fix/verify/broadcast + guardian)
|-- Generation (image/video/audio/voice/content)
|-- Swarm + Film Crew (isolated worktrees + 5-role pipeline)
|-- Servo + Vision Pipeline
|-- System Mapper / Repo intelligence (AST dependency graphs)
|-- GPU Memory Orchestrator + Plugin runner (CUDA sidecar safety)
\-- Interconnector (multi-machine sync + cluster)
    |
+---+---+---+---+---+
v   v   v   v   v   v
PostgreSQL  Redis  Ollama  Agent Display (:99, on-demand)  ComfyUI / Audio Foundry (plugins)
            Celery
  • Many components (blueprints, tool registry, plugins) are discovered or declared at runtime; exact counts drift between releases.

  • backend/mcp/config.py controls the MCP server's default-deny policy.

Frontend: React 18 · Vite · Material-UI v5 · Zustand · Monaco Editor · Socket.IO Core models and engines: Gemma4 / Llama-family / Moondream (vision) · Z-Image / FLUX.1 / Krea 2 / SDXL · Wan 2.2 / LTX / HunyuanVideo / CogVideoX / MiniMax H3 · ACE-Step / Stable Audio Open / Chatterbox / Kokoro / Piper · Real-ESRGAN family + HAT · Whisper

More: docs/ARCHITECTURE.md · agent mental model.

Roadmap

Near term

  • A hand-editable timeline in the video editor: drag to reorder, a transition per cut, and text overlays in the plan.

  • Every pipeline starting its own services (music video, Film Crew, images, audio), the way video renders already start ComfyUI.

  • Memory and context budgets sized to the model, and semantic memory recall with embeddings.

  • Outreach posting on X, verified end to end.

  • Sending a song from Audio Studio straight to the Music Video page.

Longer term

  • A cluster dashboard for multi-machine setups: fleet, routing and live node state.

  • AST-level code tools for JavaScript and TypeScript.

  • Singing voice cloning with consent and watermarking.

Not on the roadmap: cloud-by-default or a SaaS-hosted primary experience. Local-first is the product.

FAQ

Does Guaardvark send my data anywhere? No, not unless you turn something on. Models run locally, and every outbound path (model downloads, web search, posting, the Discord bot, a remote Ollama) is declared in egress.json and stays off until a setting or a person starts it.

Does it work offline? Yes, once the models you use are downloaded. Only features that reach other services by design, such as web search, posting and the Discord bot, need a connection.

What hardware do I need? Linux with one NVIDIA GPU. Chat, RAG, voice and the coding swarm run CPU-only; 8–12 GB adds vector RAG, screen agents, images, upscaling and music; video generation needs a 16 GB-class card. Details in docs/HARDWARE.md.

Does it run on macOS or Windows? Apple Silicon is supported, with GPU features arriving through Metal; see INSTALL.md. Windows through WSL2 is being verified.

Can I use it from Claude Code, Cursor or Codex? Yes. Install the Claude Code plugin with the two lines in Quick start, or run python -m backend.mcp install to wire the MCP server into every agent client it finds. See MCP server, agent skills and agent plugins.

How is it different from ComfyUI or Open WebUI? They are excellent at one slice each. Guaardvark puts chat, RAG, agents, coding swarms and the whole media pipeline in one install that shares one GPU, and it hands off to ComfyUI with one click when you want the node graph. See How Guaardvark compares.

Is it free? Yes. Guaardvark is open source under the MIT License, and running it costs nothing beyond your own hardware and power.


Get Involved

Guaardvark is open source (MIT) and built in public. Whether you want to try the bot, ship a small PR, or report what broke on your machine, here is the short path.

1. Join the community

Where

What

Discord

The Discord bot ships as a plugin: connect it to your own server for local chat, /imagine images and search against your own install (see plugins/discord/).

GitHub Issues

Bugs, features, and labeled starter work

GitHub Discussions

Questions, ideas and show-and-tell

2. Run it

Use the one-line Quick start or install by hand: Web UI → http://localhost:5173 · API → http://localhost:5000 (macOS: 5055). Details: INSTALL.md · agent mental model · full feature list: CAPABILITIES.md

3. Pick a good first issue

Starter issues carry the good first issue label, each with acceptance criteria and a clear out of scope list. When none are open, the safe zones below are the best place to start.

We aim to review serious PRs within 24–48 hours.

4. Safe vs high-risk contribution zones

Safe (great first PRs)

Ask first / high risk

Docs, INSTALL, mental-model guides

Agent loop, servo, vision targeting

CLI polish & offline commands

Self-improvement auto-apply paths

UI copy, empty states, error messages

MCP default-deny / security policy

Tests for pure helpers

Core GPU fork/CUDA plugin runner

Bug reports with steps and logs

Production auth / credential handling

Agent recipes, rule and lesson bundles, skills and agent instruction files are maintainer-written; to get a new behaviour, open an issue describing it. Full setup, style, and PR expectations: CONTRIBUTING.md.

Coding agents that use Guaardvark start at AGENTS.md and its operating contract, AGENT_GUIDE.md. Contributors, human or agent, follow CONTRIBUTING.md; inside the product, every AI code write goes through one verified gate, guarded_code_service.py::apply_exact_replacement.

5. Other ways to help (no code required)

  • Star the repo and share a short demo (screen agent, Film Crew, or Discord /imagine)

  • Report install friction with your GPU model and logs from logs/ (an issue, or email support@guaardvark.com)

  • Suggest workflows you wish worked out of the box

Support the Project

If Guaardvark is useful to you, you can support its development:

Star the repo if you find it interesting; it helps others find it.

Questions, install trouble, or feedback: support@guaardvark.com. Press, partnerships, and business: info@guaardvark.com.


License

MIT License — Copyright (c) 2025-2026 Albenze, Inc.

"Guaardvark"™ and the Guaardvark logo are trademarks of Albenze, Inc. The MIT License covers the code, not the name; see TRADEMARK.md for what you may do with the name without asking.

Available Tools

55 tools
analyze_codeA
Read-only

Review one text file with Guaardvark's local LLM (Ollama) and return its written findings; nothing is changed or written, and an empty reply is an error. The model is told to cite a line number for each finding, which is not checked. analysis_type picks the focus. A file over 48,000 characters is not sent whole: the model gets its first 28,800 and last 14,400 characters plus an outline of imports, classes and function lines, and the result has truncated=true. Returns file, language, analysis_type, analysis, line_count, char_count, truncated and visible_lines. The model call stops after 180 s; over MCP a call that outlasts its timeout (120 s by default) returns an error. To read the file yourself use read_code (for an upload, 'data/uploads/'); for a changed copy, codegen.

NameRequiredDescriptionDefault
file_pathYesFile to review: a path relative to the Guaardvark checkout (e.g. 'backend/app.py'; refused like read_code: .env, key files, git-ignored data other than uploads and outputs), or a path inside the uploads folder (e.g. 'Code/app.py'). Over MCP an absolute path works only inside the checkout; in Guaardvark's own chat one elsewhere works too, except system and key folders, and not with Settings > Project folder only on.
analysis_typeNoFocus of the review: full (default) covers everything; structure (imports, classes, functions, organisation); security (injection, auth, unsafe calls); performance (bottlenecks, memory); style (naming, formatting, documentation).full

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations with rich behavioral details: nothing is changed/written, empty reply is an error, citation checking isn't done, truncation threshold (48k chars), specific ranges kept (28.8k + 14.4k), truncated=true flag, 180s model timeout, and 120s MCP timeout. Annotations only say readOnlyHint=true, so this adds substantial value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with core purpose, then details on truncation, timeouts, and alternatives. Dense but every sentence earns its place. Slightly long but appropriate given the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains return fields (file, language, analysis_type, analysis, line_count, char_count, truncated, visible_lines). Covers access restrictions, timeout behavior, and truncation logic. Complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description adds that 'analysis_type picks the focus' but doesn't add meaning beyond the enum descriptions. Baseline 3 is appropriate when schema does the heavy lifting. The file_path parameter's sophisticated access rules are fully in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Review one text file with Guaardvark's local LLM (Ollama) and return its written findings'. It explicitly distinguishes itself from siblings by pointing to read_code (for reading) and codegen (for changed copies).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly states the tool's role and names alternatives: 'To read the file yourself use read_code...; for a changed copy, codegen.' However, it doesn't explicitly state when to use this tool vs. other analysis siblings like get_repository_map, though the purpose is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_websiteA
Read-only

Audit one public web page's SEO live and return a JSON report, computed without an LLM: url (as requested, https:// added to a bare domain) and final_url (after redirects), title, meta description, a 500-character preview; a metadata block (on by default) checking title and meta-description lengths against 30-60 and 120-160 characters; and, by analysis_type, an seo block (word count of the page's main text, reading time, content density, https), a structure block (host name, path, scheme) and an insights block (sentence stats, readability and keyword hints for article, product or landing page, from the ~2000-character extract). Use it to audit a page's title and description; to read the page use fetch_url, to find pages web_search. Needs web access on in Settings (off by default), and over MCP the Guaardvark backend running; private and local addresses are refused, including after a redirect or a DNS change.

NameRequiredDescriptionDefault
urlYesPage URL or bare domain, e.g. 'https://example.com/about' or 'example.com' (https:// is added). Up to 5 redirects are followed; each hop must be a public address. The fetch gives up when the server is silent for 15 s or the whole fetch passes 45 s. Only the first 2 MB of a page are read; a page that was cut short comes back with a page_cut field saying so. A URL that is not a page (a PDF, an image, a download) is refused.
queryNoThe user's question, in their words. When given, the preview and the insights block come from the ~2000-character stretch of the page that contains the most of its words instead of the top of the page (often navigation).
analysis_typeNoWhich blocks to add: 'seo' (word_count and estimated_reading_time at 200 words a minute for the page's main text, content_density, has_https, title/description present), 'structure' (domain: the host name without port or login, path, scheme, is_secure), 'content' (sentence_count, average_sentence_length, readability, content_type_hints), or 'full' (default) for all three.full
include_metadataNoDefault true: add a metadata block with has_title, has_description, their lengths, and whether they fall within 30-60 and 120-160 characters. Open Graph and other meta tags are not read.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds substantial behavioral context: it lists the JSON report contents, explains redirect, timeout, and size limits, discloses that private and local addresses are refused, and notes dependency on web access settings and a backend. It does not contradict the read-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and usage guidance are front-loaded, and the detail is relevant for a tool with many output blocks and constraints. The main report sentence is dense and run-on, but most information earns its place given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description explains the returned report structure, block types, and defaults. It also covers prerequisites, safety limits, and alternatives, making it complete for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the parameters well. The description ties analysis_type to output blocks and notes query behavior, but it largely repeats structured field semantics rather than adding syntax or format details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Audit one public web page's SEO live and return a JSON report.' It also distinguishes the tool from siblings by naming fetch_url for reading a page and web_search for finding pages, so an agent can route without opening the schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit use cases ('audit a page's title and description') and names the alternatives ('to read the page use fetch_url, to find pages web_search'). It also states prerequisites and restrictions, including web access being off by default, the backend requirement, and refusal of private/local addresses even after redirects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_inbound_changeA
Read-only

Read a code change the way Guaardvark's inbound guard will before it lands, and say whether it would be allowed, held for a person, or blocked, with each finding (rule, file:line, why). Give either a git range of this checkout (range, e.g. 'main...my-branch') or one file's change: filepath plus new_text, and old_text when new_text replaces that exact text in the file (without old_text, new_text is the whole new file). Reads only; records nothing and holds nothing.

NameRequiredDescriptionDefault
rangeNoA git range of this checkout to read instead, e.g. 'main...feature' or 'HEAD~3..HEAD'.
filepathNoFile the change is for, relative to the checkout root, e.g. 'backend/app.py'.
new_textNoThe replacement text, or the whole new file when old_text is not given.
old_textNoExact text in filepath that new_text replaces.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true; the description reinforces and extends this by stating it 'reads only; records nothing and holds nothing' — a meaningful clarification for a tool that simulates a gate capable of holding changes. It also discloses the output shape (verdict plus per-finding rule, file:line, why), which annotations do not cover. No contradiction with readOnlyHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and outcome, then input mechanics; no filler or marketing language. The second sentence is a long run-on that duplicates some schema parameter text, costing a little crispness but still earning its place by explaining mode selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the verdict taxonomy and finding structure, and covers read-only behavior. Minor gap: it never states what happens if neither range nor filepath is supplied, which matters given zero required parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds something the schema does not: that range and filepath/new_text are alternative modes ('Give either ... or ...'), plus the consequence of omitting old_text as a whole-file replacement. The old_text/new_text semantics themselves largely restate the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — read/evaluate a code change the way the inbound guard would before it lands — and names the three possible verdicts (allowed, held, blocked). An agent can tell this is a pre-landing simulation/dry-run rather than a general code read. It stops short of explicitly naming the closest sibling (verify_change), so the differentiation is inferential.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'before it lands' framing clearly sets the usage context, and the description spells out the two mutually exclusive input modes (git range vs. single-file filepath/new_text/old_text), which is real routing guidance. It does not, however, say when to prefer this over siblings like verify_change or analyze_code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

codegenA
Destructive

Ask Guaardvark's local LLM (Ollama) for a complete version of a code file and save its reply as data/outputs/code/<output_filename>, replacing any file of that name there; input_file is only read and can never be the output. With input_file the prompt holds that file's full text plus your instructions; the prompt and a reply of the same length must fit the active model's context window, and a longer file (or one over 10 MB) is refused before the model runs. Without it the model writes a new file from the instructions alone, and the call is refused if the instructions ask to improve, refactor, rewrite or update a file that exists in the checkout or the uploads (a new file that only shares an existing name, such as README.md, is fine). Only the code is saved: a Markdown fence and any sentences the model puts around it are dropped, and a reply with no code is an error and writes nothing. Returns output_path (over MCP relative to the checkout, e.g. 'data/outputs/code/app_v2.py', which read_code opens), filename, language, line and character counts, syntax_ok (true or false for Python and JSON output, which is parsed but never run; null for other languages) and the first 500 characters. The model call stops after 180 s; over MCP the call returns an error after its timeout (120 s by default); the run is not cancelled and saves if the model answers within 180 s of the start, and repeating the call with the same idempotency_key waits for that run instead of starting another. For review notes without writing, use analyze_code; for non-code files, generate_file.

NameRequiredDescriptionDefault
languageNoLanguage name for the prompt, e.g. 'python' or 'typescript'. Default 'auto' maps output_filename's extension (.py, .js, .jsx, .ts, .tsx, .go, .rs, .java, .sh, .sql, .html, .css, .json, .yaml and others); for other extensions name the language.auto
input_fileNoExisting file to rewrite: a path relative to the Guaardvark checkout (e.g. 'backend/app.py'; refused like read_code: .env, key files, git-ignored data other than uploads and outputs), or a path inside the uploads folder (e.g. 'Code/app.py'). Over MCP an absolute path works only inside the checkout; in Guaardvark's own chat one elsewhere works too, except system and key folders, and not with Settings > Project folder only on. Leave empty to write a new file. A named file that is missing, unreadable or empty is an error.
instructionsYesWhat to change in input_file, or what the new file should do. Besides this text the model gets only input_file's content, the file names and the language: no chat history and no other files.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
output_filenameYesFile name to write under data/outputs/code, e.g. 'app_v2.py' or 'web/form.jsx'; subfolders are created. Absolute paths, '~', '.', '..' and existing folder names are refused. Its extension picks the language when language is 'auto'.
preserve_structureNoWith input_file: true (default) tells the model to keep the file's exact layout and formatting apart from the requested changes; false lets it reorganise where the changes call for it.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, and the description substantiates it with the overwrite semantics ('replacing any file of that name there'), the read-only guarantee on input_file, the 10 MB and context-window refusals, the 180 s model / 120 s MCP timeout behavior with idempotency_key replay, and fence-stripping/error-on-no-code behavior. This is unusually rich disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core operation well, but it is a single sprawling block whose timeout sentence ('...over MCP the call returns an error after its timeout (120 s by default); the run is not cancelled and saves if the model answers within 180 s of the start...') is convoluted and hard to parse. Information-dense but not cleanly structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex generation-and-write tool with no output schema, the description covers inputs, refusal conditions, timing, idempotency, and the full return shape (output_path, filename, language, counts, syntax_ok, preview). Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema carries field-level detail and a baseline of 3 applies. The description still adds cross-parameter semantics the schema does not: input_file is read-only and can never be the output, and output_filename's presence is what selects rewrite vs new-file mode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Ask Guaardvark's local LLM ... for a complete version of a code file and save its reply as data/outputs/code/<output_filename>') and explicitly distinguishes itself from siblings by directing review-only use to analyze_code and non-code use to generate_file. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when/when-not branching: with input_file the model rewrites that file, without it the model writes from instructions alone, and calls are refused if instructions ask to improve/refactor/rewrite an existing file. It also names the alternatives (analyze_code, generate_file) and their selecting conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_imageA

Edit an existing image using a natural-language instruction. Use this when the user has attached/uploaded an image (or names one) and asks to add, remove, or change something in it, e.g. 'put a cowboy hat on this character'. Preserves the original subject and only applies the requested edit. If the user did not attach an image, ask them to attach one (an MCP client passes image). Do NOT use this to make a brand-new image from scratch — use generate_image. For a new scene that keeps a face from an attached photo, use generate_identity in Guaardvark's chat (it asks for likeness consent; not offered over MCP). To extend the canvas use outpaint_image; to cut the subject out, remove_background. Over MCP the call returns a job id at once; poll get_generation_status with it for the file, unless wait_for_result is true.

NameRequiredDescriptionDefault
imageNoThe image to edit. In chat, omit it to use the image the user just attached; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere.
modelNoImage model/backend. Default 'auto': Qwen-Image-Edit when installed, else FLUX.1 Kontext; with neither installed the call is refused and names the pack to install. In chat, 'auto' is replaced by the /imagemodel setting. 'qwen-image-edit' and 'kontext' name a pack; any other downloaded image model runs a light img2img pass that keeps most of the picture.auto
stepsNoDiffusion steps (more = higher fidelity, slower). Default 28. A value is used as given, except below a floor the editing model declares (Qwen-Image-Edit does), where it is raised and the result says so.
instructionYesThe edit to perform, e.g. 'put a cowboy hat on this character', 'change the shirt to red'.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
wait_for_resultNoOver MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.
reference_image_2NoOptional second reference (another person or style), in the same forms as image. Qwen-Image-Edit only: the call is refused when the edit would run on another backend, or when the reference cannot be read.
reference_image_3NoOptional third reference; same rules as reference_image_2.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false). The description adds substantial behavior beyond that: the job-id/polling model over MCP, the wait_for_result 60s cap, model 'auto' fallback ordering, the steps floor being silently raised, and file-type security refusals. This is rich disclosure that the annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and when-to-use before the exclusions and the MCP flow, so the most important routing signal comes first. It is fairly long and packs in edge cases (consent, security, timing), but nearly every sentence carries distinct, useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema, the description covers the return contract (job id vs. waited result), the consent/security caveats, and the exclusion set. An agent has everything needed to invoke it and interpret the response correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description still adds workflow meaning that ties parameters together – the job-id return and get_generation_status polling, the 'auto' model fallback, and the wait_for_result timing – which helps an agent understand parameter roles in context rather than restating schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Edit an existing image using a natural-language instruction.' It then names the exact siblings it must not be confused with (generate_image, generate_identity, outpaint_image, remove_background), so an agent can route correctly without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (user attached/uploaded an image and asks to add/remove/change something), an explicit exclusion ('Do NOT use this to make a brand-new image'), and named alternatives for adjacent tasks (generate_image, generate_identity, outpaint_image, remove_background). Guidance is complete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_urlA
Read-only

Read one public web page live, for ANY question about a specific webpage or domain (e.g. 'what's on example.com', 'read https://site.com/page'). Returns JSON {url, final_url, title, description, content, content_length}: the title ('' if the page has none), the meta description and up to ~2000 characters of main text (scripts, styles, nav, footers and asides removed; JavaScript is not run). Pass query with the user's question to get the stretch of the page that contains the most of its words instead of the top of the page. For open-ended searches use web_search; for a title and meta-description audit use analyze_website. Needs web access on in Settings (off by default), and over MCP the Guaardvark backend running; private and local addresses are refused, including after a redirect or a DNS change.

NameRequiredDescriptionDefault
urlYesPage URL or bare domain, e.g. 'https://example.com/pricing' or 'example.com' (https:// is added). Up to 5 redirects are followed; each hop must be a public address. The fetch gives up when the server is silent for 15 s or the whole fetch passes 45 s. Only the first 2 MB of a page are read; a page that was cut short comes back with a page_cut field saying so. A URL that is not a page (a PDF, an image, a download) is refused.
queryNoThe user's question, in their words. Its words of three or more letters or digits (common stopwords ignored) pick the ~2000-character stretch with the most of them; the top of the page is returned when there is no query, none of the words occur, or the page already fits.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries real weight and delivers: JavaScript is not run, scripts/styles/nav/footers are stripped, private/local addresses are refused even after redirect or DNS change, the backend requirement is stated, and the JSON return shape is enumerated. This is far beyond what the annotation provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the routing rule, then return shape, then preconditions and refusals. The single dense paragraph earns most of its clauses, though the parenthetical CSS-stripping list and the redirect/DNS caveat could be trimmed slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description specifies every returned field (url, final_url, title, description, content, content_length) including the empty-title case and the truncation marker. Combined with the access prerequisites and refusal conditions, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents redirects, timeouts, the 2 MB cap, URL refusal, and the stopword-based stretch selection. The description largely restates that same behavior, so it meets the baseline rather than adding new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read one public web page live') plus the scope ('ANY question about a specific webpage or domain'), and explicitly routes the agent away from web_search and analyze_website. An agent can distinguish this from every sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives named alternatives with their selecting conditions ('For open-ended searches use web_search; for a title and meta-description audit use analyze_website'), plus a concrete example usage and the precondition that web access must be enabled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_recordsA
Read-onlyIdempotent

Look up the records Guaardvark keeps, the same ones its Projects, Clients, Documents, Images, Websites, Tasks, Notes, Cast, Film Crew, Music Video and Code pages show, read live from the database so something added a moment ago is included. kind picks one type (projects, clients, documents, images, videos, audio, websites, tasks, notes, cast, productions, music_videos, code_repositories) or 'all'. name keeps records whose name, title or filename contains that text, case-insensitive. With kind 'all' and a name, every kind is searched for it; with kind 'all' and no name, the reply counts each kind. project limits documents, images, videos, audio, websites, tasks, productions and music videos to one project, by name or id. Documents report whether they are indexed and searchable yet. Use the project id with search_knowledge_base to search inside a project's documents. Read-only.

NameRequiredDescriptionDefault
kindNoWhich records: all, projects, clients, documents, images, videos, audio, websites, tasks, notes, cast, productions, music_videos, code_repositories (default all).all
nameNoOnly records whose name, title or filename contains this text, e.g. 'Drug Commercial'.
limitNoMost records to list per kind, 1-100 (default 25).
projectNoA project name or id; limits files, websites, tasks and videos to that project.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and idempotentHint, and the description reinforces this and adds real context beyond the annotations: reads are live from the database (recently added items appear), document records report indexed/searchable status, and 'all'+no-name returns per-kind counts. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause and every sentence carries concrete information about coverage or filtering behavior. It is dense and reads as a run-on wall of text, but little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing returns, and it does: kind 'all' with no name returns counts, otherwise records are listed, and documents expose index status. It is complete enough to call the tool correctly, though return shape details (fields per record) are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds value: name matching is case-insensitive across name/title/filename, and the semantics of combining kind 'all' with/without a name are behavior not present in the schema. The project-parameter scope listing slightly differs from the schema's wording, but overall it enriches the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Look up') and resource ('the records Guaardvark keeps'), enumerates the exact record types it covers, and clarifies it mirrors the content pages. It also distinguishes its scope from the search sibling by noting it records existence while search_knowledge_base searches inside documents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly explains the kind/name combinations (kind 'all' + name searches every kind; kind 'all' + no name returns counts) and routes the agent to search_knowledge_base with a project id for in-document search. It gives solid situational context but does not explicitly address when to prefer this over siblings like list_documents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_animationA

Generate a short looping GIF or frame-morph MP4 from a text prompt with motion description: frame 1 from the prompt, each later frame by img2img on a downloaded image model that supports it (Z-Image Turbo, SDXL or Stable Diffusion, picked automatically). Use when the user asks to animate, create a GIF, or make a looping frame morph. For a cinema clip from a video model use generate_video instead. Over MCP the call returns a job id at once; poll get_generation_status with it for the file, unless wait_for_result is true.

NameRequiredDescriptionDefault
formatNoOutput format: 'gif', 'mp4', or 'both'. Default: 'both'.both
framesNoNumber of frames to generate (2-24). Default: 8. More frames = smoother but slower.
motionYesWhat moves or changes between frames (e.g. 'walking forward', 'waving hand', 'clouds drifting').
promptYesDetailed description of the scene to animate.
strengthNoHow much each frame changes from the previous (0.1=subtle, 0.3=moderate, 0.5=dramatic). Default: 0.20.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
vision_steeringNoUse vision model to guide frame evolution (slower but more coherent). Default: false.
wait_for_resultNoOver MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false and destructive=false, so the description carries most of the burden and does well: it discloses the async job model, that the call returns a job id immediately, that get_generation_status is the polling companion, and how wait_for_result changes behavior. It stops short of covering cost, expected runtime, or failure modes, hence not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then the mechanism, then usage routing, then the async contract. The middle im2img/model-list aside is dense but informative; no sentence is filler. Slightly heavy for a description but each clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly takes on the return-value burden by explaining that the call returns a job id and how to retrieve the final file. Combined with explicit async/sync semantics and sibling routing, an agent has everything needed to invoke and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including strength ranges, frame bounds, and wait_for_result semantics is already documented in the schema. The description's mention of motion ('each later frame by img2img') adds light conceptual context but no format or syntax beyond what the schema provides, matching the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (generate a looping GIF or frame-morph MP4) and even explains the generation mechanism (frame 1 from prompt, later frames via img2img). It explicitly names the sibling it is not, generate_video, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use triggers ('animate, create a GIF, or make a looping frame morph') and an explicit exclusion with the alternative ('for a cinema clip from a video model use generate_video instead'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_bulk_csvA

Start a background job (the Studio's Bulk Generation job) that writes a WordPress import CSV with Guaardvark's local LLM: a header row, then one page per row with ID, Title, Content (HTML), Excerpt, Category, Tags, slug. Row N is about ' - Part N' (with quantity 1, the topic itself). When client matches a client saved in Guaardvark, its saved details go into the prompt. Returns at once with job_id and the file's path in the outputs folder; the name gets a -001 style suffix if a file or a running bulk job already has it. Rows are generated one at a time and the file is written when the job ends; each model call can take up to 180 s, a failing row is tried up to 4 times and then left out, and a job where fewer than a quarter of the rows succeed (30% above 10 rows) fails and leaves no file. Over MCP the Guaardvark backend must be running. Poll get_generation_status with job_id; 'complete' reports how many rows the file holds. For one page returned as text use generate_wordpress_content or generate_enhanced_wordpress_content; for a table of arbitrary data, generate_csv.

NameRequiredDescriptionDefault
topicYesWhat the pages are about, e.g. 'gutter maintenance'.
clientNoCompany the pages are for (default 'Professional Services'). Matched case-insensitively to clients saved in Guaardvark; a match adds its saved details to the prompt.
projectNoProject name given to the model (default 'Content Generation').
websiteNoThe company's website, e.g. 'example.com' (default 'website.com'); given to the model and used in the row IDs.
filenameYesPlain file name for the CSV, e.g. 'spring-pages.csv' (no folders). Unsafe characters are replaced; if a file or a running bulk job has the name, a -001 style suffix is added and the name used is returned.
quantityYesHow many pages (rows) to ask for, 1-5000; a row that keeps failing is left out. With 1 the topic is used as is; otherwise row N is about '<topic> - Part N'.
word_countNoWords of HTML content the model is asked for per page (default 600). An instruction, not enforced: only pages under about 30 words are regenerated.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Although annotations only say readOnlyHint=false / destructiveHint=false, the description goes far beyond that: async job with immediate job_id/file-path return, filename -001 collision suffixing, one-row-at-a-time generation with the file written only at job end, per-call 180 s timeout, up to 4 retries then row drop, and a failure threshold (less than a quarter succeed, 30% above 10 rows) that leaves no file. That is exactly the operational detail an agent needs for a long-running job.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first clause, and for a tool this complex most sentences earn their place. However, it is a single dense run-on paragraph with nested parentheticals and semicolon-separated asides, which hurts scanability; some of the constraint detail could be broken into distinct sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must cover returns — and it does (job_id plus the output-folder path, with the collision-suffixed name), along with how to poll for completion and what 'complete' reports. For a complex, async, write-capable tool the coverage is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 8 parameters (including the idempotency_key retry behavior and the -001 suffix rule). The description reinforces a few cross-parameter interactions (client match injecting saved details, row N naming with quantity), but adds little syntax or meaning the schema does not already carry. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and artifact: 'Start a background job ... that writes a WordPress import CSV with Guaardvark's local LLM', and even describes the row structure. It explicitly distinguishes itself from the closest siblings (generate_wordpress_content, generate_enhanced_wordpress_content, generate_csv), so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the operating precondition ('Over MCP the Guaardvark backend must be running'), the follow-up action (poll get_generation_status with job_id), and names the two alternatives with the exact condition that selects each ('For one page returned as text use ...; for a table of arbitrary data, generate_csv'). Nothing about when to choose this tool is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_csvA
Destructive

Write one CSV table with Guaardvark's local LLM from a description of the data: which columns it has and what the rows hold. The model invents the rows from the description alone (it reads no file and no indexed document) and writes the whole table in one reply, cut off after 180 s. The reply is parsed as CSV and saved in the outputs folder under csv/, replacing a file of that name. Returns the path, the column count and names, and row_count: the data rows written, header not counted, next to rows_requested. Nothing is saved and the call is an error when the reply is empty, holds no table, has only a header, or has rows of different widths; text and code fences around the table are left out. For a WordPress import file with a generated page per row use generate_bulk_csv (a background job polled with get_generation_status); for any other kind of file, generate_file.

NameRequiredDescriptionDefault
filenameYesName for the file, e.g. 'fruit-prices.csv'; '.csv' is added when the name has no extension, and another extension is refused. A relative path such as 'reports/q3.csv' creates the folders under csv/. Checked before the model runs.
row_countNoData rows to ask the model for (default 10). An instruction, not enforced: the result reports how many it wrote.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
include_headersNotrue (default): the first row names the columns. false: data rows only.
data_descriptionYesWhat the table holds: its columns and the kind of rows, e.g. 'name, country and founding year of European football clubs'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations flag this as a non-read-only, destructive operation, and the description goes well beyond that: 180 s cutoff, whole table in one reply, save location under csv/<filename>, and overwrite of an existing file of that name. It also enumerates the exact failure conditions (empty reply, no table, header only, mismatched row widths) and states nothing is saved in those cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then mechanism, then return values, then error semantics, then sibling routing — a logical order with no filler sentences. It is dense and on the long side for a tool description, but every clause carries information an agent needs to call it correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description fully documents the return payload (path, column count and names, row_count versus rows_requested) and the failure modes. For a generative, side-effecting tool with five parameters, an agent has everything required to invoke and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so filename, row_count, idempotency_key, include_headers and data_description are already fully documented in the schema. The description reinforces a few semantics (row_count is an instruction not an enforcement, header excluded from the count) but adds no parameter detail the schema lacks. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact ('Write one CSV table with Guaardvark's local LLM from a description of the data') and immediately scopes the mechanism (invents rows from the description alone, no file or document read). It explicitly names the sibling tools it is not: generate_bulk_csv and generate_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: generate_bulk_csv for a WordPress import file with a generated page per row (and notes it is a polled background job via get_generation_status), and generate_file for any other kind of file. The 'when not to use' condition is stated rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_enhanced_wordpress_contentA
Read-only

Compose one WordPress page grounded in the user's own indexed documents: it searches the whole knowledge base for the client, topic and services, gives Guaardvark's local LLM up to 6 passages the reranker rates related (check the sources: two clients' documents in one index can mix), asks for 500+ words of HTML content, and tells it to take specific facts only from the passages and, when services are given, to write only about primary_service and secondary_service. Returns a single CSV row of text, seven double-quoted columns with no header: ID, title, HTML content, excerpt, category, tags, slug; over MCP it comes as JSON {row, sources} naming the files the passages came from. Nothing is written to disk. The ID column is always row_id; a reply without seven fields, a title and HTML content, or with HTML or line breaks outside the content column, after one retry is an error, and so is a knowledge base that cannot be searched or has fallen back to an empty index. Each model call is cut off after 180 s, and over MCP a call still running at the timeout (120 s by default) returns an error. Without grounding or service limits use generate_wordpress_content; for many pages in one import file, generate_bulk_csv.

NameRequiredDescriptionDefault
topicYesWhat the page is about, e.g. 'emergency repair response times'; part of the knowledge-base search.
clientYesCompany the page is written for; part of the knowledge-base search and used in the copy.
row_idYesValue written to the ID column. Use increasing numbers when building an import file one page at a time.
websiteNoCompany website URL, given to the model as context only; it is not fetched.
industryNoThe company's industry; the model is told all content must fit it.
locationNoTown or region to name for local search, e.g. 'Erie, PA'.
brand_toneNoVoice for the copy, e.g. 'friendly' or 'formal' (default 'professional').professional
primary_serviceNoMain service the page may cover; part of the search. With secondary_service, the only services the model is told to write about; if both are empty there is no service limit.
target_audienceNoWho the page is written for, e.g. 'first-time homeowners'.
secondary_serviceNoSecond service the page may cover; part of the search.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=true, but the description adds substantial behavior beyond that: nothing is written to disk, the 180s per-model-call cutoff, the 120s default MCP timeout, one retry then error, and the specific failure modes (KB unsearchable, empty-index fallback, malformed CSV row). It even warns that two clients' documents in one index can mix.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information-dense and mostly front-loaded, but delivered as a single run-on paragraph of very long sentences, which makes the many constraints (timeouts, retry, error cases, return shape) harder to scan than necessary. Nothing is wasted, but structure is poor.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the return contract is fully described: a single CSV row of seven double-quoted columns with no header, the exact column order, and the MCP JSON shape {row, sources}. Combined with the error and timeout semantics, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 10 parameters and the baseline would be 3. The description adds genuine semantic value on top: it clarifies how client/topic/services feed the KB search and that primary_service + secondary_service constrain which services the model may write about (empty = no limit).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Compose one WordPress page') and immediately scopes it ('grounded in the user's own indexed documents'), which clearly separates it from the plain generate_wordpress_content sibling. The mechanism (search KB, rerank up to 6 passages, 500+ word HTML) is spelled out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Without grounding or service limits use generate_wordpress_content; for many pages in one import file, generate_bulk_csv.' This names both alternatives and the conditions that select them, so no inference is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_fileA
Destructive

Create a brand-NEW output file from a description, written under data/outputs/files (a file already at that name there is replaced; an empty model reply is an error and writes nothing). It generates from the description ALONE and never reads any existing file. Do NOT use it to improve, refactor, modify, or produce a new version of an existing or uploaded file — it cannot see that file and would fabricate. For that, use codegen with input_file= (grounded copy), or edit_code in Guaardvark's chat for an in-place repo change (not offered over MCP). For a CSV table use generate_csv; for a WordPress import file with a page per row, generate_bulk_csv.

NameRequiredDescriptionDefault
filenameYesRelative output filename with extension; nested paths are allowed (e.g., 'frontend/src/page.jsx')
file_typeNoFile type hint (code, document, data, config)auto
save_to_diskNoWhether to save the file to disk
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
content_descriptionYesDescription of what the file should contain

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, and the description earns that by explaining exactly what is destroyed: a file already at that name is replaced. It further discloses that output goes under data/outputs/files, that an empty model reply is an error writing nothing, and that generation uses the description ALONE without reading existing files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what it does, then the replacement/error behavior, then the routing rules. Every sentence is load-bearing, though the sibling-routing block makes it longer than typical; the 'not offered over MCP' aside is minor overhead.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description covers destination path, replacement semantics, failure behavior, and routing to correct alternatives. Nothing an agent needs to invoke it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters (including idempotency_key retry semantics) are already documented in the schema. The description adds little parameter-level detail beyond clarifying that content_description is the sole source of content; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a brand-NEW output file from a description') and immediately scopes it, then explicitly distinguishes it from codegen, edit_code, generate_csv, and generate_bulk_csv. An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-not guidance ('Do NOT use it to improve, refactor, modify, or produce a new version of an existing file') with the reason (it cannot see the file and would fabricate), and names the correct alternatives with conditions (codegen with input_file for grounded copies, generate_csv for tables, generate_bulk_csv for WordPress imports).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_imageA

Generate a new image from a text prompt on this machine's GPU. Returns the image's URL, or with wait_for_result=false a batch id to poll with get_generation_status. Use when the user asks to create, generate, draw or visualize an image. For a character from the Cast Library pass its numeric id in subject_ids (e.g. subject_ids=[3]); naming the character only in the prompt does not load its LoRA. To change an existing picture use edit_image; to cut out its subject, remove_background; for a video, generate_video. Over this MCP server, omitted arguments default to wait_for_result=false.

NameRequiredDescriptionDefault
modelNoModel to use. Default 'auto' — recommended; the system auto-picks the best downloaded model for the prompt (usually Z-Image-Turbo or SDXL). With subject_ids, keep 'auto': each character renders on the base model of its own LoRA. A named model must be one every character has a LoRA for, or the render is refused. Only override when the user names a specific model: 'krea2-turbo', 'zimage-turbo', 'sd-xl', 'sdxl-turbo', 'realistic-vision', 'epic-realism', 'sana-sprint', 'sana-sprint-0.6b', 'qwen-image-21' (Qwen-Image 2.1 through ComfyUI). A model that is not installed is refused with where to install it; nothing is downloaded.auto
stepsNoOptional sampling steps. The server may raise it to the model's minimum and will say so.
styleNoImage style: 'realistic', 'artistic', 'anime', 'photographic', 'digital-art'. Default: 'realistic'.realistic
widthNoImage width in pixels, default 1024: one of 256, 384, 512, 640, 768, 896, 1024, 1280 or 1536. Another value resets both sides to 1024 unless the prompt states that size (e.g. '1280x768'). The model's own limits may clamp the final size; the result reports it.
heightNoImage height in pixels, default 1024: one of 256, 384, 512, 640, 768, 896, 1024, 1280 or 1536 (see width).
promptYesScene/action description only (pose, lighting, setting). Do not embed JSON here. For cast characters put identity in subject_ids, not as the whole prompt body. If quoting on-image text, put EXACT words in double quotes — e.g. a sign reading "OPEN".
subject_idsNoOptional. Numeric Cast Library subject IDs with trained LoRAs to lock identity (e.g. [3]). Separate parameter — never nest this inside prompt. Loads LoRA + trigger + vision bible. Required for consistent characters.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
wait_for_resultNotrue: render now and return the image (the default in Guaardvark's chat). false: queue the render as an image batch and return its batch id at once; poll get_generation_status for the file (the default over MCP).

TDQS

A4.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile is already covered and the lower bar applies. The description still adds real context: the return shape (image URL vs. batch id to poll via get_generation_status) and that omitted arguments default to wait_for_result=false over MCP. It stops short of permissions, cost/rate limits, or GPU-contention behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, then return behavior, then routing to alternatives, then the character/LoRA caveat. Every sentence carries a distinct operational fact — no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter generation tool with no output schema, the description supplies the return format, polling path, default-argument behavior, and sibling routing. An agent has everything needed to call it correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema does not: subject_ids must be a separate parameter (never nested in prompt) and overrides model selection behavior, and it reiterates the MCP default for wait_for_result. This meaningfully exceeds restating field docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Generate a new image from a text prompt') plus execution locus (this machine's GPU). It also names the sibling tools it is not (edit_image, remove_background, generate_video), so an agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Use when the user asks to create, generate, draw or visualize an image') and explicit alternatives with their selecting conditions (edit_image for changes, remove_background for cutouts, generate_video for video). The subject_ids routing rule and its trap ('naming the character only in the prompt does not load its LoRA') leave nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_musicA

Make a song on this machine with ACE-Step in Guaardvark's Audio Foundry: a style prompt (genre, instruments, mood, tempo, voice) and optional lyrics, up to 240 seconds, sung or instrumental. Returns at once with a job_id; a 30-second song usually takes one to two minutes. Poll get_generation_status with that job_id; when it reports complete it gives the file name, its library document id and a download link. The song is also listed on the Studio's Audio page. Needs the Audio Foundry plugin running (it answers that it is not running otherwise). model 'ace-step-1.5' uses ACE-Step 1.5 instead of v1 when it has been installed in Audio Studio → Manage models; it is refused otherwise, never downloaded. For a spoken line use generate_speech; for a music video set to a song, generate_music_video.

NameRequiredDescriptionDefault
seedNoRepeat a take exactly with the same seed and inputs. Omit for a new one.
modelNo'ace-step' (default): ACE-Step v1. 'ace-step-1.5': ACE-Step 1.5, a newer MIT-licensed model, available once installed in Audio Studio → Manage models.ace-step
styleYesThe sound in plain tags, e.g. 'upbeat synthwave, analog bass, female vocals, 110 bpm'. Concrete genre, instrument and tempo words work better than 'professional' or 'epic'.
lyricsNoWords to sing. Section tags like [verse] and [chorus] on their own lines help. Omit for an instrumental, or set instrumental=true.
secondsNoLength in seconds, 5-240 (default 30).
instrumentalNoTrue for no vocals; lyrics are then ignored.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false / destructiveHint=false, so the description carries the rest and does so richly: async job_id return, expected latency ('30-second song usually takes one to two minutes'), failure modes for the plugin not running and for the un-installed 1.5 model ('refused otherwise, never downloaded'), and idempotency semantics. This is context an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: capability first, then return/polling contract, then prerequisites, then sibling disambiguation. Nearly every clause carries operational information; the model-enum sentence overlaps with the schema, which is the only mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates fully by explaining the return value (job_id, then file name, library document id and download link after polling) and where the artifact surfaces (Studio Audio page). For an async generation tool with a plugin dependency, nothing an agent needs to call and finish the task is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the prose adds interpretation beyond the schema: it glosses the style prompt as 'genre, instruments, mood, tempo, voice' and frames lyrics as optional with the instrumental fallback. The model enum behavior is largely duplicated from the schema, which keeps this from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Make a song ... with ACE-Step in Guaardvark's Audio Foundry') and immediately scopes what the tool produces (style prompt + optional lyrics, up to 240s, sung or instrumental). It also distinguishes itself from the two nearest siblings, generate_speech and generate_music_video, by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules ('For a spoken line use generate_speech; for a music video set to a song, generate_music_video'), names the prerequisite (Audio Foundry plugin must be running), and states the required follow-up action (poll get_generation_status with the returned job_id). Conditions that select alternatives are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_music_videoA

Start a music-video project from a song and a visual style. Uploads or attaches the song, writes unique cut prompts, and stops at the approval gate — it does not spend GPU rendering clips. Use when the user asks to make a music video. Pass song as a document id (generate_music reports one) or the location of an audio file. For a story from a screenplay, use start_film_crew.

NameRequiredDescriptionDefault
nameNoProject name. Defaults to the song filename.
songYesThe song (mp3/wav/flac/ogg/m4a/aac): a library document id or /api/files/document/<id>/download link, an /api/outputs/<path> URL, a guaardvark://outputs/<path> resource URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); in chat, anywhere in its uploads, outputs or install folder. Files named like keys or credentials are refused everywhere. A song given by path joins the library (one outside the uploads folder is copied into its Audio folder).
i2v_modelNoOptional I2V model id. Default: the active video model.
style_promptYesVisual style for the Director (mood, palette, movement).
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the thin annotations, it discloses substantial behavior: it uploads/attaches the song, writes cut prompts, and stops at the approval gate without spending GPU rendering clips. This tells the agent exactly how far the side effects go and that it is a gated, non-rendering operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then the approval-gate constraint, then usage, then the alternative and parameter guidance. Every sentence carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param, 2-required project-creation tool with no output schema, the description covers purpose, scope, side effects, usage conditions and alternatives. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real routing value for 'song' by explaining that a document id comes from generate_music or may be an audio file location. It clarifies intent over the schema's detailed format list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Start a project) with a concrete resource (music-video project) and scope (from a song and a visual style). It clearly differentiates itself from siblings generate_music, generate_video and start_film_crew, so an agent can route without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use when the user asks to make a music video' and names the alternative routing rule: 'For a story from a screenplay, use start_film_crew.' It also ties the song input back to generate_music's output, covering both when-to-use and the sibling handoff.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_speechA

Turn text into speech on this machine with Guaardvark's Audio Foundry. Waits up to about a minute for the file (usually seconds) and returns its name, library document id, length and a download link. A longer read, such as a script near the 3000-character limit or a cold start, answers with a job_id instead: poll get_generation_status with it, and do not call again, since the file lands in the library either way. Up to 3000 characters per call; split longer scripts. Voices: naming a voice (a Kokoro id such as 'af_heart' or 'bm_george') always speaks with Kokoro; with no voice, engine 'auto' uses Chatterbox's single stock voice when Chatterbox is installed and Kokoro's default voice otherwise. Chatterbox has no voice ids, so engine 'chatterbox' with a voice is refused. A model or voice pack that is not installed is refused with a pointer to Audio Studio → Manage models; nothing is downloaded. Needs the Audio Foundry plugin running. Cloning a real person's voice (a Chatterbox reference clip) is not available here; it needs the person to confirm in Audio Studio that they have the right to clone that voice. For a song use generate_music.

NameRequiredDescriptionDefault
textYesWhat to say, as it should be spoken (spell out numbers and names the way they sound).
voiceNoA Kokoro voice id: accent and gender prefix plus a name, e.g. 'af_heart' (American female, the default), 'am_michael', 'bf_emma', 'bm_george', 'ef_dora' (Spanish). Naming one selects Kokoro. An unknown id is refused with the full list. Omit for the engine's default voice.
engineNo'auto' (default): Kokoro when voice is set; otherwise Chatterbox when it is installed, falling back to Kokoro. 'kokoro': the named voice or af_heart. 'chatterbox': its one stock voice; do not combine with voice.auto
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes well beyond, disclosing the ~1 minute wait, the returned fields, the job_id long-read fallback, and the refusal cases (uninstalled model/voice pack, chatterbox+voice combination) with a pointer to Manage models. This is exactly the mutating-tool context the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose and return behavior come first, then constraints and refusal cases. It is long, but almost every sentence carries an actionable constraint rather than filler, so it stays on the right side of verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the return shape (file name, library document id, length, download link) and the job_id alternative. For a complex multi-engine, mutating tool this is complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 and the schema already documents all four parameters. The description adds value on top by explaining cross-parameter interaction and refusal behavior (e.g. 'engine chatterbox with a voice is refused', voice selection forcing Kokoro), which goes slightly beyond the field-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Turn text into speech on this machine') and names the engine/plugin backing it. It also explicitly distinguishes itself from the sibling generate_music ('For a song use generate_music'), so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use and when-not guidance: split scripts over 3000 chars, poll get_generation_status on a job_id and 'do not call again', and use generate_music for songs. It also states the prerequisite (Audio Foundry plugin running) and the cloning restriction, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_videoA

Queue a video clip from a text prompt using a local video model. Returns immediately with a batch id and Studio deep-link so long jobs are not false-timeouted. Use when the user asks to create, generate, or make a video. Pick model='minimax-h3-int8' (or audio=true) for a clip with its own soundtrack and spoken dialogue; give first_image / last_image to animate between frames; reference_images, reference_clips and reference_audio lock a person, look, motion or voice on the reference build (picked automatically when no model is named). For short looping frame-morph animations use generate_animation instead.

NameRequiredDescriptionDefault
audioNoRequire a model that generates its own soundtrack (MiniMax H3). Fails on a silent family.
modelNoVideo model id from the registry (e.g. wan22-5b, minimax-h3-int8). Omitted: the active video model in Settings, or on a machine where none is set the best installed one for the GPU; when that model cannot make this clip the call is refused with the reason, never rendered on another model. The result names the model used.
styleNoPrompt style: cinematic, realistic, artistic, anime, 3d_animation, stop_motion, hand_drawn, western_cartoon, none. A model may not offer every style; its capability record lists prompt_styles.
promptYesDescription of the video to generate (scene, subject, motion, style, any spoken lines).
duration_sNoClip length in seconds; clamped to the model's declared range. Overrides duration_frames.
last_imageNoLast frame; needs a model with first+last-frame mode. Same forms as first_image.
first_imageNoFirst frame (image-to-video): a library document id or /api/files/document/<id>/download link, a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere.
aspect_ratioNo16:9, 9:16, 1:1, 4:3, 3:2, 21:9 or 3:4; must be one the model declares.
speed_profileNoA speed profile the model declares (e.g. turbo-8).
duration_framesNoNumber of frames (legacy). Default 49. Clamped to the model's longest clip.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
reference_audioNoVoice or music references (up to 3), each in the same forms as first_image (a generated song's document id works); a single string also works. Needs the reference build.
reference_clipsNoReference video clips (who is in them, their motion), 2-15 s each, in the same forms as first_image. Their own sound is left out so it does not compete with a voice reference; pass a clip's track as reference_audio to keep it. Named <Video 1>, <Video 2> in the prompt; needs the reference build.
wait_for_resultNoIf true, poll until the clip finishes (or timeout). Default false: enqueue and return a Studio Video Gen / Jobs link immediately.
reference_imagesNoReference images (identity, look), each as a string in the same forms as first_image; needs the reference build.
num_inference_stepsNoInference steps. Omit to use the model's default, or the speed profile's count when speed_profile is given. A value below the floor (the speed profile's when one is given, else the model's) is raised to it.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false / destructiveHint=false, so the description carries the real burden and does: it discloses the async-queue contract (returns immediately with a batch id and deep-link so long jobs are not false-timeouted), idempotent retry semantics, silent-family failure for audio=true, model-clamping and refusal behavior ('never rendered on another model'), and reference-build requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense sentences that are front-loaded with the queue/return contract before routing advice. Slightly long and there is mild overlap between the description's parameter advice and the schema text, but almost every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter async mutation tool with no output schema, the description still reports what the call returns (batch id plus Studio deep-link) and covers the main behavioral forks. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 16 parameters; the baseline would be 3. The description adds genuine decision logic beyond the schema by explaining which model/audio combination yields a soundtrack, what first/last_image are for, and which reference inputs lock identity/motion/voice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Queue a video clip from a text prompt using a local video model') and immediately differentiates itself from siblings by naming generate_animation for looping frame-morph work. An agent can tell it apart from generate_image, generate_animation and generate_music_video without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Use when the user asks to create, generate, or make a video'), a named alternative with the condition that selects it ('For short looping frame-morph animations use generate_animation instead'), and routing rules for model choice, audio, frame animation and reference builds.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_wordpress_contentA
Read-only

Compose one WordPress page with Guaardvark's local LLM and return it as a single CSV row of text, six double-quoted columns with no header: ID, title, HTML content, meta description, keywords, slug. Nothing is written to disk. The page comes from the parameters alone, with no document lookup; to ground it in the user's indexed documents and keep it to named services use generate_enhanced_wordpress_content, and for many pages in one import file use generate_bulk_csv. The ID column is always row_id; a reply without six fields, a title and HTML content, or with HTML or line breaks outside the content column, after one retry is an error. Each model call is cut off after 180 s, and over MCP a call still running at the timeout (120 s by default) returns an error.

NameRequiredDescriptionDefault
topicYesWhat the page is about, e.g. 'spring lawn care checklist'.
clientYesCompany the page is written for; the model uses the name in the copy.
row_idYesValue written to the ID column. Use increasing numbers when building an import file one page at a time.
websiteNoCompany website URL, given to the model as context only; it is not fetched.
word_countNoMinimum length of the HTML content the model is asked for, in words (default 500). It is an instruction, not checked.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds substantial behavioral context beyond that: nothing is written to disk, no document lookup occurs, one retry then error on malformed output, a 180 s per-model-call cutoff, and a 120 s MCP timeout. It also enumerates the specific failure modes (not six fields, missing title/HTML, HTML or line breaks outside the content column).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and output contract, and every sentence carries information. It is dense and slightly cramped in the final sentence about timeouts, but there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must carry the return contract, and it does fully: column order, headerless CSV, quoting, and the exact error conditions. Combined with the timeout disclosure and the no-side-effect guarantee, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds meaning the schema does not: row_id is the value written to the ID column, the ID column is always row_id, and the page derives from the parameters alone. Some content (website is context-only, word_count is not enforced) duplicates the schema text, capping this below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (compose one WordPress page) plus the exact output shape (a single six-column CSV row with named columns). It explicitly distinguishes itself from both relevant siblings, generate_enhanced_wordpress_content and generate_bulk_csv, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use-this conditions ('from the parameters alone, with no document lookup') and names both alternatives with the condition that selects each: enhanced for grounding in indexed documents and named services, bulk for many pages in one import file. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dependency_graphA
Read-only

Return the file-level import graph of an uploaded Code Repository folder as JSON {analyzed_at, file_count, graph}, where graph is {file: [in-repository files it imports]} with paths starting with the folder's own path. Only Python and JavaScript/TypeScript imports are parsed; third-party imports and files that import nothing in the repository are left out, and a repository with no internal imports has an empty graph. Take folder_id from list_code_repositories. Read-only; needs the Guaardvark backend running, reflects the last analysis (analyzed_at is when it ran, in server local time; later edits are not in the graph), and fails with a message if the folder is not analysed. For a ranked symbol overview use get_repository_map; for import cycles in Guaardvark's own checkout, map_codebase.

NameRequiredDescriptionDefault
folder_idYesInteger id of an analysed Code Repository folder (has_metadata=true in list_code_repositories). Subfolders of a marked folder are listed too but are usually not analysed on their own; use the top folder's id.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds substantial behavioral context: backend dependency, staleness (reflects last analysis, later edits absent), failure behavior for unanalysed folders, parsing limitations for Python/JavaScript/TypeScript only, and omission of third-party imports and isolated files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: it front-loads the return shape, then the parsing constraints, then usage routing, then behavioral caveats. Every sentence carries information useful for correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and a complex nested return object, the description fully documents the JSON shape, key semantics, edge cases, staleness behavior, and failure mode. An agent has everything needed to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already explains that folder_id is an integer id of an analysed folder and where to find it. The description repeats 'Take folder_id from list_code_repositories' but adds no syntax, format, or constraint beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns the file-level import graph of an uploaded Code Repository folder. It also distinguishes itself from siblings by naming get_repository_map for ranked symbol overview and map_codebase for import cycles in Guaardvark's own checkout.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to take folder_id from list_code_repositories and gives two clear alternative tools with the conditions that select them. It also states when the graph may be empty or fail, so an agent knows when this tool applies and when it does not.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_document_outlineA
Read-only

Show the structure of one indexed document: its sections (heading paths such as 'Setup > Install') and pages in the order they appear, each with a passage count, under a header with the document's total. Use it after list_documents and before read_document_section, which takes a heading path, a page label or '(no section)' exactly as this outline prints them ('(no section)' covers passages with neither a heading nor a page, as in a plain .txt file). An unknown filename returns a short notice, not an error. When several indexed files share the filename, the reply lists them with their document_id and no outline: call again with document_id. To find a topic across documents use search_knowledge_base.

NameRequiredDescriptionDefault
document_idNoOnly needed when several files share the filename: the number list_documents prints after 'document_id' on that file's line.
source_filenameYesExact filename as list_documents prints it, e.g. 'handbook.pdf' (case-sensitive).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the bar is low, yet the description adds real behavior: unknown filenames return a short notice rather than an error, and ambiguous filenames short-circuit to a document_id list with no outline. These are exactly the edge cases an agent would otherwise mis-handle.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the core output description comes first, then workflow placement, then error/ambiguity behavior. The parenthetical about '(no section)' is slightly nested and long, but every sentence carries required information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must describe return values, and it does: sections, pages, passage counts, a total header, a short notice for unknown files, and a document_id list for ambiguous names. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the conditional logic behind document_id (only needed when several files share a filename) and explains that read_document_section must receive heading/page labels exactly as this outline prints them. That is meaningful semantics beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Show the structure of one indexed document') and enumerates exactly what the structure contains: heading paths, pages in order, passage counts, and a total. It is immediately distinguishable from read_document_section, list_documents, and search_knowledge_base.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit position in a workflow ('after list_documents and before read_document_section') and names the alternative for a different intent ('To find a topic across documents use search_knowledge_base'). Even the disambiguation branch (call again with document_id) is prescribed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_generation_statusA
Read-onlyIdempotent

Report the state of a queued generation: an image batch (ImageBatch_...) from generate_image with wait_for_result=false or started in the Studio, a video batch from generate_video, a bulk CSV job (bulk_gen_...) from generate_bulk_csv, a song (a 32-character job id) from generate_music, or a tool job (tooljob_...) from edit_image, inpaint_image, outpaint_image, remove_background or generate_animation called over MCP. Returns status (a tool job is queued, running, done or failed, with the time since it started), progress while running (a video batch names its pipeline stage, such as gpu_wait or generate, with the share of clips finished), and each finished file (URL for images, video and animations; for a CSV, its path and how many rows it holds; for a song, its download link), or the error of a failed job. Use after a queued generate call, or when the user asks whether a render is done. Read-only; an unknown id is an error, and so is a backend that does not answer (over MCP the backend must be running).

NameRequiredDescriptionDefault
batch_idYesThe id a generate or edit tool returned, e.g. ImageBatch_09-11-2026_132620_013, bulk_gen_1790556697_3fa2c1, a song's job id or tooljob_3fa2c1_0123456789ab.
wait_secondsNoWait up to this many seconds (0-50) for the job to finish before answering, instead of reporting 'still running' at once. Useful for a client that cannot pause between checks. Default 0: answer immediately.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint, idempotentHint), and the description goes well beyond them: it discloses the exact failure modes (unknown id is an error, silent backend is an error, the backend must be running over MCP), what each status value means, and what progress reporting looks like per job type.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the prose is dense with no filler sentences, but the full enumeration of every producing tool and every return field in one long run-on sentence is heavier than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden and does so thoroughly: status, elapsed time, per-stage progress, per-type file results, and error surface. Nothing needed to call or interpret it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, but the description adds real meaning the schema does not: it maps each id prefix (ImageBatch_, bulk_gen_, tooljob_, 32-char song id) to the tool that produced it, which is the key to choosing the right id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('report the state of a queued generation') and then enumerates exactly which id families it accepts and which sibling tool produced each. An agent can identify this tool and its scope without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use after a queued generate call, or when the user asks whether a render is done' gives a clear triggering context, and the wait_seconds parameter is framed as the alternative to repeated polling. No explicit when-not or named sibling alternative, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_repository_mapA
Read-only

Return the stored architecture overview of an uploaded Code Repository folder: Markdown listing its files by PageRank, each with up to 10 top-ranked classes, functions and methods, cut off at about 4,096 tokens. Take folder_id from list_code_repositories, using an entry with has_metadata=true. Read-only; needs the Guaardvark backend running, and shows the folder as of its last analysis, not later edits: the first line says when that analysis ran (server local time) and how many files it covered. Fails with a message if the folder is not a Code Repository or not analysed yet, and says so when the analysis found no code symbols. For import edges use get_dependency_graph; for one Python symbol's source, read_ast_node; for Guaardvark's own checkout, map_codebase.

NameRequiredDescriptionDefault
folder_idYesInteger id of an analysed Code Repository folder (has_metadata=true in list_code_repositories). Subfolders of a marked folder are listed too but are usually not analysed on their own; use the top folder's id.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description goes well beyond that by disclosing the ~4,096-token truncation, the dependency on the Guaardvark backend, the staleness semantics (reflects last analysis, not later edits, with timestamp and file count on line one), and concrete failure behaviors (not a Code Repository, not analysed, no symbols found).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the return contract, then prerequisites, then failure modes, then siblings; nearly every clause carries information. It is dense and runs long, but there is little waste and the ordering is sensible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully carries the burden: it describes the return format and truncation, the input prerequisite chain, staleness/timestamp behavior, failure modes, and empty-result handling. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the folder_id description already states has_metadata=true, the subfolder caveat and to use the top folder's id, so the description largely repeats structured data. It adds the cross-reference to list_code_repositories as the source, but no new syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the stored architecture overview of an uploaded Code Repository folder') and immediately characterizes the payload (Markdown, files by PageRank, up to 10 top-ranked symbols, ~4,096 token cap). It is clearly distinguishable from map_codebase, get_dependency_graph and read_ast_node, which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent where to get folder_id (list_code_repositories, has_metadata=true) and routes to alternatives with conditions: get_dependency_graph for import edges, read_ast_node for a single Python symbol's source, map_codebase for Guaardvark's own checkout. Usage and exclusions are fully covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inpaint_imageA

Change or remove something in an attached photo from a natural-language instruction ('remove the coffee cup', 'replace the sky with sunset'). Uses Qwen-Image-Edit when installed, else FLUX Kontext; with neither installed it refuses and names the pack to install. It runs the same edit as edit_image; either name works. For extending the canvas use outpaint_image. For a brand-new scene of a person's face use generate_identity in Guaardvark's chat (not offered over MCP). Over MCP the call returns a job id at once; poll get_generation_status with it for the file, unless wait_for_result is true.

NameRequiredDescriptionDefault
imageNoThe photo. In chat, omit it to use the attached image; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere.
stepsNoDiffusion steps. Omit to render at the editing model's own count. A value is used as given, except below a floor the editing model declares (Qwen-Image-Edit does), where it is raised and the result says so.
instructionYesWhat to change or remove.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
wait_for_resultNoOver MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark it non-read-only and non-destructive; the description adds substantial behavior beyond that — model fallback order (Qwen-Image-Edit then FLUX Kontext), refusal with the pack name when neither is installed, async job-id return over MCP, wait_for_result's 60s cap, and idempotency behavior. It does not discuss permissions or output file format, but for a local edit tool that gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded: the core purpose leads, then model resolution, then sibling disambiguation, then async semantics. Every sentence carries information, though it is longer than strictly necessary for routing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining what the call returns (job id) and how to retrieve the file (get_generation_status, or wait_for_result). Combined with the 100%-covered schema and the alternatives, an agent has everything needed to call and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 — the schema already documents image, steps, instruction, idempotency_key, and wait_for_result in detail. The description reinforces the instruction semantics and the async/wait behavior but adds little parameter detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('change or remove something in an attached photo') with a natural-language instruction, and immediately distinguishes itself from siblings: edit_image is the same operation, outpaint_image is for canvas extension, generate_identity is for new scenes outside MCP. An agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use versus alternatives: 'either name works' for edit_image, 'for extending the canvas use outpaint_image', and generate_identity for a brand-new face scene. It also tells the agent how to get results (poll get_generation_status unless wait_for_result) and how the missing-model case behaves.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_gpuA
Read-onlyIdempotent

Inspect live GPU state: nvidia-smi, the exclusive lock (Ollama vs video), orchestrator model slots, and which plugins are running. Use when the user says 'debug GPU issues', 'what's using VRAM', 'GPU status', or 'OOM'.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds value by specifying exactly what live state is inspected (nvidia-smi, lock, model slots, plugins), which goes beyond the annotations and gives the agent a clear picture of the tool's scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. The first states the purpose and enumerates the inspection targets, the second gives usage triggers. Everything earns its place with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only inspection tool with safety annotations, the description fully covers the purpose and when to use it. The inspection targets imply the nature of the output, and the annotations handle safety, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100%. Per the guidelines, a baseline of 4 is appropriate for 0-parameter tools; the description needs no parameter explanation, and it doesn't waste words on them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Inspect live GPU state' and enumerates the specific aspects (nvidia-smi, exclusive lock, orchestrator model slots, plugins running). This is specific and distinguishes it from any sibling tool that might touch GPU-related concerns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists trigger phrases: 'debug GPU issues', 'what's using VRAM', 'GPU status', or 'OOM'. This gives an agent concrete cues for when to invoke the tool, and no alternative tool in the sibling list covers GPU inspection, so no exclusions are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_code_filesA
Read-only

Show a folder of this Guaardvark install's own source as an indented tree: folders first, then files with sizes. It lists the files search_code searches plus binary files, so git-ignored data (uploads and outputs included), folders holding no source, venv, node_modules, dist, build, logs and pycache folders, symlinks and .env or credential files are left out. max_depth 0 lists only the folder's direct entries and each step adds a level; output stops at 1,500 entries with a note of how many more there are. Use read_code to open a file, search_code or search_codebase to find one by content, and list_code_repositories for repositories indexed in the Library.

NameRequiredDescriptionDefault
directoryNoFolder relative to the checkout root, e.g. 'backend/api', or '.' for the whole checkout. Paths outside the checkout are refused. Default 'frontend/src'.frontend/src
max_depthNoLevels below directory to expand: 0 shows only its direct entries, 1 adds their contents, and so on. Default 5; use 1-2 on large folders such as '.'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint annotation: it enumerates what is omitted (git-ignored data, venv, node_modules, dist/build, logs, __pycache__, symlinks, .env/credentials), states the 1,500-entry truncation with a remainder note, and notes that paths outside the checkout are refused.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A dense single paragraph but front-loaded with the core behavior and output shape, then exclusions, then depth/truncation, then alternatives. Every clause carries information, though the exclusion list is long and the base verb 'list' is buried under 'Show a folder'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries return-value duty and does so — indented tree, folders first, sizes, and truncation note. For a 2-param read-only listing tool this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description restates max_depth semantics and the directory default, adding little beyond the schema, which matches the baseline for fully covered parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Show') and resource ('a folder of this Guaardvark install's own source as an indented tree') with output shape (folders first, sizes). It explicitly differentiates from siblings by naming search_code, read_code, and list_code_repositories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: 'Use read_code to open a file, search_code or search_codebase to find one by content, and list_code_repositories for repositories indexed in the Library.' It also states when contents are excluded and advises 1-2 depth on large folders.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_code_repositoriesA
Read-only

List the folders marked as Code Repositories in Guaardvark, as a JSON array of {id, name, path, has_metadata, description}. Call it first to get the integer folder_id that get_repository_map, get_dependency_graph and read_ast_node take. Marking a folder on the Documents page also marks each subfolder, listed separately; only entries with has_metadata=true have been analysed (the map and graph are built at the end of that analysis), so use the top folder's id for those. The last entry, id 'live', is Guaardvark's own source root (path '.', the root that read_code and search_code paths are relative to), not a folder id: explore it with search_code, read_code or map_codebase. Read-only; needs the Guaardvark backend running. Folders are marked on the Documents page or by bulk indexing.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds substantial context beyond them: backend must be running, subfolders are marked separately, only has_metadata=true entries have been analysed and the map/graph are built at the end of that analysis, and 'live' is not a folder id. These are non-obvious behavioral facts an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and return shape, then the routing guidance, then the has_metadata caveat and the 'live' note. It is dense and longer than average, but nearly every clause carries distinct operational information; only mild tightening is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description spells out the returned fields, the special 'live' entry, and the has_metadata gating that determines downstream usability. Combined with the annotation covering read-only safety, an agent has everything needed to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate beyond parameter syntax, and the description correctly spends its words on return-value semantics instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the folders marked as Code Repositories in Guaardvark') and goes further by declaring the exact return shape as a JSON array of {id, name, path, has_metadata, description}. It also explicitly distinguishes the special 'live' entry from real folder ids, so an agent can tell it apart from siblings like get_repository_map.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to 'Call it first to get the integer folder_id that get_repository_map, get_dependency_graph and read_ast_node take', naming the dependent tools. It also gives the selection rule for has_metadata=true and the top-folder-id case, plus routing for the 'live' entry to search_code/read_code/map_codebase.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_documentsA
Read-only

List the documents in the local knowledge base, most passages first: one line per file with its passage count, its section count when above one, and the parser that read it, under a header giving how many documents match. Use it to see what is indexed, or to get the exact filename get_document_outline and read_document_section take. When several files share a name (different folders or projects) each gets its own line ending in 'document_id ' and its folder; pass that number to those tools to choose one. Covers every project on the default shared index; an install set to per-project indexes lists only documents that belong to no project. name_contains keeps filenames containing that text; limit and offset page through the list, and when more remain the reply ends with the offset for the next page. To find content by topic use search_knowledge_base; corpus summaries are in summarize_corpus, not here.

NameRequiredDescriptionDefault
limitNoDocuments per page, 1-200 (default 40).
offsetNoHow many documents to skip, for paging (default 0).
name_containsNoOnly list documents whose filename contains this text, case-insensitive and taken literally (no wildcards), e.g. 'manual' or '.pdf'.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint, but the description adds substantial behavioral detail: ordering by passage count, line format, duplicate filename handling with document_id, indexing scope, and pagination continuation behavior. This is far beyond what the annotation declares.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded and dense with actionable detail. Each sentence covers a distinct concern: output format, file coupling, duplicate handling, scope, parameter behavior, and alternatives, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a tool with no output schema and minimal annotations, the description fully explains the return format, ordering, pagination, duplicate-name disambiguation, and index coverage. An agent has everything needed to call and interpret it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, offset, and name_contains. The description restates their functions but adds no syntax or constraints beyond what the schema provides, making 3 the appropriate baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: list documents in the local knowledge base. It also names the exact output shape and distinguishes this tool from nearby siblings such as search_knowledge_base and summarize_corpus.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this to see what is indexed and to get filenames for get_document_outline and read_document_section. It also gives alternatives for topic search and corpus summaries, so when-not-to-use is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_codebaseA
Read-only

Run the System Mapper over Guaardvark's own source checkout, or a folder inside it, and return JSON: file_count, languages, per-analyzer stats, finding_count and the top findings, most severe first, each with id, kind (e.g. import-cycle, ghost-endpoint, dead-symbol, untested-module), severity, summary and up to 6 paths; dismissed findings are left out. Mostly static analysis of the files; mapping the whole checkout also loads its tool registry in an offline subprocess. Needs no backend, network or GPU. Never blocks for long: a map under 5 minutes old comes back as is; an older one comes back at once with its age (cache.age_seconds and a note) while a new one is computed in the background, one per folder at a time. When no map exists yet, or refresh=true, it waits up to 60 s for the new map; if that is not enough it answers with status 'computing' (or the last map and a note), and calling again later returns the result without starting a second computation. For an uploaded Code Repository folder use get_repository_map or get_dependency_graph; to find code by meaning, search_codebase.

NameRequiredDescriptionDefault
rootNoFolder inside the Guaardvark checkout to map instead of all of it, absolute or relative to the checkout (e.g. 'backend/api'); paths outside are refused. Folders named data, logs, backups, outputs, build, dist, env, venv, node_modules, migrations, plans, audit, voice or ComfyUI, among others, are always skipped, and a root inside one is refused. In a git checkout only files git tracks, or has not been told to ignore, are mapped, so a git-ignored folder maps as empty.
limitNoHow many findings to return, most severe first, 1-40 (default 15). finding_count still gives the total.
refreshNotrue: compute a new map now, rescanning every source file under root, and wait up to 60 s for it (otherwise the last map, or status 'computing', comes back and the new map lands in the background). false (default): return the last map, refreshing one older than 5 minutes in the background.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint, so the description carries the behavioral burden and does so richly: no backend/network/GPU, cache staleness at 5 minutes, 60 s wait bound, status 'computing' fallback, background computation limited to one per folder, and no duplicate computation on re-call. It also discloses the read-only static-analysis nature and the offline subprocess when mapping the whole checkout.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and return values are front-loaded, then operational behavior, then sibling routing last. It is long and clause-dense, but nearly every clause carries non-obvious information, so little reads as padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating return fields and finding attributes (id, kind, severity, summary, up to 6 paths) and by explaining omission of dismissed findings. Combined with the caching and timeout semantics, an agent has everything needed to call and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it clarifies the limit/finding_count relationship and the full refresh lifecycle (wait up to 60 s, otherwise last map or 'computing' arrives while a new map computes in the background). Those details meaningfully change how an agent should set the flag.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Run the System Mapper over Guaardvark's own source checkout, or a folder inside it') and enumerates the return shape (file_count, languages, per-analyzer stats, finding kinds). It explicitly names the sibling tools it is not for the uploaded-repo and semantic-search cases, so an agent can distinguish it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: uploaded Code Repository folders go to get_repository_map or get_dependency_graph, meaning-based lookup goes to search_codebase. It also states the operational conditions for when to set refresh=true versus relying on the cached map.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_controlA

Send play, pause, stop, next, previous or toggle to a media player already open on the machine running this Guaardvark server (Linux only), over MPRIS2 on the D-Bus session bus. Works on any MPRIS2 player, not only the VLC that media_play starts. Without player it picks, in order: the VLC Guaardvark started with media_play (while it is open), else the only player open, else the only one playing. When several players are open and none of those applies it acts on none and returns an error listing them with their status, so you can name one. Returns the player it acted on, and why when it picked one, e.g. 'Paused on vlc (the VLC Guaardvark started)' or 'Skipped to next track on spotify', or an error when no player is running. play, pause and stop are safe to repeat; next, previous and toggle act again on every call. Start music with media_play, change loudness with media_volume, read the current track with media_status.

NameRequiredDescriptionDefault
actionYesplay resumes a paused player; pause; stop; next and previous change track; toggle switches between playing and paused.
playerNoPlayer to control: the part of its D-Bus name after 'org.mpris.MediaPlayer2.', as media_status's Player line shows it, e.g. 'spotify', 'vlc' or 'vlc.instance4242' (the full bus name also works; case does not matter, and 'vlc' also finds a lone 'vlc.instance<pid>'). Omit to use the default described above.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses behavior far beyond the annotations: repeat-safety of play/pause/stop vs. act-every-call semantics of next/previous/toggle, Linux-only/MPRIS2 constraint, and the exact error path that lists open players with their status. Annotations only say non-read-only and non-destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and transport, followed by resolution rules and return examples. It is long but nearly every sentence carries actionable information; minor verbosity in the parenthetical example strings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description supplies the return contract itself (the player acted on, the reason it was picked, or an error listing candidates). For a 3-parameter tool with a single enum required argument, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value: the player-name matching rules (D-Bus suffix, case-insensitive, 'vlc' matching 'vlc.instance<pid>') and the full default-selection order for omitting it. It does not elaborate on idempotency_key beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set (play/pause/stop/next/previous/toggle) and the exact resource (an MPRIS2 media player on the D-Bus session bus of this machine). It also explicitly scopes itself against siblings: it works on any MPRIS2 player, not just the VLC media_play starts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit default-resolution algorithm (the VLC Guaardvark started, else the only player open, else the only playing) and the failure behavior when ambiguous, plus explicit routing to media_play, media_volume and media_status for other jobs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_playA

Play local music files in VLC on the machine running this Guaardvark server (Linux only). query searches the music folder set in Settings (~/Music by default) for audio files whose file name plus the name of the folder they are in contains every query word (case-insensitive; parent folders are not searched, so in an Artist/Album/track layout the artist name does not match) and plays up to 50 of them, returning e.g. "playing 12 tracks matching 'jazz' in Guaardvark's VLC (pid 4242)", or an error when none match. query 'music' (also 'all', 'songs', 'everything') plays the whole music folder, always shuffled; directory plays a folder you name instead. Matches and directory play in order unless shuffle is true. Starting new music replaces the VLC that Guaardvark started before; players the user opened are left alone, and VLC is started with its one-instance mode off so it never hands the music to a VLC already open. While that VLC is open, media_control and media_status act on it when no player is named. With neither query nor directory it sends Play to the player media_control would pick, to resume. Pause or skip with media_control, set loudness with media_volume, see the current track with media_status.

NameRequiredDescriptionDefault
queryNoWords that must each appear in a file's name or the name of the folder it is in, e.g. 'Alice in Chains' or 'jazz'. Use 'music' to play everything. Omit, with no directory, to resume playback.
shuffleNoPlay in random order (default false). query 'music' always shuffles.
directoryNoAbsolute path of a folder to play in full, e.g. '~/Music/Live' or '/mnt/music/Live'; overrides query. It must be an existing folder. Refused: '/', system folders (/etc, /usr, /var, /proc, /sys, /dev, /boot, /root, /bin, /sbin, /lib*, and /run except /run/media) and hidden folders such as ~/.ssh (any part starting with '.'), unless inside the Settings music folder. Other folders, e.g. on /mnt or /media, are allowed.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint=false/destructiveHint=false; the description carries the real behavioral load, disclosing that new music replaces the previously Guaardvark-started VLC, user-opened players are untouched, one-instance mode is disabled, up to 50 tracks play, matches/directory play in order unless shuffle is true, and the return-string format. This is far beyond annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and organized around the query/directory/neither branches, with zero filler sentences. It is dense and somewhat run-on, but the length is justified by the tool's real branching complexity and every clause conveys a distinct rule.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, state-mutating player-invocation tool with minimal annotations and no output schema, the description covers return format, none-match errors, path allow/deny rules, shuffle defaults, and cross-tool interactions. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds semantics the schema lacks: that only the file name plus its immediate folder are matched (parent folders ignored, so artist names don't match), the 50-track cap, and the idempotency/retry behavior. It adds genuine meaning over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Play local music files in VLC on the machine running this Guaardvark server'), scopes it to Linux, and clearly separates itself from the media_control/media_volume/media_status siblings by naming each one's role. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: query searches by keyword, 'music'/'all'/'songs'/'everything' plays everything, directory plays a named folder, and with neither it resumes. It also states when to defer to siblings ('Pause or skip with media_control, set loudness with media_volume, see the current track with media_status').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_statusA
Read-onlyIdempotent

Report what a media player on the machine running this Guaardvark server is playing (Linux only), read over MPRIS2 (D-Bus) without changing anything. Without player it picks, in order: the VLC Guaardvark started with media_play (while it is open), else the only player open, else the only one playing. When several are open and none of those applies it lists them with their status and asks you to name one. Otherwise it returns text lines: Player (the name to pass as player), Chosen (why, when no player was named), Status (Playing, Paused or Stopped), Title (the file name without extension when the track has no title tag or an empty one), Artist, Album ('Unknown' when the player gives none), Length m:ss, the player's own volume when known, and Other players when more are open. When no player is running it says 'No media player is running.' Start music with media_play; for system volume use media_volume; to pause or skip use media_control.

NameRequiredDescriptionDefault
playerNoPlayer to read: the part of its D-Bus name after 'org.mpris.MediaPlayer2.', as media_status's Player line shows it, e.g. 'spotify', 'vlc' or 'vlc.instance4242' (the full bus name also works; case does not matter, and 'vlc' also finds a lone 'vlc.instance<pid>'). Omit to use the default described above.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this ('without changing anything') while adding the Linux-only constraint and a detailed selection algorithm. It also documents the full text return format, which exceeds the annotation bar. It stops short of 5 only because failure modes beyond 'No media player is running' (e.g. D-Bus unavailable) are not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then selection rules, then return format, then sibling routing. It is a dense single paragraph, but every sentence earns its place; the enumerated return fields are long yet necessary given there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain return values, and it enumerates every line (Player, Chosen, Status, Title, Artist, Album, Length, volume, Other players) plus the empty case. Combined with the selection algorithm and sibling routing, an agent has everything needed to call and interpret the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema documents the player-name format in detail, so baseline is 3. The description earns above baseline by carrying the semantics the schema defers to it ('Omit to use the default described above'), fully specifying the fallback chain an agent must rely on when the parameter is omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Report what a media player ... is playing') and immediately scopes it to Linux, MPRIS2, and read-only. An agent can tell it apart from the media_play/media_control/media_volume siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to alternatives ('Start music with media_play; for system volume use media_volume; to pause or skip use media_control') and states the condition for each. Also defines the default player-selection fallback chain, so the agent knows exactly when to pass a player and when to omit it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

media_volumeA

Read or change the system output volume of the machine running this Guaardvark server (Linux only): the ALSA 'Master' control via amixer, which affects every application, not only the player. Omit level to read it without changing anything (returns 'Volume: 30%', with ' (muted)' when muted). Set it with level as text: '50' or '50%' (percent), '+10' or '-10' (points up or down), 'mute' or 'unmute'; decimals are rounded, and a level or step above 100 is used as 100 and the result says so. Returns 'Volume set to N%'. Absolute, mute and unmute give the same result on repeat; relative steps add up. Use media_control to pause or skip, media_status for the current track.

NameRequiredDescriptionDefault
levelNoText, e.g. '50' or '50%' (percent, above 100 is used as 100), '+10' or '-10' (step), 'mute' or 'unmute'; omit to read the volume. Over MCP a number such as 50 fails schema validation; send '50'.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds substantial context beyond that: Linux-only, ALSA Master affecting every application, the returned strings ('Volume: 30%', ' (muted)', 'Volume set to N%'), rounding, capping above 100 with a notice, and the repeat/idempotency behavior of absolute vs relative steps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core read/change behavior and keeps every clause informative, though the parenthetical detail about return strings and clamping makes it denser than strictly necessary for a 2-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries return-value explanation fully ('Volume: 30%', 'Volume set to N%'), plus platform limits and sibling routing. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds genuine semantic value the schema does not: how '+10'/'-10' differ from '50' on repeat, that decimals are rounded, and that values over 100 are clamped and reported. It still leaves the idempotency_key semantics largely to the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: reading or changing the system output volume (ALSA 'Master' via amixer) on the machine running the server. It explicitly scopes the effect as system-wide rather than player-only, which separates it cleanly from media_control and media_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent exactly how to read (omit level) versus write (supply level), enumerates the accepted level forms, and routes to siblings: 'Use media_control to pause or skip, media_status for the current track.' When-to-use and alternatives are both explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outpaint_imageA

Expand an attached photo in one or more directions and fill the new area so it matches the scene. Use when the user says extend, expand the canvas, or outpaint. Needs Qwen-Image-Edit to add canvas: with only FLUX Kontext installed the picture keeps its size and Kontext is asked to widen the view inside it. To change something in the picture use edit_image; to cut the subject out, remove_background. Over MCP the call returns a job id at once; poll get_generation_status with it for the file, unless wait_for_result is true.

NameRequiredDescriptionDefault
topNoPixels to add on the top.
leftNoPixels to add on the left (multiples of 8).
imageNoThe photo. In chat, omit it to use the attached image; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere.
rightNoPixels to add on the right.
stepsNoDiffusion steps. Omit to render at the editing model's own count. Outpainting raises a lower value to at least 20.
bottomNoPixels to add on the bottom.
instructionNoOptional fill direction, e.g. 'continue the forest to the left'.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
wait_for_resultNoOver MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false. The description goes far beyond that, disclosing the model dependency and its fallback behavior, the asynchronous job-id-then-poll flow over MCP, the wait_for_result / 60s timeout semantics, and idempotency behavior. These are substantive operational traits not derivable from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then usage triggers, prerequisites, alternatives, and the async contract in a logical order. Dense and information-rich, though the two async explanations (in the description and the wait_for_result schema field) are somewhat redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-param mutation tool with no output schema, it covers the full call lifecycle: prerequisite model, fallback behavior, async polling, idempotency, and sibling routing. Nothing an agent needs to invoke and interpret the call correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning: it explains the FLUX Kontext fallback of ignoring canvas growth, the async wait_for_result flow, and reinforces the steps floor of 20 and idempotency retry behavior. It still largely overlaps the schema, keeping it below a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('expand... fill the new area') and resource ('attached photo') with clear directional scope. It distinguishes itself from siblings by naming edit_image and remove_background and explaining the different intent behind each.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives trigger language ('extend, expand the canvas, or outpaint') and routes the agent to alternatives: edit_image to change contents, remove_background to cut the subject. It also states a prerequisite (Qwen-Image-Edit must be installed; FLUX Kontext alone won't add canvas), which is exactly the kind of when-not guidance agents need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outreach_draft_postA

Draft a social outreach comment or share post (does NOT post). Platforms: reddit, discord, facebook, twitter, youtube. For mode='comment' you must supply either thread_context (the OP/comment/video description) or target_url (we'll scout it — for YouTube URLs, scrapes the video title + description). mode='share' drafts a Reddit link post: platform must be reddit, share_target is the subreddit (e.g. 'r/SideProject') and share_link is optional (defaults to guaardvark.com). The draft lands in the queue at status='drafted' for human approval — nothing posts until the user approves it on the Approvals page (Outreach tab). For a post to the user's own connected accounts (Discord webhook, Bluesky, Mastodon, Telegram) use request_publish.

NameRequiredDescriptionDefault
modeNo'comment' (reply in a thread) or 'share' (new Reddit link post)comment
toneNoOptional tone preset: default, engaging, technical, casual, formal, humorous
platformYesOne of: reddit, discord, facebook, twitter, youtube
share_linkNoLink to share; defaults to https://guaardvark.com
target_urlNoComment mode: URL of the thread; if thread_context is missing we scout it. Ignored in share mode, where the destination is share_target.
feature_hintNoA feature for the draft to lead with, e.g. 'rag' or 'video_gen' (or plain words). The persona leads with it when it fits the thread (the community, in share mode) and grades below 0.3, saying why, when it does not. Leave it out to let the persona pick the angle from the pitch sheet.
include_linkNoComment mode only. When true, the draft carries a link: the GitHub repo for YouTube, guaardvark.com for other platforms. The persona is asked to work it in; if it leaves it out, the link is appended on its own line. The persona is told to grade below 0.7 when the link cannot be made to feel natural; the draft is queued either way. Defaults to false.
share_targetNoShare mode: the subreddit the link post goes to, e.g. 'r/SideProject'
thread_contextNoOP body + top comments concatenated (comment mode)
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the sparse annotations (readOnlyHint=false, destructiveHint=false): the draft lands in a queue at status='drafted', nothing posts until human approval on the Approvals page, YouTube URLs get scouted, include_link grading behavior, and idempotency semantics. Rich behavioral disclosure that the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the no-post constraint, which is good. However, some clauses are dense and run-on (the include_link and share-mode sentences), and a few details duplicate what the schema already states, making it longer than necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-param mutation-adjacent tool with no output schema, the description covers the important workflow (queue, approval, mode differences, return of a drafted item). It could mention what the tool returns (draft id/status) but the approval-queue framing largely substitutes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3, but the description adds cross-parameter logic the schema lacks: the mode='comment' vs mode='share' dependency (platform must be reddit in share mode, share_link defaults to guaardvark.com, target_url ignored in share mode). This is meaningfully beyond the per-field schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Draft a social outreach comment or share post') and immediately clarifies what it does NOT do ('does NOT post'). The description distinguishes itself from the sibling request_publish by explicitly naming it at the end.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use this for drafting queue items, use request_publish for the user's own connected accounts. Mode-specific requirements (comment needs thread_context or target_url; share requires reddit + share_target) are spelled out, so an agent knows exactly when each mode applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outreach_list_queueA
Read-only

List social outreach drafts by status. Defaults to status='drafted' (waiting for review). status='approved' lists what is queued to post, oldest first, which is the order it posts in; every other status is newest first, e.g. status='posted' for recent history. Returns up to limit rows (default 10).

NameRequiredDescriptionDefault
limitNoMax rows to return (1-50)
statusNocandidate (found, not drafted yet), drafted (waiting for review), approved (queued to post), processing (a poster has picked it up), submitting (being published now), posted, rejected, aborted (posting failed), unsupported (nothing here posts that action on that platform)drafted

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered, and the description adds genuinely non-obvious behavior: approved items are returned oldest-first (posting order) while all other statuses are newest-first, plus the default row count. It omits pagination or row-field details, but for a read-only list call this is solid added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph, front-loaded with the purpose and default, then ordering semantics and limit. No filler sentences; every clause adds operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only list tool with full schema coverage and no output schema, the description covers default behavior, per-status ordering, and result count. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by tying status values to intent (the default is 'waiting for review', 'approved' is queued-to-post order, 'posted' is history) and restating the limit default. The ordering relationship between status and result order is value the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List social outreach drafts') and scopes it by status, which cleanly separates it from siblings like outreach_status, outreach_draft_post, and outreach_reject_draft. An agent knows immediately this is the read/list entry point for the outreach draft pipeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for each status value, including that the default 'drafted' means waiting for review and that 'posted' serves recent history. It does not mention alternative tools (e.g. outreach_status) or when not to use this list view, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outreach_reject_draftA
Destructive

Reject an outreach draft by id so it will not post. Success means the row is 'rejected' and nothing will be published for it, even if it had already been picked up for posting. Once a draft is being submitted or is posted it can no longer be stopped: the call then fails and says so, and the row is left as it is. Use when the user says 'kill that one', 'don't post draft 42', etc.

NameRequiredDescriptionDefault
idYesSocialOutreachLog row id
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, and the description adds substantial context beyond that: the resulting row state ('rejected'), that nothing will publish even if the draft was already picked up, and the irreversible failure case once submission/posting has begun. This is exactly the behavioral detail an agent needs for a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and its success condition, then the failure edge case, then the usage trigger. Four sentences with little waste, though slightly more expansive than strictly needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema, the description fully covers the outcome state, the irreversibility boundary, and the caller trigger, while annotations carry the safety profile. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both 'id' and 'idempotency_key' are already documented in the schema. The description only says 'by id' and adds no syntax or format meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Reject') and resource ('an outreach draft by id') plus the effect ('so it will not post'). An agent can distinguish it from siblings like outreach_draft_post or request_publish without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Use when the user says "kill that one", "don't post draft 42"') and states the preconditions under which the call will fail (already submitting or posted). It does not name a specific alternative tool, but the when-to-use guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outreach_statusA
Read-only

Get the current state of the social outreach loop (enabled / supervised / cadence per platform). Use when the user asks 'is outreach on?', 'how many posts today?', or 'what's the outreach status?'.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces the read-only nature by saying 'Get the current state'. It adds useful context about what the state includes, which goes beyond the annotation. No contradictory or hidden side-effect behavior is suggested.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. The first sentence states the operation and result; the second quickly gives concrete user-phrase triggers. This is efficient and well front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only status tool, the description is complete: it names the domain, the state components returned, and the conversational triggers. The sibling-tool context is handled by the explicit 'outreach' scope. No output schema exists, but the described categories are enough to interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so there is nothing for the description to clarify. The baseline for a zero-parameter tool is 4, and the description appropriately focuses on the tool's outcome rather than parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), a clear resource ('the social outreach loop'), and the exact data points returned ('enabled / supervised / cadence per platform'). This makes it easy to distinguish from sibling outreach tools like outreach_draft_post or outreach_list_queue, which involve different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit trigger examples ('is outreach on?', 'how many posts today?', 'what's the outreach status?'), giving clear guidance on when to call this tool. It does not enumerate exclusions or alternatives, but for a parameterless status tool, the positive use cases are sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_fileA
Read-only

Extract the text of one document or image, after a header line 'Text of (, [N pages,] M words)'; nothing is written or indexed. PDF: the text layer of every page, no OCR (a scanned PDF comes back empty). DOCX: body paragraphs, then table rows. XML: the text of its elements, tags dropped. SVG: its title, desc and text elements, one per line. CSV, .txt, .md, .rst, .json, .yaml, .toml, .ini, .log and .html: the file as-is (UTF-8, up to 10 MB). Excel (.xlsx, .xlsm): a workbook summary, then for each sheet with data its size, column names and first 20 rows (up to 50 sheets and 10,000 rows a sheet are read); .xls needs the xlrd package and .xlsb the pyxlsb package, which a stock install lacks. A file that is password-protected, damaged or in an old format fails with an error that says which. Image text (.jpg, .jpeg, .png, .gif, .bmp, .webp) is read by a vision model in the local Ollama, and fails with an error when none is available. For documents already indexed use search_knowledge_base or read_document_section; for source code, read_code.

NameRequiredDescriptionDefault
file_pathYesFile to read: a path relative to the Guaardvark folder (tried first, e.g. 'data/uploads/report.pdf'), else relative to its uploads folder (e.g. 'reports/q3.pdf'), or an absolute path inside Guaardvark's uploads, outputs or install folder. Files named like keys or credentials (.env*, *.pem, *.key, id_rsa*, credentials*, .netrc and similar) are refused everywhere. Inside the install folder, uploads and outputs included, anything under a .git, venv, node_modules, dist, logs or similar folder is refused, and so is git-ignored data other than uploads and outputs. A relative and an absolute path to the same file get the same answer. In Guaardvark's own chat an absolute path elsewhere also works, except system folders and anything under a hidden folder or named with a leading '.', and not with Settings > Project folder only on; over MCP it is refused.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description nonetheless adds substantial context beyond it: no OCR (scanned PDFs return empty), the 10 MB size cap, dependency requirements for .xls/.xlsb, and error behavior for damaged/password-protected files. Under the calibration this is well beyond a 3, but it does not describe pagination or return-shape nuances beyond the header line; given annotations carry safety, a 4 is warranted. I'll score 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but information-dense; every format clause earns its place and the header output format is front-loaded. Slightly verbose with the parenthetical header template, but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description explains the header line and per-format extraction semantics, plus failure modes. An agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

schema_description_coverage is 100% and the file_path parameter already documents path resolution, refusal patterns, and hidden-folder rules in depth. The description adds no parameter-specific semantics, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Extract the text of one document or image') and then breaks down behavior per file format, so an agent knows exactly what it produces. It also names the sibling tools it is not (search_knowledge_base, read_document_section, read_code), making it easily distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'For documents already indexed use search_knowledge_base or read_document_section; for source code, read_code.' It also clarifies the operation writes and indexes nothing, which is a key when-to-use signal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_ast_nodeA
Read-only

Return the source of one Python class or function, decorators included, from a file in an uploaded Code Repository folder, instead of the whole file. Matches the bare name at any depth (methods, nested functions); each definition comes back headed '# Match N: lines A-B'. Reads the file as it is on disk now; needs the Guaardvark backend running to locate the folder. Fails with a message for non-.py or absolute paths, paths outside the folder, a missing file, syntax errors or a name not found. Find names with get_repository_map; for the whole file, read_code with 'data/uploads/' plus the path get_repository_map shows.

NameRequiredDescriptionDefault
filepathYesPath of a .py file relative to the folder's root, e.g. 'app/main.py'. Paths shown by get_repository_map and get_dependency_graph begin with the folder's own path (e.g. 'Repo/app/main.py'); drop that prefix.
folder_idYesInteger id of the Code Repository folder, from list_code_repositories. It does not need to be analysed.
node_nameYesExact, case-sensitive name of a class or function, e.g. 'Worker' or 'build_graph'. Use the bare name: 'Worker.run' does not match; 'run' does, along with any other definition named run.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, so the description carries the rest and does so richly: it discloses snapshot semantics ('reads the file as it is on disk now'), a backend dependency, and an enumerated failure list (non-.py, absolute paths, out-of-folder paths, missing file, syntax errors, name-not-found). Multiple matches and the '# Match N' header format are also disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose first, then behavior, then failure modes, then alternatives. Every sentence carries distinct routing or behavioral information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by describing the match-header return format. Combined with the failure semantics and sibling routing, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds value beyond it by explaining bare-name matching at any depth ('Worker.run' does not match, 'run' does) and that all same-named definitions are returned. It reinforces rather than merely duplicating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (return the source) and resource (one Python class or function, decorators included) with explicit scope contrast to the whole file. The sibling it is not — read_code — is named, so an agent can distinguish it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes: use get_repository_map to find names, use read_code with 'data/uploads/' for the whole file. It also states the prerequisite (Guaardvark backend running) and the conditions under which it fails, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_codeA
Read-only

Read one UTF-8 text file (up to 10 MB) from this Guaardvark install's own checkout, whole or by line range. Returns a header (path, line and character counts, SHA-256 of the whole file's text, mtime) and the content between START/END markers, without line numbers. One call returns at most 60,000 characters of content, in whole lines: a longer file comes back as its first page with a 'Showing lines A-B of N' line naming the start_line of the next page. Pass start_line and end_line (1-based, inclusive, the line numbers search_code reports) to read part of a file; a range past the end of the file is an error. Paths are relative to the checkout root; an absolute path works when it lies inside the checkout. Refused: git-ignored local data (files under data/uploads and data/outputs stay readable), .env and credential or key files (*.pem, .key, id_rsa, .netrc, credentials. and similar), and anything under .git, venv, node_modules, dist, logs or pycache. In Guaardvark's own chat an absolute path outside the checkout also works, except system and key folders; over MCP it is refused. To find a file use search_code or search_codebase; for PDF or Office files process_file; for logs read_logs.

NameRequiredDescriptionDefault
end_lineNoLast line to return, inclusive. Default: as far as one call reaches (60,000 characters). A value past the end of the file reads to the end.
filepathYesFile to read, relative to the checkout root, e.g. 'backend/app.py' or 'frontend/src/App.jsx'. A relative path may not leave the checkout.
start_lineNoFirst line to return, counting from 1. Default: the first line. Use the 'path:line' numbers from search_code, or the start_line a previous page named.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint already declaring safety, the description adds rich behavioral context: 10 MB file limit, 60,000-character per-call cap, pagination header format ('Showing lines A-B of N'), return structure (header with path, counts, SHA-256, mtime; content without line numbers), and a detailed refusal list including .git, venv, .env, and key files. It also distinguishes MCP versus chat absolute-path handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded, beginning with the core operation and size/pagination constraints before listing refusals and alternatives. Some redundancy exists, such as repeating that relative paths cannot leave the checkout, but most sentences carry actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers file size limits, pagination behavior, return format (even without an output schema), refusal rules, and sibling alternatives. An agent has enough detail to call the tool correctly and interpret its output without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds useful context—start_line/end_line correspond to line numbers reported by search_code, and pagination continuation uses the next page's start_line—but it also says 'a range past the end of the file is an error,' which conflicts with the schema's end_line note that 'A value past the end of the file reads to the end.' This inconsistency reduces reliability.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Read one UTF-8 text file ... from this Guaardvark install's own checkout, whole or by line range.' It distinguishes itself from siblings by naming alternatives for different file types and tasks (search_code, search_codebase, process_file, read_logs). An agent can identify the exact operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing: 'To find a file use search_code or search_codebase; for PDF or Office files process_file; for logs read_logs.' It also explains when to use start_line/end_line and covers refusal conditions, leaving little ambiguity about alternatives or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_document_sectionA
Read-only

Read the stored text of an indexed document, without searching, in document order. Pass source_filename plus heading_path or page_label from get_document_outline to read one section or page; giving both narrows to that section on that page. heading_path '(no section)' reads the passages the outline lists under that label (no heading and no page, e.g. a plain .txt file); any other heading_path matches every section whose path contains the text (case-insensitive), so a short value can return several sections. With neither, it reads the whole document from the start. Returns up to 25 passages per call, each cut at 1,200 characters and labelled with its section or page as the outline names it; the header gives the total and the offset for the next call. When several indexed files share the filename, the reply lists them with their document_id and no text: call again with document_id. To locate a topic first use search_knowledge_base; for a file that is not indexed, process_file.

NameRequiredDescriptionDefault
offsetNoPassages to skip, to read past the first 25 (default 0).
page_labelNoPage label as get_document_outline shows it, e.g. '12' for the line 'page 12' (exact match).
document_idNoOnly needed when several files share the filename: the number list_documents prints after 'document_id' on that file's line.
heading_pathNoSection path as get_document_outline shows it, e.g. 'Installation > Requirements'; any section whose path contains this text, taken literally, matches. '(no section)' reads the passages that have neither a heading nor a page. Leave out together with page_label to read the whole document.
source_filenameYesExact filename as list_documents prints it (case-sensitive).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, and the description adds substantial behavioral context: 25 passages per call, 1,200-character truncation, section/page labelling matching the outline, total-plus-offset in the header for the next call, and the duplicate-filename case that returns a document list with no text. These are exactly the operational traits an agent cannot get from the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and then dense with functional detail; essentially no sentence is filler. It is delivered as one long unbroken block, which makes the parameter-combination rules and pagination behavior harder to scan than they need to be, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still covers return shape (passages, truncation, section/page labels, header totals and next offset) and the ambiguity path (shared filenames returning document_id). For a 5-parameter read tool, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description goes further by explaining that any heading_path is matched case-insensitively as a containing substring (so a short value can return several sections) and that '(no section)' targets unheadinged, unpaged passages. It also clarifies that offset reads past the first 25 and that both params together narrow to a section on a page, though much of the per-parameter wording overlaps the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (stored text of an indexed document) and immediately differentiates itself from retrieval siblings with 'without searching, in document order.' An agent can distinguish it from search_knowledge_base and get_document_outline from the first clause alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: locate a topic first with search_knowledge_base, use get_document_outline to obtain heading_path/page_label, and process_file for files that are not indexed. It also enumerates the three parameter combinations (heading only, page only, both, neither) and their outcomes, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_logsA
Read-only

Tail one of Guaardvark's log files under logs/: the backend, Celery workers and beat, the frontend, startup and setup, and each plugin's log. Use when the user says 'review the logs', 'check backend.log', 'celery errors', or 'what did the last crash say'. Credentials in the text (passwords in URLs, tokens, API keys, Authorization headers) are replaced with ***. A log that was never written on this machine (a plugin that has not run) is reported as not found.

NameRequiredDescriptionDefault
nameNoLog filename (not a path). Default backend.log.backend.log
linesNoHow many trailing lines (10-400).
queryNoOptional case-insensitive substring filter, matched against the text as it is returned (after credentials are masked).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already declaring a safe read operation, the description adds valuable behavior beyond annotations: credentials are automatically masked with ***, and logs never written are reported as not found. These are important operational details for an agent interpreting the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then usage triggers, then security/not-found behavior. Every sentence earns its place, though the user-utterance examples make it slightly longer than a minimal definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only log-tail tool with no output schema, the description covers purpose, invocation cues, credential masking, and missing-log behavior. The schema handles parameter details, and no critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines the name enum, lines range/default, and query filter semantics. The description reinforces that files live under logs/ and lists categories, but adds little parameter-level meaning beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Tail') and resource ('one of Guaardvark's log files under logs/') and enumerates the log categories, making it immediately clear what the tool does. An agent can distinguish this from sibling tools that read code, documents, or other resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit user-utterance triggers: 'review the logs', 'check backend.log', 'celery errors', and 'what did the last crash say'. It does not name alternative tools or state when not to use it, but the context is clear and sufficient for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_backgroundA

Remove the background from an attached photo and return a transparent PNG. Use for product shots, stickers, and cut-outs. Does not invent a new scene: edit_image changes the picture, and generate_identity in Guaardvark's chat (not offered over MCP) makes a new scene with the same face. In chat the attached image is used when image is omitted; an MCP client passes image. Over MCP the call returns a job id at once; poll get_generation_status with it for the file, unless wait_for_result is true.

NameRequiredDescriptionDefault
imageNoThe photo. In chat, omit it to use the attached image; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.
wait_for_resultNoOver MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries real load: it explains that over MCP the call returns a job id immediately and must be polled via get_generation_status unless wait_for_result is true (with the 60 s cap), and that chat runs inline. This is behavioral detail well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the core purpose and output, and each subsequent sentence covers routing, invocation, or async behavior. It is dense but every sentence earns its place; slightly long but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, sibling differentiation, chat vs MCP invocation, input sourcing rules, and the async job/polling contract. With no output schema, the description still tells the agent exactly how to obtain the resulting file, leaving nothing material missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters thoroughly. The description still adds cross-context meaning, notably that chat uses the attached image when image is omitted while an MCP client must pass image, and restates the poll/wait semantics. It adds a bit of value but largely echoes the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Remove the background from an attached photo and return a transparent PNG') and explicitly distinguishes itself from siblings edit_image and generate_identity, naming what each does instead. An agent can route between these without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit use cases (product shots, stickers, cut-outs) and explicitly rules out related alternatives by naming edit_image and generate_identity with their differing behaviors. It also clarifies the chat vs MCP invocation difference and when to poll versus wait.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_publishA

Ask to publish a text post, optionally with a link, to one of the user's social connections that takes text (Discord webhook, Bluesky, Mastodon, Telegram; a YouTube connection needs a video and is not offered). This does NOT post: the request waits on the Approvals page until a person approves, rejects or cancels it, whatever the publish settings say. Omit connection when only one text connection is set up; otherwise pass its id or name. Returns the publish record ids and their status. For a comment drafted for someone else's Reddit or YouTube thread, use outreach_draft_post.

NameRequiredDescriptionDefault
bodyYesThe text of the post.
link_urlNoA link to attach to the post.
connectionNoConnection id, display name, provider or handle. Optional when only one exists.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false; the description adds the critical non-obvious trait that the call does NOT post immediately but waits on the Approvals page for a human to approve, reject or cancel, regardless of publish settings. It also discloses the return shape (publish record ids and status).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then scope, then the approval-workflow caveat, then routing. Every sentence is informative, though the tool's behavior is packed into a fairly dense block of prose rather than being more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description compensates by stating the return value (publish record ids and status). Combined with the approval-workflow disclosure and the sibling routing, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics for 'connection' beyond the schema: the omissibility rule when a single text connection exists and the accepted identifier forms. It does not explain link_url or idempotency_key, but the schema covers those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Ask to publish a text post, optionally with a link') and scopes it to text-taking connections with named providers. It also explicitly rules out the sibling outreach_draft_post for Reddit/YouTube thread comments, so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditional guidance ('Omit connection when only one text connection is set up; otherwise pass its id or name'), notes that YouTube connections are not offered because they need a video, and names the alternative tool and the condition that selects it. This is unambiguous when-to-use coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_memoryA

Store one fact, preference or standing instruction in Guaardvark's long-term memory; returns 'Successfully saved to long-term memory (ID: ).' Guaardvark's chat recalls relevant entries into its prompts: facts as ground truth, notes as rules, preferences as defaults. Use it when the user tells you about themselves, their projects or how they want you to behave; run search_memory first to avoid duplicates. Each call adds a new entry (nothing is merged); over MCP the entry is visible to every project and session. Entries are edited or deleted on the Agent Memory page, not with this tool. Needs the Guaardvark backend running.

NameRequiredDescriptionDefault
tagsNoKeywords for the entry, e.g. ['python', 'formatting']; stored lower-cased without duplicates. search_memory matches tags as well as content.
typeNo'fact' (default): something true about the user or their work, recalled as ground truth; 'preference': a default the user can override per request; 'note': a standing instruction ('instruction' is stored as 'note'). Unknown values are stored as 'note'.fact
contentYesThe memory as one self-contained statement, e.g. 'Prefers metric units'. Guaardvark's chat shows at most 200 characters of a fact, 400 of a note and 250 of a preference.
importanceNo0.0-1.0, default 0.8. The heaviest single factor when Guaardvark's chat ranks recall; the three highest facts or notes at 0.85 or above join every recall even when they do not match the question.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false). The description adds rich non-annotation behavior: each call appends (nothing merged), entries are globally visible over MCP, no in-tool edit/delete, and a backend-running prerequisite. This is context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded with purpose, usage, and consequences in a few sentences; the returned-ID string is quoted inline. Slightly overloaded packing many clauses into one long sentence, which costs a point versus a crisp two-sentence form.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description supplies the return value shape (ID string), the side effects (append, global visibility), the duplicate-avoidance workflow, and the backend prerequisite. Everything an agent needs to call this correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already handles params well. The description nonetheless adds cross-parameter meaning: it explains the fact/note/preference recall semantics used elsewhere and the append-not-merge behavior, plus a concrete returned ID format — value beyond the schema's per-field docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Store) and resource (fact, preference or standing instruction in Guaardvark's long-term memory), and points to the write-oriented counterpart search_memory as the read/duplicate-check path. This distinguishes it cleanly from the retrieval-oriented sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('when the user tells you about themselves, their projects or how they want you to behave') plus a when-not/alternative instruction ('run search_memory first to avoid duplicates'). Also clarifies edit/delete is out of scope (Agent Memory page), routing the agent away from misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_codeA
Read-only

Find lines matching a case-insensitive Python regular expression in this Guaardvark install's own source files: tracked files and untracked ones git does not ignore, skipping venv, node_modules, dist, build, logs and pycache folders, binary files, symlinks, and .env or credential files. Returns the total, then up to 100 numbered 'path:line' hits with the line text (long lines cut at 300 characters). Matching is one line at a time. 'No matches found' is a normal result; an invalid pattern, or an absolute, ~ or '..' glob, is an error. A pattern that backtracks badly (nested repeats such as '(\w+\s*)+') is stopped with an error once one line takes over 1 s or the whole search over 20 s. Use it for exact names and patterns; search_codebase asks by meaning when the zvec_grep plugin is connected; read_code opens a hit that is UTF-8 text.

NameRequiredDescriptionDefault
patternYesPython regular expression, matched case-insensitively against one line at a time, e.g. 'def\s+load_config' or 'Button.*onClick'. Escape ( [ . and the like to match them literally.
file_globNoWhich files to search, relative to the checkout root, e.g. 'backend/**/*.py', 'frontend/**/*.{js,jsx}', '*.py' or 'backend/utils'. A glob without '/' matches file names in any folder ('*.py' is every Python file, as with ripgrep -g); a folder name with no wildcard searches every file under it. '**/' spans zero or more folders, '*' and '?' stay within one folder name, and {a,b} groups expand anywhere; [abc] classes are not supported. Default '**/*.{py,jsx,js,tsx,ts}'.**/*.{py,jsx,js,tsx,ts}

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=true in annotations, the description carries the rest and does so richly: excluded directories (venv, node_modules, dist, build, logs, __pycache__), binaries, symlinks, and .env/credential files; the 100-hit cap and 300-char line truncation; that 'No matches found' is normal while invalid patterns/globs are errors; and the 1s-per-line / 20s-overall backtracking cutoff. This is far beyond what the annotation provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It front-loads what is searched and what is skipped, then the return shape, then error cases, then sibling routing. It is dense and long but nearly every clause carries operational information; a small amount of the glob detail overlaps the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain return values, and it does: total count plus up to 100 numbered 'path:line' hits with truncated line text. Combined with error and timeout behavior, an agent has everything needed to call and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters, giving a baseline of 3. The description goes further by disclosing glob validation semantics not in the schema — an absolute, ~ or '..' glob is an error — and reinforcing case-insensitive, one-line-at-a-time matching, which is a genuine value-add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find) and resource (lines matching a regex in this install's own source files), scoping it precisely to tracked plus untracked non-ignored files. It names the sibling tools it is not (search_codebase for meaning, read_code for opening hits), so an agent can route correctly without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this for exact names and patterns, that search_codebase is the by-meaning alternative when the zvec_grep plugin is connected, and that read_code opens a hit. This is a clear when-to-use plus named-alternatives statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_codebaseA
Read-only

Search this Guaardvark install's own source code by meaning or by symbol. It does not search the caller's workspace or any other repository. The checkout is already indexed, so no path or upload is needed: ask 'where is it decided whether a model supports thinking', 'which function cuts retrieved text', 'callers of think_payload'. The first line of the result names the checkout searched and how; then come the matching files with checkout-relative line numbers and the code itself. With the zvec_grep plugin connected the search is hybrid (meaning plus keyword); without it, a literal search for the query and for the code names in it. Use it before saying Guaardvark's code is unavailable and before reading whole files. For an exact name or a regular expression use search_code; read_code opens a file it finds.

NameRequiredDescriptionDefault
rootNoLeave empty. Defaults to Guaardvark's own checkout (in chat, the project folder the request came from); a folder inside it searches the same whole-checkout index. Over MCP a root outside the checkout is refused.
limitNoHow many hits to return, 1 to 25 (default 8)
queryYesWhat to find, in plain words or as a symbol name

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, yet the description adds substantial behavioral context: hybrid semantic+keyword search when zvec_grep is connected vs literal search otherwise, the index being pre-built so no upload is needed, and that out-of-checkout roots are refused over MCP. It also discloses return structure, which annotations do not cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and scope are front-loaded, and the example queries illustrate the 'meaning vs symbol' modes efficiently. It is on the long side and a few sentences are dense, but nearly every sentence carries information an agent needs to call it correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the result shape (first line names the checkout and method, then matching files with checkout-relative line numbers and code). Combined with the sibling routing and scope constraints, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented structurally. The description reinforces the 'root' semantics ('no path or upload is needed', searching the whole-checkout index) but adds no syntax or format detail beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search this Guaardvark install's own source code by meaning or by symbol') and immediately disambiguates scope ('It does not search the caller's workspace or any other repository'). It also distinguishes itself from search_code and read_code, so an agent can pick it without reading sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('Use it before saying Guaardvark's code is unavailable and before reading whole files') and explicit alternatives ('For an exact name or a regular expression use search_code; read_code opens a file it finds'). The conditions that select each sibling are stated, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_knowledge_baseA
Read-only

Search the user's indexed documents and code repositories (the local knowledge base) by meaning and keywords. Returns the top passages (the configured number, 3 on a stock install, up to 50 via top_k), each with its filename, page when known and its scores: 'rerank' (the reranker's relevance score, which the ranking starts from, shown when it ran) and 'retrieval' (the earlier search score, which does not follow the order shown); passages usually open with an index label, e.g. 'Document: . Section: .' for documents or '[python] File: .' for code, before the source text. Once corpus summaries have been built, results can include LLM-written summaries named '[corpus summary ...]': cite only real filenames. Results are ranked, not filtered, so an off-topic question still gets the nearest passages; a header line flags degraded retrieval. Needs the Guaardvark backend running. For Guaardvark's own source use search_codebase; for saved facts, search_memory; to read a whole section, read_document_section.

NameRequiredDescriptionDefault
queryYesWhat to find, as a question or key terms in plain words; matched by meaning and, when keyword search is on, by exact terms too.
top_kNoHow many passages to return, 1-50. Omit for the configured default (3 on a stock install).
project_idNoId of a Guaardvark project, e.g. '12', to search only its documents. Pass one only when the user gives it; no tool here lists projects.
filter_typeNoKeep only passages with this content_type label. Labels are set per passage by a heuristic, e.g. 'text', 'header', 'table', 'list' or 'code' for files, a language name such as 'python' for code, and 'repository_summary' or 'repository_map' for analysed repositories. One label can miss relevant passages; omit it to search everything.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint=true, it discloses that results are ranked not filtered, that a header line flags degraded retrieval, that scores are named 'rerank'/'retrieval' and do not follow display order, that corpus summaries may appear with a citation warning, and that the Guaardvark backend must be running. This is substantial behavioral context the annotation cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every clause carries real information, but the description is dense and long, packing result-format, scoring, and degraded-retrieval notes into one paragraph. Content-rich rather than padded, so it holds at 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully covers what results look like (passages, filenames, page, index labels, scores) and the operational prerequisite (backend running). Nothing an agent needs to call and interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (including top_k defaults and filter_type caveats) are already documented in the schema, which the description largely restates. The description adds passage-format and scoring interpretation, but that is output behavior rather than parameter meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search the user's indexed documents and code repositories') plus the matching mode ('by meaning and keywords'), and explicitly distinguishes itself from search_codebase, search_memory and read_document_section. An agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The closing sentence names three alternatives with the condition that selects each: search_codebase for Guaardvark's own source, search_memory for saved facts, read_document_section to read a whole section. This is explicit when-to-use/when-not routing, not inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_memoryA
Read-only

Look up entries in Guaardvark's long-term memory: facts, preferences and notes saved with save_memory or in the app, and the entries Guaardvark keeps itself, which are lessons (returned as their stored JSON, a title and steps), lesson summaries, snippets and the screen agent's 'belief_update' observations. Every type is searched and each line shows its type. An entry matches when its content or tags contain, as a whole word, any of the query's first eight keywords: words of three or more characters, not counting common words such as 'what', 'is', 'my' or 'the' (case-insensitive text, not semantic); results are ranked by importance, match, source trust, confidence and recency. Returns lines '- [ID: ] () ', or 'No memories found matching ...'; a query with no keyword lists the top entries instead. Read-only: searching does not count as a recall. Use it to recall what the user said earlier and before save_memory; for indexed documents use search_knowledge_base, for the web web_search. Needs the Guaardvark backend running.

NameRequiredDescriptionDefault
limitNoHow many entries to return, 1-50 (default 5).
queryYesKeywords to look for, e.g. 'units python'. Only the first eight keywords count; words under three characters and common words ('what', 'is', 'my', 'the') are ignored, and a query with no keyword lists the top entries.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds substantial context beyond that: the matching rule (whole-word, first eight keywords), the ranking criteria (importance, match, source trust, confidence, recency), the exact return line format, the no-keyword fallback, and a backend-running prerequisite. This is far more than the annotation provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and matching rules, and every clause carries information. It is dense and slightly repetitive of the schema's query description, but not padded or wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter search tool with no output schema, the description supplies the return format, the empty-result message, the no-keyword behavior, and the backend dependency, so an agent can call and interpret it correctly without further context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters including the keyword rules and the limit range. The description largely restates the same matching semantics, adding no real syntax or format detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Look up entries in Guaardvark's long-term memory') and enumerates the entry types it covers (facts, preferences, notes, lessons, summaries, snippets, belief_update observations), so the agent knows exactly what corpus this searches and how it differs from knowledge-base or web search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('to recall what the user said earlier and before save_memory') and names the alternatives for other cases ('for indexed documents use search_knowledge_base, for the web web_search'), leaving no routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

self_improvement_statusA
Read-only

Report whether self-improvement can run (codebase lock, enabled flag, already running) plus recent runs and PendingFix rows. Use when the user asks if SI is on, why a fix didn't apply, or what pending fixes exist. Over MCP every part comes from the running Guaardvark backend; when it is not answering, the call fails and says so.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so the read-only nature is already covered. The description adds non-obvious behavioral context: the data source is the running Guaardvark backend, and there's a failure mode where the call fails explicitly if the backend is unresponsive. This is useful for understanding error handling and dependency, though it doesn't cover return format or pagination (which is less relevant for a status snapshot).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads the complete diagnostic scope, the second covers usage and backend dependency. Every clause earns its place by either expanding on the covered states or guiding invocation. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, no output schema, and a readOnly annotation, the description is complete for an agent to call it: it states what it reports, when to use it, and the dependency on a live backend. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the baseline is 4. The description correctly implies no input parameters are needed and instead focuses on the diagnostic outputs. No parameter semantics gap exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Report') and resource (self-improvement status) and details the diagnostic dimensions it covers: codebase lock state, enabled flag, whether it is already running, plus recent runs and PendingFix rows. This clearly distinguishes it from sibling status tools like swarm_status or outreach_status by naming the specific subsystem (self-improvement) and the exact gating conditions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit use cases: 'Use when the user asks if SI is on, why a fix didn't apply, or what pending fixes exist.' This provides three concrete triggering scenarios that map to the diagnostic needs, leaving little inference required for an agent to know when to invoke this rather than a general status tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_film_crewA

Start a five-role Film Crew production from a screenplay. The screenwriter begins at once; casting, storyboards and GPU renders wait for you in Studio. ComfyUI need not be running: only the clip renders at the end use it, and the answer says when it is stopped. Use when the user asks to film a script or start the film crew. For visuals cut to a song, use generate_music_video.

NameRequiredDescriptionDefault
nameNoProduction name. Defaults to the first line of the script.
script_textYesScreenplay or scene list as plain text. A single line that names a file (a path, an /api/outputs/<path> URL or a guaardvark://outputs/<path> URI) is read instead: UTF-8 text only, up to 1 MB. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); in chat, anywhere in its uploads, outputs or install folder. Files named like keys or credentials are refused everywhere.
video_modelNoOptional I2V / scene model id. Default: the active video model.
idempotency_keyNoOptional. Send the same key when retrying this call: the retry waits for or returns the first run instead of starting a second one.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/destructiveHint annotations: it describes the async workflow (screenwriter starts at once, casting/storyboards/renders wait in Studio), the external dependency posture (ComfyUI need not be running; only clip renders use it), and that the response reports when it is stopped. That is exactly the operational context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences with no filler, and the purpose/disambiguation clauses are front-loaded. The ComfyUI sentence is slightly packed but each clause carries useful information, so it stops short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does enough for a complex multi-stage tool: it explains that work is deferred to Studio and that the response reports ComfyUI state. It does not describe progress polling or how to check on the deferred casting/render stages, which is the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (including file-URI handling, uploads-folder constraints and idempotency semantics) are already documented in the schema. The description adds only the high-level notion of a screenplay input, which is a marginal gain. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a five-role Film Crew production from a screenplay') plus the initiating artifact, and explicitly distinguishes itself from the sibling generate_music_video for song-cut visuals. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('when the user asks to film a script or start the film crew') and an explicit alternative with its own condition ('For visuals cut to a song, use generate_music_video'). Both when-to-use and when-to-use-something-else are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_corpusA
Read-only

Return precomputed summaries of the knowledge base, written by the local LLM when a summary build last ran (Settings > Build summaries). Until one has run the tool says none exist, and documents added since are not reflected. One summary per cluster of related passages, largest first, each with its size, the files it draws on (listed up to 160 characters) and up to 1,200 characters of text. Use it for broad questions (main themes, what a collection is about) before searching; for facts and quotable text use search_knowledge_base.

NameRequiredDescriptionDefault
levelNo1 (default): summaries of groups of related passages. 2: broader summaries of the level-1 summaries, whose sources show as summary ids.
limitNoHow many summaries to return, largest clusters first, 1-30 (default 8).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation it discloses the key behavioral traits: results are precomputed by a local LLM at last build time, the tool reports none exist if no build ran, and documents added since are not reflected. It also describes the return shape (one summary per cluster, largest first, with size, source files truncated at 160 chars, and up to 1,200 chars of text).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and prerequisite are front-loaded, and every sentence carries information (staleness, output shape, routing to the alternative). The character-limit details (160 / 1,200 chars) are slightly granular but still useful for setting expectations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates fully by explaining the return contents, ordering, staleness caveats, and the prerequisite build step. An agent has everything needed to call it correctly and interpret the results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it reinforces that results come largest-cluster-first (the limit parameter's ordering) and hints at the leveling concept via 'one summary per cluster'. It does not restate the level=2 behavior, so it falls short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return precomputed summaries of the knowledge base') and immediately scopes what those summaries are and what they contain. It also names the sibling it replaces for other needs (search_knowledge_base), so an agent can distinguish them without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('broad questions (main themes, what a collection is about) before searching') and a when-not/alternative ('for facts and quotable text use search_knowledge_base'), plus the prerequisite that a summary build must have run.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

swarm_statusA
Read-onlyIdempotent

Get Swarm Orchestrator status (same as GET /api/swarm/status). Use when the user asks about the coding swarm, worktrees, or running swarm tasks. Returns an honest offline error if the swarm plugin is not running.

NameRequiredDescriptionDefault
swarm_idNoOptional id of one swarm, as the launch returned it, e.g. 'swarm-20260930-120000-a1b2c3' (letters, digits, '-' and '_' only).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly and idempotent behavior, and the description adds a genuine trait beyond them: it returns an honest offline error when the swarm plugin is not running. That failure-mode disclosure is valuable context the agent couldn't infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: purpose first, usage triggers second, failure behavior third. Fully front-loaded with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only status call with no output schema and one fully-documented optional param, the description covers purpose, triggering, and error behavior. Only the shape of the returned status fields is left implicit, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single optional swarm_id already documents format and an example in the schema. The description adds nothing about swarm_id semantics, so it sits at the baseline where the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get Swarm Orchestrator status') and maps it to a concrete endpoint, so the agent knows exactly what it retrieves. No sibling tool overlaps with swarm status, so sibling differentiation is moot, but the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger conditions ('when the user asks about the coding swarm, worktrees, or running swarm tasks'), which is clear routing guidance. It lacks any when-not-to-use case, but the triggers are concrete enough to select the tool confidently.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_changeA
Read-only

Check whether a text file in this Guaardvark install's checkout contains an exact string: confirm an edit landed (should_exist=true) or that removed text is gone (should_exist=false). Plain case- and whitespace-sensitive substring (line endings read as \n), not a regex. Reads only and needs no Guaardvark backend. Returns a line starting '✓ VERIFIED' or '✗ VERIFICATION FAILED'; 'ERROR during verification' (file missing, refused, not UTF-8, or over 10 MB) comes back as an error result. Same path rules as read_code. To see the file use read_code; to find text across files, search_code.

NameRequiredDescriptionDefault
filepathYesFile to check, relative to the checkout root, e.g. 'backend/app.py'. Same rules as read_code.
should_existNotrue (default): passes when the text is present. false: passes when it is absent from the file; a missing file is an error, not a pass.
expected_textYesExact text to look for: a case- and whitespace-sensitive substring, not a regex.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give readOnlyHint=true, but the description adds substantial context: reads only, no backend needed, exact substring not regex, LF line endings, and the full set of error conditions (file missing, refused, not UTF-8, over 10 MB) plus the exact success/failure token format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose first, then semantics, then error/return behavior, then sibling routing. Nearly every clause earns its place, though the description is on the longer side.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-format burden and does so fully: exact success/failure strings and error-result conditions. Path rules and path-relative-to-checkout behavior are covered, so nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description meaningfully elaborates the should_exist semantics (true=text present, false=absent, missing file is an error not a pass) and reiterates the exact-match semantics of expected_text, adding intent beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Check whether a text file in this Guaardvark install's checkout contains an exact string'. It distinguishes itself from siblings by explicitly naming read_code and search_code and what each does instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the two use cases (confirm an edit landed vs. confirm removed text is gone) and routes to alternatives: 'To see the file use read_code; to find text across files, search_code.' When-to-use and alternatives are both stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv3.0.1
    • Changedgenerate_image6 fields changed
      • changedInput schema / properties / height / description
        Previous value: -"Image height in pixels. Default: 1024. Options: 512, 768, 1024."New value: +"Image height in pixels, default 1024: one of 256, 384, 512, 640, 768, 896, 1024, 1280 or 1536 (see width)."
      • changedInput schema / properties / model / description
        Previous value: -"Model to use. Default 'auto' — recommended; the system auto-picks the best downloaded model for the prompt (usually Z-Image-Turbo or SDXL). With subject_ids, keep 'auto': each character renders on the base model of its own LoRA. A named model must be one every character has a LoRA for, or the render is refused. Only override when the user names a specific model: 'krea2-turbo', 'zimage-turbo', 'sd-xl', 'sdxl-turbo', 'realistic-vision', 'epic-realism'."New value: +"Model to use. Default 'auto' — recommended; the system auto-picks the best downloaded model for the prompt (usually Z-Image-Turbo or SDXL). With subject_ids, keep 'auto': each character renders on the base model of its own LoRA. A named model must be one every character has a LoRA for, or the render is refused. Only override when the user names a specific model: 'krea2-turbo', 'zimage-turbo', 'sd-xl', 'sdxl-turbo', 'realistic-vision', 'epic-realism', 'sana-sprint', 'sana-sprint-0.6b', 'qwen-image-21' (Qwen-Image 2.1 through ComfyUI). A model that is not installed is refused with where to install it; nothing is downloaded."
      • changedInput schema / properties / prompt / description
        Previous value: -"Scene/action description only (pose, lighting, setting). Do not embed JSON here. For cast characters put identity in subject_ids, not as the whole prompt body. If quoting on-image text, put EXACT words in double quotes — e.g. title \"BATMAN\"."New value: +"Scene/action description only (pose, lighting, setting). Do not embed JSON here. For cast characters put identity in subject_ids, not as the whole prompt body. If quoting on-image text, put EXACT words in double quotes — e.g. a sign reading \"OPEN\"."
      • changedInput schema / properties / subject_ids / description
        Previous value: -"Optional. Numeric Cast Library subject IDs with trained LoRAs to lock identity (e.g. [26]). Separate parameter — never nest this inside prompt. Loads LoRA + trigger + vision bible. Required for consistent characters."New value: +"Optional. Numeric Cast Library subject IDs with trained LoRAs to lock identity (e.g. [3]). Separate parameter — never nest this inside prompt. Loads LoRA + trigger + vision bible. Required for consistent characters."
      • changedInput schema / properties / wait_for_result / description
        Previous value: -"True (the default in chat): render now and return the image inline. False: queue the render as an image batch and return its batch id at once; poll get_generation_status for the file. Use False from a remote agent or when the GPU may be busy."New value: +"true: render now and return the image (the default in Guaardvark's chat). false: queue the render as an image batch and return its batch id at once; poll get_generation_status for the file (the default over MCP)."
      • changedInput schema / properties / width / description
        Previous value: -"Image width in pixels. Default: 1024. Options: 512, 768, 1024."New value: +"Image width in pixels, default 1024: one of 256, 384, 512, 640, 768, 896, 1024, 1280 or 1536. Another value resets both sides to 1024 unless the prompt states that size (e.g. '1280x768'). The model's own limits may clamp the final size; the result reports it."
    • Changedgenerate_video5 fields changed
      • changedInput schema / properties / model / description
        Previous value: -"Video model id from the registry (e.g. wan22-5b, minimax-h3-int8). Default: the installed default."New value: +"Video model id from the registry (e.g. wan22-5b, minimax-h3-int8). Omitted: the active video model in Settings, or on a machine where none is set the best installed one for the GPU; when that model cannot make this clip the call is refused with the reason, never rendered on another model. The result names the model used."
      • changedInput schema / properties / reference_audio / description
        Previous value: -"A voice or music reference, in the same forms as first_image (a generated song's document id works); needs the reference build."New value: +"Voice or music references (up to 3), each in the same forms as first_image (a generated song's document id works); a single string also works. Needs the reference build."
      • addedInput schema / properties / reference_audio / items
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / reference_audio / type
        Previous value: -"string"New value: +"array"
      • addedInput schema / properties / reference_clips
        Added value: +{
        +  "description": "Reference video clips (who is in them, their motion), 2-15 s each, in the same forms as first_image. Their own sound is left out so it does not compete with a voice reference; pass a clip's track as reference_audio to keep it. Named <Video 1>, <Video 2> in the prompt; needs the reference build.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedoutreach_draft_post2 fields changed
      • addedInput schema / properties / platform / enum
        Added value: +[
        +  "reddit",
        +  "discord",
        +  "facebook",
        +  "twitter",
        +  "youtube"
        +]
      • addedInput schema / properties / tone / enum
        Added value: +[
        +  "default",
        +  "engaging",
        +  "technical",
        +  "casual",
        +  "formal",
        +  "humorous"
        +]
    • Changedrequest_publish1 field changed
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Title, for platforms that show one.",
        -  "type": "string"
        -}
  2. 7 tool updatesv3.0.0
    • Addedcheck_inbound_change
    • Addedfind_records
    • Changedgenerate_image1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Model to use. Default 'auto' — recommended; the system auto-picks the best downloaded model for the prompt (usually Z-Image-Turbo or SDXL). With subject_ids, base is taken from the character's train family (Z-Image/SDXL/FLUX). Only override when the user names a specific model: 'krea2-turbo', 'zimage-turbo', 'sd-xl', 'sdxl-turbo', 'realistic-vision', 'epic-realism'."New value: +"Model to use. Default 'auto' — recommended; the system auto-picks the best downloaded model for the prompt (usually Z-Image-Turbo or SDXL). With subject_ids, keep 'auto': each character renders on the base model of its own LoRA. A named model must be one every character has a LoRA for, or the render is refused. Only override when the user names a specific model: 'krea2-turbo', 'zimage-turbo', 'sd-xl', 'sdxl-turbo', 'realistic-vision', 'epic-realism'."
    • Changedgenerate_music1 field changed
      • addedInput schema / properties / model
        Added value: +{
        +  "default": "ace-step",
        +  "description": "'ace-step' (default): ACE-Step v1. 'ace-step-1.5': ACE-Step 1.5, a newer MIT-licensed model, available once installed in Audio Studio → Manage models.",
        +  "enum": [
        +    "ace-step",
        +    "ace-step-1.5"
        +  ],
        +  "type": "string"
        +}
    • Changedoutreach_draft_post1 field changed
      • changedInput schema / properties / feature_hint / description
        Previous value: -"Override auto-detected feature angle (e.g. 'video_gen', 'rag')"New value: +"A feature for the draft to lead with, e.g. 'rag' or 'video_gen' (or plain words). The persona leads with it when it fits the thread (the community, in share mode) and grades below 0.3, saying why, when it does not. Leave it out to let the persona pick the angle from the pitch sheet."
    • Changedoutreach_list_queue2 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"candidate (found, not drafted yet), drafted (waiting for review), approved (queued to post), processing (a poster has picked it up), submitting (being published now), posted, rejected, aborted (posting failed)"New value: +"candidate (found, not drafted yet), drafted (waiting for review), approved (queued to post), processing (a poster has picked it up), submitting (being published now), posted, rejected, aborted (posting failed), unsupported (nothing here posts that action on that platform)"
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "candidate",
        -  "drafted",
        -  "approved",
        -  "processing",
        -  "submitting",
        -  "posted",
        -  "rejected",
        -  "aborted"
        -]New value: +[
        +  "candidate",
        +  "drafted",
        +  "approved",
        +  "processing",
        +  "submitting",
        +  "posted",
        +  "rejected",
        +  "aborted",
        +  "unsupported"
        +]
    • Changedsearch_memory1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Keywords to look for, e.g. 'units python'. Only the first eight words count, and words under three characters are ignored; an empty query lists the top entries."New value: +"Keywords to look for, e.g. 'units python'. Only the first eight keywords count; words under three characters and common words ('what', 'is', 'my', 'the') are ignored, and a query with no keyword lists the top entries."
  3. 46 tool updates
    • Changedanalyze_code3 fields changed
      • changedInput schema / properties / analysis_type / description
        Previous value: -"Type of analysis: 'full', 'structure', 'security', 'performance', 'style'"New value: +"Focus of the review: full (default) covers everything; structure (imports, classes, functions, organisation); security (injection, auth, unsafe calls); performance (bottlenecks, memory); style (naming, formatting, documentation)."
      • addedInput schema / properties / analysis_type / enum
        Added value: +[
        +  "full",
        +  "structure",
        +  "security",
        +  "performance",
        +  "style"
        +]
      • changedInput schema / properties / file_path / description
        Previous value: -"Path to the code file to analyze"New value: +"File to review: a path relative to the Guaardvark checkout (e.g. 'backend/app.py'; refused like read_code: .env, key files, git-ignored data other than uploads and outputs), or a path inside the uploads folder (e.g. 'Code/app.py'). Over MCP an absolute path works only inside the checkout; in Guaardvark's own chat one elsewhere works too, except system and key folders, and not with Settings > Project folder only on."
    • Changedanalyze_website5 fields changed
      • changedInput schema / properties / analysis_type / description
        Previous value: -"Type of analysis: 'full', 'seo', 'content', 'structure' (default: 'full')"New value: +"Which blocks to add: 'seo' (word_count and estimated_reading_time at 200 words a minute for the page's main text, content_density, has_https, title/description present), 'structure' (domain: the host name without port or login, path, scheme, is_secure), 'content' (sentence_count, average_sentence_length, readability, content_type_hints), or 'full' (default) for all three."
      • addedInput schema / properties / analysis_type / enum
        Added value: +[
        +  "full",
        +  "seo",
        +  "structure",
        +  "content"
        +]
      • changedInput schema / properties / include_metadata / description
        Previous value: -"Include metadata analysis (meta tags, Open Graph, etc.)"New value: +"Default true: add a metadata block with has_title, has_description, their lengths, and whether they fall within 30-60 and 120-160 characters. Open Graph and other meta tags are not read."
      • changedInput schema / properties / query / description
        Previous value: -"What the user wants to know from the page. When given, the content excerpt is the stretch of the page about it instead of the top of the page (which is often navigation)."New value: +"The user's question, in their words. When given, the preview and the insights block come from the ~2000-character stretch of the page that contains the most of its words instead of the top of the page (often navigation)."
      • changedInput schema / properties / url / description
        Previous value: -"Website URL to analyze (with or without protocol)"New value: +"Page URL or bare domain, e.g. 'https://example.com/about' or 'example.com' (https:// is added). Up to 5 redirects are followed; each hop must be a public address. The fetch gives up when the server is silent for 15 s or the whole fetch passes 45 s. Only the first 2 MB of a page are read; a page that was cut short comes back with a page_cut field saying so. A URL that is not a page (a PDF, an image, a download) is refused."
    • Changedcodegen5 fields changed
      • changedInput schema / properties / input_file / description
        Previous value: -"Path to input file to analyze and modify (optional)"New value: +"Existing file to rewrite: a path relative to the Guaardvark checkout (e.g. 'backend/app.py'; refused like read_code: .env, key files, git-ignored data other than uploads and outputs), or a path inside the uploads folder (e.g. 'Code/app.py'). Over MCP an absolute path works only inside the checkout; in Guaardvark's own chat one elsewhere works too, except system and key folders, and not with Settings > Project folder only on. Leave empty to write a new file. A named file that is missing, unreadable or empty is an error."
      • changedInput schema / properties / instructions / description
        Previous value: -"Modification instructions or code generation request"New value: +"What to change in input_file, or what the new file should do. Besides this text the model gets only input_file's content, the file names and the language: no chat history and no other files."
      • changedInput schema / properties / language / description
        Previous value: -"Programming language (auto-detected from extension if not specified)"New value: +"Language name for the prompt, e.g. 'python' or 'typescript'. Default 'auto' maps output_filename's extension (.py, .js, .jsx, .ts, .tsx, .go, .rs, .java, .sh, .sql, .html, .css, .json, .yaml and others); for other extensions name the language."
      • changedInput schema / properties / output_filename / description
        Previous value: -"Output filename for generated code"New value: +"File name to write under data/outputs/code, e.g. 'app_v2.py' or 'web/form.jsx'; subfolders are created. Absolute paths, '~', '.', '..' and existing folder names are refused. Its extension picks the language when language is 'auto'."
      • changedInput schema / properties / preserve_structure / description
        Previous value: -"Preserve original file structure and formatting"New value: +"With input_file: true (default) tells the model to keep the file's exact layout and formatting apart from the requested changes; false lets it reorganise where the changes call for it."
    • Changededit_image6 fields changed
      • changedInput schema / properties / image / description
        Previous value: -"Path, URL, or reference of the image to edit. Usually omit this — the image the user just attached is used automatically."New value: +"The image to edit. In chat, omit it to use the image the user just attached; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere."
      • changedInput schema / properties / model / description
        Previous value: -"Image model/backend. Default follows /imagemodel (Settings). 'qwen-image-edit' or 'auto' uses Qwen-Image-Edit when installed; 'kontext' uses FLUX.1 Kontext; other downloaded models use img2img."New value: +"Image model/backend. Default 'auto': Qwen-Image-Edit when installed, else FLUX.1 Kontext; with neither installed the call is refused and names the pack to install. In chat, 'auto' is replaced by the /imagemodel setting. 'qwen-image-edit' and 'kontext' name a pack; any other downloaded image model runs a light img2img pass that keeps most of the picture."
      • changedInput schema / properties / reference_image_2 / description
        Previous value: -"Optional second reference (another person or style). Qwen-Image-Edit only."New value: +"Optional second reference (another person or style), in the same forms as image. Qwen-Image-Edit only: the call is refused when the edit would run on another backend, or when the reference cannot be read."
      • changedInput schema / properties / reference_image_3 / description
        Previous value: -"Optional third reference. Qwen-Image-Edit only."New value: +"Optional third reference; same rules as reference_image_2."
      • changedInput schema / properties / steps / description
        Previous value: -"Diffusion steps (more = higher fidelity, slower). Default 28."New value: +"Diffusion steps (more = higher fidelity, slower). Default 28. A value is used as given, except below a floor the editing model declares (Qwen-Image-Edit does), where it is raised and the result says so."
      • addedInput schema / properties / wait_for_result
        Added value: +{
        +  "default": false,
        +  "description": "Over MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.",
        +  "type": "boolean"
        +}
    • Changedfetch_url2 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"What the user wants to know from the page, in their words. When given, the returned text is the ~2000-character stretch of the page about it; without it, the top of the page, which is often navigation."New value: +"The user's question, in their words. Its words of three or more letters or digits (common stopwords ignored) pick the ~2000-character stretch with the most of them; the top of the page is returned when there is no query, none of the words occur, or the page already fits."
      • changedInput schema / properties / url / description
        Previous value: -"URL or bare domain to fetch (e.g. 'https://example.com', 'example.com', 'www.example.com'). Protocol is optional — https:// will be added automatically if missing."New value: +"Page URL or bare domain, e.g. 'https://example.com/pricing' or 'example.com' (https:// is added). Up to 5 redirects are followed; each hop must be a public address. The fetch gives up when the server is silent for 15 s or the whole fetch passes 45 s. Only the first 2 MB of a page are read; a page that was cut short comes back with a page_cut field saying so. A URL that is not a page (a PDF, an image, a download) is refused."
    • Changedgenerate_animation1 field changed
      • addedInput schema / properties / wait_for_result
        Added value: +{
        +  "default": false,
        +  "description": "Over MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.",
        +  "type": "boolean"
        +}
    • Changedgenerate_bulk_csv12 fields changed
      • changedInput schema / properties / client / description
        Previous value: -"Client name for personalized content"New value: +"Company the pages are for (default 'Professional Services'). Matched case-insensitively to clients saved in Guaardvark; a match adds its saved details to the prompt."
      • removedInput schema / properties / concurrent_workers
        Removed value: -{
        -  "default": 5,
        -  "description": "Number of concurrent generation workers",
        -  "type": "integer"
        -}
      • changedInput schema / properties / filename / description
        Previous value: -"Output CSV filename (e.g., 'output.csv')"New value: +"Plain file name for the CSV, e.g. 'spring-pages.csv' (no folders). Unsafe characters are replaced; if a file or a running bulk job has the name, a -001 style suffix is added and the name used is returned."
      • addedInput schema / properties / project
        Added value: +{
        +  "default": "",
        +  "description": "Project name given to the model (default 'Content Generation').",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project ID for RAG context",
        -  "type": "integer"
        -}
      • changedInput schema / properties / quantity / description
        Previous value: -"Number of CSV entries/pages to generate (50-1000+)"New value: +"How many pages (rows) to ask for, 1-5000; a row that keeps failing is left out. With 1 the topic is used as is; otherwise row N is about '<topic> - Part N'."
      • addedInput schema / properties / quantity / maximum
        Added value: +5000
      • addedInput schema / properties / quantity / minimum
        Added value: +1
      • changedInput schema / properties / topic / description
        Previous value: -"Main topic or subject for content generation"New value: +"What the pages are about, e.g. 'gutter maintenance'."
      • addedInput schema / properties / website
        Added value: +{
        +  "default": "",
        +  "description": "The company's website, e.g. 'example.com' (default 'website.com'); given to the model and used in the row IDs.",
        +  "type": "string"
        +}
      • changedInput schema / properties / word_count / description
        Previous value: -"Target word count per entry"New value: +"Words of HTML content the model is asked for per page (default 600). An instruction, not enforced: only pages under about 30 words are regenerated."
      • addedInput schema / properties / word_count / minimum
        Added value: +100
    • Changedgenerate_csv5 fields changed
      • changedInput schema / properties / data_description / description
        Previous value: -"Description of the data to generate (columns, rows, content type)"New value: +"What the table holds: its columns and the kind of rows, e.g. 'name, country and founding year of European football clubs'."
      • changedInput schema / properties / filename / description
        Previous value: -"Output CSV filename"New value: +"Name for the file, e.g. 'fruit-prices.csv'; '.csv' is added when the name has no extension, and another extension is refused. A relative path such as 'reports/q3.csv' creates the folders under csv/. Checked before the model runs."
      • changedInput schema / properties / include_headers / description
        Previous value: -"Whether to include column headers"New value: +"true (default): the first row names the columns. false: data rows only."
      • changedInput schema / properties / row_count / description
        Previous value: -"Number of data rows to generate"New value: +"Data rows to ask the model for (default 10). An instruction, not enforced: the result reports how many it wrote."
      • addedInput schema / properties / row_count / minimum
        Added value: +1
    • Changedgenerate_enhanced_wordpress_content11 fields changed
      • changedInput schema / properties / brand_tone / description
        Previous value: -"Brand voice/tone"New value: +"Voice for the copy, e.g. 'friendly' or 'formal' (default 'professional')."
      • changedInput schema / properties / client / description
        Previous value: -"Client/company name"New value: +"Company the page is written for; part of the knowledge-base search and used in the copy."
      • changedInput schema / properties / industry / description
        Previous value: -"Client industry for context"New value: +"The company's industry; the model is told all content must fit it."
      • changedInput schema / properties / location / description
        Previous value: -"Geographic location for local SEO"New value: +"Town or region to name for local search, e.g. 'Erie, PA'."
      • changedInput schema / properties / primary_service / description
        Previous value: -"Client's primary service offering"New value: +"Main service the page may cover; part of the search. With secondary_service, the only services the model is told to write about; if both are empty there is no service limit."
      • changedInput schema / properties / row_id / description
        Previous value: -"Unique row ID"New value: +"Value written to the ID column. Use increasing numbers when building an import file one page at a time."
      • addedInput schema / properties / row_id / minimum
        Added value: +0
      • changedInput schema / properties / secondary_service / description
        Previous value: -"Client's secondary service offering"New value: +"Second service the page may cover; part of the search."
      • changedInput schema / properties / target_audience / description
        Previous value: -"Target audience for content"New value: +"Who the page is written for, e.g. 'first-time homeowners'."
      • changedInput schema / properties / topic / description
        Previous value: -"Content topic"New value: +"What the page is about, e.g. 'emergency repair response times'; part of the knowledge-base search."
      • changedInput schema / properties / website / description
        Previous value: -"Client website URL"New value: +"Company website URL, given to the model as context only; it is not fetched."
    • Changedgenerate_image1 field changed
      • addedInput schema / properties / subject_ids / items
        Added value: +{
        +  "type": "integer"
        +}
    • Addedgenerate_music
    • Changedgenerate_music_video1 field changed
      • changedInput schema / properties / song / description
        Previous value: -"Document id or filesystem path of the song (mp3/wav/flac/ogg)."New value: +"The song (mp3/wav/flac/ogg/m4a/aac): a library document id or /api/files/document/<id>/download link, an /api/outputs/<path> URL, a guaardvark://outputs/<path> resource URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); in chat, anywhere in its uploads, outputs or install folder. Files named like keys or credentials are refused everywhere. A song given by path joins the library (one outside the uploads folder is copied into its Audio folder)."
    • Addedgenerate_speech
    • Changedgenerate_video6 fields changed
      • changedInput schema / properties / first_image / description
        Previous value: -"Document id or path of the first frame (image-to-video)."New value: +"First frame (image-to-video): a library document id or /api/files/document/<id>/download link, a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere."
      • changedInput schema / properties / last_image / description
        Previous value: -"Document id or path of the last frame; needs a model with first+last-frame mode."New value: +"Last frame; needs a model with first+last-frame mode. Same forms as first_image."
      • changedInput schema / properties / num_inference_steps / description
        Previous value: -"Inference steps. Omit to use the model's default; a value below the model's floor is raised to it."New value: +"Inference steps. Omit to use the model's default, or the speed profile's count when speed_profile is given. A value below the floor (the speed profile's when one is given, else the model's) is raised to it."
      • changedInput schema / properties / reference_audio / description
        Previous value: -"Document id or path of a voice or music reference; needs the reference build."New value: +"A voice or music reference, in the same forms as first_image (a generated song's document id works); needs the reference build."
      • changedInput schema / properties / reference_images / description
        Previous value: -"Document ids or paths of reference images (identity, look); needs the reference build."New value: +"Reference images (identity, look), each as a string in the same forms as first_image; needs the reference build."
      • addedInput schema / properties / reference_images / items
        Added value: +{
        +  "type": "string"
        +}
    • Changedgenerate_wordpress_content7 fields changed
      • changedInput schema / properties / client / description
        Previous value: -"Client/company name for content personalization"New value: +"Company the page is written for; the model uses the name in the copy."
      • changedInput schema / properties / row_id / description
        Previous value: -"Unique row ID for the CSV entry"New value: +"Value written to the ID column. Use increasing numbers when building an import file one page at a time."
      • addedInput schema / properties / row_id / minimum
        Added value: +0
      • changedInput schema / properties / topic / description
        Previous value: -"Content topic or subject to write about"New value: +"What the page is about, e.g. 'spring lawn care checklist'."
      • changedInput schema / properties / website / description
        Previous value: -"Client website URL for context"New value: +"Company website URL, given to the model as context only; it is not fetched."
      • changedInput schema / properties / word_count / description
        Previous value: -"Target word count for the content section"New value: +"Minimum length of the HTML content the model is asked for, in words (default 500). It is an instruction, not checked."
      • addedInput schema / properties / word_count / minimum
        Added value: +50
    • Changedget_dependency_graph1 field changed
      • changedInput schema / properties / folder_id / description
        Previous value: -"The integer ID of the Code Repository folder."New value: +"Integer id of an analysed Code Repository folder (has_metadata=true in list_code_repositories). Subfolders of a marked folder are listed too but are usually not analysed on their own; use the top folder's id."
    • Changedget_document_outline2 fields changed
      • addedInput schema / properties / document_id
        Added value: +{
        +  "description": "Only needed when several files share the filename: the number list_documents prints after 'document_id' on that file's line.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / source_filename / description
        Previous value: -"The document filename, as shown by list_documents."New value: +"Exact filename as list_documents prints it, e.g. 'handbook.pdf' (case-sensitive)."
    • Changedget_generation_status2 fields changed
      • changedInput schema / properties / batch_id / description
        Previous value: -"The batch id a generate tool returned (e.g. ImageBatch_09-11-2026_132620_013)."New value: +"The id a generate or edit tool returned, e.g. ImageBatch_09-11-2026_132620_013, bulk_gen_1790556697_3fa2c1, a song's job id or tooljob_3fa2c1_0123456789ab."
      • addedInput schema / properties / wait_seconds
        Added value: +{
        +  "default": 0,
        +  "description": "Wait up to this many seconds (0-50) for the job to finish before answering, instead of reporting 'still running' at once. Useful for a client that cannot pause between checks. Default 0: answer immediately.",
        +  "maximum": 50,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedget_repository_map1 field changed
      • changedInput schema / properties / folder_id / description
        Previous value: -"The integer ID of the Code Repository folder."New value: +"Integer id of an analysed Code Repository folder (has_metadata=true in list_code_repositories). Subfolders of a marked folder are listed too but are usually not analysed on their own; use the top folder's id."
    • Changedinpaint_image4 fields changed
      • changedInput schema / properties / image / description
        Previous value: -"Path of the photo. Usually omit — the attached image is used."New value: +"The photo. In chat, omit it to use the attached image; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere."
      • removedInput schema / properties / steps / default
        Removed value: -20
      • changedInput schema / properties / steps / description
        Previous value: -"Diffusion steps. Default 20."New value: +"Diffusion steps. Omit to render at the editing model's own count. A value is used as given, except below a floor the editing model declares (Qwen-Image-Edit does), where it is raised and the result says so."
      • addedInput schema / properties / wait_for_result
        Added value: +{
        +  "default": false,
        +  "description": "Over MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.",
        +  "type": "boolean"
        +}
    • Changedlist_code_files3 fields changed
      • changedInput schema / properties / directory / description
        Previous value: -"Relative path from project root (default: 'frontend/src')"New value: +"Folder relative to the checkout root, e.g. 'backend/api', or '.' for the whole checkout. Paths outside the checkout are refused. Default 'frontend/src'."
      • changedInput schema / properties / max_depth / description
        Previous value: -"Maximum directory depth to show (default: 5)"New value: +"Levels below directory to expand: 0 shows only its direct entries, 1 adds their contents, and so on. Default 5; use 1-2 on large folders such as '.'."
      • addedInput schema / properties / max_depth / minimum
        Added value: +0
    • Changedlist_documents8 fields changed
      • addedInput schema / properties / limit / default
        Added value: +40
      • changedInput schema / properties / limit / description
        Previous value: -"How many documents to return (default 40, max 200)."New value: +"Documents per page, 1-200 (default 40)."
      • addedInput schema / properties / limit / maximum
        Added value: +200
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / name_contains / description
        Previous value: -"Only list documents whose filename contains this text."New value: +"Only list documents whose filename contains this text, case-insensitive and taken literally (no wildcards), e.g. 'manual' or '.pdf'."
      • addedInput schema / properties / offset / default
        Added value: +0
      • changedInput schema / properties / offset / description
        Previous value: -"Skip this many documents — use to page through a long list."New value: +"How many documents to skip, for paging (default 0)."
      • addedInput schema / properties / offset / minimum
        Added value: +0
    • Changedmap_codebase5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max findings to return (default 15)."New value: +"How many findings to return, most severe first, 1-40 (default 15). finding_count still gives the total."
      • addedInput schema / properties / limit / maximum
        Added value: +40
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / refresh / description
        Previous value: -"Ignore the 5-minute disk cache and recompute."New value: +"true: compute a new map now, rescanning every source file under root, and wait up to 60 s for it (otherwise the last map, or status 'computing', comes back and the new map lands in the background). false (default): return the last map, refreshing one older than 5 minutes in the background."
      • changedInput schema / properties / root / description
        Previous value: -"Code root. Defaults to GUAARDVARK_ROOT. Must stay inside that tree."New value: +"Folder inside the Guaardvark checkout to map instead of all of it, absolute or relative to the checkout (e.g. 'backend/api'); paths outside are refused. Folders named data, logs, backups, outputs, build, dist, env, venv, node_modules, migrations, plans, audit, voice or ComfyUI, among others, are always skipped, and a root inside one is refused. In a git checkout only files git tracks, or has not been told to ignore, are mapped, so a git-ignored folder maps as empty."
    • Changedmedia_control3 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Action to perform: pause, stop, next, previous, toggle"New value: +"play resumes a paused player; pause; stop; next and previous change track; toggle switches between playing and paused."
      • addedInput schema / properties / action / enum
        Added value: +[
        +  "play",
        +  "pause",
        +  "stop",
        +  "next",
        +  "previous",
        +  "toggle"
        +]
      • changedInput schema / properties / player / description
        Previous value: -"Specific player name (default: auto-detect)"New value: +"Player to control: the part of its D-Bus name after 'org.mpris.MediaPlayer2.', as media_status's Player line shows it, e.g. 'spotify', 'vlc' or 'vlc.instance4242' (the full bus name also works; case does not matter, and 'vlc' also finds a lone 'vlc.instance<pid>'). Omit to use the default described above."
    • Changedmedia_play3 fields changed
      • changedInput schema / properties / directory / description
        Previous value: -"Play all music in a specific directory path"New value: +"Absolute path of a folder to play in full, e.g. '~/Music/Live' or '/mnt/music/Live'; overrides query. It must be an existing folder. Refused: '/', system folders (/etc, /usr, /var, /proc, /sys, /dev, /boot, /root, /bin, /sbin, /lib*, and /run except /run/media) and hidden folders such as ~/.ssh (any part starting with '.'), unless inside the Settings music folder. Other folders, e.g. on /mnt or /media, are allowed."
      • changedInput schema / properties / query / description
        Previous value: -"Search query for music (e.g. 'Alice in Chains', 'jazz'). Use 'music' for generic 'play some music' requests. Omit entirely to resume paused playback."New value: +"Words that must each appear in a file's name or the name of the folder it is in, e.g. 'Alice in Chains' or 'jazz'. Use 'music' to play everything. Omit, with no directory, to resume playback."
      • changedInput schema / properties / shuffle / description
        Previous value: -"Shuffle the playlist"New value: +"Play in random order (default false). query 'music' always shuffles."
    • Changedmedia_status1 field changed
      • changedInput schema / properties / player / description
        Previous value: -"Specific player name (default: auto-detect)"New value: +"Player to read: the part of its D-Bus name after 'org.mpris.MediaPlayer2.', as media_status's Player line shows it, e.g. 'spotify', 'vlc' or 'vlc.instance4242' (the full bus name also works; case does not matter, and 'vlc' also finds a lone 'vlc.instance<pid>'). Omit to use the default described above."
    • Changedmedia_volume1 field changed
      • changedInput schema / properties / level / description
        Previous value: -"Volume level: absolute (e.g. '50'), relative ('+10', '-10'), 'mute', or 'unmute'. Omit to get current volume."New value: +"Text, e.g. '50' or '50%' (percent, above 100 is used as 100), '+10' or '-10' (step), 'mute' or 'unmute'; omit to read the volume. Over MCP a number such as 50 fails schema validation; send '50'."
    • Changedoutpaint_image4 fields changed
      • changedInput schema / properties / image / description
        Previous value: -"Path of the photo. Usually omit — the attached image is used."New value: +"The photo. In chat, omit it to use the attached image; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere."
      • removedInput schema / properties / steps / default
        Removed value: -20
      • changedInput schema / properties / steps / description
        Previous value: -"Diffusion steps. Default 20."New value: +"Diffusion steps. Omit to render at the editing model's own count. Outpainting raises a lower value to at least 20."
      • addedInput schema / properties / wait_for_result
        Added value: +{
        +  "default": false,
        +  "description": "Over MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.",
        +  "type": "boolean"
        +}
    • Changedoutreach_draft_post5 fields changed
      • changedInput schema / properties / include_link / description
        Previous value: -"Comment mode only. When true, the persona includes a guaardvark.com link where it fits naturally. The persona still self-grades and may return grade<0.7 if the link would feel forced (the human reviewer would rather hold than ship spam). Defaults to false."New value: +"Comment mode only. When true, the draft carries a link: the GitHub repo for YouTube, guaardvark.com for other platforms. The persona is asked to work it in; if it leaves it out, the link is appended on its own line. The persona is told to grade below 0.7 when the link cannot be made to feel natural; the draft is queued either way. Defaults to false."
      • changedInput schema / properties / mode / description
        Previous value: -"'comment' or 'share'"New value: +"'comment' (reply in a thread) or 'share' (new Reddit link post)"
      • addedInput schema / properties / mode / enum
        Added value: +[
        +  "comment",
        +  "share"
        +]
      • changedInput schema / properties / share_target / description
        Previous value: -"Where the share post goes, e.g. 'r/SideProject' (share mode)"New value: +"Share mode: the subreddit the link post goes to, e.g. 'r/SideProject'"
      • changedInput schema / properties / target_url / description
        Previous value: -"URL of the thread; if thread_context is missing we scout it"New value: +"Comment mode: URL of the thread; if thread_context is missing we scout it. Ignored in share mode, where the destination is share_target."
    • Changedoutreach_list_queue2 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"One of: drafted, approved, posted, rejected"New value: +"candidate (found, not drafted yet), drafted (waiting for review), approved (queued to post), processing (a poster has picked it up), submitting (being published now), posted, rejected, aborted (posting failed)"
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "candidate",
        +  "drafted",
        +  "approved",
        +  "processing",
        +  "submitting",
        +  "posted",
        +  "rejected",
        +  "aborted"
        +]
    • Changedprocess_file1 field changed
      • changedInput schema / properties / file_path / description
        Previous value: -"Path to file to process"New value: +"File to read: a path relative to the Guaardvark folder (tried first, e.g. 'data/uploads/report.pdf'), else relative to its uploads folder (e.g. 'reports/q3.pdf'), or an absolute path inside Guaardvark's uploads, outputs or install folder. Files named like keys or credentials (.env*, *.pem, *.key, id_rsa*, credentials*, .netrc and similar) are refused everywhere. Inside the install folder, uploads and outputs included, anything under a .git, venv, node_modules, dist, logs or similar folder is refused, and so is git-ignored data other than uploads and outputs. A relative and an absolute path to the same file get the same answer. In Guaardvark's own chat an absolute path elsewhere also works, except system folders and anything under a hidden folder or named with a leading '.', and not with Settings > Project folder only on; over MCP it is refused."
    • Changedread_ast_node3 fields changed
      • changedInput schema / properties / filepath / description
        Previous value: -"Path to the Python file, relative to the Code Repository folder."New value: +"Path of a .py file relative to the folder's root, e.g. 'app/main.py'. Paths shown by get_repository_map and get_dependency_graph begin with the folder's own path (e.g. 'Repo/app/main.py'); drop that prefix."
      • changedInput schema / properties / folder_id / description
        Previous value: -"The integer ID of the Code Repository folder."New value: +"Integer id of the Code Repository folder, from list_code_repositories. It does not need to be analysed."
      • changedInput schema / properties / node_name / description
        Previous value: -"The name of the class or function to extract (e.g., 'MyClass' or 'my_function')."New value: +"Exact, case-sensitive name of a class or function, e.g. 'Worker' or 'build_graph'. Use the bare name: 'Worker.run' does not match; 'run' does, along with any other definition named run."
    • Changedread_code3 fields changed
      • addedInput schema / properties / end_line
        Added value: +{
        +  "description": "Last line to return, inclusive. Default: as far as one call reaches (60,000 characters). A value past the end of the file reads to the end.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / filepath / description
        Previous value: -"Path relative to project root, or an explicit absolute path for an external text file"New value: +"File to read, relative to the checkout root, e.g. 'backend/app.py' or 'frontend/src/App.jsx'. A relative path may not leave the checkout."
      • addedInput schema / properties / start_line
        Added value: +{
        +  "description": "First line to return, counting from 1. Default: the first line. Use the 'path:line' numbers from search_code, or the start_line a previous page named.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedread_document_section5 fields changed
      • addedInput schema / properties / document_id
        Added value: +{
        +  "description": "Only needed when several files share the filename: the number list_documents prints after 'document_id' on that file's line.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / heading_path / description
        Previous value: -"Section breadcrumb from get_document_outline (exact or partial match)."New value: +"Section path as get_document_outline shows it, e.g. 'Installation > Requirements'; any section whose path contains this text, taken literally, matches. '(no section)' reads the passages that have neither a heading nor a page. Leave out together with page_label to read the whole document."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Passages to skip, to read past the first 25 (default 0).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / page_label / description
        Previous value: -"Page number, for paginated documents such as PDFs."New value: +"Page label as get_document_outline shows it, e.g. '12' for the line 'page 12' (exact match)."
      • changedInput schema / properties / source_filename / description
        Previous value: -"The document filename."New value: +"Exact filename as list_documents prints it (case-sensitive)."
    • Changedread_logs2 fields changed
      • addedInput schema / properties / name / enum
        Added value: +[
        +  "audio_foundry.log",
        +  "backend.log",
        +  "backend_startup.log",
        +  "celery.log",
        +  "celery_beat.log",
        +  "celery_main.log",
        +  "celery_training.log",
        +  "comfyui.log",
        +  "dep_reconciler.log",
        +  "discord_bot.log",
        +  "frontend.log",
        +  "gpu_embedding_service.log",
        +  "heal_backend_venv.log",
        +  "lora_trainer_daemon.log",
        +  "ollama_bootstrap.log",
        +  "ollama_serve.log",
        +  "preflight.log",
        +  "reboot.log",
        +  "setup.log",
        +  "swarm.log",
        +  "upscaling.log",
        +  "video_editor.log",
        +  "video_generation.log",
        +  "vision_pipeline.log",
        +  "whisper_server.log",
        +  "x11vnc_agent.log",
        +  "xfce_agent.log"
        +]
      • changedInput schema / properties / query / description
        Previous value: -"Optional case-insensitive substring filter."New value: +"Optional case-insensitive substring filter, matched against the text as it is returned (after credentials are masked)."
    • Changedremove_background2 fields changed
      • changedInput schema / properties / image / description
        Previous value: -"Path of the photo. Usually omit — the attached image is used."New value: +"The photo. In chat, omit it to use the attached image; otherwise a URL an image or edit tool returned (/api/batch-image/image/<batch>/<file> or /api/outputs/<path>, also with http://host:port in front), a guaardvark://outputs/<path> resource URI, a data: URI, or a file path. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); files named like keys or credentials (.env, *.pem, *.key, id_rsa* and similar) are refused everywhere."
      • addedInput schema / properties / wait_for_result
        Added value: +{
        +  "default": false,
        +  "description": "Over MCP: false (default) starts the work as a job and returns its job id at once; poll get_generation_status with it for the file. true waits up to 60 s (half the server's MCP timeout when that is shorter) and returns the result, or the job id if it is still running. In chat the tool always runs inline and this is ignored.",
        +  "type": "boolean"
        +}
    • Changedsave_memory7 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"The fact, preference, or instruction to remember. Be specific and concise."New value: +"The memory as one self-contained statement, e.g. 'Prefers metric units'. Guaardvark's chat shows at most 200 characters of a fact, 400 of a note and 250 of a preference."
      • changedInput schema / properties / importance / description
        Previous value: -"Importance score from 0.0 to 1.0. Higher means it should be retrieved more often."New value: +"0.0-1.0, default 0.8. The heaviest single factor when Guaardvark's chat ranks recall; the three highest facts or notes at 0.85 or above join every recall even when they do not match the question."
      • addedInput schema / properties / importance / maximum
        Added value: +1
      • addedInput schema / properties / importance / minimum
        Added value: +0
      • changedInput schema / properties / tags / description
        Previous value: -"List of string tags for categorization (e.g. ['python', 'formatting'])."New value: +"Keywords for the entry, e.g. ['python', 'formatting']; stored lower-cased without duplicates. search_memory matches tags as well as content."
      • addedInput schema / properties / tags / items
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Type of memory: 'fact', 'preference', or 'note'. Legacy 'instruction' is normalized to 'note'."New value: +"'fact' (default): something true about the user or their work, recalled as ground truth; 'preference': a default the user can override per request; 'note': a standing instruction ('instruction' is stored as 'note'). Unknown values are stored as 'note'."
    • Changedsearch_code2 fields changed
      • changedInput schema / properties / file_glob / description
        Previous value: -"Glob pattern for files to search (default: '**/*.{py,jsx,js,tsx,ts}')"New value: +"Which files to search, relative to the checkout root, e.g. 'backend/**/*.py', 'frontend/**/*.{js,jsx}', '*.py' or 'backend/utils'. A glob without '/' matches file names in any folder ('*.py' is every Python file, as with ripgrep -g); a folder name with no wildcard searches every file under it. '**/' spans zero or more folders, '*' and '?' stay within one folder name, and {a,b} groups expand anywhere; [abc] classes are not supported. Default '**/*.{py,jsx,js,tsx,ts}'."
      • changedInput schema / properties / pattern / description
        Previous value: -"Text or regex pattern to search for (e.g., 'handleClick', 'Button.*onClick')"New value: +"Python regular expression, matched case-insensitively against one line at a time, e.g. 'def\\s+load_config' or 'Button.*onClick'. Escape ( [ . and the like to match them literally."
    • Changedsearch_codebase2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"How many hits to return (default 8)"New value: +"How many hits to return, 1 to 25 (default 8)"
      • changedInput schema / properties / root / description
        Previous value: -"Checkout to search; leave empty for the current project"New value: +"Leave empty. Defaults to Guaardvark's own checkout (in chat, the project folder the request came from); a folder inside it searches the same whole-checkout index. Over MCP a root outside the checkout is refused."
    • Changedsearch_knowledge_base6 fields changed
      • changedInput schema / properties / filter_type / description
        Previous value: -"Optional filter on the indexed content type. Real values include 'document', 'text', and 'repository_summary'. Omit to search everything."New value: +"Keep only passages with this content_type label. Labels are set per passage by a heuristic, e.g. 'text', 'header', 'table', 'list' or 'code' for files, a language name such as 'python' for code, and 'repository_summary' or 'repository_map' for analysed repositories. One label can miss relevant passages; omit it to search everything."
      • changedInput schema / properties / project_id / description
        Previous value: -"Optional project ID to scope the search."New value: +"Id of a Guaardvark project, e.g. '12', to search only its documents. Pass one only when the user gives it; no tool here lists projects."
      • changedInput schema / properties / query / description
        Previous value: -"The specific question or query to search for in the knowledge base."New value: +"What to find, as a question or key terms in plain words; matched by meaning and, when keyword search is on, by exact terms too."
      • changedInput schema / properties / top_k / description
        Previous value: -"How many passages to return (1-50). Omit for the configured default."New value: +"How many passages to return, 1-50. Omit for the configured default (3 on a stock install)."
      • addedInput schema / properties / top_k / maximum
        Added value: +50
      • addedInput schema / properties / top_k / minimum
        Added value: +1
    • Changedsearch_memory4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (default 5)."New value: +"How many entries to return, 1-50 (default 5)."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / query / description
        Previous value: -"Search query or keyword to look for in memories."New value: +"Keywords to look for, e.g. 'units python'. Only the first eight words count, and words under three characters are ignored; an empty query lists the top entries."
    • Changedstart_film_crew1 field changed
      • changedInput schema / properties / script_text / description
        Previous value: -"Screenplay or scene list (plain text)."New value: +"Screenplay or scene list as plain text. A single line that names a file (a path, an /api/outputs/<path> URL or a guaardvark://outputs/<path> URI) is read instead: UTF-8 text only, up to 1 MB. Over MCP the file must be in Guaardvark's uploads folder or in an outputs folder MCP resources serve (what resources/list shows); in chat, anywhere in its uploads, outputs or install folder. Files named like keys or credentials are refused everywhere."
    • Changedsummarize_corpus7 fields changed
      • addedInput schema / properties / level / default
        Added value: +1
      • changedInput schema / properties / level / description
        Previous value: -"Summary level: 1 is closer to the source, 2+ is broader. Default 1."New value: +"1 (default): summaries of groups of related passages. 2: broader summaries of the level-1 summaries, whose sources show as summary ids."
      • addedInput schema / properties / level / minimum
        Added value: +1
      • addedInput schema / properties / limit / default
        Added value: +8
      • changedInput schema / properties / limit / description
        Previous value: -"How many summaries to return (default 8, max 30)."New value: +"How many summaries to return, largest clusters first, 1-30 (default 8)."
      • addedInput schema / properties / limit / maximum
        Added value: +30
      • addedInput schema / properties / limit / minimum
        Added value: +1
    • Changedswarm_status1 field changed
      • changedInput schema / properties / swarm_id / description
        Previous value: -"Optional swarm id for a single swarm."New value: +"Optional id of one swarm, as the launch returned it, e.g. 'swarm-20260930-120000-a1b2c3' (letters, digits, '-' and '_' only)."
    • Changedverify_change3 fields changed
      • changedInput schema / properties / expected_text / description
        Previous value: -"Text to check for in the file"New value: +"Exact text to look for: a case- and whitespace-sensitive substring, not a regex."
      • changedInput schema / properties / filepath / description
        Previous value: -"Path relative to project root, or an explicit absolute path for an external text file"New value: +"File to check, relative to the checkout root, e.g. 'backend/app.py'. Same rules as read_code."
      • changedInput schema / properties / should_exist / description
        Previous value: -"True if text should exist, False to verify deletion (default: True)"New value: +"true (default): passes when the text is present. false: passes when it is absent from the file; a missing file is an error, not a pass."
    • Changedweb_search3 fields changed
      • changedInput schema / properties / max_results / description
        Previous value: -"Maximum number of results to return"New value: +"How many results to ask for, 1 to 20 (default 5). Fewer come back when the search finds fewer."
      • addedInput schema / properties / max_results / maximum
        Added value: +20
      • addedInput schema / properties / max_results / minimum
        Added value: +1
  4. 1 tool updatev2.9.3
    • Changedgenerate_video1 field changed
      • changedInput schema / properties / style / description
        Previous value: -"Prompt style: cinematic, realistic, artistic, anime, 3d_animation, stop_motion, hand_drawn, western_cartoon, none."New value: +"Prompt style: cinematic, realistic, artistic, anime, 3d_animation, stop_motion, hand_drawn, western_cartoon, none. A model may not offer every style; its capability record lists prompt_styles."
  5. 51 tool updatesv2.9.0
    • First observedanalyze_code
    • First observedanalyze_website
    • First observedcodegen
    • First observededit_image
    • First observedfetch_url
    • First observedgenerate_animation
    • First observedgenerate_bulk_csv
    • First observedgenerate_csv
    • First observedgenerate_enhanced_wordpress_content
    • First observedgenerate_file
    • First observedgenerate_image
    • First observedgenerate_music_video
    • First observedgenerate_video
    • First observedgenerate_wordpress_content
    • First observedget_dependency_graph
    • First observedget_document_outline
    • First observedget_generation_status
    • First observedget_repository_map
    • First observedinpaint_image
    • First observedinspect_gpu
    • First observedlist_code_files
    • First observedlist_code_repositories
    • First observedlist_documents
    • First observedmap_codebase
    • First observedmedia_control
    • First observedmedia_play
    • First observedmedia_status
    • First observedmedia_volume
    • First observedoutpaint_image
    • First observedoutreach_draft_post
    • First observedoutreach_list_queue
    • First observedoutreach_reject_draft
    • First observedoutreach_status
    • First observedprocess_file
    • First observedread_ast_node
    • First observedread_code
    • First observedread_document_section
    • First observedread_logs
    • First observedremove_background
    • First observedrequest_publish
    • First observedsave_memory
    • First observedsearch_code
    • First observedsearch_codebase
    • First observedsearch_knowledge_base
    • First observedsearch_memory
    • First observedself_improvement_status
    • First observedstart_film_crew
    • First observedsummarize_corpus
    • First observedswarm_status
    • First observedverify_change
    • First observedweb_search

TDQS

A4/5.0

Scored across 55 tools

Disambiguation4/5

Mostly distinct purposes across content, code, media, web, memory, outreach, and system tools, with detailed descriptions that explicitly cross-reference alternatives. However, edit_image and inpaint_image are described as the same operation under two names, and several generation/search tools have overlapping intent that could still confuse selection.

Naming Consistency4/5

The set predominantly uses readable snake_case with verb_noun patterns such as generate_image, read_code, search_memory, and list_documents. Minor deviations like codegen, web_search, and status-style names (swarm_status, outreach_status) are understandable but slightly break the otherwise predictable convention.

Tool Count1/5

At 55 tools, the server is far beyond the 3-15 well-scoped range and into the extreme-mismatch territory described by the rubric. Even for a broad platform, the surface is too large and heavy for an agent to navigate reliably.

Completeness3/5

The surface covers a wide range of domains, including generation, code analysis, media control, web access, memory, documents, outreach, and system diagnostics. But several lifecycle operations are missing over MCP, such as memory update/delete, direct code editing, and document upload/indexing, leaving notable gaps agents must work around.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers